Программирование ARM Bouffalo Flash Cube, инструкции по использованию Sat, May 04 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Bouffalo Flash Cube, инструкции по использованию Печать
Добавил(а) microsin   

Flash Cube это программный инструмент для прошивки приложений пользователя, таблиц разделов, загрузчика второго уровня (boot2), информационных ресурсов пользователя и других файлов в память Flash чипов Bouffalo. Также эта утилита предоставляет функцию прошивки бит eFuse.

Основные возможности Flash Cube:

1. Прошивка и проверка различных типов информации.
2. Прошивка и проверка eFuse.
3. Поддержка стирания, записи, чтения нескольких моделей Flash.
4. Хостом, на котором запускается Flash Cube, может подключаться к программируемому устройству через UART, JLink, CKLink и OpenOCD. Скорость загрузки может конфигурироваться.
5. Поддержка шифрования и подписи.

Утилита Flash Cube поставляется с графическим интерфейсом, а также с интерфейсом командной строки, в нескольких версиях для разных операционных систем:

Исполняемый файл Назначение
BLFlashCommand-freebsd Утилита командной строки для FreeBSD
BLFlashCommand-macos Утилита командной строки для MacOS
BLFlashCommand-ubuntu Утилита командной строки для Ubuntu
BLFlashCommand.exe Утилита командной строки для Windows
BLFlashCube-macos GUI-утилита для MacOS
BLFlashCube-ubuntu GUI-утилита для Ubuntu
BLFlashCube.exe GUI-утилита для Windows

Flash Cube main window fig01

Рис. 1. Основное окно GUI-утилиты Flash Cube.

• Область Firmware Options используется для выбора конфигурационного файла, управляющего прошивкой. Кнопка Browse позволяет выбрать уже существующий файл конфигурации. Кнопка Add позволяет создать файл конфигурации путем запуска дополнительного диалога (см. рис. 2). В этом диалоге указывается имя записываемого файла и адрес, по которому он должен быть записан.

Flash Cube Add Image File fig02

Рис. 2. Диалог добавления прошиваемых файлов.

• Область Efuse Options используется для настройки прошивки конфигурационных фьюзов чипа. Здесь можно выбрать прошиваемый файл данных efusedata.bin и поставить галочку Enable для разрешения прошивки. В той же самой директории должен находиться файл efusedata_mask.bin для проверки успеха программирования, иначе произойдет ошибка.

• Область Basic Options используется для выбора типа чипа, интерфейса программирования и скорости передачи. Поддерживается прошивка чипов BL602/604, BL702/704/706, BL702L, BL808, BL606P и BL616/BL618, интерфейсы программирования UART, Jlink, CKLink и Openocd. В поле "Port/SN" в случае последовательного порта нужно выбрать имя порта или серийный номер интерфейса. Кнопка Refresh позволяет обновить значения полей Basic Options.

• Если выбрать чип BL60x или BL70x, то открывается дополнительная область Encrypt Options. Здесь настраиваются следующие опции:

aes-encrypt: если используется шифрование, то нужно поставить эту галочку и ввести значения ключ в поля текста "key (16 bytes)" и "iv (16 bytes)". Значения вводятся шестнадцатеричными цифрами "0" .. "F". Один байт соответствует 2 цифрам, так что потребуется для каждого из полей Key и IV ввести 32 символа. Обратите внимание, что последние 8 цифр IV (т. е. 4 байта) все должны быть 0.
ecc-signature: если используется функция цифровой подписи, то надо поставить здесь галочку и выбрать соответствующий публичный ключ (public key). Для private key кнопкой Browse можно выбрать файл приватного ключа, по нему утилита сгенерирует pk hash и запишет его в eFuse.

• Кнопки в правой части окна нужны для следующих функций.

Refresh: позволяет обновить значения полей Basic Options. При подключении последовательных портов и интерфейсов программирования клик на этой кнопке обновит содержимое соответствующих выпадающих списков.
Clear: используется для очистки статуса прогресса и области лога в нижней части окна.
Open Uart: используется для проверки подключения к интерфейсу UART.
Save Config: сохранит текущие настроенные значения области Firmware Options в выбранный файл конфигурации.
Download: запустит процесс прошивки чипа.

[Примеры использования]

Далее на примерах будут показаны различные сценарии записи примеров приложений examples/wifi/sta.

Как компилировать. На примере проекта wifi_http для чипа BL616:

$ cd examples\wifi\sta\wifi_http
$ make CHIP=bl616 BOARD=bl616dk

