在Linux设备驱动开发中,分为三种驱动形式:字符驱动、块驱动、网络驱动。其中,最简单的是字符驱动,虽然三种驱动存在差异,但是其开发思想是相通的。下文主要介绍字符驱动开发的一些流程。
关于字符驱动开发,最重要的两个数据结构为cdev和file_operations,驱动的具体操作就是在操作这两个结构体。
1. cdev 结构体
struct cdev{
struct kobject kobj;
struct module *owner;
struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
在结构体中,dev_t定义了字符设备的设备号,为32位,其中高12位为主设备号,低20位为次设备号。我们可以采用下列宏从dev_t中获得主、次设备号。
MAJOR(dev_t dev) 获取主设备号
MINOR(dev_t dev) 获取次设备号 同样可以利用宏MKDEV(int major, int minor) 来获取设备号dev_t.
2. file_operations 结构体
file_operations结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open()、read()、write()、close()、等系统调用时最终被调用。
struct file_operations xxx_fopes{
.owner = THIS_MODULE;
.read = xxx_read;
.write = xxx_write;
.ioctl = xxx_ioctl;
…
};
3. 关联cdev与file_operations的重要函数void cdev_int(struct cdev , struct file_operations );
void cdev_init(struct cdev *cdev, struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}
这是我的第一篇博文,写的很不好。