cdev_init和cdev_add之后在/dev目录下没有长出设备节点原因

因为在linux里面有两种设备文件系统,devfs和sysfs 
devfs 
1) 需要手动创建设备节点mknod fasync_dev c 250 0 
2) 或者在fasync_dev_init函数中添加: 
#ifdef CONFIG_DEVFS_FS //支持devfs文件系统,在内核里面配置 
devfs_mk_cdev(设备号, S_IFCHR | S_IRUGO | S_IWUSR, 设备名称) 
#endif

sysfs 
sysfs通过class_create和device_create在设备树中创建相应的设备,应用层udev会自动根据设备树的变化生成相应的设备节点。

综上:在2.6内核之前通过函数cdev_init和cdev_add添加字符设备,另外还需要手动创建设备节点;在2.6之后的内核,通过cdev_init和cdev_add添加字符设备,通过class_create和device_create函数往sys文件系统中添加设备,udev检测到/sys目录的变动会根据变化在/dev目录下创建对应的设备节点。

参考如下: 
 
 
并且启动脚本中添加echo /sbin/mdev > /proc/sys/kernel/hotplug 
这样当内核class_create和device_create往sys文件系统中添加设备的时候,会调用用户空间的/sbin/mdev可执行程序
--------------------- 
作者:luckywang1103 
来源:CSDN 
原文:https://blog.csdn.net/luckywang1103/article/details/47860805 
版权声明:本文为博主原创文章,转载请附上博文链接!

static int __init oled_driver_init(void) { int error; int ret = -1; //保存错误状态码 /*---------------------注册 字符设备部分-----------------*/ //采用动态分配的方式,获取设备编号,次设备号为0, //设备名称spi_oled,可通过命令cat /proc/devices查看 //DEV_CNT为1,当前只申请一个设备编号 ret = alloc_chrdev_region(&oled_devno, 0, DEV_CNT, DEV_NAME); if (ret < 0) { printk("fail to alloc oled_devno\n"); goto alloc_err; } //关联字符设备结构体cdev与文件操作结构体file_operations oled_chr_dev.owner = THIS_MODULE; cdev_init(&oled_chr_dev, &oled_chr_dev_fops); // 添加设备cdev_map散列表中 ret = cdev_add(&oled_chr_dev, oled_devno, DEV_CNT); if (ret < 0) { printk("fail to add cdev\n"); goto add_err; } /*创建类 */ class_oled = class_create(THIS_MODULE, DEV_NAME); /*创建设备 DEV_NAME 指定设备名,*/ device_oled = device_create(class_oled, NULL, oled_devno, NULL, DEV_NAME); error = spi_register_driver(&oled_driver); if (error < 0) { device_destroy(class_oled, oled_devno); //清除设备 class_destroy(class_oled); //清除类 cdev_del(&oled_chr_dev); //清除设备号 unregister_chrdev_region(oled_devno, DEV_CNT); //取消注册字符设备 } pr_info("oled_driver_init\n"); return error; add_err: // 添加设备失败时,需要注销设备号 unregister_chrdev_region(oled_devno, DEV_CNT); printk(" error! \n"); alloc_err: return -1; } 这是我的 驱动程序注册函数,如果中途不报错,运行结束后可以在/dev中查看到设备
最新发布
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值