Jak używać / dev / fb0 jako konsoli z przestrzeni użytkownika lub wyprowadzać do niej tekst

24

Mam więc model Palm Pre (oryginalny P100EWW), w którym włączyłem tryb programisty i zainstalowałem chroota Debian Squeeze. Działa świetnie. Planuję używać tego do WSZYSTKIEGO (bittorrent peer, serwer WWW), ale do telefonu.

Zauważyłem, że jeśli to zrobię cat /dev/urandom > /dev/fb0, faktycznie zapisuje na ekranie losowe piksele, dopóki nie No space left on devicezostanie wygenerowany błąd. Wspaniale, teraz mogę korzystać z wyświetlacza.

Więc jakie są zastosowania, które albo A) pozwolą użyć / dev / fb0 jako konsoli, z której mogę wypisywać tekst lub B) renderować tekst na / dev / fb0 z linii poleceń.

Nie wiem jeszcze o ponownej kompilacji jądra (chciałbym w końcu całkowicie wyłączyć WebOS i przekształcić go w minimalny serwer ARM), więc pytam o narzędzia przestrzeni użytkownika, jeśli istnieją. Wolałby również renderować bezpośrednio do / dev / fb0 i nie używać X.

LawrenceC
źródło
Wirtualne konsole systemu Linux powinny działać na sterowniku bufora ramki. Konsole wirtualne są potężnym narzędziem; od Linuksa 2.6 pozwalają one ustawić różne czcionki dla każdej konsoli. Ale są one kontrolowane (z przestrzeni użytkownika) przez / dev / vcs  n i / dev / vcsa  n , a nie / dev / fb0.
Incnis Mrsi,

Odpowiedzi:

11

Aby użyć bufora ramki jako konsoli, potrzebujesz fbdevmodułu. Może być konieczne ponowne skompilowanie jądra.

Może Cię również zainteresować projekt DirectFB, który jest biblioteką, która ułatwia korzystanie z bufora ramki. Istnieją już napisane aplikacje i środowiska GUI.

Keith
źródło
1
Wygląda na to, że kiedy zainstalowałem Directfb ( webos-internals.org/wiki/Directfb ), przyszedł z narzędziem o nazwie, dfbgktóre pozwala mi umieścić tam zdjęcie (i nie usuwa go po ukończeniu jak fbi). Wiem, że prawdopodobnie mogę znaleźć narzędzie do utworzenia pliku .png lub podobnego z tekstu blokowego, więc może to po prostu zadziałać ...
LawrenceC
24

Kilka osób odpowiedziało na części twojego pytania dotyczące jądra i umieszczania obrazów (a nie tekstu) w buforze ramki, ale jak dotąd reszta pozostaje bez odpowiedzi. Tak, możesz użyć podsystemu wirtualnego terminala jądra, aby utworzyć tak zwaną konsolę bufora ramki . Istnieje jednak kilka narzędzi, które pozwalają używać urządzenia buforującego ramki do tworzenia wirtualnych terminali w przestrzeni użytkownika . Obejmują one:

  • zhcon ( Debian ) - wirtualny terminal przestrzeni użytkownika ukierunkowany na obsługę CJK I / O znacznie lepiej niż podsystem jądra. Jego szczególna siła polega na obsłudze kodowań innych niż UTF ISO 2022; jego szczególną słabością są kodowania UTF.
  • fbterm ( Debian ) - wirtualny terminal przestrzeni użytkownika, który stworzył kilka rozwidleń, w tym jfbterm . Ma kilka wtyczek metody wprowadzania CJK.
  • bogl-bterm ( Debian ) - wirtualny terminal użytkownika, który stworzył forki, takie jak niterm .
  • Fbpad Ali Gholami Rudi - minimalistyczny wirtualny terminal użytkownika, który nie jest zależny od bibliotek X.
  • console-terminal-emulatorI console-fb-realizernarzędzia w nosh - przestrzeni użytkownika wirtualnego terminala na celu replikowania wirtualnych terminali Linuksa i FreeBSD / PC-BSD jądra. To także nie ma zależności od bibliotek X.
  • kmscon - wirtualny terminal użytkownika, który jest ściśle powiązany z logindserwerem w systemie i jego pojęciem „miejsc”.

Ali Gholami Rudi w szczególności wyprodukował coś więcej niż tylko emulator terminala do pracy z buforowaniem ramek. Napisał także przeglądarkę plików PDF bezpośrednio do ramki, przeglądarkę VNC, odtwarzacz multimediów i czytnik Koranu.

