一、分配和释放设备号
老式设备注册的弊端:使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可
- 需要我们事先确定好哪些主设备号没有使用。
- 会将一个主设备号下的所有次设备号都使用掉,比如现在设置 LED 这个主设备号为200,那么 0~1048575(2^20-1)这个区间的次设备号就全部都被 LED 一个设备分走了。这样太浪
费次设备号了!一个 LED 设备肯定只能有一个主设备号,一个次设备号。
新式申请设备号:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
int register_chrdev_region(dev_t from, unsigned count, const char *name)
注销设备号:
void unregister_chrdev_region(dev_t from, unsigned count)
linux源码分析:
int major; /* 主设备号 /
int minor; / 次设备号 /
dev_t devid; / 设备号
if (major) { /* 定义了主设备号 /
devid = MKDEV(major, 0); / 大部分驱动次设备号都选择 0 / register_chrdev_region(devid, 1, “test”);
}
else
{ 没有定义设备号 *
alloc_chrdev_region(&devid, 0, 1, “test”); / 申请设备号
major = MAJOR(devid); /* 获取分配号的主设备号 /
minor = MINOR(devid); / 获取分配号的次设备号 */
}
二、新的字符设备注册方法
- 在 Linux 中使用 cdev 结构体表示一个字符设备
- struct cdev test_cdev;创建字符设备
- cdev_init(struct cdev *cdev, const struct file_operations *fops)
- int cdev_add(struct cdev *p, dev_t dev, unsigned count)