八、Linux设备驱动移植
1、设备树
1.1设备树
设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码
2、设备树语法概述
2.1 设备树文件
dts 设备树源文件
dtsi 类似于头文件,包含一些公共的信息,可被其它设备树文件引用
dtb 编译后的设备树文件
2.2 设备树语法
设备树的语法为树状结构,由一系列的节点和属性组成,根节点下包含子节点 子节点下还可以包含子节点,节点内部包含了对应设备的属性
/{
memory{
0x40000000
};
子节点
};根节点
3、Linux内核驱动移植
1.在make menuconfig界面中选中要安装的驱动
2.在设备树中添加/修改相应的设备信息
3.重新编译内核/设备树
4、网卡驱动移植
Linux内核驱动移植
1.在make menuconfig界面中选中要安装的驱动
在内核源码的顶层目录下执行如下命令,修改内核配置
make menuconfig
出现以下界面
给内核选配 DM9000 网卡驱动,然后选择“Save”保存
Device Drivers ---> [*] Network device support ---> [*] Ethernet driver support ---> <*> DM9000 support
因为内核要使用 NFS 去挂载根文件系统,而 NFS 是基于 TCP 协议实现的,所以这里需要选配 TCP 相关的网络协议(部分功能默认已经选配),然后选择“Save”保存
[*] Networking support ---> Networking options ---> <*> Packet socket <*> Unix domain sockets [*] TCP/IP networking [*] IP: kernel level autoconfiguration
因为内核要使用 NFS 去挂载根文件系统,所以需要给内核选配 NFS 客户端及相关功能
File systems ---> [*] Network File Systems ---> <*> NFS client support <*> NFS client support for NFS version 3 (NEW) [*] NFS client support for the NFSv3 ACL protocol extension [*] Root file system on NFS
设置完成后通过方向键选择‘Save’保存即可,然后选择‘Exit’退出该配置界面
2.在设备树中添加/修改相应的设备信息
$ vi 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]; }; };
修改时钟相关配置(忽略无用的时钟)
$ vi drivers/clk/clk.c 将static bool clk_ignore_unused; 修改为以下内容,然后保存退出 static bool clk_ignore_unused=true; 修改 EMMC 相关配置 $ vi drivers/mmc/core/mmc.c 将 if (card->ext_csd.rev > 7) { pr_err("%s: unrecognised EXT_CSD revision %d\n", mmc_hostname(card->host), card->ext_csd.rev); err = -EINVAL; goto out; } 修改为以下内容,然后保存退出 #if 0 if (card->ext_csd.rev > 7) { #else if (card->ext_csd.rev > 8) { #endif pr_err("%s: unrecognised EXT_CSD revision %d\n", mmc_hostname(card->host), card->ext_csd.rev); err = -EINVAL; goto out; }
3.重新编译内核/设备树
编译内核和设备树
$ make uImage $ make dtbs
测试内核和设备树
将编译生成的内核和设备树拷贝到 tftp 的工作目录
$ sudo cp arch/arm/boot/uImage /tftpboot $ sudo cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/ $ sudo chmod 777 /tftpboot/*
重启 tftp 和 nfs 服务器
$ sudo service tftpd-hpa restart $ sudo service nfs-kernel-server restart
重启开发板查看现象,如图所示,此时 Linux 内核已经能通过 NFS 去挂载根文件系统在终端下执行‘ls’命令我们就能看到根文件系统中的内容
day8作业
1.简述设备树的作用以及使用设备树的优势是什么?
设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码
对于同一SOC的不同主板,只需更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件。
2.简述在Linux内核上移植一个驱动程序(内核源码支持)需要做哪些事?
①编译内核和设备树②测试内核和设备树,将编译生成的内核和设备树拷贝到 tftp 的工作目录③重启 tftp 和 nfs 服务器