主次设备号:
一般请情况下,主设备号用来标识设备驱动对应的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。内核中,一般用dev_t类型来保存设备编号,将主次设备转换为dev_t类型的宏 MKDEV(int major, int minor)
分配和释放设备编号:
主要由两种方法 1)、明确知道设备编号,则使用register_chrdev_region();
2)、对于一个新设备,建议使用动态分配机制alloc_chrdev_region();
通常情况下,我们不需要cdev结构本身,而是希望包含cdev结构的scull_dev结构,内核源码中通过container_of(inode->i_cdev, struct scull_dev, cdev),来实现这种操作。
字符设备的注册:
staticvoid xxx_setup_cdev(struct xxx_dev *dev, int index)
㈠、驱动的初始化:
1.1分配设备描述结构(struct cdev)---两种分配方式:静态分配和动态分配
1>静态分配:struct cdev mdev;
2>动态分配:struct cdev *pdev = cdev_alloc();
注:注册设备号(动态)alloc_chrdev_region
1.2初始化设备描述结构---- cdev_init()函数;<linux/cdev.h>
函数原型:voidcdev_init(struct cdev *cdev, const struct file_operations *fops);
参数:
cdev: 待初始化的cdev结构
fops:设备对应的操作函数集
注:将设备结构与操作其设备的函数集相关联。
1.3注册设备描述结构---cdev_add()函数;<linux/cdev.h>
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
参数:
p:待添加到内核的字符设备结构
dev:设备号
count:该类设备的设备个数