Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:3
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9XXXXX-S3E
Пример работы с ЖК панелью SK-WF43BTIBED0TP-Plug
vadim1997a
Добавлено 02.06.2010 23:03 Сообщение: 11
vadim1997a
5

Пункты: 2600
Регистрация: 01.06.2010
Artemius, что за пример? можно глянуть? Кстати, скольки битный цвет использует драйвер?
Спуститься к концу Подняться к началу
Персональная информация
Artemius
Добавлено 02.06.2010 23:21 Редактировалось 02.06.2010 23:24 Сообщение: 12
Artemius
0

Пункты: 3655
Регистрация: 02.12.2009
Nuvoton'овский пример от платы SK-MNUC950. Выводит на экран какртинку из файла, использует экран 320x240 и 16-битный цвет.

SK-WF43BTIBED0TP у меня нет и какая там разрядность цвета у драйвера я не знаю. Но базовые принципы работы с frame-buffer'ом одинаковы.

Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <asm/ioctl.h>
#include <sys/mman.h>


/*IOCTLs*/
//#define IOCTLSETCURSOR _IOW('v', 21, unsigned int) //set cursor position
#define VIDEO_ACTIVE_WINDOW_COORDINATES _IOW('v', 22, unsigned int) //set display-start line in display buffer
//#define IOCTLREADSTATUS _IOW('v', 23, unsigned int) //read lcd module status
#define VIDEO_DISPLAY_ON _IOW('v', 24, unsigned int) //display on
#define VIDEO_DISPLAY_OFF _IOW('v', 25, unsigned int) //display off
//#define IOCTLCLEARSCREEN _IOW('v', 26, unsigned int) //clear screen
#define VIDEO_UPSCALING _IOW('v', 27, unsigned int) //video up scaling

/* Macros about LCM */
#define CMD_DISPLAY_ON 0x3F
#define CMD_DISPLAY_OFF 0x3E
#define CMD_SET_COL_ADDR 0x40
#define CMD_SET_ROW_ADDR 0xB8
#define CMD_SET_DISP_START_LINE 0xC0


#define LCD_WIDTH 320
#define LCD_HEIGHT 240

typedef struct
{
unsigned int start;
unsigned int end;
}ActiveWindow;

typedef struct
{
int hor;
int ver;
}video_scaling;

int main()
{
int fd, ret;
int i, t = 0;
FILE *fpVideoImg;
unsigned char *pVideoBuffer;
unsigned long uVideoSize;

ActiveWindow window;
unsigned int uStartLine;
video_scaling v_scaling;
unsigned int select = 0;

fd = open("/dev/fb0", O_RDWR);
if (fd == -1)
{
printf("Cannot open fb0!\n");
return -1;
}

uVideoSize = LCD_WIDTH * LCD_HEIGHT * 2;
// printf("uVideoSize = 0x%x \n", uVideoSize);
pVideoBuffer = mmap(NULL, uVideoSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
// printf("pVideoBuffer = 0x%x\n", pVideoBuffer);
if(pVideoBuffer == MAP_FAILED)
{
printf("LCD Video Map Failed!\n");
exit(0);
}
//memset(pVideoBuffer, 0xf8, uVideoSize);

fpVideoImg = fopen("/attach/video.dat", "r");
if(fpVideoImg == NULL)
{
printf("OSD open FILE fail !! \n");
exit(0);
}

#if 1
if( fread(pVideoBuffer, uVideoSize, 1, fpVideoImg) <= 0)
{
printf("Cannot Read the Image File!\n");
exit(0);
}
#endif

while(select != 0xFF)
{
printf("\n************* LCM demo ************\n");
printf("1.Video Display On ..\n");
printf("2.Video Display Off ..\n");
printf("3.Change start line in buffer ..\n");
printf("4.Scaling Up ..\n");

printf("X.Exit ..\n");
printf("\n***********************************\n");
printf("Select : \n");
select = getchar();
switch(select)
{
case 0x31:
ioctl(fd,VIDEO_DISPLAY_ON);
break;

case 0x32:
ioctl(fd,VIDEO_DISPLAY_OFF);
break;

case 0x33:
/*Change start line in buffer*/
printf("Start Line: \n" );
scanf("%d", &uStartLine);

ioctl(fd, VIDEO_ACTIVE_WINDOW_COORDINATES, &uStartLine);
break;

case 0x34:
printf("Up Scaling: \n");
printf("X: \n");
scanf("%d", &v_scaling.hor);

printf("Y: \n");
scanf("%d", &v_scaling.ver);

ioctl(fd, VIDEO_UPSCALING, &v_scaling);
break;

case 0x58: //'x' -- exit the program
case 0x78: //'X'
printf("Exit now.\n");
goto end;

default :
printf("Please select the right command number... \n");
break;
}
}

end:
/* Close LCD */
//ioctl(fd, VIDEO_DISPLAY_OFF);
close(fd);
return 0;
}


Еще в примере демонстрируется аппаратное масштабирование картинки TFT-контроллером nuc950a, вам это точно не нужно.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 03.06.2010 11:33 Редактировалось 03.06.2010 11:41 Сообщение: 13
Pavel Ivanchenko
Admin
4.39

Пункты: 91438
Регистрация: 24.03.2009
Пол: Мужчина
Ребята, ценю ваше участие, но вы вводите человека в заблуждение, т.к. у вас совсем другие платы и tft плаги.

Как это работает.
У процессоров, имеющих аппаратный модуль развертки TFT (таких как NUC950 ...), выделяется область памяти под фреймбуфер, модулю говорят где его начало, далее он нвтоматически в цикле читает этот кусок памяти и выдает ее на TFT, т.е. записали во фреймбуфер пиксель и он автоматом отобразился.

У AT91SAM9260(9XE512) нет модуля развертки TFT, поэтому, подключается TFT плаг с панелькой у которой имеется собственный контроллер развертки и память на борту и здесь возникает принципиальный момент - область фреймбуфера системы никак не пересекается с видеопамятью самой панельки!
Еслиб эту панельку подключать к системной шине, тогда можно было бы еще так сделать (разместить фреймбуфер прямо в самой панели), но к сожалению, это не возможно и общение с панелью идет через эмуляцию шинного (8080) интерфейса через GPIO.
Если сделать чтобы драйвер постоянно, по таймеру, копировал содержимое фреймбуфера в панель, то процессор только этим и будет занят на 100% ...

Как можно писать во фреймбуфер (на полноту описания не претендую).
Наверняка, подавляющее большинство приложений оперируют непосредственно с областью памяти фреймбуфера (естественно, это самый быстрый способ), но перед этим, приложение должно выяснить, через драйвер FB, в каких режимах может работать FB и включить требуемый режим - это важно для того чтоб приложение правильно упаковывало цвета в слова.
С помошью mmap выясняют адрес фреймбуфера ...
Запись через драйвер, который может иметь набор функций, например, для реализации fwrite ...

Как я говорил ранее, в функции hecubafb_write текущего драйвера, видимо не правильно вычисляются границы обновляемой области и поэтому fwrite работает "криво".
Но в драйвере есть функции hecubafb_fillrect, hecubafb_copyarea, hecubafb_imageblit, которыми пользуется консоль для своего вывода, как она это делает, нужно смотреть в исходниках самой консоли.

Можно как еще поступить - работать с фреймбуфером "как обчно", но добавить в драйвер функцию обновления всего экрана (напрмер, в драйвере fb для imx233 ее через IOCTL сделали), т.е. нарисовали что нужно, принудительно обновили экран.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9XXXXX-S3E