Инициализация драйвера fbdev, различные результаты
dolmatov
Пункты: 1802
Регистрация: 03.07.2016
Пишу приложение с использованием графической библиотеки LVGL. Компилятор gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf. Вызываю fbdev_init() без изменения исходных текстов приложения, контролирую полученные параметры. Иногда получаю 800x480 32bpp, в этом случае все работает как нужно, а в некоторых, чаще, 800x480 16bpp, с соответствующими последствиями...
dolmatov
Пункты: 1802
Регистрация: 03.07.2016
Цитата без изменения исходных текстов приложения
имеется в виду без изменений в плане инициализации драйверов
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Цитата Пишу приложение с использованием графической библиотеки LVGL. Компилятор gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf. Вызываю fbdev_init() без изменения исходных текстов приложения, контролирую полученные параметры. Иногда получаю 800x480 32bpp, в этом случае все работает как нужно, а в некоторых, чаще, 800x480 16bpp, с соответствующими последствиями...
Не знаком с lvgl, выглядит как будто приложение пытается выставить свои параметры для дисплея - посмотрите доки как указать lvgl чтобы использовалось то что по умолчанию у фоеймбуфера
dolmatov
Пункты: 1802
Регистрация: 03.07.2016
Цитата
Не знаком с lvgl, выглядит как будто приложение пытается выставить свои параметры для дисплея - посмотрите доки как указать lvgl чтобы использовалось то что по умолчанию у фоеймбуфера
непохоже ..
Код
void fbdev_init(void)
{
// Open the file for reading and writing
fbfd = open(FBDEV_PATH, O_RDWR);
if(fbfd == -1) {
perror("Error: cannot open framebuffer device");
return;
}
LV_LOG_INFO("The framebuffer device was opened successfully");
// Make sure that the display is on.
if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {
perror("ioctl(FBIOBLANK)");
// Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.
}
#if USE_BSD_FBDEV
struct fbtype fb;
unsigned line_length;
//Get fb type
if (ioctl(fbfd, FBIOGTYPE, &fb) != 0) {
perror("ioctl(FBIOGTYPE)");
return;
}
//Get screen width
if (ioctl(fbfd, FBIO_GETLINEWIDTH, &line_length) != 0) {
perror("ioctl(FBIO_GETLINEWIDTH)");
return;
}
vinfo.xres = (unsigned) fb.fb_width;
vinfo.yres = (unsigned) fb.fb_height;
vinfo.bits_per_pixel = fb.fb_depth;
vinfo.xoffset = 0;
vinfo.yoffset = 0;
finfo.line_length = line_length;
finfo.smem_len = finfo.line_length * vinfo.yres;
#else /* USE_BSD_FBDEV */
// Get fixed screen information
if(ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
perror("Error reading fixed information");
return;
}
// Get variable screen information
if(ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
perror("Error reading variable information");
return;
}
#endif /* USE_BSD_FBDEV */
LV_LOG_INFO("%dx%d, %dbpp", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
// Figure out the size of the screen in bytes
screensize = finfo.smem_len; //finfo.line_length * vinfo.yres;
// Map the device to memory
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
if((intptr_t)fbp == -1) {
perror("Error: failed to map framebuffer device to memory");
return;
}
// Don't initialise the memory to retain what's currently displayed / avoid clearing the screen.
// This is important for applications that only draw to a subsection of the full framebuffer.
LV_LOG_INFO("The framebuffer device was mapped to memory successfully");
}
c qt приложением картина чем то схожая: при первом (после включения)старте приложения плучаю картинку в виде четырех искаженных по цвету и геометрии виджетов везхнего уровня, при втором и последующих запусках все нормально ...
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Цитата Иногда получаю 800x480 32bpp, в этом случае все работает как нужно, а в некоторых, чаще, 800x480 16bpp, с соответствующими последствиями...
на местной MB с местным дисплеем штатно 16 bpp работает без проблем, можете для проверки попробовать у себя включить в buildroot fb-test и проверить
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Цитата
# fbset
mode "800x480-60"
# D: 33.501 MHz, H: 31.515 kHz, V: 60.259 Hz
geometry 800 480 800 480 16
timings 29850 89 164 23 10 10 10
accel false
rgba 5/11,6/5,5/0,0/0
endmode
# fb-test
fb-test 1.1.0 (rosetta)
fb res 800x480 virtual 800x480, line_len 1600, bpp 16
# uname -a
Linux SK-iMX6ULL 4.9.11 #1 PREEMPT Thu Jul 13 00:37:23 PDT 2023 armv7l GNU/Linux
собрано в штатном buildroot