【发布时间】:2020-04-19 10:54:33
【问题描述】:
我正在开发一个带有触摸屏的嵌入式系统。触摸屏作为输入和输出操作,“虚拟”键盘覆盖图形输出。
我有一个工作设备驱动程序,它从触摸传感器读取输入并将其正确转换为按键,这是在 this guide on kernel.org 的帮助下创建的。我想扩展这个驱动程序来处理屏幕上的图像输出。
我想同时支持 getty 和 X,尽可能少地重复。我正在运行带有精选软件包的最小 Debian 变体,例如最小 X。请注意,我不打算尝试将此驱动程序放入存储库管道,尽管我可能会将其转储到公共 GitHub 存储库。
目前,输出屏幕图像是通过一个棘手的解决方法完成的:一个强制渲染到 CPU 的嵌入式图形硬件的启动选项,尽管它没有连接到显示器,以及一个持续屏幕抓取缓冲区的守护进程,修改了少数用于创建键盘视觉效果的预定义像素,并将其推送到真实屏幕。
这是一个概念证明,证明我确实正确理解了屏幕设备所期望的语言,但显然不是最理想的。
kernel.org 也有关于“DRM”设备驱动程序的指南,但这对于我的硬件能力来说似乎是严重的过度杀伤:
Linux DRM 层包含旨在支持复杂图形设备需求的代码,通常包含非常适合 3D 图形加速的可编程管道。
我的硬件都没有类似 3D 加速的东西,所以我得出结论,这可能不是我想要的。
我应该使用什么子系统/API?我认为缺少一个术语是阻碍我搜索的原因,但如果提供有关如何完成此操作的更多信息,我们将不胜感激。
硬件细节(可能不相关): CPU 和屏幕通过 8080-esque 并行协议进行通信,CPU 本身不支持该协议,所以我用 GPIO 模拟它(通过通过以下方式操作寄存器)地图)。
发送完整的屏幕图像大约需要 20 毫秒,但从嵌入式图形缓冲区获取完整副本大约需要 180 毫秒,因此跳过该步骤是最重要的目标。屏幕硬件包含足够的SGRAM 内存来保存整个帧的数据,并且支持写入一个矩形子区域,因此需要一个挂钩来仅更新已更改的屏幕部分。
屏幕并不特别关注传入数据的时间。触摸传感器输入由专用 IC 处理,该 IC 通过 CPU 支持的I²C 与 CPU 通信。目前的驱动程序使用linux/input-polldev.h 接口。 CPU 是 Broadcom BCM2835,屏幕是带有嵌入式 Himax HX8357 控制器的 TFT,触摸屏传感器解码器是 ST STMPE610,还有一个电压电平转换器 (Nexperia 74LVCH245A) 在运行HX8357 和 BCM2835。可根据要求提供更多详细信息。
【问题讨论】:
-
我很确定你得了 NIH 综合症,基本上重新发明了一个轮子——通常触摸屏使用 HID 协议,而不是更少支持。注意,触摸屏只是输入设备。
-
@0andriy 重新发明轮子是我的事,但是当我开始时,这个特定设备没有(真正的)驱动程序。我不知道任何用于人机接口设备的标准化协议,但如果有的话,我很确定我在这里使用的触摸覆盖没有使用它。我不同意“触摸屏只是输入设备”,因为我的绝对是输出图像。
-
您根本无法识别一个包中的两个硬件块。触摸屏,不管它的名字,只是输入设备。例如,输出称为面板或 TFT 显示器。
-
merriam-webster.com/dictionary/touchscreen 是的,有两种不同的硬件:触摸感应覆盖层和 TFT 屏幕。这两个组件结合起来形成了触摸屏。你不能告诉我“忽略这个名字”来告诉我我对触摸屏的定义是错误的。
标签: linux driver screen kernel-module