一、什么是混杂设备
混杂设备也叫杂项设备,是普通字符设备驱动(struct cdev)的一个封装,可以简化一个普通字符设备驱动的设计流程。
混杂设备的特点:
1)主设备号10,次设备号不同。
2)简化cdev的设计流程
3)使用上和cdev是没有差异。
二、查看一下系统中的混杂设备
[root@GEC6818 /]#cat /proc/devices
Character devices:
1 mem
5 /dev/tty
5 /dev/console
5 /dev/ptmx
5 ttyprintk
10 misc ----->混杂设备
[root@GEC6818 /]#cat /proc/misc
42 network_throughput
43 memory_throughput
44 network_latency
45 cpu_dma_latency
46 xt_qtaguid
47 alarm
48 log_system
49 log_radio
50 log_events
51 log_main
52 ashmem
53 binder
54 uhid
236 device-mapper
55 hdmi-cec
56 nxp-scaler
223 uinput
57 keychord
1 psaux
58 usb_accessory
59 mtp_usb
60 android_adb
200 tun
61 tgt
237 loop-control
62 sw_sync
229 fuse
235 autofs
63 ion
[root@GEC6818 /]#ls /dev/ -l
crw-rw---- 1 root root 10, 63 Jan 1 1970 ion
crw-rw---- 1 root root 10, 50 Jan 1 1970 log_events
crw-rw---- 1 root root 10, 51 Jan 1 1970 log_main
crw-rw---- 1 root root 10, 49 Jan 1 1970 log_radio
crw-rw---- 1 root root 10, 48 Jan 1 1970 log_system
crw-rw---- 1 root root 10, 237 Jan 1 1970 loop-control
三、混杂设备的设计过程
1. 普通字符设备驱动的设计流程
-------定义并初始化一个字符设备---------
1)定义一个字符设备—>struct cdev
2)定义并初始化字符设备的文件操作集—>struct file_operations
3)给字符设备申请一个设备号—>设备号=主设备号<<20 + 次设备号
4)初始化字符设备
5)将字符设备加入内核
-------自动生成设备文件---------
6)创建class
7)创建device,其中device是属于class的
-------得到物理地址对应的虚拟地址-------
8)申请物理内存区,申请SFR的地址区。SFR — Special Function Register: GPIOEOUT
9)内存的动态映射,得到物理地址对应的虚拟地址
10)访问虚拟地址
2. 混杂设备驱动的设计流程
1)定义文件操作集
2)定义一个混杂设备,并完成混杂设备的初始化
3)注册一个混杂设备
4)申请物理内存区,申请SFR的地址区。SFR — Special Function Register: GPIOEOUT
5)内存的动态映射,得到物理地址对应的虚拟地址
6)访问虚拟地址
三、混杂设备的设计模型
#include <linux/miscdevice.h>
1. 混杂设备
struct miscdevice ---->描述一个混杂设备
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
umode_t mode;
};
成员说明:
int minor; —>次设备号
const char *name; ---->混杂设备的名字,也是设备文件的名字。
const struct file_operations *fops; —>文件操作集
2. 混杂设备的注册
int misc_register(struct miscdevice * misc);
3. 混杂设备的注销
int misc_deregister(struct miscdevice *misc);