对驱动程序的字符设备的操作整体可以分为两部分,分别是对设备号的操作和对设备的操作。
一、基础知识
1.主设备号用来辨别哪类设备,次设备号用来辨别哪个设备(同类型的设备)。
2.用dev_t来描述住次设备号,其实主次设备号的描述就是一个32位的整数。高12位是主设备号,低20十位是次设备号。
3.使用MAJOR(dev_t dev)宏提取主设备号,使用MINOR(dev_t dev)宏来提取次设备号。
4.字符设备文件通过主设备号来和字符设备驱动建立联系。
下面主要说的是设备号的操作:
二、分配主设备号的方式
1.静态申请
①根据Documentation/devices.txt,确定一个没有使用的主设备号。
缺点是容易冲突。
②int register_chrdev_region(dev_t from,unsigned count, const char *name)
参数:
from:希望申请使用的设备号
count:希望申请使用设备号数目
name:设备名(体现在/proc/devices)
静态申请的缺点是容易冲突,因为一旦驱动被广泛使用, 这个随机选定的主设备号可能会致设备号冲突,而使驱动程序无法注册。
2.动态分配
函数:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)
参数:
dev:分配到的设备号
baseminor:起始次设备号
count:需要分配的设备数目
name:设备名(体现在/proc/devices)
缺点:无法在安装驱动前创建设备文件(因为安装前还没有分配到主设备)。
解决办法:
安装驱动后, 从 /proc/devices 中查询设备号。
三、注销设备号
注销设备号是字符驱动程序必须的过程。因为不论使用何种方法分配设备号,都应该在不再使用它们时释放这些设备号。
函数:void unregister_chrdev_region(dev_t from, unsigned count);
下面主要说的是设备文件的操作:
四、创建一个设备文件
1.手动创建:使用mknod 命令。
执行mknod命令的格式:mknod filename type major minor
参数:filename:设备文件名
type: 设备文件类型
major: 主设备号
minor: 次设备号
2.自动创建。
五、linux字符驱动三种最重要的数据结构
1.struct file
struct file代表一个打开的文件。系统中每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建, 在文件关闭后释放。
重要成员:loff_t f_pos /*文件读写位置*/
struct file_operations *f_op
2.stuct inode
用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。
重要成员:dev_ti_rdev:设备号
3.struct file_operations
一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱
动中的函数, 这些函数实现一个特别的操作, 对于不支持的操作保留为NULL。
六、应用程序最终怎么找到驱动程序
1.设备注册
字符设备的注册可分为如下3个步骤:
① 分配cdev
分配可使用cdev_alloc函数来完成。
函数:structcdev *cdev_alloc(void)
②初始化cdev
初始化使用cdev_init函数来完成。
函数:void cdev_init(struct cdev *cdev, const struct file_operations *fops)
参数:cdev: 待初始化的cdev结构
fops: 设备对应的操作函数集
③添加cdev
添加使用cdev_add函数来完成。
函数:int cdev_add(struct cdev *p, dev_t dev, unsigned count)
参数:p: 待添加到内核的字符设备结构
dev: 设备号
count: 添加的设备个数
2.设备操作
int (*open)(structinode *, struct file *)在设备文件上的第一个操作,并不要求驱动程序
一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。
void (*release)(struct inode *, struct file *)当设备文件被关闭时调用这个操作。与open相仿,release也可以没有。
还有很多其他的设备操作函数,如读取、选择、控制等。
3.设备注销
函数:intcdev_del(structcdev *p)
参数:p: 要注销的字符设备结构
下面附上读函数的数据模型一张。