内核移植
准备工作
可以到电子资源页中下载Linux-3.14的内核源码
拷贝内核源代码到工作目录并进入
tar -xvf linux-3.14.tar.xz
cd linux-3.14
内核移植的大致步骤
修改架构;导入默认配置;选配内核;编译内核;修改设备树;上机调试;
修改架构
修改架构(vim Makefile,内核根目录中的Makefile文件中)
找到ARCH和CROSS_COMPILE,修改如下图

导入默认配置
默认配置存放在arch/arm/configs下

我的板子为三星的exynos,找到里面的exynos_defconfig这就是我们要使用的默认配置文件,然后在Linux-3.14文件夹下执行make exynos_defconfig,把这个配置文件加载到.config中。然后执行make menuconfig
错误
图形界面库错误
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
执行下列命令
sudo apt-get install exuberant-ctags
sudo apt-get install libncurses5-dev
终端太小
farsight@ubuntu:~/fs4412/1905/linux-3.14$ make menuconfig
scripts/kconfig/mconf Kconfig
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2
直接调整终端大小(拖动)
编译内核
选配内核
配置DM9000网卡内核选配
然后我们通过图形界面选配
make menuconfig
[*] Networking support ---> //配置支持TCP/IP
Networking options --->
<*> Packet socket
<*>Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
Device Drivers ---> //配置支持DM9000网卡驱动
[*] Network device support --->
[*] Ethernet driver support (NEW) --->
<*> DM9000 support
File systems ---> //配置支持网络文件系统NFS
[*] Network File Systems (NEW) --->
<*> NFS client support
[*] NFS client support for NFS version 2
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] Root file system on NFS
make uIamge,编译成功后生成的路径为arch/arm/boot/uImage
修改设备树
因为这款fs4412和origen这个板子相似,所以我们复制origen这个板子的设备树
cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts
修改Makefile 添加编译选项
vim arch/arm/boot/dts/Makefile
#在
exynos4412-origen.dtb \
#下添加如下内容
exynos4412-fs4412.dtb \
配置DM9000的设备树信息
这个板子上的网卡型号为DM9000,所以我们需要在这个架构中的设备树中添加该网卡的设备树信息,以便我们的硬件可以找到他的引脚
设备树简介
设备树(Device Tree)是一种描述
硬件设备的数据结构,在Linux系统中被广泛应用。它的主要作用是提供一种硬件描述的机制,使得操作系统能够动态地识别和配置硬件设备。设备树将硬件设备的信息以一种结构化的方式进行描述,包括设备的
类型、寄存器地址、中断信息、引脚配置等。这些描述信息存储在设备树源文件(.dts文件)中,通过编译和加载,最终生成设备树二进制文件(.dtb文件)供内核解析和使用。使用设备树的好处包括:
- 硬件独立性:设备树将硬件描述与具体的处理器架构和平台绑定分离,使得相同的设备树可以在不同的硬件平台上使用,提高了可移植性和可重用性。
- 动态配置:设备树允许操作系统在运行时动态识别和配置硬件设备,而不需要硬编码设备信息,简化了驱动程序的开发和维护。
- 可扩展性:通过修改设备树源文件,可以添加、删除或修改硬件设备的描述信息,使系统能够适应不同的硬件配置和需求。
总而言之,设备树在Linux系统中扮演着描述硬件设备的重要角色,帮助操作系统识别、配置和管理硬件设备,实现硬件与软件的交互和通信。
在linux-3.14/arch/arm/boot/dts/exynos4412-fs4412.dts文件中添加如下代码
srom-cs1@5000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x1000000>;
ranges;
ethernet@5000000 {
compatible = "davicom,dm9000";
reg = <0x5000000 0x2 0x5000004 0x2>;
interrupt-parent = <&gpx0>;
interrupts = <6 4>;
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};

然后make一下
make dtbs
上机调试
cp arch/arm/boot/uImage /tftpboot
cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot
然后板子上电,u-boot从tftp中下载然后执行
移植第三方驱动
方法一:
1. 添加驱动代码
fs4412_led_drv.c添加到内核驱动代码中;
cp fs4412_led_drv.c driver/char/
2. 修改Makefile
vim driver/char/Makefile
在文件的最后面添加代码:
obj-y += fs4412_led_drv.o
3. 重新编译内核和设备树并拷贝内核和设备树到tftp共享文件中;
4. 启动开发并验证
启动后添加设备节点
mknod /dev/led c 500 0
设备名 设备类型 主设备号 次设备号
如果要删除mknod的设备,就使用 rm /dev/led
方法二(建立在方法一的基础上):
1. 修改drivers/char/Kconfig
在menu "Character devices"下面
添加如下内容:
config FS4412_LED
bool "FS4412LED Device Support"
help
support leddevice on FS4412develop board
2. 修改Makefile
vim driver/char/Makefile
将
obj-y += fs4412_led_drv.o
修改为
obj-$(CONFIG_FS4412_LED) += fs4412_led_drv.o
3. 将驱动编译到内核中:
选配内核
make menuconfig
Device Drivers --->
Character devices --->
<*>FS4412LED Device Support
编译内核
make uImage
启动内核,并且创建设备节点(手动的方式需要创建,自动的方式不需要创建)
mknod /dev/led c 500 0
./app 验证