一次静态注册多个设备:
region_dev->major_region_dev = 222;
//静态注册需指定主设备号
region_dev->minor_region_dev = 0;
//静态注册指定第一个次设备号
region_dev->dev_no = MKDEV(region_dev->major_region_dev , region_dev->minor_region_dev);
//使用MKDEV宏将主次设备号合成一个最终的设备号
chk = register_chrdev_region(region_dev->dev_no, 1, "region_dev");
//使用register_chrdev_region函数
//arg1:第一个设备号(最终设备号),
//arg2:从第一个设备号的子设备号开始,连续注册几个
//arg3:设备名
/*
原型:
/**
* register_chrdev_region() - register a range of device numbers
* @from: the first in the desired range of device numbers; must include
* the major number.
* @count: the number of consecutive device numbers required
* @name: the name of the device or driver.
*
* Return value is zero on success, a negative error code on failure.
*/
int register_chrdev_region(dev_t from, unsigned count, const char *name){
...
}
*/
动态注册:无需指定主次设备号:
//arg1:要把申请到的第一个设备号(最终设备号放哪里)
//arg2:指定申请时次设备号从哪里开始
//arg3:要注册几个
//arg4:名
chk = alloc_chrdev_region(®ion_dev->dev_no , 0, 1, "region_dev");
region_dev->major_region_dev = MAJOR(region_dev->dev_no);
//用此宏从最终设备号中拆分出主设备号
region_dev->minor_region_dev = MINOR(region_dev->dev_no);
//用此宏从最终设备号中拆分出次设备号
使用了上面的,就需自行将cdev和file_operations结构体绑定,并将cdev加入到内核:
cdev是一个结构体,每个字符设备都对应一个。
struct cdev {
struct kobject kobj;
struct module *owner<