GNU/Linux >> Belajar Linux >  >> Linux

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

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 dan console-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 FreeBSD vtfontcvt untuk mengonversi font BDF.
  • 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.
  • 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 5 init ), 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 oleh console-terminal-emulator , yang pada gilirannya tidak memerlukan hak khusus sama sekali.

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, biarkan console-fb-realizer lakukan rendering font ke framebuffer.

    Sebagai tambahan:Perhatikan bahwa ini kebalikan dari integrasi dengan BRLTTY, yang menggunakan console-terminal-emulator tetapi tidak menjalankan console-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


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  3. Linux – Bagaimana Cara Menggunakan /dev/fb0 Sebagai Konsol Dari Userspace, Atau Teks Output Ke Itu?

  1. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  2. Kapan Menggunakan /dev/random Vs /dev/urandom?

  3. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  1. Bagaimana cara menampilkan teks berwarna ke terminal Linux?

  2. Bagaimana Anda menukar/dev/sda dengan/dev/sdb?

  3. DD dari /dev/zero ke /dev/null...apa yang sebenarnya terjadi