目录
一、设备树
1.1设备树
1.2设备树文件
1.3设备树语法
1.4Linux内核驱动移植
二、网卡驱动
2.2在设备树中添加/修改相应的设备信息
2.3修改时钟
2.4修改eMMc
2.5编译测试
一、设备树
1.1设备树
设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码
操作一个硬件需要逻辑和硬件信息两种代码。Linux将这两种代码分离了,逻辑代码就是驱动,只是实现一个过程,不包含硬件信息。而这些硬件相关的代码就是设备树。
老师举了一个例子。LED闪烁。闪烁的过程就是驱动代码。设备树就是告诉驱动让谁闪烁的。
这样做的好处就是平台升级后驱动代码不用动改一下设备树就行。早期的Linux不是这种机制。是一个叫平台文件的机制。类似于uboot的board(uboot是学的Linux;不过我先学的uboot习惯这样说。)这种机制导致Linux的源码体积越来越大。最后Linux之父忍不住了将Linux社区维护的大佬用一个F开头的单词给骂了。说这些board文件都是垃圾(因为大部分都用不上。我们真正使用的就那点。一堆重复制造的轮子)。这些大佬也都是有头有脸的人物。所以后面ARM-Linux就引入的设备树机制。
1.2设备树文件
dts 设备树源文件
dtsi 类似于头文件,包含一些公共的信息,可被其它设备树文件引用
dtb 编译后的设备树文件
1.3设备树语法
设备树的语法为树状结构,由一系列的节点和属性组成,根节点下包含子节点
子节点下还可以包含子节点,节点内部包含了对应设备的属性
/{
memory{
0x40000000 0x40000000
};
dm9000{
0x05000000;
};
key{
up{
};
down{
};
};
};
设备树的语法很简单一个/就表示根节点每个子节点中有一些属性比如内存memory内又位置和大小。网卡dm9000里有网卡的位置。
键盘key内有具体哪个按键。
1.4Linux内核驱动移植
1.在make menuconfig界面中选中要安装的驱动
2.在设备树中添加/修改相应的设备信息
3.重新编译内核/设备树
二、网卡驱动
2.1在make menuconfig界面中选中要安装的驱动
选择光标下面那个Device Drivers
因为内核要使用 NFS 去挂载根文件系统, 而 NFS 是基于 TCP 协议实现的, 所以这里需
要选配 TCP 相关的网络协议(部分功能默认已经选配) , 然后选择“Save” 保存
这四个一定要选
因为内核要使用 NFS 去挂载根文件系统, 所以需要给内核选配 NFS 客户端及相关功能
2.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];
};
};
2.3修改时钟
vi drivers/clk/clk.c
把这个变量给个初值true(忽略无用的时钟)
2.4修改eMMc
vi drivers/mmc/core/mmc.c
其实就是把7改成了8
2.5编译测试
make uImage
make dtbs
sudo service tftpd-hpa restart
sudo service nfs-kernel-server restart