Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-фев-24 01:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2018-янв-10 17:37 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 239
Используя библиотеку USB Device от "Фитон" & "Миландр", адаптировал пример встраиваемого программного USB-загрузчика Device firmware upgrade (DFU) http://www.usb.org/developers/docs/devc ... FU_1.1.pdf из AppNote UM0424 STMicroelectronics
http://www.st.com/en/embedded-software/ ... 32121.html http://www.st.com/content/ccc/resource/ ... 158241.pdf
для отладочной платы 1986ВЕ91Т - загружает прошивку в форматах .bin, .hex по интерфейсу USB в микроконтроллер (МК) 1986ВЕ9х с помощью программы DfuSeDemo от STM (AppNote UM0412)
http://www.st.com/en/development-tools/ ... 32080.html http://www.st.com/content/ccc/resource/ ... 155676.pdf

В архиве во вложении:
Папка dfu - USB-загрузчик, размещается в памяти МК с адреса 0x08000000, занимает 6,5 КБайт (8 КБайт по границе страницы флеш). При запуске проверяет, находится ли правильный указатель стека основной прошивки по адресу 0x08002000 и нажата ли кнопка SELECT на отладочной плате 1986ВЕ91Т. Если кнопка нажата или основной прошивки нет - продолжает работу, переходит в режим USB DFU (в Диспетчере устройств компьютера появялется устройство STM Device in DFU Mode - если Unknown USB Device, то надо установить пакет программ из AppNote UM0412 и далее для устройства указать поиск драйвера в папке установки C:\Program Files (x86)\STMicroelectronics\Software\DfuSe v3.0.5\Bin\Driver). Если кнопка не нажата и прошивка нормальная, то переходит по адресу 0x08002000 и выполняет основную прошивку.
Папка fw1 - основная прошивка (мигает светодиодом VD7 раз в секунду), размещается в памяти МК с адреса 0x08002000.
Папка fw2 - основная прошивка (мигает светодиодом VD11 два раза в секунду), размещается в памяти МК с адреса 0x08002000.
Папка picts - скриншоты работы программы в разных режимах: подключение в режиме DFU, выгрузка (Upload) 128 КБайт памяти из МК, загрузка прошивки fw1 в режиме верификации и без, сброс МК (Leave DFU Mode) и переход (при правильно закачанной прошивке) в основную программу.
Папка dfu_images - dfu.dfu - выгруженная из МК прошивка, fw1.dfu, fw2.dfu - основные прошивки, созданные из файлов fw1.hex, fw2.hex с помошью утилиты Dfu file manager из пакета программ AppNote UM0412 (также позволяет декодировать выгруженный файл dfu.dfu в форматы .bin и .hex). Формат .dfu файлов описан в AppNote UM0391 http://rc.fdr.hu/UM0391.pdf

Особенности адаптации:
1) структуры uint16_t_uint_8_t и функции *UPLOAD, *DNLOAD были поправлены на предмет расположения маладший/старший байт,
2) таблица таймаутов операции стирание сектора (страницы), запись массива 1024 байт прошивки содержит 3 строки, первые две из них - нули (там располагались таймауты внешних SPI-, NAND-флешек), чтобы правильно работали программы USB DFU Bootloader и DfuSeDemo. Таймаут стирания страницы навскидку задан 180 мс, запись массива 1024 байт - 0,1 мс * 1024 байт - 0,1 с. При этом используется только USB-конфигурация 0.
3) VID, PID не менял, а вот строковые дескрипторы с номером языка наверное можно менять (чтобы отображать другую информацию при подключении устройства), кроме дескриптора DFU_StringInterface0 - задаёт структуру флеш: 2 страницы по 4 КБайта (только чтение - bootloader), 30 страниц по 4КБайт (чтение/стирание/запись - основная прошивка).

P.S. Grand Merci à Milandr & Phyton & STMicroelectronics :!: :!: :!: :wink: :D :mrgreen: 8)
P.P.S. Судя по всему расширением программного STM USB DFU bootloader является аппаратный STM USB bootloader http://www.st.com/content/ccc/resource/ ... 264379.pdf
P.P.P.S. Для компиляции проектов использовался Keil uVision ver. 5.23 с паком во вложении, работа устройства проверена в ОС Windows 7 x64, bugs not detected :mrgreen:
З.Ы. Если разберусь с альтернативными конфигурациями USB, то добавлю чтение/стирание/запись информационной флеш.


