文章目录
前言
基于总线、设备和驱动这样的驱动框架, Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动。
一、platform是什么?
platform 驱动框架分为总线、设备和驱动,其中总线是 Linux 内核提供的,不需要我们管理。使用设备树时,设备的描述被放到了设备树中,所以设备也不需要管,只需要实现platform_driver(驱动)即可。
加载成功可在/sys/bus/platform/drivers/目录下查看驱动是否存在。
二、编写步骤
1.在设备树中创建设备节点
在设备树中创建节点描述设备信息,compatible属性很重要,因为 platform 总线需要通过设备节点的 compatible 属性值来匹配驱动。
在使用设备树的时候 platform 驱动会通过 of_match_table 来保存兼容性值,匹配对应设备,加载驱动。
例如一个LED设备节点,compatible属性值为"my_led",若驱动程序中的.driver下的.of_match_table 与之一致,则会执行probe函数。
led{
compatible = "my_led";
status = "okay";
led-gpio = <&gpio 38 GPIO_ACTIVE_HIGH>
};
2.注意兼容属性
驱动中的兼容用一个结构体数组来表示:
static const struct of_device_id leds_of_match[] = {
{
.compatible = "my_led" }, /* 兼容属性 */
{ /* Sentinel */ }
};
static struct platform_driver leds_platform_driver = {
.driver = {
.name = "zynq-led", // /sys/bus/platform/drivers/目录下存在一个名为zynq-led的文件
.of_match_table = leds_of_match,
}
.probe = leds_probe,
.remove = leds_remove,
};
of_device_id 代表结构体数组,即驱动的兼容表,匹配则对应的probe会执行,最后一个元素一定要为空。
MODULE_DEVICE_TABLE 声明leds_of_match这个设备匹配表,该宏一般用于热插拔设备动态加载卸载中。
driver 将leds_of_match匹配表绑定到platform驱动结构中,若与设备树节点中的compatible一致,则会跳入leds_probe执行。
3.编写 platform 驱动
当驱动和设备匹配成功就会执行probe函数,执行类似字符设备那一套。简单框架如下:
static int myled_probe(struct platform_device *pdev)
{
struct device_node *nd = pdev->dev.of_node;
//设备树匹配下,platform_device中内置一个 struct device 类型的变量 dev,dev.of_node即为设备中定义的节点
}
static int myled_remove(struct platform_device *dev)
{
;
}
static const struct of_device_id leds_of_match[] = {
{
.compatible = "my_led" }, /* 兼容属性 */
};
static struct platform_driver myled_driver = {
.driver = {
.name = "zynq-led", // /sys/bus/platform/drivers/zynq-led
.of_match_table = leds_of_match, // 设备树匹配表,用于和设备树中定义的设备匹配
},
.probe = myled_probe, // probe 函数
.remove = myled_remove, // remove 函数
};
static int __init myled_driver_init(void)
{
return platform_driver_register(&myled_driver);
}
static void __exit myled_driver_exit(void)
{
platform_driver_unregister(&myled_driver);
}
module_init(myled_driver_init);
module_exit(myled_driver_exit);
总结
以上就是今天要讲的内容,本文介绍了设备树下platform驱动的编写,制作不易,多多包涵。
标签:driver,platform,myled,驱动,编写,树下,match,设备 From: https://blog.csdn.net/qq_40514606/article/details/139810946