Ссылки:
Полная версия (на языке Шекспира и Набокова)
Утилиты, эмуляторы
1. Обмен данными с FT812 происходит по SPI. Последовательность действий такая: опустить CS_n, переслать от 1 и более байт (при отсылке байта в девайс автоматически принимается байт от девайса), поднять CS_n. Это называется транзакция.
2. Транзакции с FT812 бывают трёх типов и различаются по старшим (6 и 7) битам первого байта транзакции:
- чтение памяти (00),
- запись памяти (10),
- команда (01).
3. Чтение памяти:
- байт 0: старший байт адреса (биты 0-5 это биты адреса 16-21, биты 6-7 = 00),
- байт 1: средний байт адреса (биты 0-7 - биты адреса 8-15),
- байт 2: младший байт адреса (биты 0-7),
- байт 3: 0 (нужен для того, чтоб чип успел прочитать первый байт),
- байт 4 и далее: посылается 0, принимается содержимое памяти.
После каждого байта адрес автоматически инкрементируется, так что за одну транзакцию можно прочитать все 4МБ.
4. Запись памяти:
- байт 0: старший байт адреса (биты 0-5 это биты адреса 16-21, биты 6-7 = 10) (т.е. 3 байта для записи по адресу памяти 0х000000 будут 0х80 0х00 0х00).
- байт 1: средний байт адреса (биты 0-7 - биты адреса 8-15),
- байт 2: младший байт адреса (биты 0-7),
- байт 3 и далее: данные для записи в память.
После каждого байта адрес автоматически инкрементируется.
5. Команды:
- байт 0: команда (биты 6 и 7 установлены в 01, т.е. все команды могут иметь значения 0х40-0х7F).
Единственное исключение из данного правила - команда ACTIVE, которая выглядит, как чтение байта по адресу 0 и служит для пробуждения чипа из спячки.
6. В FT812 память по разным адресам служит для разных целей.
0х000000 - RAM_G, 1МБ: ОЗУ общего назначения, хранить битмапы, палитру, аудиосэмплы, FIFO для передачи данных,
0х300000 - RAM_DL, 8кБ: дисплей-лист,
0х302000 - RAM_REG, 4кБ: регистры,
0х308000 - RAM_CMD, 4кБ: фифо сопроцессорных команд.
7. Дисплей-лист (ДЛ) является набором инструкций видеопроцессора (ВП) (как по мне, вполне себе ассемблер), которые ВП выполняет на каждой строке видеоизображения. По результатам обработки ДЛ строится пиксельный буфер видеостроки, который и выводится на экран. ДЛ общий для всего кадра, и хотя его теоретически его можно менять на произвольной строке, я не представляю, зачем это может понадобиться.
ДЛ оборудован аппаратным теневым буфером, на который переключается в начале нового кадра. Отображаемый в данный момент ДЛ недоступен для записи/чтения. Пока CPU наполняет ДЛ для следующего кадра, в текущем кадре отображается теневой.
Все инструкции ДЛ 32-битные, т.е. ДЛ состоит из 2048 инструкций. Врядли ВП успеет выполнить их все, если набить ДЛ битмапами с линейной фильтрацией, но продуктивность ВП все же впечатляет. В самом простом случае ВП рисует 16 пикселей за 1 такт 60МГц, в худшем случае - 1 пиксель за 4 такта. Последней инструкцией ДЛ обязан стоять END, который означает конец рисования (и дисплей-листа) и отображение пиксельного буфера строки.
ДЛ оснащен также командами JUMP, CALL и RET с глубиной стека 4. Имеются также команды типа push и pop для сохранения графического контекста, глубина этого стека также 4.
8. Типы объектов, которые способен отобразить ВП при помощи ДЛ следующие:
- битмапы (десятка форматов), опционально с линейной фильтрацией, к которым возможно применение матрицы преобразования (поворот, масштабирование, обрезка),
- графические примитивы (линии, круги) с точностью 1/16 пикселя (а следовательно, с антиалайсингом),
- блиттер, позволяющий производить арифметические операции над пикселями по маске и заданным условиям.
9. Палитра в FT812 находится в общем ОЗУ, занимает 1024 байт и хранится в форматах RGB565 или ARGB8 (дада, 8 бит альфа). Используется для 8-битных палитровых битмапов.
10. Сопроцессор (не путать с видеопроцессором!) служит для рисования всяких полезных виджетов по заранее запрограммированным на фабрике говнокодам. Результатом его работы является готовый кусок ДЛ с указанного адреса в оном. Также умеет распаковывать JPG в общее ОЗУ в указанный формат битмапа, заполнять/копировать память.
(продолжение следует...)