Pełne porównanie obok siebie wykracza poza zakres tej odpowiedzi; ale oto kilka punktów, które są istotne dla pytania:

  • Jak wspomniano, kilka programów terminalu wirtualnego w przestrzeni użytkownika korzysta z bibliotek X do obsługi czcionek, mapowania klawiatury, metod wprowadzania CJK i tak dalej. Nie są klientami X, ale mają zależności od bibliotek X. fbpada narzędzia nosh z założenia nie korzystają z żadnych bibliotek X.
  • Programy używające bibliotek X do obsługi czcionek oczywiście używają czcionek X. Inni dokonują innych ustaleń.
    • Zarówno bogl-bterm, jak i fbpad mają własne formaty czcionek. Za pomocą tego bdftoboglnarzędzia można konwertować czcionki BDF na czcionki BOGL ; a jeden konwertuje TTF na czcionki „tinyfont”, które są używane przez fbpad za pomocą narzędzia ft2tf ( Arch ).
    • console-fb-realizerNarzędzie nosh używa tych samych czcionek „vt”, co nowy podsystem terminala wirtualnego jądra FreeBSD 10.1 , a zatem udostępnia narzędzie vtfontcvtdo manipulacji czcionkami FreeBSD do konwersji czcionek BDF.
  • Programy korzystające z bibliotek X używają mapowania klawiatury X. Co do pozostałych:
    • Narzędzia nosh mają swój własny idiosynkratyczny format klawiatury, który ma na celu dostarczenie pełnej klawiatury zgodnej z ISO 9995-3 z „wspólną” grupą 2. ISO. Za pomocą tego console-convert-kbdmapnarzędzia konwertuje się pliki BSD kbdmap na ten format . Ponownie, te pliki kbdmap są używane w podsystemie FreeBSD / PC-BSD vt .
    • fbpad w ogóle nie wykonuje własnego mapowania klawiatury i polega na tym w podsystemie wirtualnego terminala jądra i jego mechanizmu mapowania klawiatury.
  • Istnieje pewna rozbieżność w wywołaniu i wymaganych uprawnieniach:
    • Programy zhcon, fbterm, bogl-bterm, fbpad i kmscon działają w oparciu o to, że emulator terminala odradza program powłoki / logowania bezpośrednio na terminalu, jako proces potomny. Potrzebują uprawnień administratora, aby się spawnować login.
    • Narzędzia nosh zostały zaprojektowane do integracji z istniejącym /etc/ttys(BSD), /etc/inittab(Linux system 5 init) lub innym systemem, do którego pozostawiają zadanie spawnowania getty / login / shell. console-fb-realizerpotrzebuje tylko wystarczających uprawnień do otwarcia bufora ramki i urządzeń zdarzeń wejściowych, które nie muszą być uprawnieniami administratora, oraz dostępu do przechowywanych przez FIFO i zwykłych plików console-terminal-emulator, co z kolei nie wymaga żadnych specjalnych uprawnień.

Wszystkie te są oczywiście terminalowymi emulatorami . Jeśli chcesz usunąć emulację terminala i umieścić tekst bezpośrednio w buforze ramki, masz kilka możliwości:

  • Bogl-Bterm jest oczywiście oparty na własnej bibliotece Bena Pfaffa własnej biblioteki graficznej B / B bufora ramek zaprojektowanej do użycia w środowiskach konfiguracji systemu / ratownictwa (i „dla GUI w PDA” ). Możesz oczywiście pisać programy, które bezpośrednio z niego korzystają.
  • W połowie drogi między pisaniem programu, który korzysta z biblioteki buforowania ramek do własnego renderowania, a programem, który wydziela sekwencje specjalne do tego, co myśli, że jest terminalem: terminal wirtualny przestrzeni użytkownika nosh jest modułowy i dzieli się na elementy składowe. Po prostu nie można użyć console-terminal-emulator.

    console-fb-realizerużywa pliku wyświetlanego z tablicą komórek znakowych, jak /dev/vcsa*zwykły plik (nie jest to plik specjalnego urządzenia znakowego), z punktami kodowymi Unicode, atrybutami ECMA-48 i 24-bitowym kolorem RGB. Można go więc uruchomić i po prostu napisać znak + atrybut + kolor bezpośrednio w pliku tablicy komórek znakowych, umożliwiając console-fb-realizerrenderowanie czcionek do bufora ramki.

    Na marginesie: zauważ , że jest to przeciwieństwo integracji z BRLTTY , który używa, console-terminal-emulatorale nie działa console-fb-realizer.

JdeBP
źródło
1
To niesamowita odpowiedź. Biblioteki Enlightenment twierdzą, że obsługują bufor ramki w systemie Linux fbcon- w zależności od opcji czasu kompilacji . Dotyczy to również ich zależnego emulatora terminali. Terminologia : Działa bezpośrednio w buforze ramki linux (fbcon) . Inne niż terminology, I drugi kmscon (i innych pracach Davida Herrmanna) zalecenia siebie .
mikeserv
1
Rudi jest mistrzem bufora ramki! Pewnego dnia też porzucę X11.
Ciro Santilli新疆改造中心法轮功六四事件
10

