前言

概述

本文档介绍WS63芯片SDK开发环境(包括:SDK编译、应用程序的开发等),用于帮助用户在快速了解开发环境后编译出可执行文件进行二次开发。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

WS63

V100

读者对象

本文档主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

04

2025-02-28

更新“新增链接外部静态库”小节内容。

03

2024-10-30

更新“Flash分区表配置”小节内容。

02

2024-07-01

  • 更新“SDK目录结构介绍”小节内容。
  • 更新“添加bin文件编译”小节内容。
  • 更新“Menuconfig配置”小节内容。
  • 新增“UART配置方法”小节内容。
  • 更新“建立源码目录”小节内容。

01

2024-04-10

第一次正式版本发布。

  • 更新“编译参数详解”小节内容。
  • 更新“添加bin文件编译”小节内容。
  • 更新“Flash分区表配置”小节内容。

00B03

2024-03-29

  • 更新“编译参数详解”小节内容。
  • 更新“添加bin文件编译”小节内容。

00B02

2024-01-10

更新“安装Python环境”小节内容。

00B01

2023-11-27

第一次临时版本发布。

开发环境搭建

SDK开发环境简介

典型的SDK开发环境主要包括:

  • Linux服务器

    Linux服务器主要用于建立交叉编译环境,实现在Linux服务器上编译出可以在目标板上运行的可执行代码。

  • 工作台

    工作台主要用于目标板烧录和调试,通过串口与目标板连接,开发人员可以在工作台中烧录目标板的镜像、调试程序。工作台通常需要安装终端工具,用于登录Linux服务器和目标板,查看目标板的打印输出信息。工作台一般为Windows或Linux操作系统,在Windows或Linux工作台运行的终端工具通常有SecureCRT、Putty、miniCom等,这些软件需要从其官网下载。

  • 目标板

    本文的目标板以DEMO板为例,DEMO板与工作台通过USB转串口连接。工作台将交叉编译出来的DEMO板镜像通过串口烧录到DEMO板。如图1所示。

    图 1 SDK 开发环境

搭建Linux开发环境

Linux系统推荐使用Ubuntu 20.04及以上版本,Shell使用bash ,SDK使用Cmake编译(3.14.1以上),编译工具还包括Python(3.8.0以上)等。

配置Shell

配置默认使用 bash。打开Linux终端,执行命令“sudo dpkg-reconfigure dash”,选择 no。

安装Cmake

打开Linux终端,执行命令“sudo apt install cmake”,完成Cmake的安装。

安装Python环境

  1. 打开Linux终端,输入命令“python3 -V”,查看Python版本号,推荐python3.8.0以上版本。

  2. 如果Python版本太低,请使用命令“sudo apt-get update”更新系统到最新,或通过命令“sudo apt-get install python3 -y”安装Python3(需root/sudo权限安装),安装后再次确认Python版本。

    如果仍不能满足版本要求,请从“https://www.python.org/downloads/source/ ”下载对应版本源码包,下载与安装方法请阅读 https://wiki.python.org/moin/BeginnersGuide/Download 和源码包内README内容。

  3. 安装Python包管理工具,运行命令“sudo apt-get install python3-setuptools python3-pip -y”(需root/sudo权限安装)。

  4. 安装Kconfiglib 14.1.0+,使用命令“sudo pip3 install kconfiglib”(需root/sudo权限安装),或从“https://pypi.org/project/kconfiglib”下载.whl文件(例如:kconfiglib-14.1.0-py2.py3-none-any.whl)后,使用“pip3 install kconfiglib-xxx.whl”进行安装(需root/sudo权限安装),或者下载源码包到本地并解压,使用“python setup.py install”进行安装(需root/sudo权限安装)。安装完成界面如图1所示。

    图 1 安装Kconfiglib组件包完成示例

  5. 安装升级文件签名依赖的Python组件包。

    安装pycparser:

    从“https://pypi.org/project/pycparser/”下载.whl文件(例如:pycparser-2.21-py2.py3-none-any.whl)后,使用“pip3 install pycparser-xxx.whl”进行安装(需root/sudo权限安装),或者下载源码包到本地并解压,使用“python setup.py install”进行安装(需root/sudo权限安装)。安装完成后界面会提示“Successfully intalled pycparser-2.21”。