После завершения компиляции будет сгенерирован firmware-файл sta_bl616.bin в папке build/build_out. В ту же самую папку будут записаны дополнительные файлы загрузчика второго уровня (boot2), файл заводской прошивки (mfg) и другие файлы, относящиеся к скомпилированному firmware.

Импорт файла конфигурации. После запуска Flash Cube по умолчанию будет открыта закладка Flash Download. Кликните на кнопку Browse области Firmware Options, и выберите файл flash_prog_cfg.ini, который находится в корневой папке проекта wifi_http. Окно Flash Cube поменяет свой внешний вид:

Flash Cube import config file fig03

Рис. 3. Вид основного окна Flash Cube, когда загружен файл конфигурации flash_prog_cfg.ini.

UART. Когда для программирования выбран интерфейс UART, необходимо вывод управления загрузкой чипа (BOOT pin платы) в лог. 1, и после этого выполнить сброс платы. На платках, которые можно купить на AliExpress, для этого есть 2 специальные кнопки - BOOT и RST. После этого чип войдет в режим загрузки (запуститься загрузчик первого уровня, находящийся в ПЗУ, Boot ROM), и вывод BOOT можно вернуть обратно к уровню лог. 0 (отпустить кнопку BOOT).

Если на плате ножки Boot и Reset подключены к сигналам DTR и RTS преобразователя интерфейса USB - TTL UART, то никакие специальные действия по нажатию кнопок BOOT и RST и предпринимать не нужно, об этом позаботится Flash Cube после клика на Download.

Jlink. Когда выбран метод загрузки через Jlink, вывод Boot всегда должен быть в уровне лог. 0, чтобы произошла запись Flash.

Кликните Download, и утилита запишет все данные в память flash чипа, которые были настроены на страничке конфигурирования. Зеленая полоса прогресса 100% покажет, что все операции были выполнены успешно, и в логе будут выведены сообщения, касающиеся выполнения отдельных операций.

Замечание: если программируемая плата не подключена, и вам всего лишь нужно сгенерировать полный образ для прошивки, то клик на кнопку Download сгенерирует этот образ в файл whole_flash_data.bin.

После того, как программа была успешно записана, сброс платы с уровнем лог. 0 на выводе BOOT (или передергивание питания) приведет к запуску программы из flash. Через UART будут выведены отладочные сообщения программы.

[Файл конфигурации flash_prog_cfg.ini]

В соответствии с требованиями программируемого приложения должен быть правильно составлен файл конфигурации прошивки. Для всех примеров приложения из каталога examples уже есть готовые такие файлы flash_prog_cfg.ini.

В качестве примера рассмотрим файл конфигурации flash_prog_cfg.ini примера wifi_http (он находится в корне проекта, в папке examples\wifi\sta\wifi_http).

[cfg]
# 0: no erase, 1:programmed section erase, 2: chip erase
erase = 1
# skip mode set first para is skip addr, second para is skip len,
# multi-segment region with ; separated
skip_mode = 0x0, 0x0
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 0
 
[boot2]
filedir = ./build/build_out/boot2_*.bin
address = 0x000000
 
[partition]
filedir = ./build/build_out/partition*.bin
address = 0xE000
 
[FW]
filedir = ./build/build_out/wifi*_$(CHIPNAME).bin
address = @partition
 
# [mfg]
# filedir = ./build/build_out/mfg*.bin
# address = @partition

cfg. Раздел cfg содержит следующие опции.

erase: установит метод стирания памяти flash. По умолчанию используется erase = 1, при этом стираться будут только те области, которые будут записываться (в соответствии с начальным адресом и размером записываемых данных). erase = 2 означает, что предварительно будет полностью очищена вся память flash чипа. erase = 0 означает, что никаких операций стирания не будет, этот вариант обычно не используется.
skip_mode: установит область, которая не будет обрабатываться во время стирания и записи. Параметры областей записываются парами "начальный адреса, длина". Можно указать несколько областей skip_mode, отделенных друг от другом запятой. В примере выше задано "skip_mode = 0x0, 0x0", что означает отсутствие пропускаемых областей.
boot2_isp_mode: управляет выбором режима программирования (isp programming mode). boot2_isp_mode = 1 означает, что выбирается isp programming mode, что означает использование загрузчика второго уровня (boot2).

boot2. Здесь указывается прошиваемый загрузчик 2 уровня.

filedir: относительный путь до файла boot2.
address: адрес прошивки, должен быть всегда 0.

partition. Здесь указывается прошиваемый файл таблицы разделов flash.

