字符设备驱动
- 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
- /dev下创建设备
以上只是在/proc/devices上创建了设备,并不会在/dev/下创建设备,必须要配合以下函数才能完成完整的注册过程(通知udev进行节点创建)- class_create
- device_create