Author Topic: RED /fb0  (Read 1286 times)

duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
RED /fb0
« on: May 16, 2018, 16:33:47 »
Hallo!

Ich betreibe das Szenario RED / HDMI-Display (800x400) und habe Fragen:

(a) Wie kann ich unterbinden, dass Linux das Display verwendet? (Und sich dort dann auch keine Session öffnet, also headless bleibt.)

(b) Wenn ich alles mit libgd selbst mache (wie im OLED-Beispiel): Wie ist das Display organisiert, so dass ich eine "draw_matrix"-Funktion realisieren kann?

Vielen Dank für jede Info!

Gruß, Uwe

jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #1 on: May 16, 2018, 17:05:16 »
Hi Uwe,

in den Einstellungen des RB gibt es den X-Server, den du als Dienst ausschalten kannst.

Danach gibt es noch ein nichtgrafisches Login, das kann man auch ausschalten, da müsste ich aber selber noch mal nachsehen.

Da kannst ja direkt in den framebuffer /dev/fb0 schreiben. Ist allerdings etwas frickelarbeit, da könntest du auch mit der SDL lib arbeiten, die nimmt dir die Arbeit ab.

duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
Re: RED /fb0
« Reply #2 on: May 17, 2018, 08:35:06 »
Hallo jg!

Danke für die Antwort. Das siehst Du genau richtig: X habe ich ausgeschaltet und die Login-Konsole möchte ich weg haben! Wahrscheinlich bestimmt darüber irgend eine Datei in /etc... -- aber welche? Wäre toll, wenn Du mir das sagen könntest!

(Ich hoffe natürlich, dass Linux den fb auf jeden Fall anlegt, auch wenn kein fb durch X oder eine Konsole benötigt wird ...)

Mein Gedanke war zunächst wie folgt: libgd malt für mich in einen Puffer. Den Puffer dumpe ich dann in /fb0. Dazu muss ich natürlich wissen,
a) wie der Buffer nach /fb0 abzubilden ist und
b) wie das Schreiben in einen fb genau erfolgt.

Zu a) : Das könnte ich natürlich mühselig ausprobieren. Aber vielleicht steht es schon irgendwo?
Zu b) : Ich nehme an: Öffnen, Bytes reinschieben, Schließen

Ich denke, diese Frickelei hält sich in Grenzen. Das sollte auf jeden Fall gehen, wenn's nicht super-performat oder bewegt sein muss.

Ich habe mir auch kurz SDL lib angesehen, aber noch nicht ausprobiert.

Woher weiß die SDL lib eigentlich, dass sie in /fb0 malen darf/muss? Ist das ein Automatismus (zur Compile-/Link- oder Runtime?), wenn nur ein fb und sonst nix vorhanden ist? Ist das schon vorkonfiguriert? Oder muss ich das konfigurieren?

Vielleicht kann mir mal jemand ein ein einfaches SDL-Testprogramm schicken ...

Gruß, Uwe

bernhard.graeuler

  • Newbie
  • *
  • Posts: 23
    • View Profile
Re: RED /fb0
« Reply #3 on: May 17, 2018, 09:32:41 »

jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #4 on: May 17, 2018, 11:22:06 »
Hi Uwe,

natürlich kannst du auch direkt nach fb0 schreiben, das hängt dann vom Red ab, ich glaube der macht 32 Bit.

Das mit dem login ist nicht weiter schlimm, sobald du in den Framebuffer schreibst, ist das Teil auch weg. Den Eintrag im /etc müsste ich auch erst suchen, aber mal sehen ob ich das heute Abend schnell rausfinden kann.

SDL funktioniert nur in der "alten" 1er Version, die 2er habe ich so nicht zum laufen bekommen. Auch hier schau ich mal nach, wie ich die Version auf den red bekommen habe. Mit Glück ist SDL schon im Repostory mit drin.

Ich habe bei meinen Versuchen mit SDL festgestellt, das der Red für so einen Winzling annehmbar schnell ist.

Werde dir dann Bescheid geben.

duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
Re: RED /fb0 / SDL / SDL2
« Reply #5 on: May 19, 2018, 14:37:40 »
Hallo!

sdl2 kriege ich nicht zum Laufen: kein video device.

Egal, ob über apt-get oder selbst kompiliert, mit GPU oder ohne, mit X oder ohne.

sdl1 läuft zwar (bisher nur via apt-get installiert), macht aber ... gar nichts auf/mit dem Display. Da mache ich etwas falsch.

Hast Du mal ein Test-Programm für mich? C und auch ausführbar?

Gruß, Uwe

jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #6 on: May 20, 2018, 17:28:32 »
Hi Uwe.

