【文件属性】:
文件名称:释放设备号-基于himawari-8卫星的沙尘监测
文件大小:7.57MB
文件格式:PDF
更新时间:2024-06-29 20:20:57
嵌入式linux 周立功
(2)动态获取主设备号
如果事先不知道设备的设备号,或者一个驱动可能在多个系统上运行,为了避免出现设
备号冲突,必须采用动态设备号。调用 alloc_chrdev_region 函数可以从系统获得一个或者多
个主设备号。alloc_chrdev_region 函数在中定义:
alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
alloc_chrdev_region 函数可以从系统动态获得一个或者多个主设备号。dev 用于保存已
经获得的编号范围的第一个值,firstminor 是第一个次设备号,通常是 0,count 是获得的编
号数量,name 是设备名称。
动态获取得到的设备号,一定要用一个全局变量保存下来,以便卸载使用,否则该设备
号将不能被释放。程序清单 2.7 是一个动态获取设备号的使用范例。
程序清单 2.7 动态获取设备号
ret = alloc_chrdev_region(&devno, minor, 1, "char_cdev"); /* 从系统获取主设备号 */
major = MAJOR(devno); /* 保存获得的主设备号 */
if (ret < 0) {
printk(KERN_ERR "cannot get major %d \n", major);
return -1;
}
一个设备号一旦被系统分配,就会出现在/proc/devices 文件中。为了使用方便,除非特
殊情况,请尽量采用动态分配设备号。
(3)释放设备号
在设备注销的时候必须释放占用的主设备号,调用 unregister_chrdev_region 可以释放设
备号。函数原型:
void unregister_chrdev_region(dev_t from, unsigned count);
2.2.3 设备的注册和注销
2.6 内核用 cdev数据结构来描述字符设备,cdev在中定义,如程序清单 2.8
所示。
程序清单 2.8 cdev 结构定义
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;