Linux系统中platform平台框架包括总线、设备和驱动,其中总线不用我们去操心,Linux内核中会自动管理,我们只需要关系设备和驱动如何实现。在不支持设备树的内核中,我们需要分别实现 platform_device 和 platform_driver,其中platform_device是在平台文件中实现的。在支持设备树的内核中,我们就不用实现platform_device了,而是在设备树文件中添加设备信息。下面看一下在设备树文件中添加设备信息。
在之前关于设备树语法的章节中,我们学习了如何在根节点“/”下去添加一个设备节点信息。其中最重要的就是compatible 属性值,compatible 属性使用来和驱动进行匹配的。下面是本实验用到的LED灯设备的设备节点:
1 gpioled {
2 #address-cells = <1>;
3 #size-cells = <1>;
4 compatible = "gpioled";
5 pinctrl-names = "default";
6 pinctrl-0 = <&pinctrl_led>;
7 led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
8 status = "okay";
9 };
在使用设备树的时候 platform 驱动会通过 of_match_table 来保存兼容性值,也就是表明此驱动兼容哪些设备。所以,of_match_table 将会尤为重要,比如本实验的 platform 驱动中 platform_driver 就可以按照如下所示设置:
1 static const struct of_device_id leds_of_match[] = {
2 { .compatible = "gpioled" }, /* 兼容属性 */
3 { /* Sentinel */ }
4 };
5
6 MODULE_DEVICE_TABLE(of, leds_of_match);
7
8 static struct platform_driver leds_platform_driver = {
9 .driver = {
10 .name = "imx6ul-led",
11 .of_match_table = leds_of_match,
12 },
13 .probe = leds_probe,
14 .remove = leds_remove,
15 };
第2行,指定compatible匹配信息。
第 6 行,通过 MODULE_DEVICE_TABLE 声明一下 leds_of_match 这个设备匹配表。
第 11 行,设置 platform_driver 中的 of_match_table 匹配表为上面创建的leds_of_match,至此我们就设置好了 platform 驱动的匹配表了。