说明: 如果构建环境中包含多个python,特别是多个同版本的python,而用户无法辨认正在使用的是其中的哪个版本,此情况下,在安装python组件包时,推荐使用组件包源码进行安装。

编译SDK

SDK目录结构介绍

SDK根目录结构如表1所示。

表 1 SDK根目录

目录

说明

application

应用层代码(其中包含demo程序为参考示例)。

bootloader

boot(Flashboot/SSB)代码。

build

SDK构建所需的脚本、配置文件。

build.py

编译入口脚本。

CMakeLists.txt

Cmake工程顶层“CMakeLists.txt”文件。

config.in

Kconfig配置文件。

drivers

驱动代码。

include

API头文件存放目录。

interim_binary

库存放目录。

kernel

内核代码和OS接口适配层代码。

libs_url

库文件。

middleware

中间件代码。

open_source

开源代码。

protocol

WiFi、BT、Radar等组件代码。

test

testsuite代码。

tools

包含编译工具链(包括linux和windows)、镜像打包脚本、NV制作工具和签名脚本等。

output

编译时生成的目标文件与中间文件(包括库文件、打印log、生成的二进制文件等)。

解压缩SDK后的根目录,如图2所示。注:上表所述的output目录是编译后生成的。

图 1

图 2 解压缩SDK示例

编译SDK(Cmake)

编译方法

根目录下执行“python3 build.py”指令运行脚本编译,即可编译出对应的SDK程序。编译命令列表如表1所示。

表 1 build.sh参数列表

参数

示例

说明

python3 build.py ws63-liteos-app

启动ws63-liteos-app目标的增量编译。

-c

python3 build.py -c ws63-liteos-app

启动ws63-liteos-app目标的全量编译。

menuconfig

python3 build.py ws63-liteos-app menuconfig

启动ws63-liteos-app目标的menuconfig图形配置界面。

表 2 编译目标介绍

编译目标

说明

python3 build.py -c ws63-liteos-app

app版本编译目标(自动包含flashboot编译)

python3 build.py -c ws63-flashboot

flashboot镜像编译目标

python3 build.py -c ws63-liteos-xts

openharmony xts认证版本编译目标(详情请参考“鸿蒙XTS认证指导书”)

python3 build.py -c ws63-liteos-app-iot

Harmony connect版本编译目标(详情请参考“HiLink编译使用指南”)

python3 build.py -c ws63-liteos-hilink

Harmony connect独立升级版本编译目标(详情请参考“HiLink编译使用指南”)

编译得到的烧录镜像在“output/ws63/fwpkg/ws63-liteos-app”目录下(如表3所示)。

表 3 烧录镜像

文件名

说明

ws63-liteos-app_all.fwpkg

空片烧录时,需要烧录此文件。包含了所有的需要升级的内容。包含:root_loaderboot_sign.bin、root_params.bin、flashboot_sign.bin、ws63_all_nv.bin、ws63-liteos-app-sign.bin。

各文件介绍如下:

root_loaderboot_sign.bin:loaderboot的镜像文件。升级开始时,芯片中固化的romboot会接收此镜像文件,加载到内存并运行,loadboot负责接收后续的镜像文件。注:此镜像只在升级阶段放在RAM中运行,并不存放在flash中。

root_params.bin:flash分区信息的镜像文件。分区信息供romboot、loaderboot和flashboot使用。

flashboot_sign.bin:flashboot的镜像文件。

ws63_all_nv.bin:参数区的镜像文件。

ws63-liteos-app-sign.bin:版本镜像文件。

ws63-liteos-app_load_only.fwpkg

版本升级打包文件,包含:root_loaderboot_sign.bin、ws63-liteos-app-sign.bin。不包含flashboot相关内容。

当芯片烧录过“ws63-liteos-app_all.fwpkg”镜像后,如果后续修改不涉及root_params、flash_boot、nv的修改,则可以用此文件升级。

注:编译得到的中间文件在“output/ws63/acore/ws63-liteos-app”目录下。

