Проект примера приложения Zephyr [1] демонстрирует использование драйвера класса USB для перепрошивки firmware встраиваемых устройств (USB DFU Class driver). Этот проект требует подключения драйвера USB. В настоящий момент класс USB DFU предоставляется в составе Zephyr, в зависимости от включенной опции поддержки DFU Image Manager и созданных разделов в программируемой памяти (partition layout). Подробнее про разделы памяти Flash см. [2]. Ваш SoC должен запускать MCUboot в качестве загрузчика первого уровня (stage 1 bootloader). Проект примера собирается как приложение для загрузки под управлением MCUboot [3].
Примечание: этот пример явно включает опцию CONFIG_USB_DFU_ENABLE_UPLOAD.
[Сборка и подписывание приложения]
Этот пример может быть собран обычным способом (см. [4]), и прошивается обычным инструментарием записи памяти flash, но должен быть загружен во flash со смещением SLOT-0.
Образы приложений (такой как этот пример) должны быть подписаны. Система сборки может это сделать за вас установкой символа CONFIG_MCUBOOT_SIGNATURE_KEY_FILE.
Например:
west build -b nrf52840dk_nrf52840 zephyr/samples/subsys/usb/dfu -d build-dfu -- \
-DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"bootloader/mcuboot/root-rsa-2048.pem\"
Сборка и прошивка MCUboot bootloader для проекта Zephyr описана в документации [5]. Выполните сборку (build), подпись (sign) и прошивку (flash) орбаза примера USB DFU со смещением SLOT-0.
Выполните сборку и подпись второго образа приложения, например Hello World, который будет использоваться в качестве образа обновления. Не забудьте разрешить требуемую опцию CONFIG_BOOTLOADER_MCUBOOT (как описано в [6]). Например:
west build -b nrf52840dk_nrf52840 zephyr/samples/hello_world -d build-hello_world -- \
-DCONFIG_BOOTLOADER_MCUBOOT=y '-DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE="bootloader/mcuboot/root-rsa-2048.pem"'
[Тестирование]
Linux-утилита dfu-util может использоваться для сохранения (backup) или обновления (update) образа приложения.
Для backup образа из SLOT-0 используйте команду:
dfu-util --alt 0 --upload slot0_backup.bin
Для update приложения используйте команду:
dfu-util --alt 1 --download build-hello_world/zephyr/zephyr.signed.bin
Сброс SoC. MCUboot переключит образы, и загрузит новое приложение, при этом в консоль будет выведено:
*** Booting Zephyr OS build zephyr-v3.0.0-360-gc0dd594d4d3d ***
I: Starting bootloader
I: Primary image: magic=good, swap_type=0x2, copy_done=0x1, image_ok=0x3
I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Boot source: none
I: Swap type: revert
I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Bootloader chainload address offset: 0xc000
I: Jumping to the first image slot
*** Booting Zephyr OS build zephyr-v3.0.0-361-gb987e6daa2f9 ***
[00:00:00.005,920] < inf> main: This device supports USB DFU class.
[Permanent download и automatic reboot]
Для разрешения принудительной загрузки, не требующей участия пользователя (permanent download) могут использоваться несколько символов.
Чтобы пометить SLOT-1 в качестве перманентного после завершения загрузки, разрешите символ CONFIG_USB_DFU_PERMANENT_DOWNLOAD. Для автоматического reboot после завершения загрузки разрешите символ CONFIG_USB_DFU_REBOOT.
Предупреждение: разрешение CONFIG_USB_DFU_PERMANENT_DOWNLOAD может привести к окирпичиванию устройства! Удостоверьтесь, что вам доступен другой способ загрузить firmware в память системы. Например, с помощью отладчика или режима восстановления загрузчика (MCUBoot recovery mode).
Оба этих символа могут быть разрешены с помощью оверлея overlay-permanent-download.conf. Например:
west build -b nrf52840dk_nrf52840 zephyr/samples/subsys/usb/dfu -d build-dfu -- \
-DCONFIG_BOOTLOADER_MCUBOOT=y '-DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE="bootloader/mcuboot/root-rsa-2048.pem"' \
-DOVERLAY_CONFIG=overlay-permanent-download.conf
Следующий листинг показывает вывод в консоль при загрузке с помощью dfu-util. Обратите внимание на Swap type: perm.
*** Booting Zephyr OS build zephyr-v3.0.0-361-ge6900e2451d5 ***
[00:00:00.005,920] main: This device supports USB DFU class.
*** Booting Zephyr OS build zephyr-v3.0.0-360-gc0dd594d4d3d ***
I: Starting bootloader
I: Primary image: magic=good, swap_type=0x4, copy_done=0x1, image_ok=0x1
I: Secondary image: magic=good, swap_type=0x3, copy_done=0x3, image_ok=0x1
I: Boot source: none
I: Swap type: perm
I: Bootloader chainload address offset: 0xc000
I: Jumping to the first image slot
*** Booting Zephyr OS build zephyr-v3.0.0-361-gb987e6daa2f9 ***
Hello World! nrf52840dk_nrf52840
[Ссылки]
1. Zephyr USB DFU Sample Application site:nordicsemi.com. 2. Zephyr Flash map site:nordicsemi.com. 3. Secure boot for 32-bit Microcontrollers site:mcuboot.com. 4. Zephyr Application Development site:nordicsemi.com. 5. Сборка и использование MCUboot вместе с приложением Zephyr. 6. MCUBoot Device Firmware Upgrade site:nordicsemi.com. |