小编mem*_*tha的帖子

什么 Linux 驱动子系统/API 用于简单的屏幕/监视器设备?

我正在开发带有触摸屏的嵌入式系统。触摸屏既作为输入又作为输出,“虚拟”键盘覆盖在图形输出上。

我有一个工作设备驱动程序,它从触摸传感器读取输入并将其正确转换为按键,这是在 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)。可应要求提供更多详细信息。

linux screen driver kernel-module

9
推荐指数
1
解决办法
314
查看次数

C++ constexpr 类型为嵌套类

这有效:(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)

c++ constexpr clang++ c++20

7
推荐指数
1
解决办法
320
查看次数

在 vulkan 中使用编译的 spirv 着色器的正确方法

特尔;博士

编译的 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)

c++ shader glsl vulkan

4
推荐指数
1
解决办法
1891
查看次数

标签 统计

c++ ×2

c++20 ×1

clang++ ×1

constexpr ×1

driver ×1

glsl ×1

kernel-module ×1

linux ×1

screen ×1

shader ×1

vulkan ×1