一个完整的驱动程序框架至少应该包括设备的创建,卸载。即使用insmod
以后能够在/dev/
目录下生成 xxx 的设备。
查看是否加载成功,以及是否在/dev
目录下生成xxx设备节点。
$ ls /dev/xxx
该结构体用来描述设备的各个接口,其中包含所要实现的各成员函数,比如:open read write ...
static struct file_operations second_drv_fops = {
.owner = THIS_MODULE, // 这是一个宏,指向编译模块时自动创建的__this_module变量
.open = second_drv_open,
.read = second_drv_read,
};
static int second_drv_open(struct inode * inode, struct file * file)
{
return 0;
}
ssize_t second_drv_read(struct file * file, char ____user * buf, ssize_t size, loff_t * ppos)
{
return 0;
}
static int second_drv_init(void)
{
return 0;
}
static void second_drv_exit(void)
{
return 0;
}
##修饰一下入口函数和出口函数,再加上许可
module_init(second_drv_init);
module_exit(second_drv_exit);
MODULE_LECENSEE_LICENSE("GPL");
这样驱动程序就算是完成了,但是,这样的一个驱动程序并不通自己生成设备号等详细信息,那么,
我们再把驱动程序完善一下,系统给我们提供了一个很好用的工具mdev
,那么我们应该怎么使用这个工具呢。
过程分为那么几步走 1 创建一个类,并且在这个类下面创建一个设备。
static struct class *seconddrv_class;
static struct class_device *seconddrv_class_dev;
2 在second_drv_init
函数中实现对设备的创建,并记录设备的主设备号。在
int major;
static int second_drv_init(void)
{
major = register_chrdev(0, "second_drv", &sencod_drv_fops);
seconddrv_class = class_create(THIS_MODULE, "second_drv");
seconddrv_class_dev = class_device_create(seconddrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); // /dev/buttons
return 0;
}
到此,一个基本的驱动程序框架做好了,该驱动程序可以让系统自动创建设备,并分配设备号。剩下的就是硬件相关的部分了,相当于单片机编程。