驱动基础

参考
参考
参考

驱动程序是什么?

直接与硬件打交道,按照硬件设备的具体形式,驱动设备的寄存器,完成设备的轮询、中断处理、DMA通信,最终让通信设备可以收发数据,让显示设备能显示文字和画面,让音频设备可以完成声音的存储和播放。

LINUX内核关系
LINUX内核管理
LINUX内核管理可细分为五大块:进程管理、内存管理、文件系统、设备管理、网络管理。
每块都有不同的作用,对上提供API接口给应用工程师,对下屏蔽不同的硬件增加可移植性。

学习LINUX驱动必须的明确以下概念
1)输入子系统
2)设备驱动模型
3)设备树

输入子系统

LINUX输入子系统可分为三个层面:事件处理层、输入子系统核心层、硬件驱动层
在这里插入图片描述
1)事件处理层:主要作用就是与用户空间进行交互,将硬件驱动层传来的事件报告给用户。包含提供驱动程序的fops接口,在/dev下生成相应的设备文件节点nod等功能。
2)输入子系统核心层

a、创建设备类、注册字符设备
b、向设备驱动层提供注册接口
c、提供上层handler和下层device之间的匹配函数
d、向上层提供注册handler的接口

3)硬件驱动层:负责操作具体的硬件设备,对硬件设备的读写访问,中断设置,并将底层的硬件输入转化为统一的事件类型,向输入核心(input core)汇报,简单来说,驱动层就是负责汇报事情。

那么输入子系统到底是怎样的一个工作流程呢?
例如:当我们按下按键的时候就会触发中断(中断是早就注册好的),就会去执行中断所绑定的处理函数,在函数中就会去读取硬件寄存器来判断按下的是哪个按键和状态 ---->
将按键信息上报给input core层 —> input core层处理好了之后就会上报给input event层,在这里会将我们的输入事件封装成一个input_event结构体放入一个缓冲区中 —>
应用层read就会将缓冲区中的数据读取出去。

LINUX中有哪些输入设备类型?
EV_SYN 同步事件
EV_KEY 键盘事件
EV_REL 相对坐标事件,用于鼠标
EV_ABS 绝对坐标事件,用于摇杆
EV_MSC 其他事件
EV_LED LED灯事件
EV_SND 声音事件
EV_REP 重复按键事件
EV_FF 受力事件
EV_PWR 电源事件
EV_FF_STATUS 受力状态事件

相关数据结构
input_dev
input_handler
input_handle
在这里插入图片描述*input_register_device(struct input_dev dev)
主要功能:

1)添加设备;
2)把输入设备挂到输入设备链表input_dev_list中;
3)遍历input_handler_list链表,查找并匹配输入设备对应的事件处理层,如果匹配上了,就调用handler的connnect函数进行连接。设备就是在此时注册的。

*input_register_handler(struct input_handler handler)

1)根据事件注册一个handler,
2)将handler挂到链表input_handler_list下,
3)然后遍历input_dev_list链表,查找并匹配输入设备对应的事件处理层,如果匹配上了,就调用connect函数进行连接,并创建input_handle结构。

_init evdev_init——>input_register_handler——>input_attach_handler——>evdev_connect——>input_register_handle

从应用层出发看input子系统
handler->event(handle, v->type, v->code, v->value)
—> input_to_handler
—> input_pass_values
—> input_handle_event
—> input_event

input_dev通过输入核心为驱动层提供统一的接口,input_event,来向事件处理层上报数据并唤醒。

设备驱动模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值