如何将自己的驱动程序添加到内核,让用户可以访问到我们的驱动呢。我们可以通过把驱动程序以杂项设备的形式注册到内核,并且自动生成设备节点。这样用户层就可以通过对设备节点的操作完成对驱动的控制。
设备节点可以理解为内核提供给应用层可以操作的文件。存放路径为/dev ,可以在这里查看到所有的可用设备。
1:图解杂项设备的注册流程
2:杂项设备注册框架代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
/*文件操作集,用于上层应用的调用*/
static struct file_operations XXX_fops = {
.owner = THIS_MODULE,
/*
......
*/
};
/*注册杂项设备机构体*/
static struct miscdevice XXX_dev = {
.minor = MISC_DYNAMIC_MINOR, /*自动分配次设备号*/
.name = "misc_dev", /*创建成功后生成节点 /dev/misc_dev*/
.fops = &XXX_fops, /*文件操作集结构体成员导入*/
};
/*驱动模块加载函数*/
static int XXX_init(void)
{
int ret;
printk(KERN_ALERT "module insmod success!\n");
/*向内核注册杂项设备*/
ret = misc_register(&XXX_dev);
if(ret<0)
{
printk(KERN_ALERT "misc device register fail!\n");
return -1;
}
printk(KERN_ALERT "misc device register success!\n");
return 0;
}
/*驱动模块卸载函数*/
static void XXX_exit(void)
{
/*从内核注销杂项设备*/
misc_deregister(&XXX_dev);
printk(KERN_ALERT "module rmmod success!\n");
}
module_init(XXX_init);
module_exit(XXX_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("小小技术宅");
3:测试编写好的驱动
打开超级终端加载驱动
显示模块已经加载成功,并且杂项设备注册成功。
查看是否生成了设备节点
这里已经成功生成了设备节点。
卸载模块,并且查看设备节点是否注销
到这里我们就完成杂项设备的注册!应用层的程序就可以通过调用这个设备节点对驱动进行操作了!