Law*_*ceC 29 linux command-line arm framebuffer
所以我有一个 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。
Jde*_*eBP 29
有几个人已经回答了您的问题中处理内核和将图像(而不是文本)放入帧缓冲区的部分,但到目前为止,其余部分仍未解决。是的,您可以使用内核虚拟终端子系统来制作所谓的帧缓冲区控制台。但是有几种工具可以让您使用帧缓冲设备来制作用户空间虚拟终端。这些包括:
console-terminal-emulator和console-fb-realizer工具——一个用户空间虚拟终端,旨在复制 Linux 和 FreeBSD/PC-BSD 内核虚拟终端。它也不依赖于 X 库。logindsystemd 中的服务器及其“席位”概念密切相关。特别是 Ali Gholami Rudi,他制作的不仅仅是用于帧缓冲工作的终端模拟器。 他还编写了一个直接到帧缓冲区的 PDF 查看器、VNC 查看器、媒体播放器和古兰经阅读器。
完整的并排比较超出了本答案的范围;但这里有一些与问题相关的要点:
fbpad并且设计的 nosh 工具不使用任何 X 库。bdftobogl工具将BDF字体转换为BOGL字体;一个将 TTF 转换为 fbpad 使用 ft2tf ( Arch ) 工具使用的“tinyfont”字体。console-fb-realizer工具使用与新的 FreeBSD 10.1 内核虚拟终端子系统相同的“vt”字体,因此共享vtfontcvt用于转换 BDF 字体的 FreeBSD 字体操作工具。console-convert-kbdmap工具将 BSD kbdmap 文件转换为这种格式。同样,这些 kbdmap 文件是用于 FreeBSD/PC-BSD vt 子系统的文件。login。/etc/ttys(BSD)、/etc/inittab(Linux 系统 5 init)或其他系统集成,它们将生成 getty/login/shell 的工作留给这些系统。 console-fb-realizer只需要足够的权限来打开帧缓冲区和输入事件设备,不需要超级用户权限,并访问 FIFO 和由 维护的普通文件console-terminal-emulator,而后者根本不需要任何特殊权限。当然,所有这些都是终端模拟器。如果你想把终端仿真拿出来,更直接地把文本放在帧缓冲区上,你有一些选择:
console-terminal-emulator。 console-fb-realizer使用带有字符元胞数组的显示文件,类似于/dev/vcsa*普通文件(不是字符特殊设备文件),并带有 Unicode 代码点、ECMA-48 属性和 24 位 RGB 颜色。所以可以运行它,只需将字符+属性+颜色直接写入字符元胞数组文件,让console-fb-realizer字体渲染到帧缓冲区。
顺便说一句:请注意,这与与 BRLTTY的集成相反,后者使用console-terminal-emulator但不运行console-fb-realizer.
Kei*_*ith 15
要将帧缓冲区用作控制台,您需要该fbdev模块。您可能需要重新编译内核。
您可能还对 DirectFB 项目感兴趣,它是一个可以更轻松地使用帧缓冲区的库。还有已经为它编写的应用程序和 GUI 环境。
小智 14
如果您可以/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
Run Code Online (Sandbox Code Playgroud)
这里的重要部分是宽度 480 和高度 272 像素。
正如你所提到的,你可以用
cat /dev/urandom > /dev/fb0
你可以用 cat /dev/zeros > /dev/fb0
比清除您的屏幕,我们必须确保您正确获得尺寸。
偶然地,我的 busybox 有一个 fbsplash 二进制文件,它可以作为 .ppm 文件的输入。
如果我错了,请纠正,但似乎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
Run Code Online (Sandbox Code Playgroud)
因此,将有 272 行,959 个字符宽。文档说它应该是 1 而不是 f... 在 busybox 和 raspi f 更亮。
重要的是您在 0 之后没有空格...此任务可能有点乏味...您最好使用可以帮助您的文本编辑器。在 vim 中,您可以复制前两行,进入命令模式 (esc),然后键入以下字符:
of(esc)479a 0(esc)yy271p
Run Code Online (Sandbox Code Playgroud)
当然,我用的是我的尺寸,你应该用你的。Cat 这个文件到/dev/fb0,它应该看起来像:

好吧,我在作弊......那里不仅仅是一行......它大约是 8......但是当它不起作用时(我们有错误的尺寸或者我们在最后有空间,只有一行是很多更轻松)。
如果你做到了那么远,我们只需要打印正确的像素即可看到字符。感谢Marcel Sondaar 和他在 GitHub 上的 repo,我们不需要绘制每个字符。
有了小的调整,一个扩大了简易程序,打印f代替X和0代替的空间,将每个字符之间的空格,添加页眉和我们有相应的则charCode字母a .ppm格式文件。
再往前走一小步,你不会得到一个字符作为输入,而是一行。Cat 一个文件,通过管道连接到您的程序并输出到/dev/fb0您会得到一个文本输出:
我也在树莓派上测试了这个解决方案,它奏效了。系统告诉我我没有发布超过 2 个链接的声誉。在我得到这个之前,你必须相信我的话:D