问题一:为什么需要设备树?
在目前广泛使用的Linux kernel 2.6.x版本中,对于不同平台、不同硬件,往往存在着大量的不同的、移植性差的板级描述代码,以达到对这些不同平台和不同硬件特殊适配的
需求。但是过多的平台、过的的不同硬件导致了这样的代码越来越多,比如arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码, platform设备、resource、
i2c_board_info、spi_board_info以及各种硬件的platform_data。在一些常见的芯片如s3c2410、s3c6410等板级目录,代码量在数万行。最终引发了Linux创始人Linus的不满,以
及强烈呼吁改变。
Devicetree基本数据格式:
Devicetree是一个树状结构,由节点(node)和属性(properties)构成,而属性就是成对出现的名字(key)和值(value),每个节点除了属性还可能有若干子节点如:
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
- i2c@1,0 {
- compatible = "acme,a1234-i2c-bus";
- …
- rtc@58 {
- compatible = "maxim,ds1338";
- reg = <58>;
- interrupts = < 7 3 >;
- };
- };
问题二:设备树是如何保存,启动?
在ARM Linux在,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录中,系统启动时,fastboot(或者类似的启动程序,如Uboot)在启动内核前将DTS文件读到内存中,跳转到内核执行的同时将DTS起始地址传给内核。内核通过起始地址就可以根据DTB的结构解析整个设备树。
问题三如何实现匹配过程?
首先在触屏init函数调用i2c_add_driver。。。。。。driver_match_device函数,此时就会拿i2c_driver结构体中的.of_match_table的
compatible值与设备树中的节点对应值进行match,如果匹配则注册成功。
具体的match过程见http://blog.csdn.net/loongembedded/article/details/51453514