pecherskih
Member
Коллеги, добрый день. Как то я обещал поделиться результатами работы с проводным бутлоадером. В связи с чем и выкладываю результаты. На данный момент удалось запустить обновление прошивки по протоколу UART. Однако заработало не всё. Проблема в верификации залитой прошивки. При записи на все фреймы стек отвечает ОК. Т.е. ошибок не происходит. Если подать команду обновления, то блок удачно запускается с новой прошивкой. Но если сделать верификацию, она вылетает с ошибкой. Причем битыми указываются одни и те же 2-3 фрейма, вне зависимости от платы отладки. На данный момент я не смог понять причину. По воздуху обновление прошивки и верификация проходят без ошибок. Так что думаю проблема где то у меня.
OnlyUpdateApp
Для обновления прошивки контроллера существует два способа. Первый способ (OnlyUpdateApp) используется для контроллеров с малым объемом внутреннего FLASH. Это CH581F с памятью в 192 кБайтов. Вся память делится на 4 части. В первой располагается вектор перехода (JumpIAP) на бутлоадер IAP. Во второй части (Peripheral) располагается приложение пользователя, которое и надо обновлять. В третьей части памяти находится сам бутлоадер IAP (In-Application Programming). Ну и наконец, в последней части находится библиотека стека BLE.
При подаче питания на контроллер, управление передается по нулевому адресу программы, где лежит команда (JumpIAP) перехода на IAP. После этого перехода внутри IAP анализируется нужно производить обновление или нет. Если обновление не нужно, тогда управление передается в сегмент Peripheral и дальше исполняется программа пользователя. Если же обновлять прошивку нужно, управление остается в сегменте IAP и используя стек BLE из части LIB, контроллер обновляет прошивку пользователя в сегменте Peripheral. Во время обновления функции самой прошивки Peripheral не доступны. Для создания обобщенной прошивки, используются 3 отдельных проекта из папки WCH\ch583-main\EVT\EXAM\BLE с общим названием OnlyUpdateApp. Четвертым файлом является файл стека CH58xBLE_ROM. Объединяются 4 HEX файла при помощи приложения AssemblingFileTool, находящегося в папке WCH\ch583-main\Android Tool. На андроиде, для обновления прошивки «по-воздуху», используется приложение CH583 OTA Tool, находящегося в WCH\ch583-main\Android Tool\OTA Tool.
BackupUpgrade
Для процессоров с большим объемом памяти, таким как CH582/583, используется другой способ обновления. В этом, втором способе, обновляется не только
приложение пользователя, но также сама BLE библиотека. Кроме того, при этом способе сохраняется работоспособность пользовательского кода. Здесь FLASH память так же делится на 4 части. В первой (JumpIAP) так же лежит команда перехода на IAP. Во второй части лежат приложение пользователя и библиотека BLE. Четвертая часть памяти остается пустой. Сюда будет записываться новая прошивка. Ну и в последней части памяти находится сам IAP.
При подаче питания на контроллер, также как и в первом случае, управление передается по нулевому адресу программы, где лежит команда (JumpIAP) перехода на IAP. Далее бутлоадер IAP анализирует надо ли ему включаться в работу или нет. Если нет, тогда управление передается приложению пользователя. Одной из задач этого приложения является заполнение пустого пространства FLASH памяти новой прошивкой. Если загрузка новой прошивки прошла успешно, выставляется флаг события и подается команда перезагрузки. В этом случае IAP копирует новое приложение пользователя и BLE библиотеку из третьего в второй сегмент FLASH памяти, снимает флаг события и перезагружает процессор. Для создания обобщенной прошивки, используются 3 отдельных проекта из папки WCH\ch583-main\EVT\EXAM\BLE с общим названием BackupUpgrade. Объединяются 3 HEX файла при помощи того же приложения AssemblingFileTool. Для обновления прошивки «по-воздуху», используется приложение CH583 OTA Tool, как и в первом случае. Для меня интересен второй способ обновления, который позволяет не терять связь с пользовательской прошивкой. Рассмотрим команды, которые в нем применяются.
Команды bootloader-a
При работе со стеком, обновление прошивки происходит также как и при любой другой задаче, через команды стека. Мы не
можем напрямую прочитать или записать участок FLASH памяти напрямую. Для этого применяются 5 команд. Рассмотрим их.
1. IAP_INFO – команда запроса конфигурации устройства, где 0х84 – ID команды,
0х12 – длина посылки после текущего байта. Вот как выглядит полная команда.
84 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В ответ контроллер отправляет посылку со своей конфигурацией. Например такую:
02 00 60 03 00 00 10 83 00 44 00 20 B8 44 00 20 34 0B 00 20
0х02-второй вариант обновления (с BLE стеком), 0х00036000 = 216к размер памяти под
новую прошивку, 0х1000 – размер сегмента памяти, 0х0083 – процессор ch583
2. IAP_ERASE – команда стеку на стирание сегментов памяти, где 0х81 – ID команды,
0х1000 – начальный адрес сегментов, 0х0025=37 сегментов памяти надо стереть.
81 00 00 01 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В ответ стек отправляет нулевой байт, в случае успеха или ненулевой байт ошибки.
3. IAP_PROM – команда записи данных во FLASH. Она состоит из заголовка и данных.
80 F0 00 01
0х80 – ID команды, 0хF0 = 240 длина блока данных, 0х1000 – адрес блока памяти.
После этой команды передается блок данных длиной 240 байт.
4. IAP_VERIFY – команда верификации. Она очень похожа на команду IAP_PROM,
отличается только ID заголовком, который равен 0х82.
5. IAP_END – команда успешного окончания заливки новой прошивки. Вот она:
83 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Она похожа на команду IAP_INFO. После её получения выставляется флаг новой
прошивки и дается команда перезагрузки процессора.
OnlyUpdateApp
Для обновления прошивки контроллера существует два способа. Первый способ (OnlyUpdateApp) используется для контроллеров с малым объемом внутреннего FLASH. Это CH581F с памятью в 192 кБайтов. Вся память делится на 4 части. В первой располагается вектор перехода (JumpIAP) на бутлоадер IAP. Во второй части (Peripheral) располагается приложение пользователя, которое и надо обновлять. В третьей части памяти находится сам бутлоадер IAP (In-Application Programming). Ну и наконец, в последней части находится библиотека стека BLE.
JumpIAP | Peripheral | IAP | LIB |
4k | 44k | 16k | 128k |
0кB | 192кB |
При подаче питания на контроллер, управление передается по нулевому адресу программы, где лежит команда (JumpIAP) перехода на IAP. После этого перехода внутри IAP анализируется нужно производить обновление или нет. Если обновление не нужно, тогда управление передается в сегмент Peripheral и дальше исполняется программа пользователя. Если же обновлять прошивку нужно, управление остается в сегменте IAP и используя стек BLE из части LIB, контроллер обновляет прошивку пользователя в сегменте Peripheral. Во время обновления функции самой прошивки Peripheral не доступны. Для создания обобщенной прошивки, используются 3 отдельных проекта из папки WCH\ch583-main\EVT\EXAM\BLE с общим названием OnlyUpdateApp. Четвертым файлом является файл стека CH58xBLE_ROM. Объединяются 4 HEX файла при помощи приложения AssemblingFileTool, находящегося в папке WCH\ch583-main\Android Tool. На андроиде, для обновления прошивки «по-воздуху», используется приложение CH583 OTA Tool, находящегося в WCH\ch583-main\Android Tool\OTA Tool.
BackupUpgrade
Для процессоров с большим объемом памяти, таким как CH582/583, используется другой способ обновления. В этом, втором способе, обновляется не только
приложение пользователя, но также сама BLE библиотека. Кроме того, при этом способе сохраняется работоспособность пользовательского кода. Здесь FLASH память так же делится на 4 части. В первой (JumpIAP) так же лежит команда перехода на IAP. Во второй части лежат приложение пользователя и библиотека BLE. Четвертая часть памяти остается пустой. Сюда будет записываться новая прошивка. Ну и в последней части памяти находится сам IAP.
JumpIAP | Peripheral + LIB | Reserve | IAP |
4k | 216k | 216k | 12k |
0кB | 448кB |
При подаче питания на контроллер, также как и в первом случае, управление передается по нулевому адресу программы, где лежит команда (JumpIAP) перехода на IAP. Далее бутлоадер IAP анализирует надо ли ему включаться в работу или нет. Если нет, тогда управление передается приложению пользователя. Одной из задач этого приложения является заполнение пустого пространства FLASH памяти новой прошивкой. Если загрузка новой прошивки прошла успешно, выставляется флаг события и подается команда перезагрузки. В этом случае IAP копирует новое приложение пользователя и BLE библиотеку из третьего в второй сегмент FLASH памяти, снимает флаг события и перезагружает процессор. Для создания обобщенной прошивки, используются 3 отдельных проекта из папки WCH\ch583-main\EVT\EXAM\BLE с общим названием BackupUpgrade. Объединяются 3 HEX файла при помощи того же приложения AssemblingFileTool. Для обновления прошивки «по-воздуху», используется приложение CH583 OTA Tool, как и в первом случае. Для меня интересен второй способ обновления, который позволяет не терять связь с пользовательской прошивкой. Рассмотрим команды, которые в нем применяются.
Команды bootloader-a
При работе со стеком, обновление прошивки происходит также как и при любой другой задаче, через команды стека. Мы не
можем напрямую прочитать или записать участок FLASH памяти напрямую. Для этого применяются 5 команд. Рассмотрим их.
1. IAP_INFO – команда запроса конфигурации устройства, где 0х84 – ID команды,
0х12 – длина посылки после текущего байта. Вот как выглядит полная команда.
84 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В ответ контроллер отправляет посылку со своей конфигурацией. Например такую:
02 00 60 03 00 00 10 83 00 44 00 20 B8 44 00 20 34 0B 00 20
0х02-второй вариант обновления (с BLE стеком), 0х00036000 = 216к размер памяти под
новую прошивку, 0х1000 – размер сегмента памяти, 0х0083 – процессор ch583
2. IAP_ERASE – команда стеку на стирание сегментов памяти, где 0х81 – ID команды,
0х1000 – начальный адрес сегментов, 0х0025=37 сегментов памяти надо стереть.
81 00 00 01 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В ответ стек отправляет нулевой байт, в случае успеха или ненулевой байт ошибки.
3. IAP_PROM – команда записи данных во FLASH. Она состоит из заголовка и данных.
80 F0 00 01
0х80 – ID команды, 0хF0 = 240 длина блока данных, 0х1000 – адрес блока памяти.
После этой команды передается блок данных длиной 240 байт.
4. IAP_VERIFY – команда верификации. Она очень похожа на команду IAP_PROM,
отличается только ID заголовком, который равен 0х82.
5. IAP_END – команда успешного окончания заливки новой прошивки. Вот она:
83 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Она похожа на команду IAP_INFO. После её получения выставляется флаг новой
прошивки и дается команда перезагрузки процессора.