在使用设备树的情况下,无需自己手动注册 platform 设备,在开发板上电加载Linux 内核和设备树的时候,就已经将设备树信息转换成 platform_device 类型了。因此,在使用设备树的情况下,只需要编写 platform 驱动。
为了防止自己新增的节点和设备树原本的发生冲突,建议注释原本的节点。
一、添加设备树节点
这里使用自己创建的节点只是为了熟悉匹配流程,当然也可以使用原本的节点,只需要保证在注册 platform 驱动时 compatible 变量的值和设备树中 compatible 属性的值保持一致即可。(因为platform 驱动与设备树匹配时,依赖 compatible 属性)
再次强调,这里新增LED节点的 compatible 属性值为 alientek-led。(后续要用到)
gpio-led {
compatible = "alientek-led";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_leds>;
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
interrupt-parent = <&gpio1>;
interrupts = <3 IRQ_TYPE_EDGE_RISING>;
status = "okay";
};
二、platform 驱动注册
整体逻辑与不使用设备树时的一样,需额外新增 compatible 属性,上面也提到了 platform 驱动与设备树匹配时,依赖 compatible 属性。
第一步,在 platform_driver 的实例中添加 of_match_table 变量的定义。
static struct platform_driver led_driver = {
.driver = {
.name = "imx6ull-led",
.of_match_table = led_of_match, // 匹配表
},
.probe = led_probe,
.remove = led_remove,
};
第二步,定义 led_of_match 变量。compatible 属性在这里添加,这里的 compatible 变量的值需要与上面设备树的 compatible 属性值保持一致。
struct of_device_id led_of_match[] = {
{ .compati