Cara menggunakan / dev / fb0 sebagai konsol dari userspace, atau menampilkan teks ke sana

24

Jadi saya memiliki model Palm Pre (P100EWW asli) yang saya aktifkan mode pengembang, dan menginstal chroot Debian Squeeze. Bagus sekali. Saya memiliki rencana untuk menggunakan ini untuk APA SAJA (rekan bittorrent, server web) tetapi telepon.

Saya perhatikan jika saya melakukan cat /dev/urandom > /dev/fb0itu sebenarnya menulis piksel acak ke layar sampai No space left on devicekesalahan dihasilkan. Luar biasa, sekarang saya bisa menggunakan layar.

Jadi, jenis utiliti apa yang akan baik A) izinkan saya menggunakan / dev / fb0 sebagai konsol saya dapat menampilkan teks ke atau B) render teks pada / dev / fb0 dari baris perintah.

Saya belum tahu tentang mengkompilasi ulang kernel untuk ini (saya ingin akhirnya menghapus WebOS sepenuhnya dan mengubahnya menjadi server ARM minimal) jadi alat userspace jika mereka ada adalah apa yang saya tanyakan. Juga lebih suka untuk me-render langsung ke / dev / fb0 dan tidak menggunakan X.

LawrenceC
sumber
Konsol virtual Linux harus bekerja di atas driver framebuffer. Konsol virtual adalah alat yang ampuh; karena Linux 2.6 mereka mengizinkan untuk mengatur font yang berbeda untuk setiap konsol. Tetapi mereka dikontrol (dari userspace) melalui / dev / vcs  n dan / dev / vcsa  n , bukan / dev / fb0.
Incnis Mrsi

Jawaban:

11

Untuk menggunakan framebuffer sebagai konsol, Anda memerlukan fbdevmodul. Anda mungkin harus mengkompilasi ulang kernel Anda.

Anda mungkin juga tertarik dengan proyek DirectFB, yang merupakan perpustakaan yang mempermudah penggunaan framebuffer. Ada juga aplikasi dan lingkungan GUI yang sudah ditulis untuk itu.

Keith
sumber
1
Sepertinya ketika saya menginstal Directfb ( webos-internals.org/wiki/Directfb ), ia datang dengan utilitas bernama dfbgyang memungkinkan saya menaruh gambar di sana (dan tidak menghapusnya setelah selesai seperti fbi). Saya tahu saya kemungkinan dapat menemukan utilitas untuk membuat .png atau serupa dari teks blok jadi ini mungkin hanya berfungsi ...
LawrenceC
24

Beberapa orang telah menjawab bagian-bagian dari pertanyaan Anda yang berhubungan dengan kernel dan meletakkan gambar (alih-alih teks) ke dalam framebuffer, tetapi sejauh ini sisanya tetap tidak tertangani. Ya, Anda dapat menggunakan subsistem terminal virtual kernel untuk membuat konsol framebuffer . Tetapi ada beberapa alat yang memungkinkan Anda untuk menggunakan perangkat framebuffer untuk membuat terminal virtual ruang pengguna . Ini termasuk:

  • zhcon ( Debian ) - terminal virtual userspace yang diarahkan untuk menangani CJK I / O jauh lebih baik daripada subsistem kernel. Kekuatan khususnya dalam menangani pengkodean non-UTF ISO 2022; kelemahan khususnya adalah pengkodean UTF.
  • fbterm ( Debian ) - terminal virtual userspace yang telah melahirkan beberapa garpu termasuk jfbterm . Ini memiliki banyak plug-in metode input CJK.
  • bogl-bterm ( Debian ) - terminal virtual userspace yang telah menghasilkan garpu seperti niterm .
  • Ali Gholami Rudi fbpad - terminal virtual userspace minimalis yang tidak memiliki ketergantungan pada perpustakaan X.
  • The console-terminal-emulatorand console-fb-realizertools in nosh - terminal virtual userspace yang bertujuan mereplikasi terminal virtual kernel Linux dan FreeBSD / PC-BSD. Itu juga tidak memiliki ketergantungan pada perpustakaan X.
  • kmscon - terminal virtual userspace yang terkait erat dengan logindserver di systemd dan gagasannya tentang "kursi".

Ali Gholami Rudi secara khusus telah menghasilkan lebih dari sekadar emulator terminal untuk pekerjaan framebuffer. Dia juga menulis penampil PDF direct-to-framebuffer, penampil VNC, pemutar media, dan pembaca Quran.

