Смотрю на flash_api.c кое чего не понимаю.
В конце функций вызывается SpicDisableRtl8195A которая отключает маппинг пинов SPIC. А как же отображение флэш в адресное пространство процессора, оно же сломается.
Оно отключается, чтобы случайно, при слете и прочих делах не было записи.
Но можно было отключить функцию записи в конг.регистрах SPIC. Писатели SDK пошли по другому пути - отключают полностью.
Для обращения к Flash необходимо взять семафор (или как там его), а по отключению - отдать.
evice_mutex_lock(RT_DEV_LOCK_FLASH);
device_mutex_unlock(RT_DEV_LOCK_FLASH);
Они уже созданы в SDK (device_lock.h) для:
Код:
typedef enum _RT_DEV_LOCK_E
{
RT_DEV_LOCK_EFUSE = 0,
RT_DEV_LOCK_FLASH = 1,
RT_DEV_LOCK_CRYPTO = 2,
RT_DEV_LOCK_MAX = 3
}RT_DEV_LOCK_E;
Так-же не желательно использовать свою [inline]flash_t flash;[/inline] если она в системе одна. Есть и ошибки в SDK с Flash, но вроде исправил... При инициализации SPIC создается массив структур для нескольких Flash на разных CS и разных режимах SIO, DIO, QIO и для разных CLK проца(!) (в процедуре калибровки выбирается и тестируется максимальная производительность). Эти данные для обращения к Flash копируются в структуру flash_t flash; но только для данного CS, режима и CLK CPU при инициализации. А инициализация происходит не всегда - там путанно всё и не поддерживается до конца. Исправил как смог - писатели SDK не дописали эту часть - забыли наверно... Я тоже забыл синхронизовать это с версией в git.
Скинул:
RTL00MP3/flash_api.c at master · pvvx/RTL00MP3 · GitHub
Иначе SPIC работал в SIO режиме. Что-то ещё правил в начальной инициализации, чтобы Flash работала в DIO и процедуре калибровки на максимальную скорость (параметры SPIC после неё сохраняются в Flash, если были не записаны ранее). Возможно и не отсинхронизовал в git. Потом гляну... работать всё равно будет, хоть и тормознее
Калибровки SPIC, SDRAM контроллеров сохраняются в Flash. Если они уже записаны, то процедуры калибровок не вызываются. Т.е. калибровки отрабатывают при первом старте с чистой Flash.
С ними ещё много проблем - нет исходников стартового модуля и на RTL871xAF при каждом старте делается тест SDRAM и прочие глупости, когда там её нет.
Кто это будет доделывать для всех - пока не знаю. Всем пофиг.
Мой кусок "реверса" загрузчиков пока не работает - не доделан. Он замещается бинарником от базового SDK. В Arduino - другой бинаник.