|
Linux, как заполнить видеопамять |
|
|
|
Sep 26 2007, 18:21
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(scifi @ Sep 26 2007, 19:24)  Может быть так? cp image.bin /dev/fb0 Лучше все таки cat image.bin /dev/fb0 Однако не уверен, что сработает прямая заливка.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 26 2007, 19:37
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(amw @ Sep 26 2007, 22:21)  Лучше все таки cat image.bin /dev/fb0 Однако не уверен, что сработает прямая заливка. Тогда уж так: cat image.bin >/dev/fb0
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Sep 27 2007, 06:27
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
В моей корневухе нет утройства fb0 (любого fb), какие у него номера, блочное или символьное? Странно, но без устройства, данные куда то копируются (по крайней мере не ругается на отсутствие устройства), но явно не в видеопамять ...
Еще, драйвер через несколько минут выключает экран, хотя никакого энергосбережения в ядро не включено ...
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 27 2007, 09:05
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300

|
По фреймбуферу вводнаятеоритически должно быть так: Код cat /dev/fb0 > screen.img - получить raw экрана cat screen.img > /dev/fb0 - отобразить на экране На практике пользовать не доводилось
|
|
|
|
|
Sep 27 2007, 09:53
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Сложно описать  ... лого пингвина у меня "цветасто-полосатое", написал тестик заливки, ничего не пишется в видеопамять : Код #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE * data; int i,x,y; data = fopen("/dev/fb0","w"); for(y=0;y<480;y++); { for(x=0;x<800;x++); { fputc(0xff,data); } } fclose(data); return 0; }
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 27 2007, 09:54
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
busybox? тогда запустить mdev -s Аналог udev. Создает файлы устройств. Код ls -l /dev/fb* lrwxrwxrwx 1 root root 4 2007-09-27 13:05 /dev/fb0 -> fb/0 ls -l /dev/fb/0 crw-rw---- 1 root video 29, 0 2007-09-27 13:05 /dev/fb/0 Нужны драйверы fb, pxa-fb. (точные имена уточнить по ядру.) Управлять с помощью /usr/sbin/fbset.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 27 2007, 13:24
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 28-01-05
Пользователь №: 2 260

