android底层驱动学习之设备树驱动及设备匹配过程

时间:2021-11-09 07:38:56

问题一:为什么需要设备树?

在目前广泛使用的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 {
                        };
                };

  1. i2c@1,0 {  
  2.       compatible = "acme,a1234-i2c-bus" 
  3.       …  
  4.       rtc@58 {  
  5.           compatible = "maxim,ds1338";  
  6.           reg = <58>;  
  7.           interrupts = < 7 3 >;  
  8.       };  
  9.   };
这样就可以很简单的描述一个硬件。


问题二:设备树是如何保存,启动?

在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