字符设备驱动

  1. proc/devices下创建设备
    创建字符设备大致有两种方式,但是归根结底只有一种方式
    • 方式1:使用register_chrdev来注册,但这种方式弊端非常明显,会将次设备号为0-255的设备全部占用,即该主设备号的所有字符设备只能对应一个fops
    register_chrdev(MISC_MAJOR,"misc",&misc_fops)
            return __register_chrdev(major, 0, 256, name, fops);    // 全部占用
                cd = __register_chrdev_region(major, baseminor, count, name);
                cdev = cdev_alloc();
                err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
- 方式2:主设备号为major,指定次设备号0-xxx的字符设备对应某个fops
    devid = MKDEV(major, 0);
    rc = register_chrdev_region(devid, PC8736X_GPIO_CT, DEVNAME);
    cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fileops);
    cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT);

综上可以发现,方式2其实是方式1的展开,方式1方便但是缺点明显(霸占了所有的次设备号),方式2可以让一个主设备号能够对应多个驱动程序,所以一般推荐使用方式2

  1. /dev下创建设备
    以上只是在/proc/devices上创建了设备,并不会在/dev/下创建设备,必须要配合以下函数才能完成完整的注册过程(通知udev进行节点创建)
    • class_create
    • device_create
posted @ 2018-01-18 18:02  __千里之行  阅读(124)  评论(0编辑  收藏  举报