触摸屏的使用

这份是上一讲的延续+深化版,新增了坐标校准、阻塞性read、开机动画作业等实战点。给你一份去重后的精简总结,重点标 🔥 的是新增/强化内容。

一、JPEG解码 + libjpeg移植(面试高频)

解码八步(第六步是灵魂🔥)

  1. 创建解码对象
  2. 打开jpg文件
  3. 读取文件头
  4. 设置参数(输出格式、缩放等)
  5. 执行解码
  6. 🔥 循环读行缓冲 → RGB转ARGB(LCD要ARGB,裸解码只有RGB,必须转换才能显示)
  7. jpeg_finish_decompress
  8. 释放资源

💡 面试官只问流程逻辑,不问具体函数名,像"游戏任务指引"——你知道先做什么后做什么就行。

libjpeg移植三板斧

./configure # 配交叉编译链 + 安装路径
make # 按Makefile编译
make install # 库+头文件拷到目标目录

像打BOSS按固定连招,少一步卡关。

为什么JPEG不用BMP?

嵌入式内存受限,JPEG压缩率高,BMP太占空间。

二、触摸屏 + Linux输入子系统(本课重心)

  1. 硬件层

• 四类触摸屏:电阻式 / 电容式 / 红外式 / 声波式 → 开发板用电容式

• 电容屏原理:X、Y导电层中间绝缘隔开,手指(导体)接触 → 电容充放电变化 → 触摸芯片通过ADC检测 → 算出(X,Y)

• 🔥 显示和触摸是两颗独立芯片:一颗管LCD显示,一颗管坐标采集,别搞混

• 导电体才能触(手指/电容笔),戴绝缘手套无效

  1. 软件层:输入子系统

• 统一管理:键盘、鼠标、触摸屏都归输入子系统管

• 设备节点:/dev/input/event*(如event0)

• 🔥 event节点名是驱动工程师在写驱动时定的,不是系统自动分配,理论上fb0也可以叫fb32

• 应用层套路:open("/dev/input/event0") → read()循环读 → 解析结构体

  1. 核心结构体 struct input_event(4成员)

struct input_event {
struct timeval time; // 时间戳(微秒)
unsigned short type; // 事件类型
unsigned short code; // 事件编码
unsigned int value; // 值
};

三元组记忆法:
• type → 什么设备?(EV_KEY键盘 / EV_ABS触摸屏绝对 / EV_REL鼠标相对)

• code → 哪个操作?(KEY_A / ABS_X / ABS_Y)

• value → 什么结果?(1按下0松开 / 坐标值)

🔥 ABS vs REL 易混点:

  • 触摸屏 ABS = "指哪打哪"(绝对坐标,像经纬度)

  • 鼠标 REL = "挪了多少"(相对位移)

  1. 驱动设计思想

• C语言用结构体模拟面向对象("英雄类"→具体英雄实例)

• 头文件里找结构体定义(通常在/usr/include/linux/input.h或input-event-codes.h)

• 内核只认编码不认名字,按"A"键内核收的是编码30,显示"a"是上层输入法的事

  1. 🔥 阻塞性read

read(fd, &ev, sizeof(ev)); // 没事件时就卡在这等,这就是阻塞

多线程/人机交互里这个点常考。

三、实战:触摸屏坐标程序 + 校准🔥

程序骨架

  1. open("/dev/input/event0", O_RDONLY)
  2. 定义struct input_event buf
  3. while(1)里read()→解析type/code/value→X/Y拼出来→打印

坐标校准问题

• 触摸屏分辨率 ≠ LCD分辨率(例:触摸1024×600,LCD 800×480)

• 解法:等比例缩放

lcd_x = touch_x * LCD_WIDTH / TOUCH_MAX_X
lcd_y = touch_y * LCD_HEIGHT / TOUCH_MAX_Y

四、课后作业

做开机动画 → 为后面摄像头捕获 + 人机交互铺路(JPEG解码+触摸屏+LCD显示三者联动的第一个小项目)。

五、一句话串全课

嵌入式界面 = JPEG解码(把图解出来)→ LCD显示(ARGB上屏)→ 触摸屏输入(input_event读坐标+校准)→ 三者打通就是开机动画。

posted @ 2026-07-15 13:55  南质冰清  阅读(3)  评论(0)    收藏  举报