Perbandingan sisi-demi-sisi lengkap dengan cakupan dari jawaban ini; tetapi di sini ada beberapa poin yang relevan dengan pertanyaan:

  • Seperti dicatat, beberapa program terminal virtual ruang pengguna menggunakan pustaka X untuk penanganan font, pemetaan keyboard, metode input CJK, dan sebagainya. Mereka bukan klien X, tetapi mereka memiliki dependensi dari pustaka X. fbpaddan alat nosh dengan desain tidak menggunakan perpustakaan X apa pun.
  • Program yang menggunakan pustaka X untuk penanganan font tentu saja menggunakan font X. Yang lain membuat pengaturan lain.
    • bogl-bterm dan fbpad keduanya memiliki format font istimewa. Satu mengkonversi font BDF ke font BOGL dengan bdftoboglalat; dan satu mengkonversi TTF ke font "tinyfont" yang digunakan oleh fbpad dengan alat ft2tf ( Arch ).
    • Alat nosh console-fb-realizermenggunakan font "vt" yang sama dengan subsistem terminal virtual FreeBSD 10.1 kernel baru , dan dengan demikian membagikan alat manipulasi font FreeBSD vtfontcvtuntuk mengonversi font BDF.
  • Program yang menggunakan pustaka X menggunakan pemetaan keyboard X. Adapun yang lainnya:
    • Alat nosh memiliki format peta keyboard idiosinkratik mereka sendiri, yang dimaksudkan untuk menyediakan keyboard lengkap yang mampu ISO 9995-3 dengan grup "umum" ISO 2. Satu mengkonversi file kbdmap BSD ke format ini dengan console-convert-kbdmapalat ini. Sekali lagi, file kbdmap ini adalah yang digunakan dengan subsistem FreeBSD / PC-BSD vt .
    • fbpad tidak melakukan pemetaan keyboard sendiri sama sekali, dan bergantung pada keberadaan subsistem terminal virtual kernel dan mekanisme pemetaan keyboardnya untuk itu.
  • Ada beberapa perbedaan dalam permintaan dan hak istimewa yang diperlukan:
    • zhcon, fbterm, bogl-bterm, fbpad, dan kmscon bekerja atas dasar bahwa emulator terminal memunculkan program shell / login pada terminal, secara langsung, sebagai proses anak. Mereka membutuhkan hak akses superuser untuk bertelur login.
    • Alat nosh dirancang untuk diintegrasikan dengan yang sudah ada /etc/ttys(BSD), /etc/inittab(sistem Linux 5 init), atau sistem lain, di mana mereka meninggalkan pekerjaan pemijahan getty / login / shell. console-fb-realizerhanya membutuhkan cukup hak istimewa untuk membuka framebuffer dan memasukkan perangkat acara, yang tidak perlu menjadi hak pengguna super, dan untuk mengakses FIFO dan file biasa yang dikelola oleh console-terminal-emulator, yang pada gilirannya tidak memerlukan hak istimewa sama sekali.

Semua ini tentu saja adalah emulator terminal . Jika Anda ingin mengeluarkan emulasi terminal dan menempatkan teks pada framebuffer secara langsung, Anda memiliki beberapa pilihan:

  • bogl-bterm tentu saja didasarkan pada Perpustakaan Grafis Sendiri Ben Pfaff, sebuah perpustakaan I / O framebuffer yang dirancang untuk digunakan dalam lingkungan pengaturan / penyelamatan sistem (dan "untuk GUI di PDA" ). Tentu saja Anda dapat menulis program yang menggunakannya secara langsung.
  • Untuk setengah jalan antara menulis sebuah program yang menggunakan perpustakaan framebuffer untuk melakukan rendering sendiri dan program yang mengeluarkan urutan escape ke apa yang dianggapnya terminal: Terminal virtual ruang pengguna nosh adalah modular, dan terbagi menjadi beberapa potongan komponen. Seseorang tidak bisa menggunakan console-terminal-emulator.

    console-fb-realizermenggunakan file tampilan dengan array sel karakter, seperti /dev/vcsa*tetapi file biasa (bukan file perangkat karakter khusus) dan dengan titik kode Unicode, atribut ECMA-48, dan warna RGB 24-bit. Jadi orang dapat menjalankannya dan hanya menulis karakter + atribut + warna langsung ke file array sel karakter, membiarkan console-fb-realizermelakukan rendering font ke framebuffer.

    Sebagai tambahan: Perhatikan bahwa ini adalah kebalikan dari integrasi dengan BRLTTY , yang menggunakan console-terminal-emulatortetapi tidak berjalan console-fb-realizer.

JdeBP
sumber
1
Ini jawaban yang luar biasa. Perpustakaan Enlightenment mengklaim dukungan framebuffer di linux fbcon- tergantung pada opsi waktu kompilasi . Ini juga berlaku untuk emulator terminal dependen mereka Terminologi : Bekerja langsung di framebuffer linux (fbcon) . Selain terminology, saya yang kedua kmscon (dan pekerjaan lain dari David Herrmann) rekomendasi sendiri .
mikeserv
1
Rudi adalah master framebuffer! Suatu hari saya akan membuang X11 juga.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
10

Jika Anda bisa /dev/urandom > /dev/fb0menggambar dan mendapatkan piksel acak di layar, Anda memiliki semua yang Anda butuhkan.

