Beberapa orang telah menjawab bagian dari pertanyaan Anda tentang kernel dan meletakkan gambar (bukan teks) ke framebuffer, tetapi sejauh ini sisanya tetap tidak tertangani. Ya, Anda dapat menggunakan subsistem terminal virtual kernel untuk membuat apa yang disebut konsol framebuffer . Namun ada beberapa alat yang memungkinkan Anda menggunakan perangkat framebuffer untuk membuat terminal virtual ruang pengguna . Ini termasuk:
- zhcon (Debian) — terminal virtual ruang pengguna diarahkan untuk menangani CJK I/O jauh lebih baik daripada subsistem kernel. Kekuatan khususnya adalah dalam menangani pengkodean non-UTF ISO 2022; kelemahan khususnya adalah pengkodean UTF.
- fbterm (Debian) — terminal virtual userspace yang telah menelurkan beberapa cabang termasuk jfbterm. Ini memiliki banyak plugin metode masukan CJK.
- bogl-bterm (Debian) — terminal virtual userspace yang telah menelurkan fork seperti niterm.
- fbpad Ali Gholami Rudi — terminal virtual ruang pengguna minimalis yang tidak memiliki ketergantungan pada pustaka X.
console-terminal-emulator
danconsole-fb-realizer
tools in nosh — terminal virtual userspace yang ditujukan untuk mereplikasi Linux dan terminal virtual kernel FreeBSD/PC-BSD. Itu juga tidak memiliki ketergantungan pada pustaka X.- kmscon — terminal virtual ruang pengguna yang terkait erat dengan
logind
server di systemd dan pengertiannya tentang "kursi".
Ali Gholami Rudi khususnya telah menghasilkan lebih dari sekedar emulator terminal untuk pekerjaan framebuffer. Dia juga menulis penampil PDF direct-to-framebuffer, penampil VNC, pemutar media, dan pembaca Quran.
Perbandingan penuh berdampingan berada di luar cakupan jawaban ini; namun berikut adalah beberapa poin yang relevan dengan pertanyaan tersebut:
- Seperti disebutkan, 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.
fbpad
dan 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 yang unik. Seseorang mengubah font BDF menjadi font BOGL dengan
bdftobogl
alat; dan satu mengonversi TTF ke font "tinyfont" yang digunakan oleh fbpad dengan alat ft2tf (Arch). - Nosh
console-fb-realizer
alat menggunakan font "vt" yang sama dengan subsistem terminal virtual kernel FreeBSD 10.1 baru, dan dengan demikian berbagi alat manipulasi font FreeBSDvtfontcvt
untuk mengonversi font BDF.
- bogl-bterm dan fbpad keduanya memiliki format font yang unik. Seseorang mengubah font BDF menjadi font BOGL dengan
- Program yang menggunakan perpustakaan X menggunakan pemetaan keyboard X. Adapun yang lainnya:
- Alat nosh memiliki format peta keyboard istimewa mereka sendiri, yang dimaksudkan untuk menyediakan keyboard berkemampuan ISO 9995-3 lengkap dengan grup "umum" ISO 2. Seseorang mengonversi file kbdmap BSD ke format ini dengan
console-convert-kbdmap
alat. Sekali lagi, file kbdmap ini adalah yang digunakan dengan subsistem vt FreeBSD/PC-BSD. - fbpad sama sekali tidak melakukan pemetaan keyboardnya sendiri, dan bergantung pada keberadaan subsistem terminal virtual kernel dan mekanisme pemetaan keyboardnya untuk itu.
- Alat nosh memiliki format peta keyboard istimewa mereka sendiri, yang dimaksudkan untuk menyediakan keyboard berkemampuan ISO 9995-3 lengkap dengan grup "umum" ISO 2. Seseorang mengonversi file kbdmap BSD ke format ini dengan
- Ada beberapa variasi dalam pemanggilan dan hak istimewa yang diperlukan:
- zhcon, fbterm, bogl-bterm, fbpad, dan kmscon bekerja atas dasar emulator terminal menelurkan program shell/login pada terminal, secara langsung, sebagai proses anak. Mereka membutuhkan hak superuser untuk menelurkan
login
. - Alat nosh dirancang untuk diintegrasikan dengan
/etc/ttys
yang sudah ada (BSD),/etc/inittab
(Sistem Linux 5init
), atau sistem lain, tempat mereka meninggalkan pekerjaan pemijahan getty/login/shell.console-fb-realizer
hanya memerlukan hak istimewa yang cukup untuk membuka framebuffer dan perangkat peristiwa input, yang tidak memerlukan hak istimewa pengguna super, dan untuk mengakses FIFO dan file biasa yang dikelola olehconsole-terminal-emulator
, yang pada gilirannya tidak memerlukan hak khusus sama sekali.
- zhcon, fbterm, bogl-bterm, fbpad, dan kmscon bekerja atas dasar emulator terminal menelurkan program shell/login pada terminal, secara langsung, sebagai proses anak. Mereka membutuhkan hak superuser untuk menelurkan
Semua ini adalah emulator terminal tentu saja. Jika Anda ingin mengeluarkan emulasi terminal dan menempatkan teks pada framebuffer secara lebih langsung, Anda memiliki beberapa pilihan:
- bogl-bterm tentu saja didasarkan pada Pustaka Grafik milik Ben milik Ben Pfaff perpustakaan I/O framebuffer yang dirancang untuk digunakan dalam pengaturan sistem/lingkungan penyelamatan (dan "untuk GUI di PDA"). Anda tentu saja dapat menulis program yang menggunakannya secara langsung.
- Untuk jalan tengah antara menulis program yang menggunakan perpustakaan framebuffer untuk melakukan renderingnya sendiri dan program yang mengeluarkan urutan pelarian ke apa yang dianggapnya sebagai terminal:Terminal virtual ruang pengguna nosh bersifat modular, dan terpecah menjadi bagian-bagian komponen. Seseorang tidak bisa menggunakan
console-terminal-emulator
.console-fb-realizer
menggunakan file tampilan dengan larik sel karakter, seperti/dev/vcsa*
tetapi file biasa (bukan file perangkat khusus karakter) dan dengan poin kode Unicode, atribut ECMA-48, dan warna RGB 24-bit. Jadi seseorang dapat menjalankannya dan hanya menulis karakter+atribut+warna langsung ke file larik sel karakter, biarkanconsole-fb-realizer
lakukan rendering font ke framebuffer.Sebagai tambahan:Perhatikan bahwa ini kebalikan dari integrasi dengan BRLTTY, yang menggunakan
console-terminal-emulator
tetapi tidak menjalankanconsole-fb-realizer
.
Untuk menggunakan framebuffer sebagai konsol, Anda memerlukan fbdev
modul. Anda mungkin harus mengkompilasi ulang kernel Anda.
Anda juga mungkin tertarik dengan proyek DirectFB, yang merupakan pustaka yang mempermudah penggunaan framebuffer. Ada juga aplikasi dan lingkungan GUI yang sudah ditulis untuk itu.
Jika Anda dapat kucing /dev/urandom > /dev/fb0
dan dapatkan 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 panjang, karena jika Anda tidak menggunakan beberapa konsol, Anda perlu mencetak piksel karakter Anda sendiri.Untungnya seseorang telah melakukan kerja keras, jadi kami hanya perlu menggabungkannya.
Di busybox atau di raspi Anda, Anda harus memiliki fbset
binary. Ini mungkin membantu Anda mengetahui setelan Anda sebagai dimensi layar.
Di tampilan tersemat saya 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
Daripada membersihkan layar Anda, kami harus memastikan Anda mendapatkan dimensi dengan benar.
Kebetulan busybox saya memiliki biner fbsplash yang mendapatkan input file .ppm.
Benar jika saya salah, tapi sepertinya fb0
menerima format ini. Melihat Portable Anymap di Wikipedia, ada beberapa "subformat"... fbsplash menggunakan yang mewah dengan warna, dan sebagainya... tetapi kami hanya ingin mencetak sesuatu yang dapat dibaca. Mari gunakan P1 yang dikodekan dalam ASCII demi kesederhanaan. Jika kami dapat mencetak garis vertikal, kami akan mengetahui bahwa dimensi kami sudah benar. Mari kita coba:
Garis vertikal dalam tipe ppm 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 baris, 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. Dalam vim, Anda dapat menyalin dua baris pertama, masuk ke mode perintah ( esc), lalu ketikkan karakter berikut:
of(esc)479a 0(esc)yy271p
Tentu saja, saya menggunakan dimensi saya, Anda harus menggunakan milik Anda.Cat file ini ke /dev/fb0
, seharusnya terlihat seperti:
Oke, saya curang... tidak hanya satu baris di sana... sekitar 8... tetapi ketika tidak berhasil (kami memiliki dimensi yang salah atau kami memiliki ruang di akhir, memiliki satu baris saja sudah banyak lebih mudah).
Jika Anda sudah sampai sejauh itu, kita tinggal mencetak piksel yang tepat untuk dilihat sebagai karakter. Berkat Marcel Sondaar dan repo-nya di GitHub, kita tidak perlu menggambar setiap karakter.
Dengan tweak kecil, kembangkan program sederhananya untuk mencetak f
bukannya X
dan 0
alih-alih spasi, sisipkan spasi di antara setiap karakter, tambahkan header dan kami memiliki file .ppm dengan huruf yang sesuai dengan kode karakternya.
Satu langkah kecil lebih jauh dan Anda tidak mendapatkan karakter sebagai input, tetapi file line.Cat, pipa ke program Anda dan output ke /dev/fb0
dan Anda mendapatkan keluaran teks:
Saya menguji solusi ini juga pada raspberry pi dan berhasil. Sistem memberi tahu saya bahwa saya tidak memiliki reputasi untuk mengirim lebih dari 2 tautan. Sampai saya mendapatkan ini, Anda harus mengandalkan kata-kata saya :D