GNU/Linux >> Znalost Linux >  >> Linux

Jak používat /dev/fb0 jako konzoli z uživatelského prostoru nebo do ní vysílat text

Několik lidí odpovědělo na části vaší otázky týkající se jádra a vkládání obrázků (spíše než text) do framebufferu, ale zbytek zatím zůstává neadresný. Ano, můžete použít subsystém virtuálního terminálu jádra k vytvoření takzvané konzole framebufferu . Existuje však několik nástrojů, které vám umožňují použít zařízení framebuffer k vytvoření virtuálních terminálů v uživatelském prostoru . Patří mezi ně:

  • zhcon (Debian) — virtuální terminál v uživatelském prostoru zaměřený na zpracování CJK I/O mnohem lépe než subsystém jádra. Jeho zvláštní síla je ve zpracování kódování ISO 2022 bez UTF; jeho zvláštní slabinou je kódování UTF.
  • fbterm (Debian) — virtuální terminál v uživatelském prostoru, který vytvořil několik forků včetně jfbterm. Má spoustu zásuvných modulů vstupní metody CJK.
  • bogl-bterm (Debian) – virtuální terminál v uživatelském prostoru, který vytvořil forky, jako je niterm.
  • Fbpad Ali Gholami Rudi — minimalistický virtuální terminál uživatelského prostoru, který není závislý na X knihovnách.
  • 02 a 10 nástroje v nosh — virtuální terminál v uživatelském prostoru zaměřený na replikaci virtuálních terminálů jádra Linuxu a FreeBSD/PC-BSD. Také nemá žádnou závislost na X knihovnách.
  • kmscon — virtuální terminál uživatelského prostoru, který je úzce propojen s 23 server v systemd a jeho pojmy „sedadla“.

Zejména Ali Gholami Rudi vytvořil více než jen emulátor terminálu pro práci s framebufferem. Napsal také prohlížeč PDF s přímým přístupem k vyrovnávací paměti snímků, prohlížeč VNC, přehrávač médií a čtečku Koránu.

Úplné srovnání vedle sebe je mimo rozsah této odpovědi; ale zde je několik bodů, které jsou pro tuto otázku relevantní:

  • Jak bylo uvedeno, několik programů virtuálního terminálu v uživatelském prostoru využívá knihovny X pro práci s písmy, mapování klávesnice, metody zadávání CJK a tak dále. Nejsou to X klienti, ale mají závislosti z X knihoven. 35 a nástroje nosh podle návrhu nevyužívají žádné X knihovny.
  • Programy, které používají X knihovny pro práci s písmy, samozřejmě používají X písem. Ostatní se zařídí jinak.
    • bogl-bterm a fbpad mají své vlastní idiosynkratické formáty písem. Jeden převede písma BDF na písma BOGL pomocí 41 nástroj; a jeden převede TTF na "tinyfont" fonty, které používá fbpad pomocí nástroje ft2tf (Arch).
    • Nosh 51 nástroj používá stejné "vt" fonty jako nový virtuální terminálový subsystém jádra FreeBSD 10.1, a proto sdílí nástroj pro manipulaci s fonty FreeBSD 69 pro převod písem BDF.
  • Programy, které používají knihovny X, používají mapování klávesnice X. Pokud jde o ostatní:
    • Nástroje nosh mají svůj vlastní idiosynkratický formát mapy klávesnice, který má poskytnout plnou klávesnici splňující normu ISO 9995-3 se skupinou ISO „common“ 2. Soubory BSD kbdmap lze převést do tohoto formátu pomocí 76 nástroj. Tyto soubory kbdmap jsou opět ty, které se používají se subsystémem FreeBSD/PC-BSD vt.
    • fbpad vůbec neprovádí vlastní mapování klávesnice a spoléhá se na přítomnost subsystému virtuálního terminálu jádra a jeho mechanismu mapování klávesnice.
  • Existují určité rozdíly ve vyvolání a požadovaných oprávněních:
    • zhcon, fbterm, bogl-bterm, fbpad a kmscon fungují na základě toho, že emulátor terminálu vytváří shell/login program na terminálu přímo jako podřízený proces. Potřebují práva superuživatele, aby mohli vytvořit 81 .
    • Nástroje nosh byly navrženy tak, aby se daly integrovat se stávajícím 96 (BSD), 108 (Linux systém 5 111 ), nebo jiný systém, kterému přenechají práci spawnování getty/login/shell. 127 potřebuje pouze dostatečná oprávnění k otevření framebufferu a vstupních událostí, což nemusí být oprávnění superuživatele, ak přístupu k FIFO a běžným souborům spravovaným 131 , který zase nepotřebuje vůbec žádná zvláštní oprávnění.

