Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linux, как заполнить видеопамять
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
3.14
Имею PXA270 + LCD 800х480
Как залить какой-нибудь массив в видеопамять (желательно из комманодной строки)?
scifi
Может быть так?
cp image.bin /dev/fb0
amw
Цитата(scifi @ Sep 26 2007, 19:24) *
Может быть так?
cp image.bin /dev/fb0

Лучше все таки
cat image.bin /dev/fb0
Однако не уверен, что сработает прямая заливка.
v_shamaev
Цитата(amw @ Sep 26 2007, 22:21) *
Лучше все таки
cat image.bin /dev/fb0
Однако не уверен, что сработает прямая заливка.


Тогда уж так:
cat image.bin >/dev/fb0
3.14
В моей корневухе нет утройства fb0 (любого fb), какие у него номера, блочное или символьное?
Странно, но без устройства, данные куда то копируются (по крайней мере не ругается на отсутствие устройства), но явно не в видеопамять ...

Еще, драйвер через несколько минут выключает экран, хотя никакого энергосбережения в ядро не включено ...
S_agent
По фреймбуферу вводная

теоритически должно быть так:
Код
cat /dev/fb0 > screen.img - получить raw экрана
cat screen.img > /dev/fb0  - отобразить на экране

На практике пользовать не доводилось smile.gif
3.14
Да, запотлняет, сейчас пытаюсь понять чего у меня с цветами творится.
S_agent
Цитата(3.14 @ Sep 27 2007, 12:15) *
Да, запотлняет, сейчас пытаюсь понять чего у меня с цветами творится.

а что именно?
3.14
Сложно описать smile.gif ... лого пингвина у меня "цветасто-полосатое", написал тестик заливки, ничего не пишется в видеопамять :
Код
#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;
}
amw
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.
3.14
Устройство я уже создал, драйвера собраны ... я сечас как раз и пытаюсь выяснить "полосатость" вызвана моими руками или нет. В моей версии драйвера PXAFB небыло поддержки 18 бит TFT ...
3.14
Блин, ну не пишет fputc в /dev/fb0, можно записать как то по другому?
path_finder
Цитата(3.14 @ Sep 27 2007, 12:53) *
Сложно описать smile.gif ... лого пингвина у меня "цветасто-полосатое", написал тестик заливки, ничего не пишется в видеопамять :
Код
#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
amw
cat image.bin > /dev/fb0
write()

А что говорит fbset?
А прав хватает?


А фреймбуфер вообще включается?
/var/log/dmesg в студию.
3.14
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
path_finder
Цитата(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), но здесь я не помощник - я работал только с черно-белым экранчиком.
3.14
Итак, заливаю следующим тестом:
Код
#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 и приехали ...
path_finder
проверьте что screensize соответствует размеру экрана, может он память недостаточно отмапивает. Возможно, что размер видеопамяти, выделяемый внутри ядра не соответствует размеру вашего экрана.
Кстати, Kernel panic может быть связан именно с этим - пишет в недопустимую область.
3.14
Какое-либо упоминание о screensize я нашел только в tdfxfb.c файле, там идет ее вычисление на основе моих xres и yres:
Код
reg.screensize = info->var.xres | (info->var.yres << 12);
3.14
C Kernel panic - not syncing: pixel_to_pat(): unsupported pixelformat разобрался, к размеру выделяемой памяти это отношение не имело.
А вот с цветами ... т.е. получается когда сам линух пишет в видеопамять, то неправильно RGB раскладывает. Взгляните плиз на драйвер, может какой криминал заметите.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.