|
Цитата(3.14 @ Sep 27 2007, 12:53)  Сложно описать  ... лого пингвина у меня "цветасто-полосатое", написал тестик заливки, ничего не пишется в видеопамять : Код #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE * data; int i,x,y; data = fopen("/dev/fb0","w"); for(y=0;y<480;y++); { for(x=0;x<800;x++); { fputc(0xff,data); } } fclose(data); return 0; } А проверить коды ошибок при открытии и записи пробовали? Вот это иногда помогает http://doc.trolltech.com/4.1/qtopiacore-te...ramebuffer.html
|
|
|
|
|
Sep 28 2007, 07:02
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
cat image.bin > /dev/fb0 Пишет в видеопамять (я уже это говорил). fbset у меня нет, я пока собрал только busybox и z-modem. Насчет прав ... у меня пока только root. Фрейм буфер включается, вот часть лога касающаяся fb: Код pxa2xx-fb pxa2xx-fb: overriding resolution: 800x480 pxa2xx-fb pxa2xx-fb: overriding bit depth: 18 pxa2xx-fb pxa2xx-fb: override pixclock: 30000 pxa2xx-fb pxa2xx-fb: override left: 1 pxa2xx-fb pxa2xx-fb: override right: 1 pxa2xx-fb pxa2xx-fb: override vsynclen: 10 PXA: invalid hsync_len 0 PXA: invalid hsync_len 0 Console: switching to colour frame buffer device 100x60 Далее, тестик по вышеприведеннйол ссылке (http://doc.trolltech.com/4.1/qtopiacore-te...ramebuffer.html) работает, заливает прямоугольник. Вот только с цветами какая то неразбериха ... Еще, он меня уже забодал выключаться через 5 минут
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 28 2007, 09:35
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 28-01-05
Пользователь №: 2 260

|
Цитата(3.14 @ Sep 28 2007, 10:02)  cat image.bin > /dev/fb0 Пишет в видеопамять (я уже это говорил). fbset у меня нет, я пока собрал только busybox и z-modem. Насчет прав ... у меня пока только root. Фрейм буфер включается, вот часть лога касающаяся fb: Код pxa2xx-fb pxa2xx-fb: overriding resolution: 800x480 pxa2xx-fb pxa2xx-fb: overriding bit depth: 18 pxa2xx-fb pxa2xx-fb: override pixclock: 30000 pxa2xx-fb pxa2xx-fb: override left: 1 pxa2xx-fb pxa2xx-fb: override right: 1 pxa2xx-fb pxa2xx-fb: override vsynclen: 10 PXA: invalid hsync_len 0 PXA: invalid hsync_len 0 Console: switching to colour frame buffer device 100x60 Далее, тестик по вышеприведеннйол ссылке (http://doc.trolltech.com/4.1/qtopiacore-te...ramebuffer.html) работает, заливает прямоугольник. Вот только с цветами какая то неразбериха ... Еще, он меня уже забодал выключаться через 5 минут  прот отключение: http://lists.arm.linux.org.uk/pipermail/li...-January/018879с цветами надо играться с палитрой (что-то надо делать с параметром cmap), но здесь я не помощник - я работал только с черно-белым экранчиком.
|
|
|
|
|
Sep 28 2007, 10:31
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Итак, заливаю следующим тестом: Код #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h>
int main() { int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; char *fbp = 0; int x = 0, y = 0; long int location = 0;
// Open the file for reading and writing fbfd = open("/dev/fb0", O_RDWR); if (!fbfd) { printf("Error: cannot open framebuffer device.\n"); exit(1); } printf("The framebuffer device was opened successfully.\n"); // Get fixed screen information if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information.\n"); exit(2); } // Get variable screen information if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { printf("Error reading variable information.\n"); exit(3); }
printf("%dx%d, %dbpp, %d linelen %d xoffs %d yoffs\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel,\ finfo.line_length,vinfo.xoffset,vinfo.yoffset);
// Figure out the size of the screen in bytes screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
// Map the device to memory fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); if ((int)fbp == -1) { printf("Error: failed to map framebuffer device to memory.\n"); exit(4); } printf("The framebuffer device was mapped to memory successfully.\n"); for (y = 0; y < 360; y++) for (x = 0; x < 800; x++) { location = (x+vinfo.xoffset) * 3 + (y+vinfo.yoffset) * finfo.line_length; int b = 0x0; int g = 0x0; // A little green int r = 0x00; // A lot of red unsigned int t = r<<12 | g << 6 | b; *((unsigned char*)(fbp + location)) = t&0xff; *((unsigned char*)(fbp + location + 1)) = (t>>8)&0xff; *((unsigned char*)(fbp + location + 2)) = (t>>16)&0xff;
} // Figure out where in memory to put the pixel for (y = 10; y < 300; y++) for (x = 100; x < 200; x++) { location = (x+vinfo.xoffset) * 3 + (y+vinfo.yoffset) * finfo.line_length; int b = 0x00; int g = 0xff; // A little green int r = 0x00; // A lot of red unsigned int t = r<<12 | g << 6 | b; *((unsigned char*)(fbp + location)) = t&0xff; *((unsigned char*)(fbp + location + 1)) = (t>>8)&0xff; *((unsigned char*)(fbp + location + 2)) = (t>>16)&0xff; } x = 400; y = 100; // Where we are going to put the pixel for (y = 10; y < 200; y++) for (x = 300; x < 400; x++) { location = (x+vinfo.xoffset) * 3 + (y+vinfo.yoffset) * finfo.line_length; int b = 0x0; int g = 0x00; // A little green int r = 0xff; // A lot of red unsigned int t = r<<12 | g << 6 | b; *((unsigned char*)(fbp + location)) = t&0xff; *((unsigned char*)(fbp + location + 1)) = (t>>8)&0xff; *((unsigned char*)(fbp + location + 2)) = (t>>16)&0xff; } for (y = 10; y < 360; y++) for (x = 500; x < 885; x++) { location = (x+vinfo.xoffset) * 3 + (y+vinfo.yoffset) * finfo.line_length; int b = 0xff; int g = 0x0; // A little green int r = 0x00; // A lot of red unsigned int t = r<<12 | g << 6 | b; *((unsigned char*)(fbp + location)) = t&0xff; *((unsigned char*)(fbp + location + 1)) = (t>>8)&0xff; *((unsigned char*)(fbp + location + 2)) = (t>>16)&0xff; } munmap(fbp, screensize); close(fbfd); return 0; } Цвета пишутся правильно, а вот с адресацией проблемы ... Если писать строки больше 360 вылетает сообщение "Segmentation fault". Зато по Х это сообщение выходит при записи начиная с 885 точки (а не 800). Еще, я в сметении, в линухе чтоб записать в видеопамять что-либо нужно тучу драйверов поставить, проникнуться "десятью" уровнями каких-то абстракций и в итоге Я САМ ДОЛЖЕН СДВИГАТЬ RGB С УЧЕТОМ СПЕЦИФИКИ МОЕЙ TFT Еще одна неприятность, если выводить сообщения на консоль (эту самую TFT), то в ответ на вывод сообщения которое не влезет в экран (по вертикали) вываливается сообщение Kernel panic - not syncing: pixel_to_pat(): unsupported pixelformat и приехали ...
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 28 2007, 12:19
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 28-01-05
Пользователь №: 2 260

|
проверьте что screensize соответствует размеру экрана, может он память недостаточно отмапивает. Возможно, что размер видеопамяти, выделяемый внутри ядра не соответствует размеру вашего экрана. Кстати, Kernel panic может быть связан именно с этим - пишет в недопустимую область.
|
|
|
|
|
Oct 1 2007, 09:30
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
C Kernel panic - not syncing: pixel_to_pat(): unsupported pixelformat разобрался, к размеру выделяемой памяти это отношение не имело. А вот с цветами ... т.е. получается когда сам линух пишет в видеопамять, то неправильно RGB раскладывает. Взгляните плиз на драйвер, может какой криминал заметите.
Прикрепленные файлы
pxafb.rar ( 10.74 килобайт )
Кол-во скачиваний: 42
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|