Všechny tyto jsou emulátory terminálu samozřejmě. Pokud chcete odstranit emulaci terminálu a umístit text do framebufferu příměji, máte několik možností:

  • bogl-bterm je samozřejmě založen na Ben's Own Graphics Library Bena Pfaffa I/O knihovna framebufferu navržená pro použití v prostředích nastavení/záchrany systému (a "pro GUI v PDA"). Můžete samozřejmě psát programy, které to přímo používají.
  • Na půli cesty mezi psaním programu, který využívá knihovnu framebufferu k vlastnímu vykreslování, a programem, který chrlí escape sekvence do toho, co považuje za terminál:virtuální terminál v uživatelském prostoru nosh je modulární a se rozdělí na jednotlivé části. 148 prostě nelze použít .

    159 používá soubor zobrazení s polem buněk, například 164 ale obyčejný soubor (nikoli soubor se speciálním znakem zařízení) a s body kódu Unicode, atributy ECMA-48 a 24bitovou barvou RGB. Takže to lze spustit a jednoduše napsat znak+atribut+barva přímo do souboru pole buněk znaků, nechat 172 proveďte vykreslení písem do framebufferu.

    Na okraj:Všimněte si, že se jedná o opak integrace s BRLTTY, která používá 181 ale nespustí 190 .


K použití framebufferu jako konzole potřebujete 203 modul. Možná budete muset překompilovat jádro.

Také by vás mohl zajímat projekt DirectFB, což je knihovna, která usnadňuje používání framebufferu. Existují také aplikace a prostředí GUI již pro něj napsané.


Pokud můžete kočka 213 a získat náhodné pixely na obrazovce, máte vše, co potřebujete.

V mém případě jsem potřeboval vypsat nějaké textové informace. Testoval jsem to v busybox a raspi, takže by vám to mohlo fungovat. Odpověď může být trochu dlouhá, protože pokud nepoužíváte nějakou konzoli, budete si muset vytisknout pixelů znaků sami. Naštěstí někdo udělal tu těžkou práci, takže to musíme zkombinovat.

V busybox nebo v raspi byste měli mít 227 binary.To vám může pomoci zjistit vaše nastavení jako rozměry obrazovky.

V mém embedded vypadá takto:

# 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

Důležitou součástí je zde šířka 480 a výška 272 pixelů.

Jak jste zmínil, můžete obrazovku vyplnit pomocí 231

a můžete jej vymazat pomocí 246

Než vymažete obrazovku, musíme vás ujistit, že získáte správné rozměry.

Náhodou měl můj busybox binární soubor fbsplash, který dostal jako vstup soubor .ppm.

Opravte, pokud se mýlím, ale zdá se, že 257 tento formát přijímá. Když se podíváte na Portable Anymap na Wikipedii, existuje několik "podformátů"... fbsplash používá luxusní formát s barvou a tak dále... ale my chceme mít možnost vytisknout jen něco čitelného. Pro jednoduchost použijme P1 kódovaný v ASCII. Pokud bychom mohli vytisknout svislou čáru, věděli bychom, že naše rozměry jsou správné. Zkusme to:

Svislá čára v ppm typu P1 by měla vypadat takto:

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

Takže tam bude 272 řádků, 959 znaků na šířku. Dokumentace říká, že by to mělo být 1 místo f... na busybox a raspi f bylo jasnější.

Je důležité, abyste za nulami neměli mezeru...Tento úkol může být trochu zdlouhavý... raději použijte textový editor, který vám pomůže.Ve vimu můžete zkopírovat první dva řádky, přejít do příkazového režimu ( esc), poté zadejte následující znaky:

of(esc)479a 0(esc)yy271p

Samozřejmě, že používám své rozměry, vy byste měli použít své. Tento soubor převeďte na 266 , mělo by to vypadat takto:

Ok, podvádím... není tam jen jeden řádek... je to asi 8... ale když to nefunguje (máme špatné rozměry nebo máme místo na konci, mít jen jeden řádek je moc jednodušší).

Pokud jste se dostali tak daleko, stačí vytisknout správné pixely, abyste je viděli jako znaky. Díky Marcelu Sondaarovi a jeho repozitáři na GitHubu nebudeme muset kreslit každý znak.

Malým vylepšením rozšiřte jeho jednoduchý program na tisk 279 místo 289 a 292 místo mezer vložte mezery mezi každý znak, přidejte záhlaví a máme soubor .ppm s písmenem odpovídajícím jeho znakovému kódu.

O malý krůček dále a nezískáte znak jako vstup, ale řádek. Catat soubor, roura do vašeho programu a výstup na 306 a dostanete textový výstup:

Testoval jsem toto řešení také na malinovém pi a fungovalo to. Systém mi říká, že nemám pověst, abych mohl zveřejnit více než 2 odkazy. Dokud to nedostanu, musíte se spolehnout na mé slovo :D


Linux
  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  3. Jak kódovat base64 /dev/random nebo /dev/urandom?

  1. Jak zaměníte /dev/sda s /dev/sdb?

  2. DD z /dev/zero do /dev/null...co se vlastně stane

  3. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  1. Jak vyměnit vadný pevný disk v softwarovém RAID systému Linux

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Vytvořte virtuální blokové zařízení, které zapisuje do /dev/null