设备树下的platform驱动编写


前言

基于总线、设备和驱动这样的驱动框架, 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驱动的编写,制作不易,多多包涵。

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值