1. 什么是dts?
在Linux3.x版本后,arch/arm/plat-xxx和arch/arm/mach-xxx中,描述板级细节的代码(比如platform_device、i2c_board_info等)被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dts
设备树就是由一些属性和节点组成的一种数据结构,属性一般会赋予一些属性值,而节点则可能是是由属性跟其下的子节点构成。
2 . 设备树的格式
kernel/Documentation/devicetree/bindings/mmc 具体的某个子系统的填充格式在内核中都会有对应的说明。
3. 在没有设备树的内核中我们是怎么在进行驱动移植的
例: 移植一个dm9000网卡到s3c2440平台,我们需要做的事情有哪些呢?
首先我们要做的事情是构建一个平台设备 platform_device s3c_device_dm9k 的结构体 ,在结构体中有与驱动匹配的.name ,id, resource,platform_data等,然后平台设备添加到设备的结构提中,再将结构体注册到内核中去。
构建resource :里面是配置的寄存器资源,这里的配置与我们的硬件是相关的。
platform_data: 配置的是网卡的一些特有特性。
添加头文件,控制宏,进入图形化界面配置device。
最后编译检查报错,烧写到开发板中测试功能
4. 在linux3.x以上的内核中使用了设备树后,我们的驱动移植就变得简单多了。
通过内核中的说明文档提供的demo格式,添加我们的硬件参数即可,
添加的目录是在arch/arm/boot/下面,在这个目录下面会有两种文件dts和dtsi,dtsi后缀的文件是把平台的共有特性抽象出来的的文件,dts中则是具体的某个产品文件,我们的修改是在dts中。
Example:
ethernet-phy@0 {
compatible = = "dm9k"; //匹配内核中Platform_driver
linux,phandle = <2452000> //起始地址
interrupt-parent = <40000>; //地址长度
interrupts = <35 1>; //中断
reg = <0>; //寄存器
device_type = "ethernet-phy"; //设备type
};