编译参数详解

编译命令接收参数及解释如表1所示。

表 1 编译参数信息表

参数

参数信息

-c

clean后编译

-j

-j<num>,以num线程数执行编译,如-j16,-j8

默认最大线程

-def=

-def=XXX,YYY,ZZZ=x,... 向本次编译target中添加XXX、YYY、ZZZ=x编译宏

可使用-def=-:XXX 来屏蔽XXX宏

可使用-def=-:ZZZ=x 来添加或者修改ZZZ宏

-component=

-component=XXX,YYY,... 仅编译XXX,YYY组件

-ninja

使用ninja生成中间文件,默认使用Unix makefile

-[release / debug]

release: 在生成反汇编文件时节省时间

debug: 在生成反汇编文件时信息更加全面但也更耗时

默认为debug

-dump

编译时在终端输出target的所有参数列表 -- 包括编译宏、组件、编译选项等

-nhso

不更新HSO数据库

-out_libs

-out_libs=file_path, 不再链接成elf, 转而将所有.a打包成一个大的.a

others

作为匹配编译target_names的关键字

编译选项详解

WS63在不同目录下的.py文件下配置编译选项,如表1所示。

表 1 WS63通用组件编译选项

编译选项类型

说明

内容

对应文件控制路径

common_ccflags

基础编译选项

-std=gnu99 -Wall -Werror -Wextra -Winit-self -Wpointer-arith -Wstrict-prototypes -Wno-type-limits -fno-strict-aliasing -Os -fno-unwind-tables

\sdk\build\config\target_config\common_config.py

riscv31

芯片类型编译选项

-ffreestanding -fdata-sections -Wno-implicit-fallthrough -ffunction-sections -nostdlib -pipe -fno-tree-scev-cprop -fno-common -mpush-pop -msmall-data-limit=0 -fno-ipa-ra -Wtrampolines -Wlogical-op -Wjump-misses-init -Wa,-enable-c-lbu-sb -Wa,-enable-c-lhu-sh -fimm-compare -femit-muliadd -fmerge-immshf -femit-uxtb-uxth -femit-lli -femit-clz -fldm-stm-optimize -g

\sdk\build\config\target_config\common_config.py

fp_flags

硬浮点编译选项

-march=rv32imfc -mabi=ilp32f

\sdk\build\config\target_config\ws63\target_config.py

codesize_flags

codesize优化选项

--short-enums -madjust-regorder -madjust-const-cost -freorder-commu-args -fimm-compare-expand -frmv-str-zero -mfp-const-opt -mswitch-jump-table -frtl-sequence-abstract -frtl-hoist-sink -fsafe-alias-multipointer -finline-optimize-size -fmuliadd-expand -mlli-expand -Wa,-mcjal-expand -foptimize-reg-alloc -fsplit-multi-zero-assignments -floop-optimize-size -Wa,-mlli-relax -mpattern-abstract -foptimize-pro-and-epilogue

\sdk\build\config\target_config\ws63\target_config.py

其中,编译选项的详细说明如表2所示。

表 2 编译选项详细说明

选项

说明

-std=gnu99

使用 ISO C99 标准再加上GNU的扩展

-Wall

选项意思是编译后显示所有警告

-Werror

用于将所有警告升级成错误

-Wextra

用于开启额外的警告信息(-Wall的补充)

-Winit-self

警告使用自己初始化的未初始化变量

-Wpointer-arith

警告任何取决于“功能类型”或“功能类型”的大小void

-Wstrict-prototypes

警告如果一个函数被声明或定义而没有指定参数类型

-Wno-type-limits

屏蔽由于数据类型范围有限而导致比较始终为真或始终为false的告警

-fno-strict-aliasing

禁用 strict-aliasing优化规则:不同类型的指针绝对不会指向同一块内存区域

-Os

专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项,同时-Os还会执行更加优化程序的选项

-fno-unwind-tables

删除unwind调试信息

-ffreestanding

断言编译发生在独立环境中

-fdata-sections

将每个数据放入自己的部分(仅限ELF)

-Wno-implicit-fallthrough

可忽略编译时switch-case中缺少break的错误

