http://www.nedopc.org/nedopc/upload/OpenLetter.rar
И наконец, история создания(по сей день):
- 03.02.07 Запуск AT91SAM7S256. Тестовая программа исполнялась во Flash. Пришли VS1003 и OLED
04.02.07 Создание своего тестового проекта и его запуск в SRAM с разгоном ARM'а свыше 100МГц
17.02.07 Создание отладочной платы для OLED
18.02.07 Запуск OLED'а. Освоение контроллера(графического ускорителя) OLED
22.02.07 Построение повышающего преобразователя напряжения 12V на MAX761
24.02.07 Подключение внешней SRAM K6R4008C1C-JC15 на 512kB (ВидеоБуфер)
26.02.07 Проверка быстродействия с использованием внутренней SRAM вместо внешней
04.03.07 Создание отладочной платы на базе YMF721. Успешный запуск FM и MPU
05.03.07 Освоение MPU, написание прототипов плееров для FM
06.03.07 Составление принципиальной схемы MIDI OPL
07.03.07 Работа с Flash-памятью AT91SAM7S256. Написание на ARM Flat Assembler'е простейшего загрузчика
09.03.07 Найдена причина некорректной работы прерываний контроллера, когда программа загружена в SRAM
11.03.07 Сделан вывод о неэффективности использования одного программного порта ввода/вывода для нескольких устройств
21.03.07 Началось изготовление отладочной платы для VS1003B
23.03.07 Наконец-то пришли AT91RM9200, SDRAM, SRAM и кварцы для ARM'а и MP3-декодера
24.03.07 Успешный запуск VS1003. Проверка в режимах WAV, WMA, MP3, MID
25.03.07 Запуск VS1003 через аппаратный SPI. Составление принципиальной схемы VLSI
27.03.07 Освоение работы с SPI по прерываниям
28.03.07 Найдена причина некорректной работы SPI с выводом NPCS0/NSS
30.03.07 Освоен DMA контроллер на передачу данных из SRAM в SPI. Написание комплексной программы, работающей с SPI, IRQ, DMA
31.03.07 Освоена MMC+ карточка в режиме SPI. Написание программы, работающей с MMC+ и VS1003B. Освоен DMA на приём данных
01.04.07 Освоена запись на MMC+ карточку программно и с помощью DMA
07.04.07 Сделаны фотографии печатных плат
10.04.07 Проверена совместимость стандартной MMC карточки (чтение/запись)
14.04.07 Сборка преобразователя RS232<=>TTL/CMOS на MAX232. Успешное программирование через DBGU. Освоение UART
15.04.07 Написание собственного загрузчика программы по UART и своего бут-ассистента
16.04.07 Найдена причина некорректной инициализации UART
22.04.07 Освоена Compact Flash на чтение и запись в True IDE Mode
25.04.07 Пришли SX48BD и SX-Blitz
05.05.07 Борьба в мозгах между SX и ARM закончилась в пользу ARM'а
06.05.07 Начато составление принципиальной схемы отладочной платы на AT91RM9200
10.05.07 Закончено составление отладочной платы
27.05.07 Написаны наброски OPL граббера и логгера
01.06.07 Оптимизация и портирование декодера MIDI SMF0 с IBM PC на YMF721
05.06.07 Написаны наброски 16-битного 2D-движка, оценена скорость видеовывода
12.06.07 Закончено составление разводки отладочной платы
17.06.07 Успешный запуск AT91RM9200 в минимальной конфигурации
18.06.07 Разогнал AT91RM9200 до 220MHz. Разобрался как шить по COM-порту.
23.06.07 Задействовал EBI на 100MHz. Успешно подключил OLED, YMF721 (OPL и MPU)
24.06.07 Закончена разводка платы 256K x 16 SRAM K6R4016V1D-UI10
27.06.07 Успешно подключена 256K x 16 SRAM
28.06.07 Успешное исполнение программы во внешней SRAM
01.07.07 Найдена ошибка подключения OLED к EBI. Проверка совместной работы ARM,OLED,SRAM,MPU,OPL.
Освоено прерывание системного таймера 32768 Hz
05.07.07 Найдены и устранены плохие контакты с шиной EBI, которые вели к ошибкам
чтения/записи из/в памяти и регистров периферии
06.07.07 Оптимально настроены (быстродействие+надёжность) OLED,MPU,OPL,SRAM с шиной EBI на @100 MHz
07.07.07 Освоена работа с DataFlash AT45DBDB021B. Самостоятельная загрузка ARM'а из DataFlash
08.07.07 Закончена разводка платы 1M x 32 x 4 на двух SDRAM MT48LC4M16A2TG-75. Написание собственного прошивальщика DataFlash
12.07.07 Поставил MAX3232 вместо MAX232, тем самым все линии ввода/вывода стали на 3.3V
15.07.07 Провален тест SDRAM. Исключение SDRAM из схемы. Успешное подключение CF к шине EBI
16.07.07 Найдена ошибка чтения CF. Успешное подключение VS1003 к AT91RM9200
17.07.07 Пришли комплектующие от ТерраЭлектроники. Заменил AT45DB021B (28pin) на AT45DB011B (8pin)
Заменил диповский LM358 на планарный. Объединил аудиовыходы VS1003 и YMF721
18.07.07 Расширил динамический диапазон усилителя LM358 повышением напряжения питания до 5V
Поставил супервизор MAX6390, схема при этом стала стабильно запускаться с первого раза
Заменил диповский MAX761 на планарный и подал на него 5V
Реализована следующая схема загрузки:
1) С DataFlash'а ARM'ом считывается загрузчик во внутреннюю RAM. Затем на него передаётся управление
2) Загрузчик считывает с CompactFlash бинарник во внешнюю SRAM. Затем передаётся управление на бинарник
3) Бинарник выполняется во внешней SRAM (код+данные)
Написаны: прошивальщик для CompactFlash и загрузчик из CompactFlash (прошивается в DataFlash)
20.07.07 Исключил CF и VS1003 из-за их нестабильной работы до выяснения обстоятельств.
Реализована автономная загрузка программ из MMC(SD)
22.07.07 Приехал домой. Освоил чтение/запись на AT45DB011B аппаратным SPI
24.07.07 Поставил буфер 74HC244 на VS1003 и MMC. Успешно запустил VS1003+MMC и DataFlash
25.07.07 Раскопал истинную причину подглючивания SPI-устройств при их динамичном использовании.
Были высокочастотные наводки на портах ввода/вывода, отвечающие за выбор чипа на шине SPI.
Конденсаторы-глюкодавы прочно спасли положение! Теперь MMC+VS1003 и DataFlash работают нормально
26.07.07 Провозился с CF. Исключил её из схемы по следующим причинам:
1) Альтернативный источник хранения информации по отношению к MMC
2) Восприимчивость к наводкам (глючные чтение/запись)
3) Уменьшение нагрузки на шину EBI
4) Упрощение разводки печатной платы в дальнейшем
5) Уменьшение габаритов платы
27.07.07 Задействовал FIQ в AT91RM9200. Завёл туда IRQ от YMF721 (прерывание по переполнению таймеров YMF721)
Задействовал IRQ6. Завёл туда DREQ от VS1003 (прерывание по занятости VS1003)
28.07.07 Провозился с NPCS0. Обнаружил, что SPI парализуется, если NPCS=0 или pull-down
29.07.07 Задействовал NPCSx вместо PIO для SPI-устройств
01.08.07 Разогнал ядро ARM до 200 МГц. Тоесть PCK=200 MHz, MCK=PCK/2=100MHz
03.08.07 Успешно испытал клавиатуру 3x4.
Обнаружил глюк PIO (нужна небольшая задержка, чтоб значение после записи в порт, стало актуальным)
04.08.07 Шлифовал схему:
1) Устранил дыры в адресном пространстве
2) Убедился, что ~WAIT для YMF721 необходим
3) Сделал программное включение/выключение DC/DC-преобразователя напряжения для OLED дисплея
4) Запитал стабилизаторы питания параллельно (для равномерного распределения нагрузки)
Сграбил Font8x8 с IBM PC
05.08.07 Обнаружил ляп, замыкающий 8-й бит OLED и выхода DC/DC преобразователя.
Расширил шину данных для OLED с 8 до 9 бит (что позволит задействовать режим 262 тыс. цветов)
06.08.07 Обнаружил отсутствие контакта в цепи сброса OLED, что делало нестабильным его включение
Обнаружил, что pull-up резистор на ножке ~WAIT у YMF721 выбран некорректно (OPL3 работал неустойчиво)
Из-за этого схема работала нестабильно при PCK=200 MHz и MCK=100 MHz. Заменил его на 1кОм
07.08.07 Провозился отдельно с SDRAM (одна MT48LC4M16A2TG-75). Успешно запускается только на 25МГц
10.08.07 Всё-таки вопреки своим убеждениям, пытался выжать с SDRAM максимум.
Применил RC-цепочки на SDCKE и SDCK (220 Ом, 50пФ), что дало запустить SDRAM на 45МГц.
Тестировал SDRAM на чтение/запись по байтам/словам/двойным словам.
Исполнил код в SDRAM. Присутствие SDRAM говнячит все шины ARM'а.
Работа SDRAM создаёт наводки на остальные периферийные устройства.
Графика с SDRAM работает в 3 раза медленнее, чем с SRAM (код+данные+видеобуфер в SDRAM).
В AT91RM9200 невозможно тактировать SRAM и SDRAM от разных MCK.
Учитывая вышесказанное, исключил SDRAM из схемы окончательно.
Произошло ужасное: короткое замыкание в цепи 3.3V (оловянный ляп упал в процессе демонтажа SDRAM)
После устранения аварии проверил: ARM,MMC,VS1003 пашут. Остальное нет.
Принял решение сделать ремонтаж всей периферии. Перепаял SRAM. К великому счастью заработала!
11.08.07 Окончательно перепаял всю периферию. Восстановил всю Advanced Micro Machine.
Нашёл ещё оди оловянный ляп на шине данных, что и делало неработоспособными устройства на EBI шине.
Задействовал интервальный таймер и его прерывание для отсчитывания секундного интервала (для измерения FPS)
Пробовал ARM/Thumb Mode. Режимы равнозначны с позиции быстродействия (код в 16-битной SRAM), так как
ARM-инструкция 4 байта(2 обращения к 16bit SRAM), а
Thumb-инструкция 2 байта(одно обращение к 16-bit SRAM, но время уходит на декомпрессирование Thumb->ARM).
В Real View C Complier использовал Cross Module Optimization и Optimization Level 3 - производительность
графики выросла на 30%. Использовал ARM Mode с ARM/Thumb Interworking. В итоге выжал максимум 95 FPS!
И это не единой строчки на Assembler'е! Поигрался с контрол-регистром кэша. Включение кэша данных без MMU
ничё не даёт. Лучше всего Syncronous Mode. С его помощью достиг 102 FPS! Режим Fust Bus наоборот тормозит (82 FPS)
12.08.07 Освоил MMU. Задействовал кэш данных. Достиг 154 FPS! Подправил регистры PLL.
В итоге при PCK=200MHz,MCK=100MHz,ICache,DCache,MMU получил 185 FPS! Кэш данных дал прирост на 50%
13.08.07 Ради эксперимента перенёс код во внутреннюю SRAM. Данные оставил во внешней SRAM. Быстродействие не изменилось.
Протестировал быстродействие во всех комбинациях (M=MMU,D=DataCache,I=InstructionCache):
038 FPS
M 038 FPS
D 038 FPS
DM 040 FPS
I 126 FPS
I M 140 FPS
ID 126 FPS
IDM 186 FPS
14.08.07 Заставил работать ОДНОВРЕМЕННО VS1003(MP3-композиция), YMF721(OPL-композиция), OLED(16bit-графика с буфером)
MP3 - 128kbps, 44100Hz, 16bit, Stereo (данные подкачиваются с MMC)
OPL - BIN(RAW) Stream, 157Hz (данные в SRAM)
Graphix 16bit - 160 FPS!!! Кэши и MMU включены