реклама на сайте
подробности

 
 
> Linux, как заполнить видеопамять
3.14
сообщение Sep 26 2007, 09:30
Сообщение #1


Их либе дих ...
******

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



Имею PXA270 + LCD 800х480
Как залить какой-нибудь массив в видеопамять (желательно из комманодной строки)?


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 19)
path_finder
сообщение Sep 28 2007, 09:35
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 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 минут smile.gif


прот отключение:
http://lists.arm.linux.org.uk/pipermail/li...-January/018879

с цветами надо играться с палитрой (что-то надо делать с параметром cmap), но здесь я не помощник - я работал только с черно-белым экранчиком.
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 28 2007, 10:31
Сообщение #17


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 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 07.gif


Еще одна неприятность, если выводить сообщения на консоль (эту самую TFT), то в ответ на вывод сообщения которое не влезет в экран (по вертикали) вываливается сообщение Kernel panic - not syncing: pixel_to_pat(): unsupported pixelformat и приехали ...


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
path_finder
сообщение Sep 28 2007, 12:19
Сообщение #18


Участник
*

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



проверьте что screensize соответствует размеру экрана, может он память недостаточно отмапивает. Возможно, что размер видеопамяти, выделяемый внутри ядра не соответствует размеру вашего экрана.
Кстати, Kernel panic может быть связан именно с этим - пишет в недопустимую область.
Go to the top of the page
 
+Quote Post
3.14
сообщение Oct 1 2007, 06:54
Сообщение #19


Их либе дих ...
******

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



Какое-либо упоминание о screensize я нашел только в tdfxfb.c файле, там идет ее вычисление на основе моих xres и yres:
Код
reg.screensize = info->var.xres | (info->var.yres << 12);


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
3.14
сообщение Oct 1 2007, 09:30
Сообщение #20


Их либе дих ...
******

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



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


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 18:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016