filedir: относительный путь до файла таблицы разделов.
address: указывается адрес прошивки таблицы разделов. Когда указано "@partition", адрес берется из файла partition_xxx.toml SDK (для чипа BL616 это может быть файл bsp\board\bl616dk\config\partition_cfg_4M.toml).

FW. Здесь представлено приложение пользователя. Здесь имя "FW" используется для получения кода прошивки из таблицы разделов.

filedir: относительный путь до файла прошиваемого firmware. Имя может быть составлено из названия приложения, например wifista это прошивка одного из примеров каталога examples\wifi\sta, а $(CHIPNAME) представляет тип используемого чипа.
address: использование "@partition" для адреса будет означать, что адрес будет браться из таблицы разделов (partition.bin). Также можно указать абсолютный адрес, например address = 0x10000.

mfg. Представляет firmware "заводского приложения", которое может быть получено из таблицы разделов по имени "mfg".

filedir: относительный путь до файла прошиваемого firmware.
address: ”@partition” будет означать автоматически определяемую по таблице разделов область записи. Можно также указать и абсолютный адрес, например address = 0x210000.

Для сценария программирования карты памяти нескольких приложений (IOT multi-firmware program), если вы захотите добавить новые программируемые элементы, то понадобится изменить этот файл конфигурации прошивки:

• Измените файл таблицы разделов, и добавьте информацию таблицы разделов в соответствующий файл.
• Добавьте соответствующий элемент конфигурации в файл flash_prog_cfg.ini.

Следующий пример добавит элемент конфигурации для дополнительного приложения теста (test) системы BL616, как пример такого сценария.

[Изменение файла таблицы разделов]

В каталоге bsp/board/bl616dk/config SDK находится файл настройки таблицы разделов, используемый по умолчанию, который называется partition_xxx.toml (вместо xxx обычно указывают размер flash, например partition_cfg_4M.toml). При добавлении новых программируемых элементов требует внесения изменений в этот файл настройки таблицы разделов.

Например: подготовлена прошивка test.bin для позиции 0x378000 в памяти flash, и размер firmware составляет 0x1000. Добавьте в таблицу раздела новый элемент раздела с именем "test", где address0 укажите 0x378000, размер 0x1000, и другие опции конфигурации используют значения по умолчанию.

type. Этот параметр представляет тип раздела, 0 означает запуск образа ядром CPU0, 1 запуск образа ядром CPU1. Boot2 запускает образ на основе его типа, так что пользователи должны избегать 0 и 1 при настройке таблицы разделов, иначе Boot2 будет рассматривать этот раздел как работоспособный образ для запуска и работы.

[[pt_entry]]
type = 8
name = "test"
device = 0
address0 = 0x378000
size0 = 0x1000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[pt_table]
#partition table is 4K in size
address0 = 0xE000
address1 = 0xF000
# If version is 2, It will use dynamic mode.
version = 2
 
[[pt_entry]]
type = 16
name = "Boot2"
device = 0
address0 = 0
size0 = 0xE000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 1
# If header is 1 and security is 1, It will be encrypted.
security = 1
 
[[pt_entry]]
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x200000
address1 = 0x210000
size1 = 0x168000
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 1
# If header is 1 and security is 1, It will be encrypted.
security= 1
 
[[pt_entry]]
type = 10
name = "mfg"
device = 0
address0 = 0x210000
size0 = 0x168000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 1
# If header is 1 and security is 1, It will be encrypted.
security= 1
 
[[pt_entry]]
type = 2
name = "media"
device = 0
address0 = 0x378000
size0 = 0x71000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 0
# If header is 1 and security is 1, It will be encrypted.
security= 0
 
[[pt_entry]]
type = 3
name = "PSM"
device = 0
address0 = 0x3E9000
size0 = 0x8000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 0
# If header is 1 and security is 1, It will be encrypted.
security= 0
 
[[pt_entry]]
type = 4
name = "KEY"
device = 0
address0 = 0x3F1000
size0 = 0x2000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 0
# If header is 1 and security is 1, It will be encrypted.
security= 0
 
[[pt_entry]]
type = 5
name = "DATA"
device = 0
address0 = 0x3F3000
size0 = 0x5000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 0
# If header is 1 and security is 1, It will be encrypted.
security = 0
 
[[pt_entry]]
type = 6
name = "factory"
device = 0
address0 = 0x3F8000
size0 = 0x8000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 0
# If header is 1 and security is 1, It will be encrypted.
security= 0

