如何从用户空间使用 /dev/fb0 作为控制台,或向其输出文本

如何从用户空间使用 /dev/fb0 作为控制台,或向其输出文本

因此,我有一个 Palm Pre(原始 P100EWW)型号,我启用了开发人员模式,并安装了 Debian Squeeze chroot。效果很好。我计划将其用于任何东西(bittorrent 对等点、网络服务器),但手机除外。

我注意到,如果我这样做,cat /dev/urandom > /dev/fb0它实际上会将随机像素写入屏幕,直到No space left on device生成错误。太棒了,现在我可以使用显示器了。

那么有哪些实用程序可以 A) 让我使用 /dev/fb0 作为可以输出文本的控制台,或者 B) 从命令行在 /dev/fb0 上呈现文本。

我还不知道为此重新编译内核(我希望最终完全剥离 WebOS 并将其转变为最小的 ARM 服务器),因此用户空间工具(如果存在)就是我要问的问题。也更愿意直接渲染到 /dev/fb0 而不是使用 X。

答案1

有几个人已经回答了您问题中涉及内核和放置的部分图片(而不是文本)到帧缓冲区,但到目前为止其余部分仍未解决。是的,您可以使用内核虚拟终端子系统来制作所谓的帧缓冲控制台。但是有几个工具可以让你使用帧缓冲设备来制作用户空间虚拟终端。这些包括:

  • 中康德班) — 用户空间虚拟终端,旨在比内核子系统更好地处理 CJK I/O。它的特殊优势在于处理 ISO 2022 非 UTF 编码;它的特别弱点是 UTF 编码。
  • FB术语德班) — 一个用户空间虚拟终端,已经产生了多个分支,包括联合术语。它有一堆CJK输入法插件。
  • 博格-bterm (德班) — 一个用户空间虚拟终端,已产生分支,例如尼特姆
  • 阿里·古拉米·鲁迪键盘— 一个极简的用户空间虚拟终端,不依赖于 X 库。
  • 中的和console-terminal-emulator工具console-fb-realizer开胃菜— 旨在复制 Linux 和 FreeBSD/PC-BSD 内核虚拟终端的用户空间虚拟终端。它也不依赖于 X 库。
  • 公里斯康— 与系统紧密相连的用户空间虚拟终端logindsystemd 中的服务器及其“席位”的概念。

Ali Gholami Rudi 尤其制作了不仅仅是用于帧缓冲区工作的终端模拟器。 他还写了直接到帧缓冲区的 PDF 查看器、VNC 查看器、媒体播放器和古兰经阅读器。

完整的并排比较超出了这个答案的范围;但以下是与该问题相关的一些要点:

  • 如前所述,一些用户空间虚拟终端程序利用 X 库进行字体处理、键盘映射、CJK 输入法等。它们不是 X 客户端,但它们具有 X 库的依赖项。 fbpadnosh 工具在设计上不使用任何 X 库。
  • 使用 X 库进行字体处理的程序当然也使用 X 字体。其他人另有安排。
    • bogl-bterm 和 fbpad 都有自己特殊的字体格式。一是使用该bdftobogl工具将 BDF 字体转换为 BOGL 字体;一种将 TTF 转换为 fbpad 使用 ft2tf () 工具。
    • noshconsole-fb-realizer工具使用与新的 FreeBSD 10.1 内核虚拟终端子系统确实如此,因此分享了 FreeBSD 字体操作工具vtfontcvt用于转换 BDF 字体。
  • 使用 X 库的程序使用 X 键盘映射。至于其他人:
    • nosh 工具有自己独特的键盘映射格式,旨在为 ISO“通用”组 2 提供完整的 ISO 9995-3 功能键盘。可以使用该console-convert-kbdmap工具将 BSD kbdmap 文件转换为这种格式。同样,这些 kbdmap 文件是与 FreeBSD/PC-BSD vt 子系统一起使用的
    • fbpad 根本不进行自己的键盘映射,而是依赖于内核虚拟终端子系统及其键盘映射机制的存在。
  • 调用和所需权限存在一些差异:
    • zhcon、fbterm、bogl-bterm、fbpad 和 kmscon 的工作原理是终端仿真器直接在终端上生成 shell/登录程序作为子进程。它们需要超级用户权限才能生成login
    • nosh 工具被设计为与现有的/etc/ttys(BSD)、/etc/inittab(Linux 系统 5 init) 或其他系统集成,它们将生成 getty/login/shell 的工作留给这些系统。 console-fb-realizer仅需要足够的权限来打开帧缓冲区和输入事件设备(不需要超级用户权限),并访问由 维护的 FIFO 和普通文件console-terminal-emulator,而这根本不需要任何特殊权限。