-ffunction-sections

将每个函数放在自己的节中(仅限ELF)

-nostdlib

关闭默认头文件与库文件搜索目录

-pipe

编译过程中使用管道,借助 GCC 的管道功能来提高编译速度

-fno-tree-scev-cprop

禁用标量演化信息进行复写传递,代码空间优化相关

-fno-common

可以把静态库中的没有初始化的全局变量从弱符号变成强符号,当所有静态库链接成可执行文件,如果同时有两个以上“重名强符号”,链接器会报错。

-mpush-pop

CodeSize 优化,改编译选项需要CPU版本支持push/pop/popret/lwm/swm 等指令

-msmall-data-limit=0

CodeSize 优化,改编译选项需要CPU版本支持push/pop/popret/lwm/swm 等指令

-fno-ipa-ra

禁用编译器针对叶子函数的编译优化(编译选项中添加了-O2优化选项时-fipa-ra参数导致)

-Wtrampolines

该选项用于检查代码中是否包含内嵌函数,gcc对内嵌函数有个专门的称呼:trampoline

-Wlogical-op

当逻辑操作结果似乎总为真或假时给出警告

-Wjump-misses-init

switch或者goto语句后声明并且初始化变量,进行告警。

-Wa,-enable-c-lbu-sb

汇编器优化,默认禁用。如果启用此优化,汇编器将使用压缩的 lbu & sb 来替换 lbu & sb。

-Wa,-enable-c-lhu-sh

汇编器优化,默认禁用。如果启用此优化,汇编器将使用压缩的 lhu & sh 来替换 lhu & sh

-fimm-compare

代码大小的优化,可以将非零立即比较的两条指令(li,bxx)合并到一条指令(bxxi)

-femit-muliadd

CodeSize优化,可以将多条加树指令合并为一条指令

-fmerge-immshf

CodeSize优化,可以将立即移位合并为一条指令。组合仅在 -O1 以上的选项中生效

-femit-uxtb-uxth

CodeSize优化,将无符号扩展字节和无符号扩展半字优化为uxtb、uxth(16字节)。组合仅在 -O1 以上的选项中

-femit-lli

使用48位l.li指令代替64位指令lui + addi进行32位长立即加载。此优化与insn组合结合使用

-femit-clz

支持CLZ指令,所有__builtin_clz函数的调用都会优化为CLZ指令。

-fldm-stm-optimize

启用用 ldmia/stmia 替换连续 WORD 加载/存储的优化,默认禁用。

-g

调试编译选项,对于可执行二进制文件可通过以下方法确定是否包含调试信息

-mabi=ilp32f

支持硬浮点(指定整数和浮点调用约定)

-march=rv32imfc

支持硬浮点(为给定的 RISC-V ISA 生成代码)

--short-enums

CodeSize 优化,enum类型等于大小足够的最小整数类型

-madjust-regorder

寄存器分配优化-寄存器分配顺序调整优化

-madjust-const-cost

立即数重复加载优化

-freorder-commu-args

浮点运算可交换操作数优化

-fimm-compare-expand

扩展指令常量比较指令优化

-frmv-str-zero

rodata段常量字符串对齐优化

-mfp-const-opt

浮点常量加载优化

-mswitch-jump-table

switch case跳转表优化

-frtl-sequence-abstract

函数内过程优化

-frtl-hoist-sink

代码移动优化

-fsafe-alias-multipointer

多级指针重复加载优化

-finline-optimize-size

inline内联代价模型优化

-fmuliadd-expand

扩展指令乘加指令优化(muliadd优化)

-mlli-expand

扩展指令l.li指令优化

-Wa,-mcjal-expand

汇编器上jal压缩指令优化

-foptimize-reg-alloc

寄存器分配优化-寄存器分配优先级调整优化

-fsplit-multi-zero-assignments

连续赋零值优化

-floop-optimize-size

循环结构优化

-Wa,-mlli-relax

高频立即数加载优化(汇编器和链接器协同优化)

-mpattern-abstract

过程间抽象优化(根据已知pattern抽象优化)

-foptimize-pro-and-epilogue

函数prologue和epilogue优化