SDL2 nutzt nur noch Hardwarebeschleunigung via Grafikchip und das geht wohl beim Red nicht.

SDL1 funktioniert.

Hier ein kleines Beispiel, hab ich gerade mal aus ein paar Resten zusammengepackt und kurz getestet.

Code: [Select]
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_gfxPrimitives.h>

#define _W 1400
#define _H 460

SDL_Surface *screen;
Uint32 Mc[256];

int finish()
{
SDL_Quit();
return 0;
}

Uint32 convert(int r, int g, int b)
{
Uint32 x=0;

x = (( r * 16777216 ) + ( g * 65536  ) + ( b * 256 ) + 255 );
// fprintf(stderr," X  = %x %ud %d %d %d \n",x,x,r,g,b);
return x;
}


void createColor()
{
int i,j;
Uint32 c;
j = 1;

Mc[0]=0;
for ( i = 0 ; i <85 ;i++ ) {
Mc[j++] = convert(0+i*3,0,255);
}
for ( i = 0 ; i < 85 ;i++ ) {
Mc[j++] = convert(255,0,255-i*3);
}
for ( i = 0 ; i < 85;i++ ) {
Mc[j++] = convert(255,0+i*3,0);
}
}

int main(int argc, char *argv[])
{
SDL_PixelFormat *fmt;
SDL_Color *color_;
SDL_Event evt;
int i;

if (SDL_Init(SDL_INIT_VIDEO) != 0) {
fprintf(stderr,"NOT ");
return -1;
}

TTF_Init();
screen = SDL_SetVideoMode(0,0, 32, SDL_HWSURFACE | SDL_DOUBLEBUF |SDL_FULLSCREEN);
if (screen == NULL) {
fprintf(stderr,"NOT ");
return -1;
}
fmt=screen->format;
fprintf(stderr,"%d Bits pro Pixel\n",fmt->BitsPerPixel);

SDL_LockSurface(screen);
createColor();

for ( i = 0; i < 256; i++ ) {
boxColor (screen, 10+5*i,10,12+5*i,50,Mc[i]);
}

SDL_UnlockSurface(screen);
fprintf(stderr,"GEMALT\n");
SDL_Flip(screen);
while(1) {
while(SDL_PollEvent(&evt)) {
if(evt.type == SDL_QUIT) {
finish();
}
if (evt.type == SDL_MOUSEBUTTONDOWN ) {
finish();
}
}
}
return 0;
}


Ist jetzt nicht schön, aber mit :

cc f.c -o start.out -I /usr/include/SDL -lSDL -lSDL_gfx  -lSDL_ttf -lpthread && clear && ./start.out

sollte das ganze zu kompilieren sein.

Da ich auch mit SDL2 gespielt habe, musst du ALLES(!) von SDL einmal per synaptic entfernen und danach SDL1 wieder neu aufspielen, sonst gibt es da irgendeinen Nebeneffekt das SDL1 nicht läuft.
Ich habe die GPU ausgeschaltet, das Programm funktioniert MIT Desktop und OHNE Desktop, da beides über den Framebuffer läuft. ( Das X läuft auch nur auf dem Framebuffer )

Ich habe das Ganze gerade noch mal auf dem Red laufen lassen, auf einem kleinen 7" Display funktioniert es.



« Last Edit: May 20, 2018, 17:30:04 by jgmischke »

duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
Re: RED SDL1.2 / fb0
« Reply #7 on: May 20, 2018, 20:45:11 »
SDL1.2:
Danke, schon mal ... Jetzt kommt das "aber":

Wenn ich mit apt-get libsdl1.2 und libsdl1.2-dev installiere, dann sind SDL_ttf und SDL_gfx nicht da: Keine Header-Dateien für's Compilieren, keine libs zum Linken.

Wie kommen die auf den red? Ich finde das nur für SDL2 ...

FB:
Das Füllen des FB funktioniert. (Z.B. https://stackoverflow.com/questions/4996777/)

Wieder ein "aber": Der Cursor blinkt munter weiter. Diese Konsole stört ...

Gruß, Uwe

jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #8 on: May 21, 2018, 12:14:00 »
Hi Uwe,

mach das ganze doch über synaptic, da werden auch die anderen sdl1 Pakete mit angezeigt. Natürlich musst du auch die DEV Pakete mit runterladen.

Ich packe mal einen Screenshot vom Synaptic mit drauf.

Da das ganze Programm im Vollbildmodus arbeitet, hab ich bei mir keinen Cursor, der sollte sich aber auch über SDL ausschalten lassen.

Das man den Framebuffer auch "per Hand" füllen kann ist mir bekannt, ich finde die SDL Routinen sind aber so schnell und wenn du all die Funktionalität noch mal selber programmieren müsstest  ... Gerade die TTF und GFX Routinen liefern einem alles, was man zum grafischen darstellen braucht und das ist sogar sehr schnell, jedenfalls wenn man denkt, was da intern im Red so vor sich hin arbeitet.

Viel Spaß.
« Last Edit: May 21, 2018, 12:24:42 by jgmischke »

duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
Re: RED SDL1.2
« Reply #9 on: May 21, 2018, 19:45:33 »
ERFOLG! :)