所有这些都是终端模拟器当然。如果您想去掉终端仿真并更直接地将文本放入帧缓冲区,您有一些选择:

  • bogl-bterm 当然是基于 Ben Pfaff 的Ben 自己的图形库一个帧缓冲 I/O 库,设计用于系统设置/救援环境(以及“用于 PDA 中的 GUI”)。您当然可以编写直接使用它的程序。
  • 对于编写使用帧缓冲区库进行自己的渲染的程序和将转义序列吐出到它认为是终端的程序之间的中间过渡:nosh 用户空间虚拟终端是模块化的,并分为组成件。根本就不能用console-terminal-emulator

    console-fb-realizer使用带有字符元胞数组的显示文件,类似于/dev/vcsa*普通文件(不是字符特殊设备文件),并且带有 Unicode 代码点、ECMA-48 属性和 24 位 RGB 颜色。因此,我们可以运行它,然后将字符+属性+颜色直接写入字符单元数组文件,然后将console-fb-realizer字体渲染到帧缓冲区。

    顺便说一句:请注意,这与与 BRLTTY 集成,它使用console-terminal-emulator但不运行console-fb-realizer

答案2

如果您可以捕捉/dev/urandom > /dev/fb0并获得屏幕上的随机像素,那么您就拥有了所需的一切。

就我而言,我需要转储一些文本信息。我在 busybox 和 raspi 中测试了这个,所以它可能对你有用。答案可能有点长,因为如果您不使用某些控制台,您将需要自己打印字符的像素。幸运的是有人已经完成了这项艰巨的工作,所以我们只需要把它结合起来即可。

在 busybox 或你的 raspi 中你应该有一个fbset二进制文件。这可能会帮助您找到屏幕尺寸的设置。

在我的嵌入中看起来像这样:

# fbset

mode "480x272-1"
    # D: 0.104 MHz, H: 0.207 kHz, V: 0.657 Hz
    geometry 480 272 480 272 16
    timings 9600000 3 3 0 32 17 11
    accel false
    rgba 5/0,6/5,5/11,0/0
endmode

这里重要的部分是宽度 480 和高度 272 像素。

正如您所提到的,您可以使用以下命令来填充屏幕 cat /dev/urandom > /dev/fb0

你可以用以下命令清除它cat /dev/zeros > /dev/fb0

除了清除屏幕之外,我们还必须确保您获得正确的尺寸。

碰巧我的 busybox 有一个 fbsplash 二进制文件,它可以输入 .ppm 文件。

如果我错了,请纠正,但似乎fb0接受这种格式。看看维基百科上的便携式 Anymap,有几种“子格式”...fbsplash 使用一种带有颜色的奇特格式,等等...但我们希望能够打印可读的内容。为了简单起见,我们使用 ASCII 编码的 P1。如果我们可以打印一条垂直线,我们就会知道我们的尺寸是正确的。我们来尝试一下:

ppm 类型 P1 中的垂直线应如下所示:

P1
480 272
f 0 0 0 0 ... 0 
f 0 0 0 0 ... 0
... 
f 0 0 0 0 ... 0

因此,将有 272 行,959 个字符宽。文档说它应该是 1 而不是 f...在 busybox 上,raspi f 更亮。

重要的是,0 后面没有空格...这个任务可能有点乏味...您最好使用可以帮助您的文本编辑器。在 vim 中,您可以复制前两行,进入命令模式 (esc),然后键入以下字符:

of(esc)479a 0(esc)yy271p

当然,我用的是我的尺寸,你应该使用你的。将此文件发送到/dev/fb0,它应该如下所示: 竖线屏

好吧,我在作弊...那里不只有一行...大约有 8 行...但是当它不起作用时(我们的尺寸错误或末尾有空间,只有一行就太多了)更轻松)。

如果你已经做到了这一点,我们只需打印正确的像素即可将其视为字符。感谢Marcel Sondaar 和他在 GitHub 上的存储库我们不需要绘制每个字符。

通过一个小小的调整,我们可以扩展他的简单程序来打印fX不是0空格,在每个字符之间插入空格,添加标题,我们就得到了一个 .ppm 文件,其中的字母对应于其字符代码。

再向前迈出一小步,您就不会得到一个字符作为输入,而是得到一行。 Cat 一个文件,通过管道传输到您的程序并输出到/dev/fb0,您将获得文本输出:

文本输出示例

我也在树莓派上测试了这个解决方案并且它有效。系统告诉我,我没有资格发布超过 2 个链接。在我得到这个之前,你必须相信我的话:D

答案3

要将帧缓冲区用作控制台,您需要该fbdev模块。您可能需要重新编译内核。

您可能还对 DirectFB 项目感兴趣,该项目是一个使帧缓冲区的使用变得更容易的库。也已经有为其编写的应用程序和 GUI 环境。

答案4

这是一篇旧文章,但我理解通常您需要帧缓冲区控制台(fbcon)才能在帧缓冲区上运行控制台。它在配置中。 (设备驱动程序/图形/控制台显示..)

相关内容