内核移植

准备工作

可以到电子资源页中下载Linux-3.14的内核源码

拷贝内核源代码到工作目录并进入

tar -xvf linux-3.14.tar.xz

cd linux-3.14

内核移植的大致步骤

修改架构;导入默认配置;选配内核;编译内核;修改设备树;上机调试;

修改架构

修改架构(vim Makefile,内核根目录中的Makefile文件中)

找到ARCHCROSS_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

修改设备树

因为这款fs4412origen这个板子相似,所以我们复制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文件)供内核解析和使用。

使用设备树的好处包括:

  1. 硬件独立性:设备树将硬件描述与具体的处理器架构和平台绑定分离,使得相同的设备树可以在不同的硬件平台上使用,提高了可移植性和可重用性。
  2. 动态配置:设备树允许操作系统在运行时动态识别和配置硬件设备,而不需要硬编码设备信息,简化了驱动程序的开发和维护。
  3. 可扩展性:通过修改设备树源文件,可以添加、删除或修改硬件设备的描述信息,使系统能够适应不同的硬件配置和需求。

总而言之,设备树在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];
    };
};

添加DM9000的设备树信息

然后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 验证