之前的文章是传统的未采用设备树的方式去实现platfrom设备和驱动方式在有设备树的时候设备的描述就放在了设备树中去描述。1、首先创造设备的pinctrl节点在platfrom框架下必须使用pinctrl来配置引脚的复用功能下面以正点原子的rk3568上的led为例子打开rk3568-pinctrl.dtsi文件RK3568上的所有的引脚描述都是在该文件中。在文件中的pinctrl节点里面添加以下led-gpios{ /omit-if-no-ref/ led_gpio: led-pin { rockchip,pins 0 RK_PC0 RK_FUNC_GPIO pcfg_pull_none; }; };上述代码描述了 将GPIO0_C0 描述为GPIO功能。2、在设备树中创建设备节点接下来在设备树中创造设备节点来描述设备信息重点是要设置好compatible的值因为platfrom总线通过设备节点的compatible属性来匹配驱动gpioled { compatible alientek,led; pinctrl-names alientek,led; pinctrl-0 led_gpio; led-gpio gpio0 RK_PC0 GPIO_ACTIVE_HIGH; status okay; };第二行为compatibel 属性是alientek,led因此在写platfrom驱动的时候of_match_table 属性表里面要有“alientek,led”。第四行pinctrl-0属性设置LED的pin对应的pinctrl节点也就是上面写的led-gpio3、编写platfrom驱动的时候要注意兼容属性在使用设备树的时候platfrom驱动会通过of_match_table来保存兼容性值也就是表明此驱动兼容哪些设备。所以of_match_table将会尤为重要static const struct of_device_id led_of_match[] { { .compatible alientek,led }, /*兼容属性*/ { /* Sentinel*/ } }; MODULE_DEVICE_TABLE(of,led_of_match); static struct platfrom_driver led_platform_driver { .driver { .name rk3568-led, .of_match_table led_of_match, }, .probe led_probe, .remove led_remove, };1-4行 是一个数组 所以一个驱动可以匹配很多个设备上面代码只写了一个alientek,led设备这里的必须和设备树里面的compatible保持一致因此相应的probe函数就会启动下面一行是MODULE_DEVICE_TABLE声明一下led_of_match这个匹配表。设置platform_driver 中的of_match_table 匹配表为上面创建的leds_of_match至 此我们就设置好了platform驱动的匹配表了。检查引脚复用检查pinctrl配置在实际项目中 需要检查该引脚是不是配置了其他功能某些时刻一个引脚可以被复用很多功能但是在特殊情况下必须关闭复用为其他功能在linux下必须保持一个功能一个引脚来设计硬件。