您的位置:首页 > 移动开发 > Android开发

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

2016-12-05 17:22 435 查看
问题一:为什么需要设备树?

在目前广泛使用的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: