Утилита командной строки bflb_iot_tool предназначена для записи чипов Bouffalo как альтернатива GUI-утилите BLDevCube.exe. Утилита bflb_iot_tool входит в состав Bouffalo SDK [1, 2], и доступна в вариантах для Windows (bflb_iot_tool.exe), Mac OS (bflb_iot_tool-macos) и Linux (bflb_iot_tool-ubuntu).
Как использовать:
$ tools/flash_tool/bflb_iot_tool-ubuntu --help
usage: bflb_iot_tool-ubuntu [-h] --chipname CHIPNAME [--interface INTERFACE]
[--port PORT] [--baudrate BAUDRATE] [--xtal XTAL]
[--dts DTS] [--pt PT] [--boot2 BOOT2] --firmware
FIRMWARE [--mfg MFG] [--media MEDIA]
[--romfs ROMFS] [--build] [--erase] [--single]
[--addr ADDR] [--config CONFIG] [--ota OTA]
[--version VERSION] [--key KEY] [--iv IV]
[--pk PK] [--sk SK]
Аргументы:
-h, --help Показать этот текст подсказки и выйти.
--chipname CHIPNAME Имя чипа (bl602/bl702/bl616...)
--interface INTERFACE Интерфейс для подключения.
1.uart (по умолчанию)
2.jlink
3.cklink
4.openocd
--port PORT Используемый последовательный порт (/dev/ttyUSB0)
или серийный номер jlink.
--baudrate BAUDRATE Скорость последовательного порта, по умолчанию 115200.
--xtal XTAL Тип кварца на плате.
Для bl602 1:24M
2:32M
3:38.4M
4:40M (по умолчанию, если не указано)
5:26M
Для bl702 1:32M (по умолчанию, если не указано)
Для bl616 просто используйте значение 7 (auto adjust)
--dts DTS Опционально, выбор файла используемого device tree
--pt PT Обязательно, таблица разделов (partition table) flash,
по умолчанию находится в chips/chipname/partition.
--boot2 BOOT2 Обязательно, boot2 бинарник в качестве bootloader, по умолчанию
находится в chips/chipname/builtin_imgs/boot2_isp_xxxxx.
--firmware FIRMWARE Обязательно, двоичный файл прошивки, который был собран
из SDK bl_iot_sdk.
--mfg MFG Опционально, бинарный файл mfg, используется только для теста RF.
--media MEDIA media bin
--romfs ROMFS Опционально, директория romfs (romfs dir) для создания romfs.bin.
--build Только сгенерировать полный образ содержимого flash, без его
прошивки. По умолчанию имя выходного файла firmware.bin.
--erase Стереть чип.
--single Загрузить один файл, без добавления таблицы разделов и других
файлов.
--addr ADDR Байтовый адрес для записи, по умолчанию 0.
--config CONFIG Файл конфигурации eflash loader, по умолчанию используется
chips/blXXXX/eflash_loader/eflash_loader_cfg.ini.
--ota OTA Директория ota-файла, по умолчанию chips/blXXXX/ota.
--version VERSION version
--key KEY Ключ шифрования aes.
--iv IV Ключ шифрования iv.
--pk PK Подпись ecc публичного ключа.
--sk SK Подпись ecc приватного ключа.
Примеры использования для программирования чипа BL602 через последовательный порт:
# Программирование прошивки (bl602_demo_wifi.bin) с указанием таблицы
# разделов (partition_cfg_2M.toml) и файла дерева устройств
# (bl_factory_params_IoTKitA_40M.dts):
$ bflb_iot_tool.exe --chipname=bl602 --port=COM28 --baudrate=2000000 \
--firmware="bl602_demo_wifi.bin" --pt="chips/bl602/partition/partition_cfg_2M.toml" \
--dts="chips/bl602/device_tree/bl_factory_params_IoTKitA_40M.dts"
# Просто генерация полного содержимого flash размером 2 мегабайта, для записи
# которого можно использовать опцию --single (будет сгенерирован файл firmware.bin):
$ bflb_iot_tool.exe --chipname=bl602 --port=COM28 --baudrate=2000000 \
--firmware="helloworld_bl602.bin" --pt="chips/bl602/partition/partition_cfg_2M.toml"
--dts="chips/bl602/device_tree/bl_factory_params_IoTKitA_40M.dts" --build
# Программирование только прошивки, без таблицы разделов и дерева устройств:
$ bflb_iot_tool.exe --chipname=bl602 --port=COM28 --baudrate=2000000 --addr=0x0 \
--firmware="helloworld_bl602.bin" --single
Важное замечание: опции для команды утилиты bflb_iot_tool следует вводить обязательно с сохранением регистра символов, потому что иначе утилита может вести себя неадекватно. Например, если в опции --chipname указать имя чипа в верхнем регистре (BL602), то опция --build не сработает, и файл firmware.bin не будет сформирован, хотя утилита отработает без всякого сообщения об ошибке.
Установка инструментов RISC-V. Включает закачку помощью git, копирование в каталог пользователя /usr/bin и добавление путей запуска в ~/.bashrc:
$ git clone https://gitee.com/bouffalolab/toolchain_gcc_t-head_linux.git
$ sudo cp -rf toolchain_gcc_t-head_linux/ /usr/bin
$ echo "export PATH=\"$PATH:/usr/bin/toolchain_gcc_t-head_linux/bin\"" >> ~/.bashrc
$ source ~/.bashrc
После выполнения вышеперечисленных действий нужно проверить, действительно ли установка прошла успешно, для этого введите следующую команду:
В случае успешной установки будет выведено:
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Проверка компилятора:
$ riscv64-unknown-elf-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/mnt/d/EmbeddedSoftware/Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5/bin/
libexec/gcc/riscv64-unknown-elf/10.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /lhome/software/toolsbuild/slave2/workspace/Toolchain/build-gnu-riscv_4/
./source/riscv/riscv-gcc/configure --target=riscv64-unknown-elf
--with-gmp=/lhome/software/toolsbuild/slave2/workspace/Toolchain/build-gnu-riscv_4/
build-riscv-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5/
lib-for-gcc-x86_64-linux--with-mpfr=/lhome/software/toolsbuild/slave2/workspace/
Toolchain/build-gnu-riscv_4/build-riscv-gcc-riscv64-unknown-elf/build-Xuantie-900
-gcc-elf-newlib-x86_64-V2.2.5/lib-for-gcc-x86_64-linux --with-mpc=/lhome/software/
toolsbuild/slave2/workspace/Toolchain/ build-gnu-riscv_4/build-riscv-gcc-riscv64-unknown-elf/
build-Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5/lib-for-gcc-x86_64-linux --with-libexpat-prefix=/
lhome/software/toolsbuild/slave2/workspace/Toolchain/build-gnu-riscv_4/build-riscv-gcc-riscv64
-unknown-elf/build-Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5/lib-for-gcc-x86_64-linux
--with-libmpfr-prefix=/lhome/software/toolsbuild/slave2/workspace/Toolchain/build-gnu-riscv_4/
build-riscv-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5/lib-for-gcc
-x86_64-linux --with-pkgversion='Xuantie-900 elf newlib gcc Toolchain V2.2.5 B-20220323'
CXXFLAGS='-g -O2 -DTHEAD_VERSION_NUMBER=2.2.5' --enable-libgcctf --prefix=/lhome/software/
toolsbuild/slave2/workspace/Toolchain/build-gnu-riscv_4/build-riscv-gcc-riscv64-unknown-elf/
Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5 --disable-shared --disable-threads --enable-languages=c,
c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/lhome/software/toolsbuild/slave2/
workspace/Toolchain/build-gnu-riscv_4/build-riscv-gcc-riscv64-unknown-elf/Xuantie-900-gcc-elf
-newlib-x86_64-V2.2.5/riscv64-unknown-elf --with-native-system-header-dir=/include
--disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls
--disable-tm-clone-registry --src=/lhome/software/toolsbuild/slave2/workspace/Toolchain/build
-gnu-riscv_4/./source/riscv/riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64gcxthead
'CFLAGS_FOR_TARGET=-Os -mcmodel=medany' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medany'
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (Xuantie-900 elf newlib gcc Toolchain V2.2.5 B-20220323)
[Bouffalo SDK и примеры кода]
Git-репозиторий Bouffalo SDK. Скачайте Bouffalo SDK [1], в его составе есть множество примеров, готовых стать основой для будущей разработки.
$ cd ~
$ git clone https://github.com/bouffalolab/bouffalo_sdk.git
Как компилировать. Откройте терминал Linux, перейдите в каталог examples, выберите интересующий вас пример, в его каталоге должен быть файл Makefile. Сделайте копию каталога выбранного примера.
$ cd ~/bouffalo_sdk
$ mkdir projects
$ cp -r examples/helloworld projects/helloworld
$ cd projects/helloworld
Для компиляции используйте следующую команду, сгенерированный bin-файл будет выведен в каталог build/build_out:
$ cd examples/helloworld
# chip_name — модель чипа, можно указать bl702, bl616, bl808, bl606p.
# board_name — название макетной платы, подробности смотрите в каталоге bsp/board.
# $ make CHIP=chip_name BOARD=board_name
# Пример:
$ make CHIP=bl602 BOARD=bl602dk
Замечание: если вы используете BL808 или BL606P, вам необходимо добавить CPU_ID=id на вышеуказанной основе, id может быть m0 или d0.
Очистка. Для удаления временных файлов введите команду:
Также можно очистку выполнить, если удалить папку build или build_out (имя папки с результатами сборки зависит от версии SDK):
Прошивка. На примере микроконтроллера BL602 и программы helloworld:
1. Зайдите в каталог проекта командой cd.
2. Снимите питание +3.3V с микроконтроллера BL602.
3. Соедините ножку GPIO8 микроконтроллера BL602 с его шиной питания +3.3V. При включении питания это будет означать сигнал активации загрузчика.
4. Подайте питание +3.3V на микроконтроллер BL602.
5. Выполните команду make flash CHIP=bl602 COMX=/dev/ttyUSB0. Замечание: если вы используете BL808 или BL606P, вам необходимо добавить CPU_ID=id на вышеуказанной основе, id может быть m0 или d0.
$ make flash CHIP=bl602 COMX=/dev/ttyUSB0
./bouffalo_sdk/tools/bflb_tools/bouffalo_flash_cube/BLFlashCommand-ubuntu --interface=uart
--baudrate=2000000 --port=/dev/ttyUSB0 --chipname=bl602 --cpu_id= --config=flash_prog_cfg.ini
['./bouffalo_sdk/tools/bflb_tools/bouffalo_flash_cube/BLFlashCommand-ubuntu', '--interface=uart',
'--baudrate=2000000', '--port=/dev/ttyUSB0', '--chipname=bl602', '--cpu_id=', '--config=flash_prog_cfg.ini']
[08:36:16.014] - Serial port is /dev/ttyUSB0
[08:36:16.014] - ==================================================
[08:36:16.015] - Program Start
[08:36:16.015] - ========= eflash loader cmd arguments =========
[08:36:16.015] - serial port is /dev/ttyUSB0
[08:36:16.015] - chiptype: bl602
[08:36:16.015] - cpu_reset=False
[08:36:16.017] - com speed: 2000000
[08:36:16.017] - ========= Interface is uart =========
[08:36:16.017] - Eflash load bin file: ~/bouffalo_sdk/tools/bflb_tools/
bouffalo_flash_cube/chips/bl602/eflash_loader/eflash_loader_40m.bin
[08:36:16.017] - ========= load eflash_loader.bin =========
[08:36:16.017] - Load eflash_loader.bin via uart
[08:36:16.017] - ========= image load =========
[08:36:16.275] - tx rx and power off, press the machine!
[08:36:16.275] - cutoff time is 0.1
[08:36:16.376] - power on tx and rx
[08:36:17.102] - reset cnt: 0, reset hold: 0.005, shake hand delay: 0.1
[08:36:17.102] - clean buf
[08:36:17.102] - send sync
[08:36:17.303] - ack is b'4f4b'
[08:36:17.303] - shake hand success
[08:36:17.314] - get_boot_info
[08:36:17.315] - data read is b'010000000000000003000000570fe24cb97c1600'
[08:36:17.315] - ========= ChipID: 7cb94ce20f57 =========
[08:36:17.315] - last boot info: None
[08:36:17.315] - sign is 0 encrypt is 0
[08:36:17.315] - segcnt is 1
[08:36:17.321] - segdata_len is 37184
[08:36:17.406] - 4080/37184
[08:36:17.491] - 8160/37184
[08:36:17.576] - 12240/37184
[08:36:17.661] - 16320/37184
[08:36:17.746] - 20400/37184
[08:36:17.831] - 24480/37184
[08:36:17.915] - 28560/37184
[08:36:18.000] - 32640/37184
[08:36:18.086] - 36720/37184
[08:36:18.096] - 37184/37184
[08:36:18.097] - Run img
[08:36:18.198] - Load helper bin time cost(ms): 2180.154296875
[08:36:18.298] - Flash load shake hand
[08:36:18.307] - default set DTR high
[08:36:18.407] - clean buf
[08:36:18.408] - send sync
[08:36:18.613] - ack is b'4f4b'
[08:36:18.613] - Read mac addr
[08:36:18.614] - MACADDR: 570fe24cb97c
[08:36:18.614] - flash set para
[08:36:18.614] - ========= flash read jedec ID =========
[08:36:18.614] - Read flash jedec ID
[08:36:18.614] - readdata:
[08:36:18.614] - b'ef401580'
[08:36:18.614] - Finished
[08:36:18.614] - flash config Not found,use default
[08:36:18.614] - jedec_id:ef4015
[08:36:18.614] - capacity_id:21
[08:36:18.614] - capacity:2.0M
[08:36:18.614] - get flash size: 0x00200000
[08:36:18.614] - Program operation
[08:36:18.614] - Dealing Index 0
[08:36:18.614] - ========= programming ~/bouf_hello_world/./build/
build_out/helloworld_bl602.bin to 0x000000
[08:36:18.615] - ========= flash load =========
[08:36:18.615] - ========= flash erase =========
[08:36:18.615] - Erase flash from 0x0 to 0x884f
[08:36:18.619] - erase pending
[08:36:18.754] - erase pending
[08:36:18.803] - Erase time cost(ms): 187.701904296875
[08:36:18.826] - decompress flash load 18860
[08:36:18.839] - Load 2048/18860 {"progress":10}
[08:36:18.856] - Load 4096/18860 {"progress":21}
[08:36:18.871] - Load 6144/18860 {"progress":32}
[08:36:18.886] - Load 8192/18860 {"progress":43}
[08:36:18.901] - Load 10240/18860 {"progress":54}
[08:36:18.913] - Load 12288/18860 {"progress":65}
[08:36:18.928] - Load 14336/18860 {"progress":76}
[08:36:18.943] - Load 16384/18860 {"progress":86}
[08:36:18.959] - Load 18432/18860 {"progress":97}
[08:36:18.973] - Load 18860/18860 {"progress":100}
[08:36:18.973] - Load 18860/18860 {"progress":100}
[08:36:18.973] - Write check
[08:36:18.979] - Flash load time cost(ms): 176.591796875
[08:36:18.979] - Finished
[08:36:18.980] - Sha caled by host: d86f096eee4dbdcdf2fc5393fb9c336e2063b02de578b5d7868fd8527241a46f
[08:36:18.980] - xip mode Verify
[08:36:18.991] - Read Sha256/34896
[08:36:18.991] - Flash xip readsha time cost(ms): 10.74951171875
[08:36:18.991] - Finished
[08:36:18.992] - Sha caled by dev: d86f096eee4dbdcdf2fc5393fb9c336e2063b02de578b5d7868fd8527241a46f
[08:36:18.992] - Verify success
[08:36:18.992] - Program Finished
[08:36:18.992] - All time cost(ms): 2977.26806640625
[08:36:19.196] - close interface
[08:36:19.197] - [All Success]
6. Для проверки работы прогаммы запустите putty, настройте скорость подключения 2000000 мегабит, подключитесь к порту /dev/ttyUSB0. Передерните питание BL602, терминал putty покажет примерно следующее:
Замечание: если вы используете BL808 или BL606P, вам необходимо добавить CPU_ID=id на вышеуказанной основе, id может быть m0 или d0.
Отладка. Для отладки рекомендуется использовать eclipse + cklink, что позволяет делать сборку и отладку с помощью Eclipse или использовать отладку из командной строки. Это здесь не рассматривается.
{spoiler title=Пример компиляции примера bl602_demo_wifi из репозитория [4] opened=0}
$ git clone https://github.com/bouffalolab/bl_iot_sdk.git
$ cd bl_iot_sdk/customer_app/bl602_demo_wifi/
$ chmod +x genromap
$ chmod -R +x toolchain/
$ dos2unix genromap
$ ./genromap
$ chmod +x tools/flash_tool/bflb_iot_tool-ubuntu
# Создание файла ./firmware.bin из таблицы разделов, дерева устройств
# и кода программы:
$ tools/flash_tool/bflb_iot_tool-ubuntu --interface=uart --baudrate=2000000 \
--port=/dev/ttyUSB0 --chipname=bl602 --firmware="build_out/bl602_demo_wifi.bin" \
--pt="tools/flash_tool/chips/bl602/partition/partition_cfg_2M.toml" \
--dts="tools/flash_tool/chips/bl602/device_tree/bl_factory_params_IoTKitA_40M.dts" \
--build
# Прошивка ./firmware.bin, это сгенерированный образ flash:
$ tools/flash_tool/bflb_iot_tool-ubuntu --interface=uart --baudrate=2000000 \
--port=/dev/ttyUSB0 --chipname=bl602 --addr=0x0 --firmware="./firmware.bin" --single
Ниже пример прошивки памяти flash частями, это позволяет не сбрасывать энергонезависимые настройки, сохраненные с помощью библиотеки easyflash [3]. Кусок makefile:
BL_FLASH_PROGRAM ?= ${HOME}/bl_iot_sdk/tools/flash_tool/bflb_iot_tool-ubuntu
BAUDRATE ?= 2000000
COMX ?= /dev/ttyUSB0
CHIP = bl602
command_flash = $(BL_FLASH_PROGRAM) --interface=uart --baudrate=$(BAUDRATE) \
--port=$(COMX) --chipname=$(CHIP) --firmware="build_out/bl602_demo_wifi.bin" \
--pt="${HOME}/bl_iot_sdk/tools/flash_tool/chips/bl602/partition/partition_cfg_2M.toml" \
--dts="${HOME}/bl_iot_sdk/tools/flash_tool/chips/bl602/device_tree/bl_factory_params_IoTKitA_40M.dts"
[Ссылки]
1. bouffalolab / bouffalo_sdk. 2. bouffalolab / bl_iot_sdk. 3. BL602: как работать с энергонезависимыми настройками easyflash. |