字符设备驱动有两个重要的数据结构1.dev_t 用于描述设备的主从设备号 2.struct cdev用于描述字符设备的结构体
1.在内核中,dev_t裂隙用来保存设备的编号——包括主设备号和次设备号。dev_t是一个32位的结构体,其中12位是一个主设备号,20位是一个次设备号。我同可以从dev_t中获取主从设备号:
MAJOR(dev_t dev);
MINOR(dev_t dev);
相反,如果要将主从设备号转换成dev_t类型,则
MKDEV(int major, int minor);
2.分配和释放设备编号
在建立一个字符设备之前,我们首先应该获取一个设备号。有两个函数可以实现
a。int register_chrdev_region(dev_t first, unsigned int count, char *name)
如果我们明确知道所需要的设备编号可以用这个函数
first 是指分配开始的主设备号,
count是指要连续分配的设备号个数。
name是设备的名称
b。int alloc_chrdev_region(dev_t * dev, unsigned int firstminor, unsigned int count, char *name);
这个函数是系统分配未使用的设备号。
dev是一个输出参数,用于输出生成的设备号。
3.用完之后应该释放这些设备号;
void unregistered_chrdev_region(dev_t firsr, unsigned int count)
4,在获取到设备号之后,我们给这个设备注册一些操作函数,这些函数主要在file_operation结构中。包括读、写、打开、释放、ioctl等。
5.申请一个cdev结构体,然后初始化,添加到系统中。
struct cdev *my_dev = cdev_alloc();分配一个cdev结构体
void cdev_init(struct cdev *dev, struct file_operation *fops); 初始化一个cdev结构体
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);向系统添加一个字符设备
6.最后用完后应该从系统中移除一个字符设备,
void cdev_del(struct *dev);
至此,一个字符设备基本生成并添加到内核中,在/proc/device中可以看到相应设备号的设备了。然后在/dev目录下建立相应的设备节点(命令 mknod c 主设备号 次设备号)