linux驱动学习(七)之混杂设备

发布于:2024-06-07 ⋅ 阅读:(114) ⋅ 点赞:(0)

需要板子一起学习的可以这里购买(含资料)点击跳转

一、混杂设备

混杂设备也叫杂项设备,是对普通的字符设备(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)

觉得有帮助的话,打赏一下呗。。

           


网站公告

今日签到

点亮在社区的每一天
去签到