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


24

因此,我有一个启用了开发人员模式的Palm Pre(原始P100EWW)模型,并安装了Debian Squeeze chroot。效果很好。我已经计划将其用于任何东西(bittorrent对等方,Web服务器),而不是电话。

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

因此,有什么样的工具可以使用:A)让我使用/ dev / fb0作为控制台,我可以将文本输出到其中;或者B)从命令行在/ dev / fb0上呈现文本。

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


Linux虚拟控制台应在帧缓冲驱动程序上运行。虚拟控制台是一个强大的工具。从Linux 2.6开始,它们允许为每个控制台设置不同的字体。但是它们是通过/ dev / vcs n和/ dev / vcsa  n(而不是/ dev / fb0 )(从用户空间)控制的  。
Incnis Mrsi 2015年

Answers:


11

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

您可能还对DirectFB项目感兴趣,该项目使使用帧缓冲区更加容易。已经为它编写了应用程序和GUI环境。


1
看起来像当我安装Directfb(webos-internals.org/wiki/Directfb)时,它带有一个名为的实用程序dfbg,可让我在其中放置图片(并且不会像完成时那样将其删除fbi)。我知道我很可能会找到一个实用程序来从块文本创建.png或类似文件,因此这可能行得通...
LawrenceC

24

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

  • zhconDebian)—一个用户空间虚拟终端,其处理CJK I / O的能力远远优于内核子系统。它的特殊优势在于处理ISO 2022非UTF编码。它的特别弱点是UTF编码。
  • fbtermDebian)-一个用户空间虚拟终端,已经产生了包括jfbterm在内的多个fork 。它有一堆CJK输入法插件。
  • bogl-bterm(Debian)—一个用户空间虚拟终端,已经产生了例如niterm的fork
  • Ali Gholami Rudi的fbpad —一个极简的用户空间虚拟终端,不依赖X库。
  • nosh中console-terminal-emulatorand console-fb-realizer工具-一个用于复制Linux和FreeBSD / PC-BSD内核虚拟终端的用户空间虚拟终端。它也不依赖于X库。
  • kmscon —一个用户空间虚拟终端,与logindsystemd中的服务器及其“座”的概念紧密链接。

特别是Ali Gholami Rudi不仅为帧缓冲工作提供了终端仿真器。 他还编写了直接到帧缓冲区的PDF查看器,VNC查看器,媒体播放器和Quran阅读器。

完整的并排比较超出了此答案的范围;但是以下是与该问题有关的几点:

  • 如前所述,一些用户空间虚拟终端程序使用X库来进行字体处理,键盘映射,CJK输入法等。它们不是X客户端,但是它们具有来自X库的依赖项。 fbpad并且设计的nosh工具不使用任何X库。
  • 使用X库进行字体处理的程序当然会使用X字体。其他人做出其他安排。
    • bogl-bterm和fbpad都有自己的特有字体格式。使用该bdftobogl工具可以将BDF字体转换为BOGL字体。然后将ttf转换为ft2tf(Arch)工具使用的fbpad所使用的“ tinyfont”字体。
    • nosh console-fb-realizer工具使用与新FreeBSD 10.1内核虚拟终端子系统相同的“ vt”字体,因此共享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程序。他们需要超级用户特权才能生成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's Own图形库的一个帧缓冲I / O库,设计用于系统设置/救援环境(以及“用于PDA中的GUI”)。您当然可以编写直接使用该程序的程序。
  • 在编写使用帧缓冲库进行自身渲染的程序和将转义序列吐出它认为是终端的程序之间进行了半途而废:nosh用户空间虚拟终端是模块化的,并拆分为组成部分。一个人根本无法使用console-terminal-emulator

    console-fb-realizer使用带有字符单元格数组的显示文件,例如/dev/vcsa*普通文件(不是字符特殊设备文件),并且具有Unicode代码点,ECMA-48属性和24位RGB颜色。因此,可以运行它,只需将character + attribute + colour直接写入字符单元阵列文件中,console-fb-realizer就可以将字体呈现到帧缓冲区中。

    顺便说一句:请注意,这与与BRLTTY集成是相反的,后者使用console-terminal-emulator但不运行console-fb-realizer


1
这是一个了不起的答案。Enlightenment库声称在Linux fbcon上支持帧缓冲-取决于编译时选项。它们的从属终端仿真器术语也是如此:直接在linux framebuffer(fbcon)中工作。除此之外terminology,我本人kmscon (和大卫·赫尔曼的其他著作)都推荐了自己
mikeserv

1
鲁迪是帧缓冲区的高手!有一天,我也将放弃X11。
Ciro Santilli新疆改造中心法轮功六四事件

10

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

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

在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二进制文件,该二进制文件作为输入文件。

如果我错了,请更正,但似乎fb0接受这种格式。看一下Wikipedia上的Portable 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,它应类似于: 垂直线屏

好吧,我在作弊...这不仅是一行...大约是八行...但是当行不通时(我们的尺寸错误或最后有空格,只有一行是很多更轻松)。

如果您走了那么远,我们只需要打印正确的像素就可以看成字符。感谢Marcel Sondaar及其在GitHub上的仓库,我们不需要绘制每个字符。

有了小的调整,一个扩大了简易程序,打印f代替X0代替的空间,将每个字符之间的空格,添加页眉和我们有相应的则charCode字母a .ppm格式文件。

再往前走一小步,您不会得到char作为输入,而是一行。整理一个文件,通过管道传递到您的程序并输出到/dev/fb0,您将获得文本输出:

文字输出示例

我也在树莓派上测试了该解决方案,并且有效。系统告诉我,我不具有发布两个以上链接的声誉。在得到这个之前,您必须依靠我的话:D


2

在控制台方面,您可以回显内容,/dev/console也可以使用syslog,并且根据各种其他设置,它可能会显示在控制台上。

对于图像,我只是尝试将bmp文件添加到fb0上,所以它确实有效!(分类-多份,较小尺寸)

我在这里找到了一个bmp-to-framebuffer程序。那应该是fb0期望格式的完美示例。还有fbi一个用于直接写入帧缓冲区的程序。


fbi允许我在屏幕上放置图片,这很有用,但是一旦退出,它将清除帧缓冲区。
LawrenceC

0

这是一篇老文章,但我知道通常您需要使用framebuffer控制台(fbcon)才能在framebuffer上运行控制台。它在配置中。(设备驱动程序/图形/控制台显示。。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.