Есть ли способ нарисовать EGL в / dev / fb1 вместо / dev / fb0, не копируя данные на Raspberry Pi? - PullRequest
0 голосов
/ 30 января 2019

Я нашел здесь некоторую информацию, в частности, что EGL не использует слои / dev / fb * https://www.raspberrypi.org/forums/viewtopic.php?t=58952

Однако я хотел бы знать, есть ли способ поменять местами / dev / fb0и / dev / fb1, или полностью избавиться от / dev / fb0?

/ dev / fb0 - это выход hdmi, а / dev / fb1 - это дисплей SPI

Мне не нужен дисплей hdmi для чего-либо, если есть способ отключить его навсегда,SPI-дисплей становится основным fb0-дисплеем, который будет работать.

У меня есть следующий код для mmap кадрового буфера, но они имеют разную глубину цвета, поэтому я не могу запоминать его, и копирование пиксель за пикселем мучительно медленно

Есть ли лучший способ ввсе для этого?

Спасибо,

uint16_t *fbp0;
uint16_t *fbp1;
DISPMANX_DISPLAY_HANDLE_T display;
DISPMANX_RESOURCE_HANDLE_T resourceHandle;
VC_RECT_T rect;
struct fb_fix_screeninfo finfo;
uint32_t pixels;
const char *device = "/dev/fb1";
int fbfd = open(device, O_RDWR);
if (fbfd == -1) {printf("cannot open framebuffer device");return;}
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {printf("cannot get framebuffer fixed information");return;}
struct fb_var_screeninfo vinfo;
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {printf("cannot get framebuffer variable information");return;}
if((vinfo.xres * 2) != finfo.line_length) {printf("assumption failed ... framebuffer lines are padded");return;}
if ((vinfo.xres % 16) != 0) {printf("framebuffer width must be a multiple of 16");return;}
if (vinfo.bits_per_pixel != 16){printf("framebuffer is not 16 bits per pixel");return;}
fbp1 = (uint16_t*)mmap(0,finfo.smem_len,PROT_READ | PROT_WRITE,MAP_SHARED,fbfd,0);
if (fbp1 == MAP_FAILED){printf("cannot map framebuffer into memory");return;}
memset(fbp1, 0, finfo.smem_len);vc_dispmanx_resource_create(VC_IMAGE_RGB565,vinfo.xres,vinfo.yres,  &image_ptr);
device = "/dev/fb0";
fbfd = open(device, O_RDWR);
if (fbfd == -1) {printf("cannot open framebuffer device"); return;}
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {printf("cannot get framebuffer fixed information"); return;}
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {printf("cannot get framebuffer variable information"); return;}
if ((vinfo.xres % 16) != 0) {printf("framebuffer width must be a multiple of 16"); return;}
fbp0 = (uint16_t*)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
if (fbp0 == MAP_FAILED){printf("cannot map framebuffer into memory"); return;}
memset(fbp0, 0, finfo.smem_len);

1 Ответ

0 голосов
/ 30 января 2019

Я нашел другой драйвер, который, как я заметил, использует fbcp (framebuffer copy).https://github.com/juj/fbcp-ili9341

Он прекрасно копирует кадровый буфер HDMI на дисплей SPI с частотой 60 Гц и не требует установки оригинальной реки SPI, а лучше всего работает в пространстве пользователя

Все еще не решение, которое я искал, но для тех, кто ищет эту информацию, попробуйте драйвер выше

...