Основываясь на STM32, открытая загрузочная среда — RT-FOTA
Введение
RT-Thread официально представил универсальный загрузчик для серии микроконтроллеров STM32. На веб-сайте можно создать файл записи загрузчика с помощью веб-конфигурации, что позволяет инженерам встраиваемых систем легко создавать функции загрузчика для своих продуктов без необходимости писать код. Однако, поскольку официальный загрузчик RT-Thread, RT-OTA, является коммерческим и не имеет открытого исходного кода, это ограничивает его переносимость на другие платформы и затрудняет добавление специфических функций в продукт.
Хотя мои навыки программирования ограничены, я решил создать открытый исходный код и универсальную среду загрузчика на основе системы RT-Thread в качестве хобби, чтобы внести свой вклад в сообщество. Я назвал этот проект RT-FOTA, вдохновлённый RT-Thread.
Анализ требований к RT-FOTA:
Разработка среды загрузчика, основанной на RTOS. Многие эксперты рекомендуют разрабатывать загрузчики как голые металлические программы, такие как u-boot, для обеспечения стабильности и надёжности. Однако я считаю, что ресурсы 32-битных микроконтроллеров богаты, а стабильность и надёжность RT-Thread хорошо известны, плюс богатый набор компонентов RT-Thread облегчает расширение функциональности (например, добавление сетевых и USB-функций). Поэтому я использую урезанную версию RT-Thread под названием rtt-nano.
Совместимость с официальными файлами RBL от RT-Thread: использование официального инструмента упаковки RT-Thread для создания файлов загрузки обеспечивает функции шифрования и сжатия. Из-за моих ограниченных навыков я могу только обеспечить максимальную совместимость, например, я не знаю, как вычислить HASH_CODE в файлах RBL.
Простота переноса: поскольку RT-FOTA основан на RT-Thread, он может быть легко перенесён на любую платформу, поддерживаемую RT-Thread.
Основные функции RT-FOTA:
Структура разработки программного обеспечения
Структура разработки программного обеспечения следует структуре каталогов RT-Thread. Хотя я изначально планировал использовать SCONS для компиляции, но из-за отсутствия опыта работы с SCONS, я временно использую MDK для завершения проекта.
Конфигурация программного обеспечения
Конфигурация RT-FOTA по-прежнему сосредоточена в файле rtconfig.h, который содержит определения конфигурации для RT-Thread. Некоторые файлы .c имеют предопределённые макросы конфигурации, которые можно настроить в соответствии с требованиями. Драйверы оборудования Config
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F4
#define SOC_STM32F407ZE
/* На чипе периферийные драйверы */
#define BSP_USING_GPIO
#define BSP_USING_ON_CHIP_FLASH
#define BSP_USING_ONCHIP_RTC
#define BSP_USING_UART
#define BSP_USING_UART1
#define BSP_USING_SPI
#define BSP_USING_SPI1
/* Встроенные периферийные драйверы */
#define BSP_DATAFALSH_CS_PIN 30
/* Расширенные модули драйверов платы */
#define BSP_RS485_DIR_PIN 52
/* Определение модуля RT-FOTA */
#define RT_FOTA_SW_VERSION "1.0.0"
/* Включить Ymodem OTA */
#define PKG_USING_YMODEM_OTA
/* Имя раздела можно настроить в соответствии с вашими потребностями */
/* FOTA приложение имя раздела */
#ifndef RT_FOTA_APP_PART_NAME
#define RT_FOTA_APP_PART_NAME "app"
#endif
/* FOTA загрузка имени раздела */
#ifndef RT_FOTA_FM_PART_NAME
#define RT_FOTA_FM_PART_NAME "fm_area"
#endif
/* FOTA по умолчанию имя раздела */
#ifndef RT_FOTA_DF_PART_NAME
#define RT_FOTA_DF_PART_NAME "df_area"
#endif
/* Эти два пароля должны совпадать с настройками программного обеспечения упаковки RTT */
/* Вариант алгоритма шифрования AES256 */
#define RT_FOTA_ALGO_AES_IV "0123456789ABCDEF"
#define RT_FOTA_ALGO_AES_KEY "0123456789ABCDEF0123456789ABCDEF"
#endif
Те, кто использовал официальный компонент RT-OTA от RTT, знают, что загружаемый файл не является bin-файлом, а должен быть «оформлен» с помощью программного обеспечения для упаковки RTT и превращён в файл rbl, чтобы его мог распознать RT-OTA.
Программное обеспечение для упаковки RTT позволяет настраивать шифрование кода и сжатие, и вся информация о конфигурации находится в первых 96 байтах файла rbl:
rt-fota />fota show fm_area 0 96 00000000: 52 42 4C 00 00 02 00 00 5E A9 A4 5D 61 70 70 00 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 31 2E 30 2E 00000020: 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000030: 00 00 00 00 31 2E 30 2E 36 00 00 00 00 00 00 00 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 43 33 29 0A 00000050: 47 08 F6 DA 84 BB 00 00 1C 84 00 00 C4 3D E3 B5
Его конкретное значение следующее:
typedef struct { char type[4]; /* RBL символ заголовка / rt_uint16_t fota_algo; / конфигурация алгоритма: указывает, используется ли шифрование или алгоритм сжатия / rt_uint8_t fm_time[6]; / время исходного bin файла, 6-битное время, использующее 4 байта, включая информацию о годе, месяце и дне / char app_part_name[16]; / имя исполняемого раздела приложения / char download_version[24]; / номер версии встроенного ПО / char current_version[24]; / эта область одинакова в файле rbl при создании, я использую её для представления текущей версии приложения в разделе приложения, чтобы определить, требуется ли обновление встроенного ПО / rt_uint32_t code_crc; / CRC32 кода, это значение проверки после упаковки, то есть 96 байт после файла rbl / rt_uint32_t hash_val; / предполагается, что эта область указывает на исходное значение контрольной суммы кода, но алгоритм неизвестен, поэтому он не используется в программе / rt_uint32_t raw_size; / размер исходного кода / rt_uint32_t com_size; / упакованный размер кода / rt_uint32_t head_crc; / значение CRC32 заголовка файла rbl, то есть первые 96 байт файла */ } rt_fota_part_head, *rt_fota_part_head_t;
Интерфейс запуска RT-FOTA выглядит следующим образом:
Можно видеть, что используются компоненты SFUD и FAL от RTT, и отображается информация о разделе.
Исходный код RT-FOTA открыт, вы можете изменять его по своему усмотрению:
В течение 5 секунд после нажатия клавиши Enter (0x0d) можно войти в командный режим:
Поскольку FINSH имеет функцию аутентификации, можно установить пароль для оболочки. Подробности см. в соответствующей документации RTT.
Командный режим RT-FOTA использует компонент FINSH от RTT. Помимо команд, встроенных в систему, также добавлены команды fota и ymdown:
Команда fota
После ввода команды fota и нажатия Enter появится справка по команде:
rt-fota />fota Usage: fota probe - probe RBL file of partiton fota show partition addr size - show 'size' bytes starting at 'addr' fota clone des_part src_part - clone src partition to des partiton fota exec - execute application program package size | 33824
Здесь перечислены основные сведения о файлах RBL в разделах fm_area и df_area, которые могут быть полезны разработчикам:
Параметр show может отображать конкретные данные раздела для удобства отладки и проверки:
rt-fota />fota show app 0 96
00000000: C0 08 00 20 E5 57 02 08 5D 04 02 08 5F 04 02 08
00000010: 63 04 02 08 67 04 02 08 6B 04 02 08 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 6F 04 02 08
00000030: 71 04 02 08 00 00 00 00 73 04 02 08 75 04 02 08
00000040: FF 57 02 08 FF 57 02 08 FF 57 02 08 49 55 02 08
00000050: FF 57 02 08 FF 57 02 08 FF 57 02 08 FF 57 02 08
Здесь показаны данные из раздела app с 0 по 96 байт.
Параметр clone используется для клонирования данных раздела:
rt-fota />fota clone fm_area df_area
Clone df_area partition to fm_area partition:
#########################################################
#########################################################
#########################################################
#########################################################
############################
Clone partition success, total 1048576 bytes!
Здесь происходит полное клонирование данных из раздела df_area в раздел fm_area.
Параметр exec используется для выполнения кода приложения в разделе app:
rt-fota />fota exec
[I/fota] Implement application now.
LCD ID:5510
Команда ymdown
ymdown — это команда загрузки, основанная на Ymodem-протоколе. Она использует компоненты ymodem и ymodem_ota из RTT и устанавливает DEFAULT_DOWNLOAD_PART в файле ymodem_ota.c для указания раздела по умолчанию, который будет использоваться при использовании команды ymdown без параметров. Также можно указать раздел с помощью параметра.
rt-fota />ymdown
Default save firmware on download partition.
Warning: Ymodem has started! This operator will not recovery.
Please select the ota firmware file and use Ymodem to send.
CCCCCC
Starting ymodem transfer. Press Ctrl+C to cancel.
100% 33 KB 6 KB/s 00:00:05 0 Errors
Download firmware to flash success.
Download firmware verify........[OK]
Reset system and apply new firmware.
После завершения загрузки система автоматически перезагружается, и новая прошивка переносится в раздел app:
____ _____ _____ ___ _____ _
| _ \_ _| | ___/ _ \ _ _|/ \
| |_) || |_____ | |_ || || | | / _ \
| _ < | |_____ | _| ||_|| | |/ ___ \
|_| \_\|_| |_| \___/ |_/_/ \_\
2016 - 2019 Copyright by Radiation @ warfalcon
Version: 1.0.0 build Oct 18 2019
[SFUD] Find a Winbond flash chip. Size is 16777216 bytes.
[SFUD] nor_flash0 flash device is initialize success.
[I/FAL] ==================== FAL partition table ====================
[I/FAL] | name | flash_dev | offset | length |
[I/FAL] -------------------------------------------------------------
[I/FAL] | app | onchip_flash | 0x00020000 | 0x000e0000 |
[I/FAL] | fm_area | nor_flash0 | 0x00000000 | 0x00100000 |
[I/FAL] | df_area | nor_flash0 | 0x00100000 | 0x00100000 |
[I/FAL] =============================================================
[I/FAL] RT-Thread Flash Abstraction Layer (V0.4.0) initialize success.
Please press [Enter] key into shell mode in 5 secs:
[I/fota] Partition[app] erase start:
[I/fota] Start to copy firmware from fm_area to app partition:
############
[I/fota] Upgrade success, total 48004 bytes.
[I/fota] Copy firmware version Success!
[I/fota] Implement application now.
LCD ID:5510
Существует несколько способов восстановления заводских настроек, но автор предпочитает использовать внешнюю кнопку для длительного нажатия после запуска. Заводская прошивка хранится в разделе df_area (имя раздела можно настроить в коде), и после длительного нажатия кнопки (длительность настраивается в коде) RT-FOTA автоматически расшифровывает и распаковывает раздел df_area и переносит его в раздел app для выполнения.
Default firmware key pressed:
>>>>>>>>>>
[I/fota] Partition[app] erase start:
[I/fota] Start to copy firmware from df_area to app partition:
############
[I/fota] Upgrade success, total 48004 bytes.
[I/fota] Implement application now.
LCD ID:5510
Перенос RT-FOTA очень прост, если в исходном коде RT-Thread есть пакет BSP для вашей платформы.
Также легко модифицировать различные компоненты в RT-FOTA, такие как FAL и SFUD, следуя инструкциям RTT или README.md в исходном пакете.
RT-FOTA можно использовать непосредственно в RT-Thread.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )