В этом разделе в основном рассказывается, как использовать командную строку для программ с SoC-чипами разработки под управлением Linux или WSL. Как установить WSL под Windows и как использовать последовательный порт под WSL1/WSL2, см. [6, 7].
[Установка необходимого инструментария]
Настройка инструментария сборки:
$ cd ~
$ sudo apt install git make ninja-build -y
Установка инструментов RISC-V. Включает закачку помощью git, копирование в каталог пользователя /usr/bin и добавление путей запуска в ~/.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.
Git-репозиторий Bouffalo SDK. Скачайте Bouffalo SDK, в его составе есть множество примеров, готовых стать основой для будущей разработки.
$ 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 покажет примерно следующее:
Замечание: если вы используете BL808 или BL606P, вам необходимо добавить CPU_ID=id на вышеуказанной основе, id может быть m0 или d0.
Отладка. Для отладки рекомендуется использовать eclipse + cklink, что позволяет делать сборку и отладку с помощью Eclipse или использовать отладку из командной строки. Это здесь не рассматривается.
$ 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 [5]. Кусок makefile:
Система компиляции не может найти стандартные заголовочные файлы assert.h, errno.h, stdint.h. При этом в логе компиляции проекта (файл build/CMakeFiles/CMakeError.log) появляются сообщения наподобие:
Очевидно, что настроены неправильные пути поиска стандартных заголовков. Необходимо правильно настроить переменную окружения CROSS_COMPILE в файле Makefile. Она должна указывать на полный путь до каталога bin утилит riscv64-unknown-elf, которые были установлены выше командой sudo cp -rf toolchain_gcc_t-head_linux/ /usr/bin (см. выше "Установка инструментов RISC-V"). Относительно этого пути автоматически настраиваются пути поиска стандартных заголовков. Пример установки корректного пути до тулчейна:
$ make CHIP=bl602 BOARD=bl602dk
./tools/cmake/bin/cmake -S . -B build -G "Unix Makefiles" -DCROSS_COMPILE=riscv64-unknown-elf-
-DCHIP=bl602 -DCPU_ID= -DBOARD=bl602dk -DBOARD_DIR= -DCONFIG_DEBUG=y -DCONFIG_ROMAPI=y -DCONFIG_USB_HS=y
-DCONFIG_COMX=COM5 -DCMAKE_EXPORT_COMPILE_COMMANDS=OFF -DCONFIG_TLSF=y
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/riscv64-unknown-elf-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- [register library : libc], path:/home/домен/имяпользователя/asm/bouffalo_sdk/components/libc
-- [register library : mm], path:/home/домен/имяпользователя/asm/bouffalo_sdk/components/mm
-- [register library : utils], path:/home/домен/имяпользователя/asm/bouffalo_sdk/components/utils
-- [register library : lhal], path:/home/домен/имяпользователя/asm/bouffalo_sdk/drivers/lhal
-- [register extern library : libpka], path:/home/домен/имяпользователя/asm/bouffalo_sdk/drivers/lhal
-- [register library : std], path:/home/домен/имяпользователя/asm/bouffalo_sdk/drivers/soc/bl602/std
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
CONFIG_COMXCONFIG_USB_HS
-- Build files have been written to: /home/домен/имяпользователя/asm/bouffalo_sdk/projects/helloworld/build
...
Видно, что переменные CONFIG_USB_HS и CONFIG_COMX устанавливаются в командной строке ./tools/cmake/bin/cmake. CONFIG_COMX и CONFIG_USB_HS настраиваются в файле project.build, который находится в корне Bouffalo SDK:
Конечно, при необходимости можно закомментировать эти строчки в файле project.build или поменять их значение. Но лучше всего указать их значение из командной строки make, например:
$ make CHIP=bl602 BOARD=bl602dk COMX=COM9 CONFIG_USB_HS=n
Либо, как вариант, настроить эти переменные в Makefile проекта, например:
Tell CMake where to find the compiler by setting either the environment
variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
the compiler, or to the compiler name if it is in the PATH.
Call Stack (most recent call first):
CMakeLists.txt:5 (find_package)
CMake Error at ~/bouffalo_sdk/cmake/bouffalo_sdk-config.cmake:31 (enable_language):
The CMAKE_CXX_COMPILER:
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.
Call Stack (most recent call first):
CMakeLists.txt:5 (find_package)
CMake Error at ~/bouffalo_sdk/cmake/bouffalo_sdk-config.cmake:31 (enable_language):
The CMAKE_ASM_COMPILER:
Tell CMake where to find the compiler by setting either the environment
variable "ASM" or the CMake cache entry CMAKE_ASM_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.
Call Stack (most recent call first):
CMakeLists.txt:5 (find_package)
Проверка запуска компилятора приводит к сообщению отсутствия прав доступа:
$ /usr/bin/toolchain_gcc_t-head_linux/bin/riscv64-unknown-elf-gcc --version
bash: /usr/bin/toolchain_gcc_t-head_linux/bin/riscv64-unknown-elf-gcc: Отказано в доступе
С правами root та же самая команда запускается нормально:
$ sudo /usr/bin/toolchain_gcc_t-head_linux/bin/riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (Xuantie-900 elf newlib gcc Toolchain V2.6.1 B-20220906) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Для решения проблемы необходимо настроить права доступа на запуск к каталогу bin утилит riscv64-unknown-elf для обычного пользователя. Обычно это делается командой chmod (возможно придется также поменять владельца командой chown). Права доступа на каталог можно посмотреть командой sudo ls -l /usr/bin/toolchain_gcc_t-head_linux/bin:
...
CC build_out/blog_testc/blog_testc4_onlypri.o
CC build_out/httpc/http_client.o
CC build_out/bloop/src/bloop_base.o
Сообщения ассемблера:
Критическая ошибка: неверный параметр -march=: «rv32imfc»
make[1]: *** [~/bl_iot_sdk/make_scripts_riscv/component_wrapper.mk:313: evb/src/boot/gcc/entry.o] Ошибка 1
make[1]: *** Ожидание завершения заданий…
Сообщения ассемблера:
Сообщения ассемблера:
CC build_out/aws-iot/aws-iot-device-sdk-embedded-C/src/aws_iot_jobs_types.o
Критическая ошибка: Сообщения ассемблера:
Критическая ошибка: CC build_out/bloop/src/bloop_handler_sys.o
Критическая ошибка: неверный параметр -march=: «rv32imfc»
...
Как это ни странно, ошибка правится добавлением прав на выполнение в каталог тулчейна командой chmod (с правами текущего пользователя, либо с правами root, через sudo):
$ chmod +x -R toolchain/
Иногда может помочь также и смена владельца каталога toolchain: