【驱动】04.input子系统
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
输入子系统
硬件原理
电阻屏原理
电阻屏就是基于欧姆定律制作的,它有上下两层薄膜,这两层薄膜就是两个电阻,如下图所示:
平时上下两层薄膜无触触,当点击触摸屏时,上下两层薄膜接触:这时就可以测量触点电压。
电阻屏数据
Linux驱动程序中,会上报触点的X、Y数据,注意:这不是LCD的坐标值,需要APP再次处理才能转换为LCD坐标值。
对应的input_event结构体中,“type、code、value”如下:
按下时:
EV_KEY BTN_TOUCH 1 /* 按下 */
EV_ABS ABS_PRESSURE 1 /* 压力值,可以上报,也可以不报,可以是其他压力值 */
EV_ABS ABS_X x_value /* X坐标 */
EV_ABS ABS_Y y_value /* Y坐标 */
EV_SYNC 0 0 /* 同步事件 */
松开时:
EV_KEY BTN_TOUCH 0 /* 松开 */
EV_ABS ABS_PRESSURE 0 /* 压力值,可以上报,也可以不报 */
EV_SYNC 0 0 /* 同步事件 */
电容屏原理
电容屏中有一个控制芯片,它会周期性产生驱动信号,接收电极接收到信号,并可测量电荷大小。当电容屏被按下时,相当于引入了新的电容,从而影响了接收电极接收到的电荷大小。主控芯片根据电荷大小即可计算出触点位置。
怎么通过电荷计算出触点位置?这由控制芯片实现,这类芯片一般是I2C接口。
电容屏数据
Type B类型的触摸屏能分辨是哪一个触点,上报数据时会先上报触点ID,再上报它的数据。
当有2个触点时(type, code, value):
EV_ABS ABS_MT_SLOT 0 // 这表示“我要上报一个触点信息了”,用来分隔触点信息
EV_ABS ABS_MT_TRACKING_ID 45 // 这个触点的ID是45
EV_ABS ABS_MT_POSITION_X x[0] // 触点X坐标
EV_ABS ABS_MT_POSITION_Y y[0] // 触点Y坐标
EV_ABS ABS_MT_SLOT 1 // 这表示“我要上报一个触点信息了”,用来分隔触点信息
EV_ABS ABS_MT_TRACKING_ID 46 // 这个触点的ID是46
EV_ABS ABS_MT_POSITION_X x[1] // 触点X坐标
EV_ABS ABS_MT_POSITION_Y y[1] // 触点Y坐标
EV_SYNC SYN_REPORT 0 // 全部数据上报完毕
应用编程
一般方式
获取设备信息int ioctl(int fd, unsigned long request, ...);
查询方式
APP调用open函数时,传入“O_NONBLOCK”表示“非阻塞”。
APP调用read函数读取数据时,如果驱动程序中有数据,那么APP的read函数会返回数据,否则也会立刻返回错误。
休眠-唤醒方式
APP调用open函数时,不要传入“O_NONBLOCK”。
APP调用read函数读取数据时,如果驱动程序中有数据,那么APP的read函数会返回数据;否则APP就会在内核态休眠,当有数据时驱动程序会把APP唤醒,read函数恢复执行并返回数据给APP。
POLL/SELECT方式
POLL机制、SELECT机制是完全一样的,只是APP接口函数不一样。
异步通知方式
tslib库方式
tslib是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入设备添加各种“filter”(过滤器,就是各种处理)
就不用自己费劲写读出的数据的解析了
解析完的数据都放这个结构体了
内核驱动
编写驱动程序
GPIO按键驱动分析与使用
套路
- 根据设备树获得硬件信息:哪个GPIO、对于什么按键
- 分配/设置/注册input_dev结构体
- request_irq: 在中断处理函数中确定按键值、上报按键值
- 有两种IRQ函数
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)