Skip to content

Latest commit

 

History

History
86 lines (68 loc) · 2.43 KB

ch1_02-驱动程序框架.md

File metadata and controls

86 lines (68 loc) · 2.43 KB

驱动程序框架

一个完整的驱动程序框架至少应该包括设备的创建,卸载。即使用insmod以后能够在/dev/目录下生成 xxx 的设备。 查看是否加载成功,以及是否在/dev目录下生成xxx设备节点。

$ ls /dev/xxx

首先创建一个file_operations结构体

该结构体用来描述设备的各个接口,其中包含所要实现的各成员函数,比如:open read write ...

static struct file_operations second_drv_fops = {
    .owner = THIS_MODULE,   // 这是一个宏,指向编译模块时自动创建的__this_module变量
    .open = second_drv_open,
    .read = second_drv_read,
};

实现file_operations中所描述的成员函数

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;
}

到此,一个基本的驱动程序框架做好了,该驱动程序可以让系统自动创建设备,并分配设备号。剩下的就是硬件相关的部分了,相当于单片机编程。

实验结果如下:

驱动加载成功:

设备节点创建成功