После внесения изменений перекомпилируйте firmware приложения. Если вы увидите "Create partition using partition_xxx.toml" в логе компиляции, то это значит, что таблица разделов в виде файла partition.bin будет создана в каталоге build/build_out корневого каталога проекта.

Если вы увидели сообщение "[Warning] No partiton file found in ./bsp/board/bl616dk/config, go on next steps", то это значит, что конфигурационная информация для создания таблицы разделов не была найдена, проверьте полный путь до файла *.toml (например, для чипа BL616 это файл board\bl616dk\config\partition_cfg_4M.toml).

[Изменение файла конфигурации прошивки]

Откройте файл flash_prog_cfg.ini в каталоге вашего приложения (для примера приложения wifi_http это файл examples\wifi\sta\wifi_http\flash_prog_cfg.ini) и добавьте в него элемент конфигурации test. Содержимое конфигурационного файла после добавления элемента программирования test будет следующим:

[cfg]
# 0: no erase, 1:programmed section erase, 2: chip erase
erase = 1
# skip mode set first para is skip addr, second para is skip len, multi-segment
# region with ; separated
skip_mode = 0x0, 0x0
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 0
 
[boot2]
filedir = ./build/build_out/boot2_*.bin
address = 0x000000
 
[partition]
filedir = ./build/build_out/partition.bin
address = 0xE000
 
[FW]
filedir = ./build/build_out/sta*_$(CHIPNAME).bin
address = @partition
 
[mfg]
filedir = ./build/build_out/mfg*.bin
address = @partition
 
[test]
filedir = ./build/build_out/test*.bin
address = @partition

В новом элементе настройки прошивки test:

• filedir указывает место расположения двоичного прошиваемого файла. Рекомендуется указывать относительный путь (относительно места расположения файла конфигурации). Рекомендуется новое добавляемое firmware в ту же директорию, что и FW.
• address указывает адрес для программирования. Рекомендуется указывать "@partition", чтобы автоматически получать адрес прошивки из таблицы разделов. Также можно указывать абсолютный адрес 0x1FF000.

После успешного внесения изменений используйте Flash Cube для импорта нового файла конфигурации и прошивки. После импорта интерфейс программирования получится примерно такой:

Flash Cube import config file test fig04

Рис. 4. Вид основного окна Flash Cube, когда загружен файл конфигурации с добавленным элементом test.

[Утилита командной строки Flash Cube]

Для Windows исполняемый файл BLFlashCommand.exe, а для Linux BLFlashCommand-* (вместо звездочки freebsd, macos или ubuntu). С указанием --help выведется базовая подсказка по командной строке.

c:\bouffalo_sdk\tools\bflb_tools\bouffalo_flash_cube>BLFlashCommand.exe --help
usage: BLFlashCommand.exe [-h] [--interface INTERFACE] [--port PORT]
                          [--chipname CHIPNAME] [--baudrate BAUDRATE]
                          [--config CONFIG] [--firmware FIRMWARE]
                          [--cpu_id CPU_ID] [--efuse EFUSE] [--key KEY]
                          [--iv IV] [--pk PK] [--sk SK] [--pk_str PK_STR]
                          [--sk_str SK_STR] [--build]
 
flash-command
 
optional arguments:
  -h, --help            show this help message and exit
  --interface INTERFACE interface to use
  --port PORT           serial port to use
  --chipname CHIPNAME   chip name
  --baudrate BAUDRATE   the speed at which to communicate
  --config CONFIG       run config
  --firmware FIRMWARE   image to write
  --cpu_id CPU_ID       cpu id
  --efuse EFUSE         efuse options
  --key KEY             aes key
  --iv IV               aes iv
  --pk PK               ecc public key
  --sk SK               ecc private key
  --pk_str PK_STR       ecc public key string
  --sk_str SK_STR       ecc private key string
  --build               build pack

Для прошивки нужно указать --interface для интерфейса программирования, --port для имени последовательного порта или серийного номера JLink, --chipname для типа чипа, и --baudrate для скорости передачи. Опция --config задает файл конфигурации программирования. 

Например, для прошивки под Windows, если зайти в директорию tools\bflb_tools\bouffalo_flash_cube\, то для программирования может использоваться следующая команда:

BLFlashCommand.exe --interface=uart --chipname=bl616 --port=COM24 --baudrate=2000000
 --config=bouffalo_sdk/examples/wifi/sta/flash_prog_cfg.ini
