【问题标题】:RPI OpenGL PWM display driverRPI OpenGL PWM 显示驱动程序
【发布时间】:2021-12-26 20:15:19
【问题描述】:

所以我正在构建一个基于运行 Linux(通过 buildroot 创建的图像)驱动 Led 矩阵(64x32 RGB 连接器)的树莓派 4 的系统,我对 linux 的软件堆栈感到非常困惑。我希望能够在小分辨率屏幕上使用 OpenGL 功能,然后将其传输到实际驱动 Led 矩阵的驱动程序。

我阅读了有关 DRM、KMS、GEM 和其他系统的信息,并得出结论,最好的方法是采用以下工作方案:

User space:      App
                  | OpenGL
                  v
Kernel space:    DRM -GEM-> Led device driver
                                  |
                                  v
Hardware:                     Led Matrix

其中一些可能没有多大意义,因为我仍然对这些概念感到困惑。

本质上,该应用会进行 OpenGL 调用,生成的帧可以映射到 DRM 上的缓冲区,这些帧可以与 Led 设备驱动程序共享,然后驱动矩阵中的 LED。

这样的事情会是最好的方法吗?

我可以编写一些愚蠢的缓冲区 cpu 实现,但我宁愿把它当作学习经验。

【问题讨论】:

  • 适用于哪个硬件接口? DSI? LVDS? SPI?
  • 无接口,通过8个输入的定时锁存来编程,但这不是问题的重点
  • 我不会创建自己的显示驱动程序。我会简单地使用 OpenGL 屏幕外缓冲区(或使用 Vulkan)并通过其他方式将其传输到 LED 矩阵。将您的 LED 矩阵变成被检测为 HDMI 显示器的显示器非常复杂且不可维护,因此应该只是一个爱好挑战。如果您需要在显示器上运行任何应用程序,我会考虑编写您的 Wayland 合成器或 X 服务器。然后它将不使用 HDMI 显示帧缓冲区,而是将其复制到您的 LED 矩阵。
  • @NoNae 非常感谢您的回复!我认为您的回复可能与我想要做的非常接近。您能否详细说明 openGL 屏幕外缓冲区如何与 Wayland 合成器/X 服务器一起使用?我会接受这个作为问题的答案
  • 您真的不想费心编写显示驱动程序(除非您正在设计自己的显卡)。只需使用普通显示系统,然后读取它创建的像素。

标签: opengl linux-kernel linux-device-driver raspberry-pi4


【解决方案1】:

OpenGL 渲染到一个缓冲区(称为“帧缓冲区”,通常显示在屏幕上。但是渲染到屏幕外缓冲区(顾名思义)不会渲染到屏幕上,而是渲染到一个数组中,可以通过C/C++。现代操作系统有一种间接方式。通常你的屏幕上有多个可见的窗口。因此应用程序不能渲染到屏幕上,而是渲染到由窗口系统管理的缓冲区中,然后将其合成为一个最终图像。Linux 使用 Wayland,多个 Wayland 客户端可以创建并绘制到 Wayland 合成器的缓冲区中。

如果您只想显示您的应用程序,只需使用屏幕外缓冲区。

如果您想显示另一个应用程序,请通过编写您自己的 Wayland 合成器来读取它的帧缓冲区。请注意,如果您想使用硬件加速,这可能很难(我从未这样做过)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2013-03-16
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多