Описание как работать с Floader.
Предварительно по swire посылается остановка/сброс CPU - SwireWrite(0x006f, 0x20, 1).
Далее загружается бинарник в адрес 0x8000 - SwireWrite(0x8000, floader, sizeof(floader) ).
После загрузки запускается CPU - SwireWrite(0x0602, 0x88, 1).
В бинарнике floader.bin по адресу 4 расположен указатель на адрес структуры обмена командами EXT.
Далее общаемся c работающим floader по swire через эту структуру EXT в памяти TLSR8269.
Код:
typedef struct {
volatile u32 faddr; // адрес Flash или другого устройства
volatile u32 pbuf; // адрес буфера в памяти TLSR
volatile u16 count; // кол-во байт обработки
volatile u16 cmd; // команда Floader-у
volatile u16 iack; // оповещение о смене команды по swire
volatile u16 oack; // оповещение Floader-а о исполнении команды
} sext;
sext ext;
По старту Floader-а данная структура заполняется:
- ETX.faddr = Flash ID
- ETX.pbuf = адрес буфера в памяти TLSR
- ETX.count = максимальный размер буфера
- ETX.cmd = команда чтения ID Flash
- ETX.iack = номер версии Floader
- ETX.oack = 0
После старта Floader, через задержку в пару ms, по swire считываем EXT.
Проверяем размер ETX.count, FlashID, адрес буфера, номер версии Floader...
Если хотим подать команду чтения Flash, то изменяем:
- ETX.faddr = адрес чтения Flash,
- ETX.count = сколько хотим прочитать за раз (см. ограничение буфера)
- ETX.cmd = FLASH_READ_CMD
- ETX.iack увеличиваем на 1
ETX.pbuf не меняем (будем менять - это надо только при хитрых мультизадачах).
Передаем структуру ETX по Swire за раз, но не всю, без последних 2-х байт ETX.oack.
В цикле читаем по swire слово ETX.oack и ждем когда оно изменится от прошлого (изменяется на +1).
Это значит floader выполнил команду.
Читаем по swire буфер по адресу ETX.pbuf и размером ETX.count.
Всё – заданный кусок Flash прочитан.