VideoFlipper Руководство программиста (или аппаратчика?) (C) Romanich 2010 Здесь рассмотрены аппаратные ресурсы видеосистемы VideoFlipper. 1. Информационные линии. D0..D15 - Шина данных. Передаются команды и видеоконтент. A - Шина адреса. 0 - команда(регистр), 1 - аргумент команды / видеоконтент. ~CE - Выбор системы. Активный 0. ~WE - Строб записи. Активный 0. IRQ - Вывод прерывания или состояние. 0 - страница всё ещё не переключена. 1 - страница переключена. Такая конфигурация была выбрана исходя из следующих соображений: 1) Частичная совместимость с мобильными LCD экранами от DigitalThresher(+) 2) Минимальное количество линий без понижения пропускной способности 3) Простота разводки видеосистемы 4) Лёгкость доработки схемы Digital Thresher(+) до схемы Thresher Forever Используется отложенное переключение страницы - VideoFlipper переключает страницу(банк) во время обратного хода луча по кадру, если была команда переключить страницу. Сразу же после команды переключения страницы - IRQ становится 0 до тех пор, пока не переключится cтраница - тогда IRQ станет 1. При включении питания IRQ=1. В Thresher Forever адресный бит A соединён с битом 16, ~CE заведён на асинхронный банк 0 процессора ADSP-BF532. Тоесть диапазон адресов 0x20000000..0x20010000. В API используется следующая пара: 0x20000000 - порт для записи команды(т.е. выбор регистра) 0x20010000 - порт для записи аргумента команды(т.е. запись в регистр) / видеоконтента Объявление портов: //Более короткое объявление типов #define u16 unsigned short int #define u32 unsigned long int #define VF_Command16 *(volatile u16*) 0x20000000 //Порт команд #define VF_Data16 *(volatile u16*) 0x20010000 //Порт данных 16-битная запись #define VF_Data32 *(volatile u32*) 0x20010000 //Порт данных 32-битная запись (для ускорения вывода видеоконтента) 2. Описание регистров. 0x0 - NOP - нет команды 0x1 - DISPLAY - отображение 0x2 - DEPTH - глубина цвета 0x3 - OUTPUT - вывод 0x4 - PAGE - страница 0x5 - X0 - начальная X-координата 0x6 - X1 - конечная X-координата 0x7 - Y0 - начальная Y-координата 0x8 - Y1 - конечная Y-координата 0x9 - COLOR - выбор цвета 0xA - RGB - выбор палитры 0xB - DATA - запись данных Пример инициализации: VF_Command16=0x0; //NOP VF_Data16=0x0000; //Не значащий аргумент VF_Command16=0x1; //DISPLAY VF_Data16=0x0001; //Включить показ кадра. 0x0000 - Выключить показ кадра. При включении питания развёртки кадра нет. VF_Command16=0x2; //DEPTH VF_Data16=0x0000; //Цветовой режим 15bpp, прямой вывод. 0x0001 - Режим 256 цветов, через палитру. Для программирования палитры - регистры 0x9,0xA. VF_Command16=0x3; //OUTPUT VF_Data16=0x0000; //Выводится VGA сигнал для монитора. 0x0001 - Выводится NTSC сигнал для телевизора. VF_Command16=0x4; //PAGE VF_Data16=0x0000; //Не значащий аргумент. Команда на переключение банка(страницы). IRQ становится = 0. Банк переключится во время VBlank и затем IRQ станет 1. VF_Command16=0x5; //X0 (0..319) VF_Data16=0; //X0=0. Отступ слева. VF_Command16=0x6; //X1 (0..319) VF_Data16=255; //X1=255. Отступ справа. X0 и X1 - запрограммированы для получения логической ширины экрана 256 пикселов. VF_Command16=0x7; //Y0 (0..239) VF_Data16=0; //Y0=0. Отступ сверху. VF_Command16=0x8; //Y1 (0..239) VF_Data16=223; //Y1=223. Отступ снизу. Y0 и Y1 - запрограммированы для получения логической высоты экрана 224 пикселов. Таким образом, регистры 0x5,0x6,0x7,0x8 задали логическое разрешение 256x224 пиксела, для вывода видеобуфера в левом верхнем углу экрана. Несмотря на это, на экран выводится ВСЯ область 320x240 пикселов. Логично, что вначале необходимо очистить экран от мусора, задав X0=0, X1=319, Y0=0, Y1=239. Можно динамически менять X0,X1,Y0,Y1 для вывода нескольких фрагментов на экран (например, для реализации текстовых сообщений GUI): ----------------------- |0 319| | | | ---- | | |OK| ------ | | ---- |NEW | | | |YEAR| | | |2010| | |239 ------ | ----------------------- VF_Command16=0x9; //COLOR VF_Data16=5; //Для задания палитры выбран цвет номер 5. В 256-цветном режиме выбирает номер цвета, для которого нужно установить палитру. VF_Command16=0xA; //RGB VF_Data16=(8<<10)|(0<<5)|16; //Red=8, Green=0,Blue=16. Теперь цвет номер 5 - это фиолетовый(смесь синего с меньшей долей красного). Биты в палитре распределяются так: 15 - не используется, 14..10 - Red, 9.. 5 - Green, 4.. 0 - Blue VF_Command16=0xB; //DATA for(i=0;i<256*224;i++) VF_Data16=VideoBuffer[i]; //Пересылаем 256*224 слов видеобуфера в банк видеопамяти. Данные начинают записываться в видеопамять с точки (X0,Y0) и заполняют видеопамять слева-направо, сверху-вниз. Адрес видеопамяти изменяется автоматически после записи каждого СЛОВА видеоконтента (по поднятию строба записи ~WE). По достижению точки (X1,Y1), данные записываются снова с точки (X0,Y0). После пересылки нужно дать команду на переключения банка (регистр 0x4). Для следующей пересылки нужно, чтобы IRQ = 1, иначе видеобуфер будет записан в обе страницы комплементарными кусками. Для увеличения быстродействия, видеобуфер нужно перебрасывать двойными словами: for(i=0;i<256*224*2;i+=4) VF_Data32=*(u32*)(VideoBuffer+i); Или ещё лучше так: register u32 i,e; i=VideoBuffer; e=i+(256*224*2); for(;i