Программирование ARM Bouffalolab Iot Command Tool Sat, December 21 2024  

Поделиться

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

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


Bouffalolab Iot Command Tool Печать
Добавил(а) microsin   

Утилита командной строки 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

После выполнения вышеперечисленных действий нужно проверить, действительно ли установка прошла успешно, для этого введите следующую команду:

$ make -v

В случае успешной установки будет выведено:

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.

Очистка. Для удаления временных файлов введите команду:

$ make clean

Также можно очистку выполнить, если удалить папку build или build_out (имя папки с результатами сборки зависит от версии SDK):

$ rm -r build

Прошивка. На примере микроконтроллера 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 покажет примерно следующее:

BL602 helloworld output

Замечание: если вы используете 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.
3BL602: как работать с энергонезависимыми настройками easyflash.

 

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


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

Top of Page