Jump to content

RED /fb0


Recommended Posts

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

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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

 

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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.

 

#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.

 

 

 

 

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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.

[/img]

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ß.

Screenshoot_synaptic.thumb.png.e24dc56f88544595b8ee212d2f2cda26.png

Link zu diesem Kommentar
Share on other sites

ERFOLG! :)

 

Diese Pakete sind via

[size=10pt]sudo apt-get install[/size]

installiert:

[size=10pt]apt list libsdl* --installed[/size]

liefert

[size=10pt]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][/size]

 

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

[size=10pt]Unable to open a console terminal[/size]

-- 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

[size=10pt] /dev/fb[/size]

: Für das high-level-Zeichnen gibt es die

[size=10pt]libgd[/size]

(https://libgd.github.io). Muss man wirklich nicht selber machen. Nur das Dumpen in den fb muss erledigt werden.

 

Vielen Dank!

Uwe

Link zu diesem Kommentar
Share on other sites

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??

 

 

 

Link zu diesem Kommentar
Share on other sites

Ich logge mich per

ssh

als

[size=10pt]user tf [/size]

ein.

Ich kann als

tf

das Programm ausführen -- nur hat

tf

wohl nicht die Rechte, die erforderlich sind, um

[size=10pt]SDL_Init[/size]

auszuführen.

Als

tf

kann darf ich

[size=10pt]sudo[/size]

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

 

 

 

 

Link zu diesem Kommentar
Share on other sites

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.

 

 

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...