Hallo Pi-Forum,
ich versuche mithilfe des Framebuffers ein Bild über HDMI auszugeben. Ziel des Ganzen soll es später sein ein Display über LVDS via DVI-LVDS Adapter anzusteuern. Testen kann ich momentan nur auf einen normalen DVI Monitor.
Zurzeit schaffe ich es den Framebuffer so zu beschreiben, dass das Display eine Farbe anzeigt. Allerdings blinkt der Cursor noch... Zudem gefällt mir nicht, dass das Display mit 16bitpp angesteuert wird... Wo mir auch die Aufteilung (Blau 8 Bit, Grün 4 Bit und Rot 4 Bit) komisch erscheint...
Daher meine Fragen:
- Kann man den Framebuffer "sperren", so dass nur mein Programm Zugriff hat?
- Wie kann ich das eingespielte "Bild" wieder aus dem Speicher nehmen? Ist es hier evtl. sinnvoll einen Screenshot von der Ausgangsituation zu machen und den dann wieder in den Speicher zu schreiben?
- Die Display Einstellungen kann ich über die config.txt machen oder?
Wenn jemand Tipps für mich hat, nehme ich die gerne entgegen Bitte beachtet, dass ich erst letzte Woche mit dem Raspberry angefangen habe und seit Anfang dieser Woche die ersten Schritte in C Programmierung mache...
Vielen Dank!
// Einbinden von Header-Dateien
#include <stdio.h> // Standard Input/Ouput
#include <string.h> // Funktionen fuer Zeichenketten
#include <fcntl.h> // File Control Options
#include <sys/mman.h> // Memory Management
#include <linux/fb.h> // Zum Ansteuern des Framebuffer unter Linux
//#include <ioctl.h> // Input/ Output Control fuer direktes Treiberansprechen (auf RasPi nicht gefunden)
#include <unistd.h> // Standard Symblic Constants and types
#include <stdlib.h> // Funktionen zur Umwandlung von Zahlen, Speicherverwaltung
// Deklaration von Funktionen
//Main-Methode; enthaelt im ersten Schritt alle Funktionen
int main(void)
{
// Deklaration von lokalen Variablen
int width; // Breite
int height; // Hoehe
int bitspp; // Bits pro Pixel
int bytespp; // Byte pro Pixel
long int screensize; // Screensize in Byte
unsigned int *fbmem_pointer; // Zeiger auf Framebufferspeicher
struct fb_var_screeninfo var_screeninfo; // struct Variable var_screeninfo vom Typ fb_var_screeninfo
struct fb_fix_screeninfo fix_screeninfo; // struct Variable fix_screeninfo vom Typ fb_fix_screeninfo
// Oeffnen des Framebuffers fb0 (Geraet) mit Lese- und Schreibrechten
int fb_pointer = open("/dev/fb0", O_RDWR);
// Fehlermeldung falls Framebuffer nicht geoeffnet werden kann
if (!fb_pointer) // if(!fb_pointer) entspricht if (fb_pointer != 0)
{
printf("Oeffnen von Framebuffer nicht moeglich\n");
return 1; // Rueckgabewert fuer inkorrekten Programmablauf
}
printf("Framebuffer erfolgreich geoeffnet\n");
// Informationen des Framebuffers auslesen
// Pruefen, ob Lesen von variablen Screeninfos moeglich
if (ioctl(fb_pointer, FBIOGET_VSCREENINFO, &var_screeninfo)) // Auslesen von variablen Screeninfos und speichern der Informationen an der Adresse &var_screeninfo
{
printf("Lesen von variablen Screeninfos nicht moeglich\n");
close(fb_pointer);
return 1;
}
printf("Variable Screeninfos erfolgreich gelesen\n");
if (ioctl(fb_pointer, FBIOGET_FSCREENINFO, &fix_screeninfo)) // Auslesen von fixen Screeninfos und speichern der Informationen an der Adresse &fix_screeninfo
{
printf("Lesen von fixen Screeninfos nicht moeglich\n");
close(fb_pointer);
return 1;
}
printf("Fixe Screeninfos erfolgreich gelesen\n");
width = var_screeninfo.xres;
height = var_screeninfo.yres;
bitspp = var_screeninfo.bits_per_pixel;
// Berechnen der Screensize in Byte
screensize = width * height * bitspp /8;
// Zeiger auf Framebufferspeicher anfordern
// void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
// addr = 0 --> kernel sucht Adresse aus
// length --> Speicherlaenge in Byte
// offset --> Startpunkt von Speicherbereich
// fd --> file descriptor
// prot --> Memory Protection des Mapping
// flags --> Entscheidung, ob Aenderungen anderen Prozessen die gleichen Bereich mappen aufgezeigt werden sollen
fbmem_pointer = (unsigned int*) mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_pointer, 0);
if (!fbmem_pointer)
{
printf("Framebuffer mappen nicht moeglich\n");
close(fb_pointer);
return 1;
}
printf("Framebuffer erfolgreich gemappt\n");
int row = 0;
int col = 0;
for (row = 0; row < height; row++)
{
for (col = 0; col < width; col++)
{
fbmem_pointer[row*width + col] = 0x00FF;
}
}
printf("Screeninfos:\n");
printf("Aufloesung: %dx%d \n", width, height);
printf("Bits pro Pixel: %d\n", bitspp);
printf("Screensize: %W Byte\n", screensize);
// Aufheben von Mapping und Widerherstellen (bei MAP_PRIVATE)
munmap(fbmem_pointer, screensize);
close(fb_pointer);
//Rueckgabewert fuer korrekten Programmablauf
return 0;
}
Alles anzeigen