Diese Pakete sind via sudo apt-get install installiert:
apt list libsdl* --installed
liefert
Listing... Done
libsdl-gfx1.2-5/stable,now 2.0.25-5 armhf [installed]
libsdl-gfx1.2-dev/stable,now 2.0.25-5 armhf [installed]
libsdl-ttf2.0-0/stable,now 2.0.11-3+b1 armhf [installed]
libsdl-ttf2.0-dev/stable,now 2.0.11-3+b1 armhf [installed]
libsdl1.2-dev/stable,now 1.2.15+dfsg1-4 armhf [installed]
libsdl1.2debian/stable,now 1.2.15+dfsg1-4 armhf [installed]


Ich habe am red weder Tastatur noch Maus, kein X -- ssh vom Mac, geht auch ohne synaptic.

Für das 5" Touch habe ich die Größe im Code angepasst.

Ich muss das zum Ausführen sudo'en, sonst liefert schon SDL_Init(SDL_INIT_VIDEO) den Fehler Unable to open a console terminal -- da muss man erst mal drauf kommen ...

Das ist komisch und bei Dir anders, oder?

Wenn ich das Display berühre, dann wird wieder auf die Konsole umgeschaltet, aber das Programm läuft und muss mit Ctrl-C beendet werden. Das werde ich ergründen.

@TF Ich fände es schon nett, wenn die GPU auf dem red mit SDL2 unterstützt würde ... Wofür ist sie denn sonst da?

Noch mal /dev/fb : Für das high-level-Zeichnen gibt es die libgd (https://libgd.github.io). Muss man wirklich nicht selber machen. Nur das Dumpen in den fb muss erledigt werden.

Vielen Dank!
Uwe

jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #10 on: May 22, 2018, 10:05:10 »
Hallo Uwe,

der Zugriff auf dem Red klappt nur als root. Die libgl kenn ich auch, nutze aber lieber die SDL Libs. ( Da hat wohl jeder seinen Geschmack. Ich mag an SDL die komplette Unterstützung für alles, was man zum Spieleprogrammieren braucht. ) Um ein Programm als normaler Benutzer zu nutzen müssten noch ein paar Dateibits gesetzt werden, aber zum experimentieren habe ich immer als root gearbeitet.

Komischerweise habe ich da keine Probleme mit dem Konsolenbetrieb. Sobald das Programm läuft wird der gesamte Bildschirm von SDL benutzt.
Was hast du da für einen Monitor dran, vielleicht gibt es da auch noch Unterschiede?

Da ich die Option FULLSCREEN beim Aufruf habe, sollte auch die Größe egal sein, oder wird bei dir das ganze als Fenster dargestellt??



duaw

  • Jr. Member
  • **
  • Posts: 80
    • View Profile
Re: RED SDL / fb0
« Reply #11 on: May 22, 2018, 12:52:12 »
Ich logge mich per ssh als user tf ein.
Ich kann als tf das Programm ausführen -- nur hat tf wohl nicht die Rechte, die erforderlich sind, um SDL_Init auszuführen.
Als tf kann darf ich sudo ausführen, dann hat das Programm die Rechte. (Das ist doch nicht das Ausführen als root, oder doch?).

SDL nutzt das Touch-Display (5"aus dem TF-Shop) fullscreen. Start, die (Autologin-) Konsole ist weg, die Grafik ist fullscreen da. Drücken auf dem Schirm (Touch) und Konsole ist wieder da, aber das Programm (von der ssh-Shell gestartet) ist noch nicht beendet.

Gruß, Uwe




jgmischke

  • Full Member
  • ***
  • Posts: 203
    • View Profile
Re: RED /fb0
« Reply #12 on: May 22, 2018, 13:56:44 »
Hi Uwe,

ok das Teil ist so programmiert das auf den MOUSEBUTTON reagiert. Das Verhalten ist soweit "normal".

sudo und su arbeiten beide mit root Rechten und sind quasi als root unterwegs. Das ist aber nur eine Frage der Einstellung, du kannst das suid Bit noch setzen und dann kann das auch ein normaler Benutzer starten.