['m:\\asm\bouffalo_sdk\\tools\\bflb_tools\\bouffalo_flash_cube', '--interface=uart',
 '--chipname=bl616', '--port=COM24', '--baudrate=2000000', '--config=bouffalo_sdk/
 examples/wifi/sta/flash_prog_cfg.ini']
[16:13:43.969] - Serial port is COM24
[16:13:43.970] - ==================================================
[16:13:43.973] - FW get address from partiton file m:\asm\bouffalo_sdk\examples\
 wifi\sta\wifi_http\./build/build_out/partition.bin
[16:13:43.973] - Address=0x10000
[16:13:43.974] - mfg get address from partiton file m:\asm\bouffalo_sdk\examples\
 wifi\sta\wifi_http\./build/build_out/partition.bin
[16:13:43.974] - Address=0x210000
[16:13:43.976] - test get address from partiton file m:\asm\bouffalo_sdk\examples\
 wifi\sta\wifi_http\./build/build_out/partition.bin
[16:13:43.976] - Address=0x378000
[16:13:43.977] - Program Start
[16:13:43.977] - ========= eflash loader cmd arguments =========
[16:13:43.978] - serial port is COM24
[16:13:43.978] - chiptype: bl616
[16:13:43.978] - cpu_reset=False
[16:13:44.140] - ========= Interface is uart =========
[16:13:44.140] - Bootrom load
[16:13:44.140] - ========= get_boot_info =========
[16:13:44.141] - ========= image get bootinfo =========
[16:13:44.145] - default set DTR high
[16:13:44.258] - usb serial port
[16:13:44.319] - clean buf
[16:13:44.367] - send sync
[16:13:44.585] - ack is b'4f4b464c0201'
[16:13:44.630] - shake hand success
[16:13:45.143] - data read is b'01001606000001002516891034ddd52c720c19008f758018'
[16:13:45.143] - ========= ChipID: 0c722cd5dd34 =========
[16:13:45.146] - Get bootinfo time cost(ms): 1004.73828125
[16:13:45.146] - change bdrate: 2000000
[16:13:45.146] - Clock PLL set
[16:13:45.147] - Set clock time cost(ms): 1.01318359375
[16:13:45.281] - Read mac addr
[16:13:45.282] - flash set para
[16:13:45.282] - get flash pin cfg from bootinfo: 0x24
[16:13:45.282] - set flash cfg: 14124
[16:13:45.282] - Set flash config
[16:13:45.284] - Set para time cost(ms): 1.998046875
[16:13:45.284] - ========= flash read jedec ID =========
[16:13:45.284] - Read flash jedec ID
[16:13:45.285] - readdata:
[16:13:45.285] - b'ef401700'
[16:13:45.285] - Finished
[16:13:45.287] - Program operation
[16:13:45.287] - Dealing Index 0
[16:13:45.287] - ========= programming m:\asm\bouffalo_sdk\examples\wifi\sta
 \wifi_http\.\build\build_out\boot2_bl616_release_v8.0.7.bin to 0x000000
[16:13:45.289] - flash para file: m:\asm\bouffalo_sdk\tools\bflb_tools\
 bouffalo_flash_cube\chips\/bl616/efuse_bootheader/flash_para.bin
[16:13:45.290] - Set flash config
[16:13:45.296] - Set para time cost(ms): 6.062255859375
[16:13:45.298] - ========= flash load =========
[16:13:45.298] - ========= flash erase =========
[16:13:45.300] - Erase flash from 0x0 to 0xa93f
[16:13:45.656] - Erase time cost(ms): 355.3857421875
[16:13:45.670] - Load 43328/43328 {"progress":100}
[16:15:39.658] - Write check
[16:15:39.660] - Flash load time cost(ms): 250.399169921875
[16:15:39.660] - Finished
[16:15:39.661] - Sha caled by host: 81bdd6bd9e028b2d1fa5da8d12aa4438353842d3f
 2a0b85e61a4efb00dd50fd0
[16:15:39.661] - xip mode Verify
[16:15:39.699] - Read Sha256/43328
[16:15:39.699] - Flash xip readsha time cost(ms): 37.889404296875
[16:15:39.702] - Finished
[16:15:39.704] - Sha caled by dev: 81bdd6bd9e028b2d1fa5da8d12aa4438353842d3f2
 a0b85e61a4efb00dd50fd0
[16:15:39.704] - Verify success
[16:15:39.705] - Dealing Index 1
[16:15:39.793] - ========= programming m:\asm\bouffalo_sdk\examples\wifi\sta
 \wifi_http\.\build\build_out\sta_bl616.bin to 0x10000
[16:15:39.797] - flash para file: m:\asm\bouffalo_sdk\tools\bflb_tools\
 bouffalo_flash_cube\chips\bl616\efuse_bootheader\flash_para.bin 
[16:15:39.797] - Set flash config
[16:15:39.803] - Set para time cost(ms): 5.73193359375
[16:15:39.803] - ========= flash load =========
[16:15:39.804] - ========= flash erase =========
[16:15:39.804] - Erase flash from 0x10000 to 0xda61f
[16:15:42.502] - Erase time cost(ms): 2697.24658203125
[16:15:47.222] - Load 828960/828960 {"progress":100}
[16:15:47.222] - Write check
[16:15:47.226] - Flash load time cost(ms): 4721.73046875
[16:15:47.226] - Finished
[16:15:47.230] - Sha caled by host: 6167624bb39d78d164eada22e9802520fb2bea0b5
 26a5563fc4ea6568d557747
[16:15:47.230] - xip mode Verify
[16:15:47.918] - Read Sha256/828960
[16:15:47.918] - Flash xip readsha time cost(ms): 686.973388671875
[16:15:47.920] - Finished
[16:15:47.922] - Sha caled by dev: 6167624bb39d78d164eada22e9802520fb2bea0b52
 6a5563fc4ea6568d557747
[16:15:47.922] - Verify success
[16:15:47.925] - Dealing Index 3
[16:15:47.925] - ========= programming m:\asm\bouffalo_sdk\examples\wifi\sta
 \wifi_http\.\build\build_out\mfg_bl616_gu_af8b0946f_v2.26.bin to 0x210000
[16:15:47.927] - flash para file: m:\asm\bouffalo_sdk\tools\bflb_tools\
 bouffalo_flash_cube\chips\bl616\efuse_bootheader\flash_para.bin
[16:15:47.927] - Set flash config
[16:15:47.934] - Set para time cost(ms): 6.00146484375
[16:15:47.934] - ========= flash load =========
[16:15:47.935] - ========= flash erase =========
[16:15:47.936] - Erase flash from 0x210000 to 0x27457f
[16:15:49.320] - Erase time cost(ms): 1383.6416015625
[16:15:51.672] - Load 411008/411008 {"progress":100}
[16:15:51.672] - Write check
[16:15:51.676] - Flash load time cost(ms): 2355.2607421875
[16:15:51.676] - Finished
[16:15:51.678] - Sha caled by host: 02a97ceb1934fa725bd9822908a23790782516d09
 2ccb6e8521f9614e52c46e3
[16:15:51.679] - xip mode Verify
[16:15:52.021] - Read Sha256/411008
[16:15:52.022] - Flash xip readsha time cost(ms): 342.109619140625
[16:15:52.023] - Finished
[16:15:52.025] - Sha caled by dev: 02a97ceb1934fa725bd9822908a23790782516d092
 ccb6e8521f9614e52c46e3
[16:15:52.025] - Verify success
[16:15:52.027] - Program Finished
[16:15:52.028] - All time cost(ms): 14265.697021484375
[16:15:52.147] - close interface
[16:15:52.147] - [All Success]

[Flash Utils]

Выберите закладку Flash Utils для входа в специальный вспомогательный интерфейс отладки Flash (Flash debugging assistant). Это может использоваться для получения Flash ID, чтения и стирания flash. Можно производить чтение по указанному адресу Flash, чтение и запись значений в соответствующие регистры.

Flash Cube Flash Utils fig05

Рис. 5. Основное окно Flash Utils.

Ниже показан пример чтения содержимого регистров. В поле Command введите команду чтения (read command 0x05/0x35), в поле Length введите количество, кликните на Read Register. Прочитанные данные будут показаны в поле Value и в тексте лога.

Flash Cube read register fig06

Рис. 6. Пример чтения регистра.

Аналогичным образом можно записывать регистры. В поле Command введите команду записи (write command 0x01/0x31), в поле Length введите количество, записываемое значение введите в поле Value, кликните на Write Register.

Flash Cube также поддерживает и другие продвинутые функции программирования, осуществляемые модификацией файла конфигурации.

[Поддержка нечеткого сопоставления путей]

В конфигурационном файле flash_prog_cfg.ini, импортируемом пользователем, путь до файлов firmware может быть наподобие "./build/build_out/helloworld*_$(CHIPNAME).bin". Обратите внимание на звездочку в имени файла - таким образом утилита сопоставляет имя test firmware с конкретным файлом. Подобный метод сопоставления может использоваться и для других файлов конфигурации.

[cfg]
# 0: no erase, 1:programmed section erase, 2: chip erase
erase = 1
# skip mode set first para is skip addr, second para is skip len,
# multi-segment region with ; separated
skip_mode = 0x0, 0x0
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 0
 
[boot2]
filedir = ./build/build_out/boot2_*.bin
address = 0x000000
 
[partition]
filedir = ./build/build_out/partition.bin
address = 0xE000
 
[FW]
filedir = ./build/build_out/sta*_$(CHIPNAME).bin
address = @partition
 
[mfg]
filedir = ./build/build_out/mfg*.bin
address = @partition

• [boot2] здесь filedir использует "./build/build_out/boot2_*.bin", что соответствует файлу boot2_bl616_release_v8.0.7.bin в каталоге build/build_out.
• [FW] filedir установлен в "./build/build_out/sta*_$(CHIPNAME).bin". Это соответствует файлу sta_bl616.bin в директории build/build_out.
• [mfg] filedir установлен в "./build/build_out/mfg*.bin", что соответствует mfg_bl616_gu_af8b0946f_v2.26.bin в директории build/build_out.

Если было обнаружено больше одного совпадения для опции, то утилита выдаст сообщение об ошибке "Error: Multiple files were matched!".

[Поддержка ISP]

ISP расшифровывается как In-System Programming, т. е. "программирование в системе". Flash Cube поддерживает режим программирования ISP.

Если взять для примера чип BL602, то boot2_isp_mode управляет, выбран ли режим программирования ISP, и isp_mode_speed управляет скоростью обмена с загрузчиком boot2 для запуска программирования ISP. Кроме того, boot2_isp_mode устанавливает определяемый пользователем файл конфигурации прошивки, и isp_mode_speed устанавливается в chips/bl602/eflash_loader/eflash_loader_cfg.ini. Измените "boot2_isp_mode = 0" в пользовательском конфигурационном файле на "boot2_isp_mode = 1", и затем сохраните его (Save the file), чтобы использовать режим программирования ISP.

Процесс прошивки будет включать в себя следующие шаги:

• Во-первых, убедитесь, что программа загрузчика Boot2 запрограммирована и запущена в чипе, затем в конфигурационном файле поменяйте boot2_isp_mode на "boot2_isp_mode = 1" и сохраните файл.

• Во время процесса прошивки будет выведена подсказка для нажатия кнопки сброса ("Please Press Reset Key!"). В этот момент пользователю нужно будет сбросить чип в течение 5 секунд. После успешной процедуры handshake (детектирования последовательности байт 0x55 [2]) будет выведено сообщение "read ready" или "isp ready", и затем произойдет успешное программирование чипа.

[Поддержка компрессии]

В режиме программирования сжатых данных образа утилита упаковывает каждый прошиваемый файл. Когда файл передается в чип через последовательный порт, загрузчик чипа распаковывает файл и распакованные данные программирует в память flash. Таким образом экономится время, затрачиваемое на процесс программирования.

Если взять для примера BL602, откройте файл chips/bl602/eflash_loader/eflash_loader_cfg.ini в директории утилиты и измените "decompress_write = false" на "decompress_write = true", и затем сохраните файл. Во время программирования лог покажет, что в процессе прошивки использовался метод компрессии для передачи данных прошивки (decompress flash load).

[Проверка программирования eFuse]

Flash Cube поддерживает программирование eFuse, и файлы efusedata.bin и efusedata_mask.bin будут сгенерированы в директории build/build_out после компиляции проекта SDK.

Файл efusedata.bin это двоичные данные программируемых фьюзов, а файл efusedata_mask.bin используется для верификации программирования eFuse. Используется ли верификация eFuse, можно сконфигурировать модификацией параметра factory_mode в файле eflash_loader_cfg.ini при выборе соответствующего типа чипа (например для чипа BL602 путь до файла chips/bl602/eflash_loader/eflash_loader_cfg.ini). По умолчанию factory_mode установлен в false, что соответствует отсутствию проверки eFuse. Когда factory_mode = true, то верификация eFuse выполняется.

При использовании повторного шифрования и подписи чипа если чип будет снова запрограммирован, то поскольку ключ шифрования и хэш подписи защищены от записи и чтения, и если factory_mode = true, то будет отображено сообщение об ошибке верификации eFuse. Это нормальная ситуация, но может вызвать путаницу для клиентов.

Flash Cube repeated programming eFuse check failed fig08

Рис. 8. Сообщение об ошибке проверки eFuse при повторной прошивке защищенного чипа.

Если установить factory_mode = false и не выполнять верификацию программирования, то будет выведено сообщение об успешном программировании.

Flash Cube repeated programming eFuse no check fig09

Рис. 9. Повторная запись с отключенной проверкой eFuse.

[Управление стиранием flash]

Поддерживаются методы полного стирания и сегментированного стирания, что управляется параметром erase файла конфигурации (flash_prog_cfg.ini), который находится в разделе [cfg]. Когда erase = 0, то никакого стирания не производится, erase = 1 означает стирание только в тех местах, где производится запись, erase = 2 означает полное стирание памяти перед программированием. В режиме стирания erase = 1 область стирания определяется по начальному адресу и размеру записываемого файла, и стирание происходит перед программированием каждого файла.

Функция skip для стирания и записи. Когда не нужно, чтобы указанная область не стиралась и не записывалась при программировании, можно использовать функцию пропуска (skip). Для этого в файле конфигурации (flash_prog_cfg.ini), в секции [cfg] есть опция skip. Например, если в чипе BL602 вы не хотите затрагивать область 0x11000 ~ 0x12000 при программировании, то содержимое этой опции нужно поменять следующим образом:

skip_mode = 0x11000, 0x1000

Здесь первое значение задает начальный адрес пропускаемой области, а второе значение её размер в байтах.

Можно указать несколько пропускаемых регионов памяти, отделяя их друг от друга символом ';'. Например, если надо пропустить стирание и программирование областей 0x11000 ~ 0x12000 и 0x13000 ~ 0x15000, то опцию skip надо задать так:

skip_mode = 0x11000, 0x1000; 0x13000, 0x2000

[Генерация файлов для массового производства]

Во время каждого программирования утилита будет генерировать 2 файла для массового производства:

whole_flash_data.bin. Это двоичный файл, представляющий полное содержимое flash. В него помещается содержимое каждой программируемой части flash:

Flash Cube whole flash data bin fig10

Рис. 10. Что находится в файле whole_flash_data.bin.

Как показано на рис. 10, файл whole_flash_data.bin содержит все двоичные файлы, которые прошиваются в память flash в соответствии с таблицей разделов. Таким образом, файл whole_flash_data.bin может использоваться для автоматизации программирования при массовом производстве устройств, при прошивке файла начиная с адреса 0. В файле whole_flash_data.bin находится лишняя информация (байты дополнения 0xFF, соответствующие не записанным областям), что является недостатком, потому что потенциально увеличивает время программирования.

whole_img.pack. Это тот же файл, но с примененной компрессией данных. Он не только содержит различные прошиваемые файлы, но также и конфигурационную информацию прошиваемых файлов. Структура файла whole_img.pack следующая:

Flash Cube whole img pack fig11

Рис. 11. Структура содержимого файла whole_img.pack.

Файл прошивки с компрессией может прошиваться быстрее, поскольку его содержимое может распаковываться RAM-загрузчиком, предварительно загруженным в память, и объем передаваемых данных уменьшается.

Генерируемые файлы whole_flash_data.bin и whole_img.pack сохраняются в директорию chips/bl616/img_create.

[Замечания по поводу настройки процесса программирования]

1. Сначала настраивается конфигурация, которая должна импортироваться в Flash Cube, в файле flash_prog_cfg.ini. В нем находится конфигурация таких функций, как erase, skip_mode, boot2_isp_mode и другие. К этим функциям также соответствуют конфигурации, находящиеся в директории используемого типа чипа (eflash_loader/eflash_loader_cfg.ini).

Настройки обновляются для файла eflash_loader_cfg.ini, и генерируемый whole_img.pack также использует обновленный файл eflash_loader_cfg.ini.

2. Имя каждой опции в интерфейсе программирования поддерживает максимум 10 символов. Длина поля имени каждого раздела в таблице разделов не может превышать 10 символов.

3. Тип кварцевого резонатора Flash Cube не может быть изменен, и устанавливается настройка по умолчанию. Для BL602 это 40M, BL702 32M, BL808/BL606P/BL616 автоматически получают тип кварцевого генератора для auto.

4. Если какой-нибудь двоичный прошиваемый файл firmware выходит за пределы выделенной области памяти, то при утилита Flash Cube выдаст сообщение об ошибке.

[Ссылки]

1. Источник: tools\bflb_tools\bouffalo_flash_cube\docs\FlashCube_User_Guide.pdf из репозитория GitHub Bouffalo SDK.
2. BL602: протокол прошивки.

 

Добавить комментарий


Защитный код
Обновить

Top of Page