需要板子一起学习的可以这里购买(含资料):点击跳转
一、混杂设备
混杂设备也叫杂项设备,是对普通的字符设备(struct cdev)的一种封装,设计目的就是为了简化字符设备驱动设计的流程。具有以下特点:
1) 主设备号为10,次备号不同。
2) 大大简化cdev的设计流程。
3) 混杂设备与普通的字符设备在使用上并没有区别。
二、查看系统的混杂设备
[root@GEC6818 /proc]#cat devices ----> 查看设备
Character devices: --->字符设备
1 mem
5 /dev/tty
5 /dev/console
5 /dev/ptmx
5 ttyprintk
10 misc ----->数字为主设备号,字符串为设备名字:混杂设备
13 input
14 sound
21 sg
29 fb
81 video4linux
86 ch
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
153 spi
Block devices: --->块设备
259 blkext
7 loop
8 sd
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
[root@GEC6818 /proc]#cat 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
130 watchdog
55 hdmi-cec
56 nxp-scaler
223 uinput
57 keychord
[root@GEC6818 /dev]#ls -l
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
//主设备号为10则表示为混杂设备,依据次设备号来区分各个设备,各个设备并没有直接联系
三、混杂设备的驱动设计流程
1、普通字符设备驱动流程
驱动程序的设计框架:三个阶段
创建一个字符设备 --- struct cdev
创建一个文件操作集
申请设备号
字始化设备
设置加入到内核
------------------------------
创建一个class
创建一个device ----->得到该设备的文件 ---->该文件提供给应用层来访问
--------------------------
申请物理内存区 ---- request_mem_region
ioremap ----> 得到物理设备基址的虚拟的起始地址
得到相应物理地址的虚拟地址,并来访问硬件
2、混杂设备驱动设计流程(struct miscdevice)
1) 定义一个混杂设备
#include <linux/miscdevice.h>
static struct miscdevice led_misc = {
.name = "gec6818_led_drv", //设备文件的名字
.fops = &gec6818led_fops, //文件操作集
.minor = MISC_DYNAMIC_MINOR, // 设置次设备号,MISC_DYNAMIC_MINOR --- 表示由系统动态分配一个次设备号
};
2) 定义一个文件操作集
static const struct file_operations gec6818led_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = gec6818_led_ioctl,
.open = gec6818_led_open,
.release = gec6818_led_release,
};
3) 注册混杂设备到内核中
int misc_register(struct miscdevice * misc)
参数说明:
struct miscdevice * ----> 混杂设备对象
返回值:
成功:0
失败:负数
4)从内核中注销混杂设备
int misc_deregister(struct miscdevice *misc)
觉得有帮助的话,打赏一下呗。。