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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
scifi
сообщение Sep 26 2007, 16:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Может быть так?
cp image.bin /dev/fb0
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 26 2007, 18:21
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Sep 26 2007, 19:37
Сообщение #4


Местный
***

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



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


Тогда уж так:
cat image.bin >/dev/fb0


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 27 2007, 06:27
Сообщение #5


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

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



В моей корневухе нет утройства fb0 (любого fb), какие у него номера, блочное или символьное?
Странно, но без устройства, данные куда то копируются (по крайней мере не ругается на отсутствие устройства), но явно не в видеопамять ...

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


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
S_agent
сообщение Sep 27 2007, 09:05
Сообщение #6


Местный
***

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



По фреймбуферу вводная

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

На практике пользовать не доводилось smile.gif
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 27 2007, 09:15
Сообщение #7


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

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



Да, запотлняет, сейчас пытаюсь понять чего у меня с цветами творится.


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


Местный
***

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



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

а что именно?
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 27 2007, 09:53
Сообщение #9


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

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



Сложно описать 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;
}


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 27 2007, 09:54
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 27 2007, 10:06
Сообщение #11


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

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



Устройство я уже создал, драйвера собраны ... я сечас как раз и пытаюсь выяснить "полосатость" вызвана моими руками или нет. В моей версии драйвера PXAFB небыло поддержки 18 бит TFT ...


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


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

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



Блин, ну не пишет fputc в /dev/fb0, можно записать как то по другому?


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


Участник
*

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



Цитата(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
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 27 2007, 13:29
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



cat image.bin > /dev/fb0
write()

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


А фреймбуфер вообще включается?
/var/log/dmesg в студию.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 28 2007, 07:02
Сообщение #15


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

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


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
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 - 04:38
Рейтинг@Mail.ru


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