platform 驱动框架

67 篇文章 15 订阅

所谓的 platform 驱动并不是独立于字符设备驱动、块设备驱动和网络设备驱动之外的其他种类的驱动。platform 只是为了驱动的分离与分层而提出来的一种框架,其驱动的具体实现还是需要字符设备驱动、块设备驱动或网络设备驱动。

/* 设备结构体 */
	struct xxx_dev{  
		struct cdev cdev; 
 		/* 设备结构体其他具体内容 */
};
 
 struct xxx_dev xxxdev; /* 定义个设备结构体变量 */
 
 static int xxx_open(struct inode *inode, struct file *filp) 
 { 
 	/* 函数具体内容 */
 	return 0;
 }

 static ssize_t xxx_write(struct file *filp, const char __user *buf,size_t cnt, loff_t *offt)
 {
	 /* 函数具体内容 */
	 return 0;
 }

 /*
* 字符设备驱动操作集
 */
 static struct file_operations xxx_fops = {
	 .owner = THIS_MODULE,
 	 .open = xxx_open,
	 .write = xxx_write,
 };

 /*
 * platform 驱动的 probe 函数
 * 驱动与设备匹配成功以后此函数就会执行
 */
 static int xxx_probe(struct platform_device *dev)
 { 
 	......
 	cdev_init(&xxxdev.cdev, &xxx_fops); /* 注册字符设备驱动 */
 	/* 函数具体内容 */
 	return 0;
 }

 static int xxx_remove(struct platform_device *dev)
 {
 	......
 	cdev_del(&xxxdev.cdev);/* 删除 cdev */
 	/* 函数具体内容 */
 	return 0;
 }

 /* 匹配列表 */
 static const struct of_device_id xxx_of_match[] = {
 	{ .compatible = "xxx-gpio" },
 	{ /* Sentinel */ }
 };

 /* 
 * platform 平台驱动结构体
 */
 static struct platform_driver xxx_driver = {
 	.driver = {
 	.name = "xxx",
 	.of_match_table = xxx_of_match,
 	},
 	.probe = xxx_probe,
	.remove = xxx_remove,
 };
 
 /* 驱动模块加载 */
 static int __init xxxdriver_init(void)
 {
 	return platform_driver_register(&xxx_driver);
 }

 /* 驱动模块卸载 */
 static void __exit xxxdriver_exit(void)
{
 	platform_driver_unregister(&xxx_driver);
}

 module_init(xxxdriver_init);
 module_exit(xxxdriver_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Jason");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Linux系统开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值