本文主要是介绍高通平台中用devicetree注册设备及驱动匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、在设备树文件(.dts)中的相应节点下添加要注册设备的节点
&soc {
......
plf_char_dev: mytest,plf_char_dev {
compatible = "mytest,plf_char_dev";
......
};
......
};
定义好的设备树源文件(dts文件)会被编译器DTC编译成二进制的dtb文件。然后在系统上电时,这个二进制文件会被加载到内存中,其地址被保存在R2寄存器中。但是,这个时候还并不存在device tree,需要经过kernel解析(主要工作分是两次扫描dtb,第一次是为了根据设备节点给设备树分配足够的内存,第二次是将节点填入内存,生成设备树)后,才生成真正的设备树,然后将设备树的根节点地址赋值给一个全局变量"allnodes"。
然后,内核会根据设备树的内容生成相应的设备结构体,这个结构体中包含了设备的资源(I/O地址等),并用of_device_add函数把设备结构体添加到设备模型中。
2、设备和驱动的匹配
总线(bus)的 match 函数通过调用of_driver_match_device实现驱动和设备的匹配。确认驱动是否匹配的关键因素是检查driver中的of_device_id类型的成员与device中device_node类型的成员是否匹配,device_node类型代表的是设备树中的树节点,内含compatible, type, name等设备节点信息;of_device_id结构体包含compatible, type, name;优先对比compatible,其次是type,最后是name,这三种信息如果出现一个相同的,则认为设备与驱动匹配。一般都是compatible匹配。
3、驱动程序的编写
当使用设备树编写驱动时,不需要再在代码中定义device结构中的resource等成员,因为设备的属性资源定义在设备树的节点中,驱动需要是可通过相应的api获取;而相应的driver结构体需要初始化of_device_id类型的of_match_table成员,以便匹配。由于driver中用于匹配device的数据不再是name成员,所以,name成员可以随意定义,而不影响匹配。
这篇关于高通平台中用devicetree注册设备及驱动匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!