Dalam kasus saya, saya perlu membuang beberapa info teks. Saya menguji ini di busybox dan raspi, jadi mungkin berhasil untuk Anda. Jawabannya mungkin agak lama, karena jika Anda tidak menggunakan konsol, Anda perlu mencetak sendiri piksel-piksel karakter. Untungnya seseorang telah melakukan pekerjaan berat, jadi kita hanya perlu menggabungkannya.

Di busybox atau raspi Anda, Anda harus memiliki fbsetbiner. Ini mungkin membantu Anda mengetahui pengaturan Anda sebagai dimensi layar.

Di embedded saya terlihat seperti ini:

# 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

Bagian penting di sini adalah lebar 480 dan tinggi 272 piksel.

Seperti yang Anda sebutkan, Anda dapat memenuhi layar dengan cat /dev/urandom > /dev/fb0

dan Anda dapat menghapusnya dengan cat /dev/zeros > /dev/fb0

Dari membersihkan layar Anda, kami harus memastikan Anda mendapatkan dimensi dengan benar.

Secara kebetulan, busybox saya memiliki biner fbsplash yang mendapatkan sebagai input file .ppm.

Benar jika saya salah, tetapi tampaknya fb0menerima format ini. Melihat Portable Anymap di Wikipedia , ada beberapa "subformat" ... fbsplash menggunakan yang mewah dengan warna, dan seterusnya ... tetapi kami ingin dapat hanya mencetak sesuatu yang dapat dibaca. Mari kita gunakan kode P1 dalam ASCII demi kesederhanaan. Jika kita bisa mencetak garis vertikal, kita akan tahu dimensi kita benar. Mari kita coba:

Garis vertikal dalam ppm tipe P1 akan terlihat seperti ini:

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

Jadi, akan ada 272 garis, lebar 959 karakter. Dokumentasi mengatakan seharusnya 1 bukannya f ... di busybox dan raspi f lebih cerah.

Penting bahwa Anda tidak memiliki ruang setelah 0 ... Tugas ini bisa sedikit membosankan ... Anda lebih baik menggunakan editor teks yang membantu Anda. Di vim, Anda dapat menyalin dua baris pertama, pergi ke mode perintah (esc), daripada mengetik karakter berikut:

of(esc)479a 0(esc)yy271p

Tentu saja, saya menggunakan dimensi saya, Anda harus menggunakan dimensi Anda. Cat file ini /dev/fb0, akan terlihat seperti: Layar garis vertikal

Ok, saya curang ... itu bukan hanya satu baris di sana ... itu sekitar 8 ... tetapi ketika tidak bekerja (kami memiliki dimensi yang salah atau kami memiliki ruang pada akhirnya, memiliki hanya satu baris jauh lebih mudah).

Jika Anda sejauh itu, kita hanya perlu mencetak piksel yang tepat untuk dilihat sebagai karakter. Berkat Marcel Sondaar dan repo-nya di GitHub kita tidak perlu menggambar masing-masing char.

Dengan tweak kecil memperluas program sederhana untuk mencetak fbukan Xdan 0bukannya spasi, masukkan spasi di antara masing-masing karakter, tambahkan header dan kami memiliki file .ppm dengan huruf yang sesuai dengan kode kodenya.

Satu langkah kecil lebih jauh dan Anda tidak mendapatkan char sebagai input, tetapi sebuah baris. Cat file, pipa ke program Anda dan output ke /dev/fb0dan Anda mendapatkan output teks:

Contoh output teks

Saya menguji solusi ini juga pada pi raspberry dan itu berhasil. Sistem memberi tahu saya bahwa saya tidak memiliki reputasi untuk mengirim lebih dari 2 tautan. Sampai saya mendapatkan ini, Anda harus mengandalkan kata saya: D

Zeh
sumber
2

Untuk sisi konsol, Anda dapat menggema hal-hal /dev/consoleatau Anda dapat menggunakan syslog, dan tergantung pada berbagai pengaturan lain, itu mungkin muncul di konsol.

Untuk gambar, saya baru saja mencoba membuat file bmp ke fb0 dan ternyata berfungsi! (sortof - banyak salinan, ukuran lebih kecil)

Saya menemukan program bmp-to-framebuffer di sini . Itu harus menjadi contoh sempurna dari format yang diharapkan oleh fb0. Ada juga fbi, program untuk menulis langsung ke frame buffer.

Shawn J. Goff
sumber
fbimemungkinkan saya untuk meletakkan gambar di layar, yang berguna, tetapi membersihkan framebuffer setelah keluar.
LawrenceC
0

Ini adalah posting lama tapi saya mengerti biasanya Anda memerlukan framebuffer console (fbcon) untuk menjalankan konsol di framebuffer. Ada dalam konfigurasi. (driver perangkat / grafik / tampilan konsol ..)

Chan Kim
sumber