Протокол OSD1
USB HID-отчёты, команды рисования, поток между отчётами, Feature report и статус устройства.
Протокол OSD1 версии 1 связывает приложение с прошивкой. Хост отправляет поток команд, устройство отвечает нажатиями и статусом.
USB HID
Размер отчёта включает байт Report ID. Размер USB-пакета 64 байта в Full Speed и 512 байт в High Speed. Один HID-отчёт может передаваться несколькими пакетами.
Output report
Бит 15 поля длины означает SYNC. Парсер сбрасывает предыдущую незавершённую команду и начинает новую с первого байта полезных данных. Сам бит в значение длины не входит.
Полезные данные нескольких отчётов образуют непрерывный поток. Команда, аргументы и пиксели могут пересекать границы отчётов. Все многобайтные числа передаются в порядке little endian.
Команды
Canvas 0 соответствует экрану. Координаты нативные, ширина canvas 480 пикселей. BLIT принимает построчный RGB565. FRAME рисует контур толщиной один пиксель. COPY копирует область между canvas через BTE.
Очередь и поток
Очередь содержит 24 слота, из которых доступно 23. Основной цикл обрабатывает до четырёх отчётов за проход. Если пиксельный поток не продвигается дольше 1000 мс, парсер сбрасывается.
FENCE возвращает идентификатор последней обработанной команды во входном отчёте. Для нового изображения хост передаёт полную последовательность команд и не полагается на восстановление оборванного потока.
Input report
Отчёт отправляется при изменении состояния клавиш, при FENCE и после новой USB-конфигурации. Бит 0 соответствует верхней левой кнопке, бит 14 нижней правой.
Feature report 3
Feature report 0x7E
Заставка
После включения прошивка показывает анимацию из буфера SDRAM по адресу 0x600000. Canvas 0 при этом продолжает принимать команды хоста, и хост рисует первый кадр как обычно, не дожидаясь окончания анимации.
- Ячейки 6 × 3 (пять столбцов клавиш и три секции боковой полосы) заливаются цветом
#222222по змейке: верхний ряд слева направо, средний справа налево, нижний слева направо. - Шрифтом Inter SemiBold побуквенно проявляются надписи OPEN (ячейки с 1 по 4), STREAM (ячейки с 7 по 12) и DECK (ячейки с 13 по 16). Ячейки нумеруются слева направо и сверху вниз.
- Первое рисование хоста в canvas 0 считается готовностью. После проявления и паузы 150 мс ячейки раскрываются из центра, показывая содержимое canvas 0 поверх надписи.
- Отображение переключается на canvas 0, и буфер
0x600000больше не используется.
Пока идёт анимация, парсер на каждом кадре (каждые 15 мс) останавливается на ближайшей границе команды. Текущий BLIT дописывается до конца, следующая команда ждёт. Поток хоста при этом не теряется.
Без хоста заставка остаётся на экране. Новое нажатие кнопки запускает игру.