本帖最后由 知行合一 于 2024-6-13 19:20 编辑
之前看泽哥的帖子,仅仅只是看了遍,似懂非懂,即使配置GPIO也得回来看帖子
这次借着手里有快M61kit,根据泽哥的帖子看SDK,我也缕缕
顺便把一些问题请教下大家
有我理解错误的地方,正好请大家指正
build文件夹
该文件夹是编译后生成的 bin 文件存储的地方
编译生成的固件名由CMakeLists.txt决定
# 设置工程名称,这个配置决定了编译出来的文件名
# 编译后的 bin 文件是以工程名 + 芯片命名,这里只指定工程名
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
# CMAKE_CURRENT_SOURCE_DIR 指向当前处理的 CMakeLists.txt 文件对应的构建目录
project(${PROJECT_NAME})
生成的 bin 文件存储在 build/build_out 下,编译生成的bin文件为wifi_test_bl616.bin,616和618软件区分很小,共用SDK
这里生成的bin文件不是合成的bin文件,还需要其他如boot2等文件,具体看flash_prog_cfg.ini文件
使用博流烧录工具烧录的合成bin文件在SDK中,具体路径为:
必须执行下 make flash 才可以生成新的组合固件
aithinker_Ai-M6X_SDK/tools/bflb_tools/bouffalo_flash_cube/chips/bl616/img_create/whole_flash_data.bin
CMakeLists.txt
CMake 是一个跨平台、开源的构建系统,它可以帮助我们管理好工程里的软件架构。CMakeLists.txt 文件相当于执行的列表,它可以调用其他的.h 头文件和.so/.a 库文件,生成 Makefile,将.cpp/.c/.cc 文件编译成可执行文件或新的库文件。
cmake_minimum_required(VERSION 3.15) # 指定Cmake的最小版本
include(proj.conf) # 包含需要使用的组件文件,添加需要的组件都在这个文件设置
# 芯片包,原厂适配好了,不用管
find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})
# #############################################################
# 搜集所有的C文件
file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c")
# 添加头文件的引用路径
sdk_add_include_directories(main config components/wifi components/mqtt components/led components/state components/esay_flash components/cJson)
# 把C文件添加到工程里
target_sources(app PRIVATE ${sources})
# 设置main.c 的文件
# 注意:不能和file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c") 冲突(Note: Cannot conflict with “file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c")”)
sdk_set_main_file(main/main.c)
# 设置工程名称,这个配置决定了编译出来的文件名。
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${PROJECT_NAME}) # 工程名 也是Build生成的文件名称
BouffaloSDK 中封装了以下函数接口,基本满足常用场景使用。
Function |
Description |
sdk_generate_library |
生成库,库名如果函数没有形参则使用当前库所在目录名 |
sdk_library_add_sources |
为库添加源文件 |
sdk_library_add_sources_ifdef |
为库添加源文件(满足 if 条件) |
sdk_add_include_directories |
添加头文件路径 |
sdk_add_include_directories_ifdef |
添加头文件路径(满足 if 条件) |
sdk_add_compile_definitions |
添加宏定义,不要带 -D |
sdk_add_compile_definitions_ifdef |
添加宏定义(满足 if 条件) |
sdk_add_compile_options |
添加编译选项 |
sdk_add_compile_options_ifdef |
添加编译选项(满足 if 条件) |
sdk_add_link_options |
添加链接选项 |
sdk_add_link_options_ifdef |
添加链接选项(满足 if 条件) |
sdk_add_link_libraries |
添加静态库 |
sdk_add_link_libraries_ifdef |
添加静态库(满足 if 条件) |
sdk_add_subdirectory_ifdef |
编译子目录下的 cmakelist(满足 if 条件) |
sdk_add_static_library |
添加外部静态库 |
sdk_set_linker_script |
设置链接脚本 |
sdk_set_main_file |
设置 main 函数所在文件 |
project |
工程编译 |
target_source(app PRIVATE xxx) |
添加源文件到 app 库中,当用户需要自己添加一些源文件又不想创建 cmakelist 单独编译成库,可以使用该项 |
flash_prog_cfg.ini
BouffaloSDK 采用新的 flash tool(bouffalo_flash_cube),并且烧录依赖 flash prog cfg.ini 文件。我们的烧录命令 make flash 就是依赖这个文件执行的。它也有自己的语法。
[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
# 复位下载功能使能(Reset download function enable)
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 1
# 配置boot2固件,否则无法使用复位烧录功能(Configure boot2 firmware, otherwise the reset burn function cannot be used)
[boot2]
# AiPi-Eyes-R1/R2 必要固件
#filedir = ./build/build_out/Rx_boot2_*.bin
filedir = ./build/build_out/boot2_*.bin
address = 0x000000 # address 必须使用 0 地址
# AiPi-Eyes-R1/R2 必要固件
#[edata]
#filedir = ./build/build_out/edata.bin
#address = 0x3e0000
# 配置partition固件,这是必要的(Configuring partition firmware is necessary)
[partition]
filedir = ./build/build_out/partition*.bin
address = 0xE000
# 配置应用程序固件地址,需要新建工程时需要修改“Project_basic” 为新工程的名字,否则可能会导致烧录失败
[FW]
filedir = ./build/build_out/WiFi6-Test_$(CHIPNAME).bin
address = 0x10000
正常使用只需要创建一个 KEY,例如 [FW],并且填写 filedir 和 address 就可以使用了
其中 filedir 的填写方式有以下几种
- bin 文件全路径 + bin 文件名称
- bin 文件相对路径 + bin 文件名称
- bin 文件名称添加 _\$(CHIPNAME) 后缀可以自动识别成不同芯片(仅在 bin 文件名称前缀不同的时候使用)
- bin 文件名称添加 * 通配符,可以自动补全 bin 文件名称(仅在 bin 文件名称前缀不同的时候使用)
[FW]项
- FW 要烧录的应用固件,必须使用 FW 名称。
- filedir 表示应用固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 _\$(CHIPNAME).bin 用于自动区分不同芯片。 xxx 表示应用固件名称,与 CMakeLists.txt 中 project(xxx) 中名称一致。* 表示正则匹配,可用可不用。address 必须使用 0 地址
多个运行固化烧录
禁止使用通配符 * 以及 _\$(CHIPNAME) 前缀,因为 bin 文件名称前缀相同。
[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
[FW1]
filedir = ./build/build_out/xxx0.bin
address = 0x00000
[FW2]
filedir = ./build/build_out/xxx1.bin
address = 0x10000
[FW3]
filedir = ./build/build_out/xxx2.bin
address = 0x20000
main.c
主程序运行的文件。
Makefile
编译的文件,其指定了一系列以赖关系和依赖规则。指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,可以实现自动化编译,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
目前来说只需要修改第二行 BL_SDK_BASE ?= \$(SDK_DEMO_PATH)/../aithinker_Ai-M6X_SDK 的编译路径设置即可。
# 当前工程文件路径(Current project file path)
SDK_DEMO_PATH ?= .
# 配置SDK路径(Configure SDK path)
BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../aithinker_Ai-M6X_SDK
# 设置SDK路径(Set SDK path)
export BL_SDK_BASE
#配置芯片型号,M61/M62都配置成bl616(Configure chip models, with both M61 and M62 configured as bl616)
CHIP ?= bl616
#配置板子类型,M61/M62 保持 “bl616dk”(Configuration board subtype, M61/M62 maintains' bl616dk ')
BOARD ?= bl616dk
#配置编译工具链(Configure Compilation Toolchain)
CROSS_COMPILE ?= riscv64-unknown-elf-
# add custom cmake definition
#cmake_definition+=-Dxxx=sss
#引用实际的编译配置(Reference the actual compilation configuration)
include $(BL_SDK_BASE)/project.build
proj.conf
前面在 CMakeLists.txt 中提到的组件的使用,当我们需要使用各种组件或开启一些配置功能时,需要进入这个文件中添加。
# 这个文件决定了当前工程中用到的组件,并且把它们添加到编译列表
# 如果发现引用的某个组件的文件夹找不到路径,大概率是该组件没在这个文件中设置为启用
# Components
set(CONFIG_BFLOG 1)
set(CONFIG_FREERTOS 1)
set(CONFIG_POSIX 1)
set(CONFIG_TLSF 1)
set(CONFIG_SHELL 0)
set(CONFIG_LWIP 1)
set(CONFIG_WIFI6 1)
set(CONFIG_RF 1)
set(CONFIG_MBEDTLS 1)
set(CONFIG_DHCPD 1)
set(CONFIG_PING 1)
readme.md
说明文件,略过
问题
flash_prog_cfg.ini中
[boot2]
filedir = ./build/build_out/boot2_*.bin
address = 0x000000
[partition]
filedir = ./build/build_out/partition*.bin
address = 0xE000
[FW]
filedir = ./build/build_out/xxx*_$(CHIPNAME).bin
address = 0x10000
[mfg]
filedir = ./build/build_out/mfg*.bin
已知boot2用于自动下载
FW是固件
其他两个 泽哥 说是 开启wifi功能烧录,但是 wifi6 test 没烧录 mfg 和 partition 也可以正常连接wifi
mfg 和 partition 这两个是干什么用的