上一章里在设备树中添加了设备的硬件信息,这一章里搭建驱动框架,并填充操作信息。
(一)平台总线设备驱动框架。
平台总线设备同字符驱动设备一样,需要出入口函数,不同的是出入口函数中只对平台总线驱动结构体进行操作,代码如下:
static const struct of_device_id ask100_sr501[] = {
{.compatible = "100ask,sr501" },
{ },
};
static struct platform_driver sr501_driver = {
.probe = sr501_probe,
.remove = sr501_remove,
.driver = {
.name = "100ask,sr501",
.of_match_table = ask100_sr501,
},
};
static int __init sr501_init(void)
{
int err;
printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
err = platform_driver_register(&sr501_driver);
return err;
}
/* 3. 有入口函数就应该有出口函数:卸载驱动程序时,就会去调用这个出口函数
* 卸载platform_driver
*/
static void __exit sr501_exit(void)
{
printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
platform_driver_unregister(&sr501_driver);
}
以上代码完成平台总线设备驱动的注册,当系统检索到设备树中有compatible属性为"100ask,sr501"的设备时,就会自动调用驱动的probe句柄了。
使用insmod sr501.ko命令加载驱动模块以后,就可以在下图的文件夹中查找到对应的平台设备驱动。
(二)字符设备驱动
仅有平台设备的框架,还是不能操作这个设备的,所以还要添加字符设备驱动的内容。
首先要在probe句柄中提取硬件设备信息,方便之后读取设备值
//提取设备树中的GPIO信息
sr501_gpio=gpiod_get(&pdev->dev,NULL,0);
if(IS_ERR(sr501_gpio))
{
dev_err(&pdev->dev,"Fail to get GPIO for sr501\n");
return PTR_ERR(sr501_gpio);
}
然后,注册字符设备驱动,并添加辅助信息
major = register_chrdev(0, "100ask_sr501", &sr501_drv);
//设备辅助信息,创建设备文件,方便应用程序调用。
sr501_class = class_create(THIS_MODULE, "100ask_sr501_class");
if (IS_ERR(sr501_class)) {
printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
unregister_chrdev(major, "100ask_sr501");
gpiod_put(sr501_gpio);
return PTR_ERR(sr501_class);
}
device_create(sr501_class, NULL, MKDEV(major, 0), NULL, "100ask_sr501");
有了这部分内容,就可以在系统中看到可供应用调用的设备节点了
那怎样读取硬件信息并验证是否正确呢?下一篇就会讲解,别走开~~~~