设备分类
字符设备 | 块设备 | 网络设备 | |
访问方式 | 顺序访问,字节为单位 | 随机访问,固定大小为单位访问 | |
设备 | 键盘,键盘 | 磁盘[扇区],FLASH[读:页,写:块] | |
有无缓冲 | 没有 | 有 | |
有无设备文件 | 有 | 有 | 没有 |
设备号
dev_t devno; //32位的整数devno = MKDEV(major, minor);31~20 主设备号,用于识别不同类型的设备19~0 次设备号,用于识别相同类型的不同设备
创建设备节点
查看已经申请的设备节点mknod 类型 主设备号 次设备号
查看/proc/devices
字符设备驱动制作
- 申请设备号
- 静态方式
- dev_t devno = MKDEV(major, minor);
- register_chrdev_region(devno, 申请的数量, "设备名称"); //静态申请,可能重复导致不能申请成功
- 动态方式
- dev_t devno = 0;
- alloc_chrdev_region(&devno, 次设备号, 申请的数量, "设备名称"); //动态申请,第一个设备号保存在devno中,设备号连续
- 静态方式
- 实现操作集合
- 定义struct file_operations结构体变量,并实现操作
- 其中owner = THIS_MODULE
- 注册字符设备
- 创建struct cdev cdev;变量, 并实例化
- 调用cdev_init
- 设置cdev.owner = THIS_MODULE;
- 添加到字符设备链表中,进行cdev_init,完成注册cdev_add
- 卸载函数中从列表中删除cdev, 释放设备号
设备驱动在内核中的结构