Вложения:
Keil.MDR1986BExx.rar [2.54 МБ]
Скачиваний: 34
dfu.rar [1.11 МБ]
Скачиваний: 40

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-янв-14 02:30 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 239
Подчистил проект и доделал чтение/стирание+запись информациооной флеш, но есть нюансы применения...

Как я понял алгоритм работы программы DfuSeDemo (в ходе анализа USB-сниффером) - она считывает строковые дескрипторы для Alternate setting интерфейса 0 конфигурации 0 и узнаёт адреса и размеры памяти видов флеш (Internal/SPI/NOR), но она не посылает запросы SET_INTERFACE в USB DFU Bootloader, а посылает только допустимые адреса видов флеш - это является определяющим, с каким типом флеш (Internal/SPI/NOR) работать, также это видно и из функций файлов dfu_mal.h и dfu_mal.c:
Открыть
dfu_mal.h
#define MAL_MASK 0xFC000000

#define INTERNAL_FLASH_BASE 0x08000000
#define SPI_FLASH_BASE 0x00000000
#define NOR_FLASH_BASE 0x64000000

dfu_mal.c
uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength)
{

switch (SectorAddress & MAL_MASK)
{
case INTERNAL_FLASH_BASE:
pMAL_Write = FLASH_If_Write;
break;

#if defined(USE_STM3210B_EVAL) || defined(USE_STM3210E_EVAL)
case SPI_FLASH_BASE:
pMAL_Write = SPI_If_Write;
break;
#endif /* USE_STM3210B_EVAL || USE_STM3210E_EVAL */

#ifdef USE_STM3210E_EVAL
case NOR_FLASH_BASE:
pMAL_Write = NOR_If_Write;
break;
#endif /* USE_STM3210E_EVAL */
default:
return MAL_FAIL;
}
return pMAL_Write(SectorAddress, DataLength);
}
Закрыть


и файла usb_prop.h - перегрузки обработчика стандартного запроса DFU_SetInterface нет:
Открыть
#define DFU_GetConfiguration NOP_Process
//#define DFU_SetConfiguration NOP_Process
#define DFU_GetInterface NOP_Process
#define DFU_SetInterface NOP_Process
#define DFU_GetStatus NOP_Process
#define DFU_ClearFeature NOP_Process
#define DFU_SetEndPointFeature NOP_Process
#define DFU_SetDeviceFeature NOP_Process
//#define DFU_SetDeviceAddress NOP_Process
Закрыть


В соответствии с этим для информационной флеш было решено смапировать её реальный адрес 0x08000000 в виртуальный 0x00000000 (как это делается для SPI-флеш в примере STM - строковый дескриптор DFU_StringInterface1), а в USB DFU Bootloader (в программе микроконтроллера) добавлять к этому адресу смещение 0x08000000.
Отсюда NUANCE: если создавать .bin, .hex-файлы в Keil и т.п., то необходимо указывать базовое смещение адреса равным 0x00000000, иначе получится (0x08000000+0x08000000) и USB-загрузчик не прошьёт инфо-флеш! Стартовый адрес выгружаемых данных также будет 0x00000000.

Также, отлаживая программу и думая, что существует запрос SET_INTERFACE, затирал сам USB-загрузчик, так как шил по адресу 0x08000000 не инфо-флеш, а главную флеш. Поэтому было решено добавить в сам USB-загрузчик железобетонную проверку на приходящий от компьютера адрес (должен лежать вне диапазона загрузчика) на случай (что маловероятно), если строковый дескриптор DFU_StringInterface0 главной флеш вдруг считается неправильно.

Таймауты памяти для любых адресов возвращаются одинаковые - файл dfu_mal.c:
Открыть
static const uint16_t TimingTable[1][2] =
{
/* Sector Erase time, Sector Program time*/
{ INTERN_FLASH_SECTOR_ERASE_TIME, INTERN_FLASH_SECTOR_WRITE_TIME } /* Internal Flash */
};

uint16_t MAL_GetStatus (uint32_t SectorAddress, uint8_t Cmd, uint8_t *buffer)
{
uint8_t y = Cmd & 0x01;

/* x: Erase/Write Timing */
/* y: Media */
SET_POLLING_TIMING (TimingTable[0][y]);

return MAL_OK;
}
Закрыть


Кроме программы DfuSeDemo в папке установки есть аналогичная более детальная программа STDFUTester.exe http://www.afedri-sdr.com/index.php/dow ... decription


Вложения:
dfu.rar [521.87 КБ]
Скачиваний: 32

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB