驱动学习之register_chrdev_region函数和cdev结构体
admin
2023-08-02 19:46:52
0次

1:register_chrdev_region

int register_chrdev_region(dev_t from, unsigned count, const char *name)
{
    struct char_device_struct *cd;
    dev_t to = from + count;
    dev_t n, next;

    for (n = from; n < to; n = next) {
        next = MKDEV(MAJOR(n)+1, 0);
        if (next > to)
            next = to;
        cd = __register_chrdev_region(MAJOR(n), MINOR(n),
                   next - n, name);
        if (IS_ERR(cd))
            goto fail;
    }
    return 0;
fail:
    to = n;
    for (n = from; n < to; n = next) {
        next = MKDEV(MAJOR(n)+1, 0);
        kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
    }
    return PTR_ERR(cd);
}

  register_chrdev_region函数和register_chrdev函数类似,也是用于字符设备驱动的注册,不同点在于register_chrdev函数在注册字符设备驱动的时候是一步完成的,而register_chrdev_region函数在注册字符设备驱动的时候是分两步完成的:

第一步:注册/分配主次设备号

第二步:注册字符设备驱动

此外有register_chrdev_region函数的源码可以发现,register_chrdev_region可以同时注册多个设备号

2:cdev结构体的定义

struct cdev {
    struct kobject kobj;    //每个cdev都是一个kobject
    struct module *owner;  //指向实现驱动的模块
    const struct file_operations *ops;   //操作这个字符设备的方法
    struct list_head list;  //与cdev对应的字符设备文件的inode->i_devices的链表头
    dev_t dev;     //起始的设备号
    unsigned int count;  //设备号的范围,也可以用于计数等,起始就是一个普通的变量
};

cdev结构体的定义在linux/cdev.h中,这个结构体的定义是用于描述一个设备驱动

注册函数相关的函数

cdev_alloc:给cdev结构体分配内存(指针实例化)

cdev_init:绑定cdev和file_operations

cdev_add:注册设备

cdev_del:注销设备

3:dev_t类型

    dev_t类型其本质就是一个unsigned int 类型的变量,这个变量用于存放主次设备号,比如高16位存放主设备号,低16位存放次设备号,具体哪些位用来存放主设备号,哪些位用来存放次设备号要看具体的定义。

4:设备号相关的三个宏

MKDEV:由主次设备号换算得到一个设备号

#define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))
ma:主设备号
mi:次设备号

MAJOR:从设备号中取出主设备号

#define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))

MINOR:从设备号中取出次设备号

#define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...