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
在目前广泛使用的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
相关文章推荐
- Linux之设备驱动学习简过程<四>
- 学习笔记:创建一个简单字符设备驱动的过程
- android底层驱动学习之log的输出
- 【1】android底层驱动开发学习及Ubuntu使用问题
- android底层驱动学习之内存初步
- Linux之设备驱动学习简过程<五>
- android底层驱动学习之从应用程序如何到底层driver的调用
- android底层驱动学习之内核信息的输出以及控制方式
- android底层驱动学习之日志信息、printk的个人理解
- android底层驱动学习之java基本语法的学习(二)
- Android底层驱动验证过程(S3C6410 gpio)
- android底层驱动学习之调试驱动DEVICE_ATTR的原理及用法
- 块设备驱动学习过程
- android底层驱动学习之focaltech触屏实例理解
- Linux之设备驱动学习简过程<二>
- android驱动学习-sysfs文件系统设备--LED(3)
- android底层驱动学习之 module_init的内核调用顺序
- android底层驱动学习之linux输入子系统的理解
- android底层驱动学习之debug方法(proc、sysfs、debugfs)
- android底层驱动学习之工作队列work_queue相关参数