我正在开发带有触摸屏的嵌入式系统。触摸屏既作为输入又作为输出,“虚拟”键盘覆盖在图形输出上。
我有一个工作设备驱动程序,它从触摸传感器读取输入并将其正确转换为按键,这是在 kernel.org 上的本指南的帮助下创建的。我想扩展这个驱动程序来处理图像输出到屏幕。
我想同时支持 getty 和 X,尽量减少重复。我正在运行一个带有精选软件包的最小 Debian 变体,例如最小 X。请注意,我不打算尝试将此驱动程序放入存储库管道,尽管我可能会将其转储到公共 GitHub 存储库中。
输出屏幕图像目前是通过一个令人讨厌的解决方法完成的:一个引导选项强制渲染到 CPU 的嵌入式图形硬件,尽管它没有连接到显示器,以及一个持续屏幕抓取缓冲的守护进程,修改一些预定义像素以创建键盘视觉效果,并将其推送到真实屏幕上。
这可以作为概念证明,证明我确实正确理解了屏幕设备期望的语言,但显然不是最佳的。
kernel.org 还有一个关于“DRM”设备驱动程序的指南,但这对于我的硬件能力来说似乎是严重的矫枉过正:
Linux DRM 层包含旨在支持复杂图形设备需求的代码,通常包含非常适合 3D 图形加速的可编程管道。
我的硬件都没有类似 3D 加速的功能,所以我得出结论,这可能不是我想要的。
我应该使用什么子系统/API?我认为一个缺少的术语阻碍了我的搜索,但有关如何实现这一点的更多信息将不胜感激。
硬件细节(可能无关): CPU 和屏幕通过 8080 式并行协议进行通信,CPU 本身不支持该协议,所以我用 GPIO 模拟它(通过 mmap 操作寄存器)。
发送完整的屏幕图像大约需要 20 毫秒,但从嵌入式图形缓冲区获取完整副本需要大约 180 毫秒,因此跳过该步骤是最重要的目标。屏幕硬件包括足够的SGRAM内存来保存一整帧的数据,并支持写入矩形子区域,因此需要一个只更新屏幕发生变化的部分的钩子。
屏幕对传入数据的时间没有特别要求。触摸传感器输入由专用 IC 处理,该 IC 通过CPU 支持的I²C与 CPU 进行通信。当前驱动程序使用该linux/input-polldev.h接口。CPU是Broadcom BCM2835,屏幕是TFT,内嵌Himax HX8357控制器,触摸屏传感器解码器是ST STMPE610,HX8357和BCM2835之间有一个电压电平转换器(Nexperia 74LVCH245A)。可应要求提供更多详细信息。
这有效:(A)
class Foo {
public:
const bool b;
constexpr ~Foo() = default;
constexpr Foo(const bool b) : b(b) {};
};
class Bar {
public:
static constexpr Foo tru { true };//Foo is complete type
};
Run Code Online (Sandbox Code Playgroud)
编译失败:(B)
class Bar {
public:
class Foo {
public:
const bool b;
constexpr ~Foo() = default;
constexpr Foo(const bool b) : b(b) {};
};
static constexpr Foo tru { true };//undefined constructor 'Foo' cannot be used
};
Run Code Online (Sandbox Code Playgroud)
错误:
$ clang++ --std=c++20 -D_POSIX_C_SOURCE=200112L -fPIC -g -Werror …Run Code Online (Sandbox Code Playgroud) 特尔;博士:
编译的 spirv 着色器在内联运行时编译的 spirv 工作时崩溃,使用修改后的示例进行测试。崩溃发生在 vulkan 代码的深处。是什么赋予了?
细节:
我在使用编译的 spirv 着色器时遇到问题。我采用了“draw-textured-cube”示例,将其提取到具有成对 cmake 的独立环境和对util.cpp的最小编辑以调整数据目录的路径。它编译并按预期工作。
然后我从static const文件开头的cstrings 中提取着色器代码并将它们移动到它们自己的文件中。我将调用替换为init_shaders仅读取文件并使用与init_shaders. 我使用从原始示例CMakeLists.txt 中未使用的函数中获取的选项将 glsl 编译到 spirv 中。
它现在因创建管道时的访问冲突而崩溃(完整的错误文本如下)。无论有没有验证层,Debug 和 Release 版本的结果都相同。在 Visual Studio 中逐步执行程序集显示错误发生在创建管道调用深处至少 16 层(其中 acall或非本地jmp构成一个层,因为这些很可能是功能障碍)。
Unhandled exception at 0x000000006894A525 (nvoglv64.dll) in main.exe: 0xC0000005: Access violation writing location 0x00000080A3CAA530. occurred
(确切的地址正如人们所期望的那样变化。)
SDK 中包含的任何示例都使用在运行时编译为 spirv 的内联 glsl,但都有与此类似的注释(来自纹理立方体示例):
/* For this sample, we'll start with GLSL so the shader function …Run Code Online (Sandbox Code Playgroud)