新增链接外部静态库

链接外部静态库,请参考sdk\application\samples\wifi\ohos_connect\CMakeLists.txt中引用1个外部静态库文件hilinkbtsdk.a的示例:

set(COMPONENT_NAME "hilinkbtsdk")
set(LIBS ${ROOT_DIR}/application/samples/wifi/libhilink/lib${COMPONENT_NAME}.a)
set(WHOLE_LINK
true
)
build_component()

然后在sdk\build\config\target_config\ws63\config.py 中对应的编译target中添加'hilinkbtsdk'。

添加bin文件编译

当前ws63编译ws63-liteos-app_all.fwpkg时,默认编译root_loaderboot_sign.bin、root_params.bin、flashboot_sign.bin、ws63_all_nv.bin、ws63-liteos-app-sign.bin,文件介绍如表3所示。

若需编译其他bin文件,可按如下步骤添加:

  1. 在根路径下打开/tools/pkg/chip_packet/ws63/packet.py文件

  2. 在make_all_in_one_packet函数中添加代码,如图1所示

    图 1 文件路径和函数

  3. 在函数中添加bin文件路径

    其中每个拼接字符串代表一层目录(文件夹名和文件名)

    最终拼接完成的test_add_bin实际值:sdk\interim_binary\ws63\bin\rom_bin\pke_rom.bin

    图 2 bin文件路径图

  4. 设置编译参数,参数之间用"|"分割

    图 3 bin文件编译参数

    1. 烧录位置,单板剩余地址可在sdk\build\config\target_config\ws63\param_sector\param_sector.json文件中查看

    2. 占用空间大小

    3. 文件类型,0代表loader,1代表普通烧写文件,3是efuse,4是otp

    图 4 单板剩余地址

  5. 在函数末尾,将设置好编译参数和路径的变量添加到编译列表

    图 5 添加路径到编译列表

  6. 编译结果展示

    图 6 编译结果

说明: 如果新增的bin文件有通过OTA升级的需求,请参见《WS63V100 FOTA 开发指南》中对应内容,适配新增bin文件的OTA升级支持。

Flash分区表配置

分区表配置文件路径sdk\build\config\target_config\ws63\param_sector\param_sector.json

说明: 上图内容仅作文件内容说明,具体分区信息请参考《WS63V100 FOTA 开发指南》“4.2 注意事项”章节中分区信息。 分区表ID限制16个分区数量,默认Flash共4M大小,预留6个分区ID,可通过uapi_partition_get_info接口传入分区ID获取对应地址和长度。

根据当前Flash分区方案,Flash划分情况如图1所示。

图 1 Flash划分情况

调整分区时,需要遵守以下原则:

  1. 地址段0x000000~0x030000为不可调整区,任何改动都可能会导致无法启动而变砖

  2. 地址段0x030000~0x270000为APP镜像区,地址段信息来源于分区表中ID为0x20对应的APP镜像区,该地址段仅支持调整分区大小,分区首地址不支持调整,调整分区首地址同样会导致无法启动。

  3. 地址段0x270000~0x3F3000为FOTA镜像区,地址段信息来源于分区表中ID为0x21对应的压缩分区/OTA升级分区/产测镜像分区/B面分区,该分区首地址必须为APP镜像区的结束地址使用压缩升级方案时,该分区大小至少配置为APP镜像区大小的0.7倍及以上

  4. 地址段0x3F3000~0x3FB000为预留分区,该分区首地址为FOTA镜像区的结束地址,支持划分为4个不同分区ID的单独分区。

  5. 地址段0x3FB000~0x400000为其他功能区,包括死机信息(0x11)以及NV分区(0x10),该分区不支持调整

  6. 调整分区时,除不可调整区以外,其他分区的首地址以及大小均要4K对齐。

调整分区示例:

