全部博文(1493)
分类:
2012-07-11 08:28:38
原文地址:Linux字符设备驱动 作者:pingchang2012
在Linux中有一句哲学“Linux下皆文件”,设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
Linux设备驱动程序的分类:
Linux设备驱动程序分为字符设备驱动(无缓冲且只能顺序存取),块设备驱动程序(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主次设备号,主设备号相同的设备是同类设备(使用同一驱动程序)(1)块设备:系统中能够随机(不需要按顺序)访问固定大小数据片(chunk)的设备被称作块设备;他们都是以安装文件系统的方式使用的(2)字符设备:字符设备按照字符流动的方式被有序访问
在内核中,dev_t类型用来保存设备编号(包括主设备号和次设备号),dev_t是一个32位的数,12位表示主设备号,20为表示次设备号
(1)主设备号 = MAJOR(dev_t dev)
(2)次设备号 = MINOR(dev_t dev)
(3)设备编号 = MKDEV(int major,int minor)
分配和释放设备号:
(1)int register_chrdev_region(dev_t first,unsigned int count,char *name);
(2)int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
(3)void unregister_chrdev_region(dev_t first,unsigned int count);
注册字符设备
在获得了设备号范围之后,需要将设备添加到字符设备数据库中,以激活设备。这需要用cdev_init函数初始化一个struct cdev的实例,然后调用cdev_add函数
(1)void cdev_init(struct cdev *cdev,struct file_operation *fops);
函数用于初始化cdev的成员,并建立cdev和file_operations之间的连接
(2)int cdev_add(struct cdev *dev,dev_t num,unsigned int count)
(3)void cdev_del(stuct cdev *dev)
cdev_add()函数和cdev_del()函数分别向系统添加和删除一个cdev,完成字符设备的注册和注销。对cdev_add()的调用通常发生在字符设备驱动模块加载函数中,
而对cdev_del()函数的调用则通常发生在字符设备驱动模块卸载函数中
cdev 一般它有两种定义初始化方式:静态的和动态的
1>静态内存定义初始化:
struct cdev my_cdev;
cdev_init(&my_cdev, &fops);
my_cdev.owner = THIS_MODULE;
2>动态内存定义初始化:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &fops;
my_cdev->owner = THIS_MODULE;
实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,class_creat 以及 device_creat 来实现自动在 /dev 下自动创建节点