Jeśli potrafisz /dev/urandom > /dev/fb0wyskakiwać na ekranie losowe piksele, masz wszystko, czego potrzebujesz.

W moim przypadku musiałem zrzucić trochę informacji tekstowych. Przetestowałem to na busyboksie i raspi, więc może ci się przydać. Odpowiedź może być nieco długa, ponieważ jeśli nie używasz konsoli, musisz samodzielnie wydrukować piksele znaków. Na szczęście ktoś wykonał ciężką pracę, więc musimy ją po prostu połączyć.

W busybox lub w raspi powinieneś mieć plik fbsetbinarny. Może to pomóc w ustaleniu ustawień jako wymiarów ekranu.

W moim osadzonym wygląda to tak:

# 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

Ważną częścią jest tutaj szerokość 480 i wysokość 272 pikseli.

Jak wspomniałeś, możesz wypełnić ekran za pomocą cat /dev/urandom > /dev/fb0

i możesz to wyczyścić cat /dev/zeros > /dev/fb0

Niż wyczyść ekran, musimy upewnić się, że prawidłowo uzyskasz wymiary.

Przez przypadek mój busybox miał plik binarny fbsplash, który pobierał jako plik wejściowy .ppm.

Poprawnie, jeśli się mylę, ale wygląda na to, że fb0akceptuje ten format. Patrząc na Portable Anymap na Wikipedii , istnieje kilka „podformatów” ... fbsplash używa fantazyjnego z kolorami i tak dalej ... ale chcemy móc po prostu wydrukować coś czytelnego. Dla uproszczenia użyjmy P1 zakodowanego w ASCII. Gdybyśmy mogli wydrukować linię pionową, wiedzielibyśmy, że nasze wymiary są prawidłowe. Spróbujmy:

Linia pionowa w ppm typu P1 powinna wyglądać następująco:

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

Tak więc będzie 272 wierszy o szerokości 959 znaków. Dokumentacja mówi, że powinna być 1 zamiast f ... na busyboksie, a raspi f był jaśniejszy.

Ważne jest, aby po zerach nie było miejsca ... To zadanie może być trochę nudne ... lepiej użyj edytora tekstu, który ci pomoże. W vimie możesz skopiować pierwsze dwa wiersze, przejść do trybu poleceń (esc), a następnie wpisać następujące znaki:

of(esc)479a 0(esc)yy271p

Oczywiście używam swoich wymiarów, powinieneś użyć swoich. Cat ten plik do /dev/fb0, powinien wyglądać następująco: Pionowy ekran linii

Ok, oszukuję ... to nie jest tylko jedna linia ... to jest około 8 ... ale kiedy to nie działa (mamy złe wymiary lub na końcu mamy spację, posiadanie tylko jednej linii to dużo łatwiej).

Jeśli zaszedłeś tak daleko, musimy po prostu wydrukować odpowiednie piksele, aby zobaczyć je w postaci znaków. Dzięki Marcelowi Sondaarowi i jego repozytorium na GitHub nie będziemy musieli rysować każdego znaku.

Po drobnej poprawce rozwinął swój prosty program do drukowania fzamiast Xi 0zamiast spacji, wstaw spacje między każdym znakiem, dodaj nagłówek, a my mamy plik .ppm z literą odpowiadającą jego kodowi znaków.

Jeden mały krok dalej i nie dostajesz znaku jako wejścia, ale wiersz. Cat plik, potok do swojego programu i wyjście do, /dev/fb0a otrzymasz wynik tekstowy:

Przykład wyjścia tekstu

Testuję to rozwiązanie również na Raspberry Pi i zadziałało. System mówi mi, że nie mam reputacji, aby publikować więcej niż 2 linki. Dopóki tego nie otrzymam, musisz polegać na moim słowie: D

Zeh
źródło
2

Po stronie konsoli możesz echo rzeczy /dev/consolelub możesz użyć syslog, aw zależności od różnych innych ustawień, może pojawić się na konsoli.

W przypadku obrazów właśnie próbowałem przechwycić plik bmp do fb0 i faktycznie zadziałało! (sortof - wiele kopii, mniejszy rozmiar)

Tutaj znalazłem program bmp-to-framebuffer . To powinien być doskonały przykład formatu, którego oczekuje fb0. Istnieje również fbiprogram do zapisu bezpośrednio do bufora ramki.

Shawn J. Goff
źródło
fbipozwala mi umieścić obraz na ekranie, co jest przydatne, ale usuwa bufor ramki po wyjściu.
LawrenceC,
0

To stary post, ale rozumiem, że normalnie potrzebujesz konsoli bufora ramki (fbcon), aby uruchomić konsolę na buforze ramki. Jest w konfiguracji. (sterowniki urządzeń / grafika / wyświetlacz konsoli ..)

Chan Kim
źródło