根据分区表中分区信息,想要调整分区ID为0x30的预留分区的大小。

  1. 假设在APP镜像分区有8K的空间余量,则调整APP镜像区的大小,减少8K,分区结束地址同时减少8K,同步修改文件drivers/boards/ws63/evb/memory_config/include/memory_config_common.h,将文件中宏APP_PROGRAM_LENGTH的值(默认为'(0x240000 - 0x000300)')修改为调整后分区大小(如'(0x23E000 - 0x000300)')。

  2. FOTA分区受APP镜像区的影响,首地址前移8K,调整为0x26E000,压缩升级方案中FOTA分区大小需同步调整,4K对齐后为减少4K,最终FOTA分区结束地址为0x3F0000。

  3. APP镜像分区以及FOTA分区总计调整出12K的余量,可合并到预留分区中,预留分区首地址前移12K,为0x3F0000,同时大小增加12K,结束地址保持为0x3FB000。

UART配置方法

WS63芯片总共有3个UART,SDK默认配置如下。

uart序号

波特率

用途

0

115200

debug调试打印/烧录/AT。

1

921600

debugkits调试口。

2

115200

空闲,暂未使用。

烧录功能,固定用uart0,不可更改。

debug调试打印/AT/debugkits调试口,可通过menuconfig进行配置,以便适应不同硬件板级uart连接,波特率也可以通过menuconfig进行定制。

menuconfig的配置路径为Drivers->Chips->Chip Configurations for ws63:

须知:

  1. debugkits调试口不能与其他功能共用同一个UART口,必须独占。

  2. UART波特率建议配置典型值,如115200/921600/1M等,考虑到兼容性,不建议配置不常用的特殊值,比如115623此类波特率值。

  3. 修改UART序号请慎重,必须要与板级硬件工程师确认uart硬件连接,确保软件配置与硬件板级的实际电路连接是对得上的,否则无法正常工作。

注意事项

  • 如果执行“./build.py”提示无权限,可执行命令“chmod +x build.py”添加执行权限或执行“python3./build.py”。

  • 编译过程中,报错找不到某个包,请检查环境中的python是否已经安装了相应组件。如果构建环境中包含多个python,特别是多个同版本的python,而用户无法辨认正在使用的是其中的哪个版本,此情况下,在安装python组件包时,推荐使用组件包源码进行安装。

  • 系统优先使用用户通过Menuconfig所做的配置,如果用户未配置,系统将使用默认配置进行编译。

新建APP

建立源码目录

说明: 用户可在“application/ws63”同级目录下参考“ws63_liteos_application”目录建立app,以下均以建立“my_demo”为例。

步骤如下:

  1. 新建“application/ws63/my_demo”目录,用来存放“my_demo”的源文件。

  2. 复制“application/ws63/ws63_liteos_application/CMakeLists.txt”到“application/ws63/my_demo/CmakeLists.txt”,并将源文件放在“application/ws63/my_demo”目录下。

  3. 修改“application/ws63/my_demo/CmakeLists.txt”文件。其中各个变量的含义如表1所示。

    表 1 组件的CmakeLists.txt中的变量含义

    变量名称

    变量含义

    COMPONENT_NAME

    当前组件名称,如“my_demo”。

    SOURCES

    当前组件的C文件列表,其中CMAKE_CURRENT_SOURCE_DIR变量标识当前CMakeLists.txt所在的路径。

    PUBLIC_HEADER

    当前组件需要对外提供的头文件的路径。

    PRIVATE_HEADER

    当前组件内部的头文件搜索路径。

    PRIVATE_DEFINES

    当前组件内部生效的宏定义。

    PUBLIC_DEFINES

    当前组件需要对外提供的宏定义。

    COMPONENT_PUBLIC_CCFLAGS

    当前组件需要对外提供的编译选项。

    COMPONENT_CCFLAGS

    当前组件内部生效的编译选项。

  4. 修改“application/ws63/CMakeLists.txt”,将my_demo目录加入编译。

  5. 修改“build/config/target_config/ws63/config.py”,在ram_component字段中加入‘my_demo’,向编译系统中注册my_demo组件。

开发代码

目录结构建立完成后开始启动开发代码(用户可参考“application/samples”进行移植),代码开发完成后即可使用“python3 build.py -c ws63-liteos-app -component=my_demo”编译my_demo进行代码编译调试。

镜像烧录

镜像烧录方法,请参见《WS63V100 BurnTool工具 使用指南》中“操作指南”章节。