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
a10
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 FreeBSD69
pro převod písem BDF.
- bogl-bterm a fbpad mají své vlastní idiosynkratické formáty písem. Jeden převede písma BDF na písma BOGL pomocí
- 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.
- 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í
- 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 5111
), 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ým131
, který zase nepotřebuje vůbec žádná zvláštní oprávnění.
- 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
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říklad164
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ů, nechat172
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