device和driver会通过名字(conpatible)进行匹配,匹配成功以后,会执行driver中的probe函数,在这个probe函数中就可以实现去device中取出硬件信息的方法了。
设备树替换掉了device部分,也就是设备树也会被转换为platform_device,然后就会通过名字匹配driver,匹配成功后就是调用driver中的probe函数了,然后就是获取硬件信息
那么在设备属下platform_device和platform_driver如何进行匹配的,driver又是如何从设备树取到硬件信息的?
1、如何确定自己手上的rk3568开发板用的哪个设备树文件?
运行编译内核的脚本进行编译内核,然后在这个过程中使用ctrl+c打断编译,就可以看到使用了哪一个设备树文件
2、编写dts
首先查看需要用到的寄存器地址,这里查看的是之前设备平台总线中device.c部分的代码
这部分就需要用到reg属性,寄存器地址和长度,这样就对寄存器描述好了
编写时一定要写在根节点里面:/
既然用到了reg属性,就必须使用addrss-cell和size-cell属性了,都为1,代表一个寄存器地址,一个长度,对应下面的reg中一个寄存器地址一个长度
可以看到,在此dts中,包含了两个个dtsi,我们在这个dts中添加了一个根节点,但是在dtsi中是否还有根节点,实际这种在编译的时候多个根节点最后会合并为一个设备树。
前面这两个参数放在了根节点下,一旦编译时,就会影响根节点下全部的参数,所以这里再创建一个子节点,这样就不会影响根节点了
3、加入名字,重点,用于匹配
在platform匹配中,由于这里时设备树相关的,在子节点中没有名字,也就是没有conpatible,是无法匹配的,所以在子节点添加上
这样的话,my_led这个节点才会被转换成platform_device,这样才能和platform_driver匹配成功,驱动才能拿到my_led节点中的reg资源
驱动使用
这是没有使用设备树时的驱动程序,需要name和id_table进行匹配
在使用设备树以后,就需要使用of_device_id进行匹配了
如何设置driver和dts进行匹配
dts最终会被转化为device,根据conpatible和driver进行匹配,所以在driver中也要设置conpatible与其一致
这样匹配成功以后就回去执行驱动中的probe函数了
编译内核的同时会编译设备树
并且会把编译好的设备树文件打包到内核镜像里面,这样直接更新开发板的内核镜像就可以了
然后将编译好的驱动ko文件也拷贝到开发板
查看内核中是否有了设备树中定义的节点
在开发板上:
cd /proc/device-tree/
ls topeet/
topeet就是前面设备树文件dts中定义的节点topeet,myled是真正要使用要获取地址等硬件属性的节点
安装ko驱动
可以看到打印了一句,这一句就是在驱动程序的probe函数中定义的使用printk打印出来的
这就说明驱动和设备树匹配成功了,这样就可以去设备树中拿到节点信息了