From 67efe05be6c6caa2afbe3774b0e25bac2837f6d7 Mon Sep 17 00:00:00 2001 From: likailong Date: Sat, 25 Dec 2021 11:44:16 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E6=81=92=E7=8E=84bes?= =?UTF-8?q?2600w=E7=A7=BB=E6=A4=8D=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: likailong --- .../figure/bes2600_board_make_menuconfig.png | Bin 0 -> 12007 bytes .../porting/figure/bes2600_hb_env.png | Bin 0 -> 36460 bytes .../porting/figure/bes2600_hb_set.png | Bin 0 -> 13405 bytes .../figure/bes2600_newlib_make_menuconfig.png | Bin 0 -> 7832 bytes .../porting/figure/bes2600_xts_state.png | Bin 0 -> 12189 bytes ...ing-bes2600w-on-minisystem-display-demo.md | 1304 +++++++++++++++++ .../porting/porting-minichip-cases.md | 4 + zh-cn/readme.md | 1 + 8 files changed, 1309 insertions(+) create mode 100644 zh-cn/device-dev/porting/figure/bes2600_board_make_menuconfig.png create mode 100644 zh-cn/device-dev/porting/figure/bes2600_hb_env.png create mode 100644 zh-cn/device-dev/porting/figure/bes2600_hb_set.png create mode 100644 zh-cn/device-dev/porting/figure/bes2600_newlib_make_menuconfig.png create mode 100644 zh-cn/device-dev/porting/figure/bes2600_xts_state.png create mode 100644 zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md create mode 100644 zh-cn/device-dev/porting/porting-minichip-cases.md diff --git a/zh-cn/device-dev/porting/figure/bes2600_board_make_menuconfig.png b/zh-cn/device-dev/porting/figure/bes2600_board_make_menuconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..4269a1c86e1662fb4ddd54cd85ab5608bf3e6202 GIT binary patch literal 12007 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 btDtw#jz`unVoWgtc7U3)mQsy^S?K=&j5Ujv literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/figure/bes2600_hb_env.png b/zh-cn/device-dev/porting/figure/bes2600_hb_env.png new file mode 100644 index 0000000000000000000000000000000000000000..10fa486ec6f56f490a19d5021cb7b309b372ddb9 GIT binary patch literal 36460 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 ^ zfW2AJ>b2XAsnFOgRz@pAo^a9|lf0(r+@|Xkrax;O$H?Jr@Gtpz+#W<&k>Wenki!qk zUy*^y_K&}d88PdO9&ps-nsL=S!L(bJMd1^w)H2jaCY@4)lA9{DMb22?n5EJvvd7KN z*?nzRncSKvc|F@e#_bxP<7upNhFO{Sn5rTb_?tvPJjuhK?BbmvybjI4^2Jqa<={F> zKF!?VEQ3}+Wq%g|{uez4LT^XWr<0xLS_=u@@})4eufOEHWz?uKc3;;i2QcW4$NI`e#xRb{-7`vOGL1f zMo{d0&fQTi@a&tQ0btIvVo@gRRAXJHV$xeWcL5?OX10?&xNo64l$Gj2x90eJT62eo zh>8kr^QPQU7^E+HP_1qgMt@H~ff$DSZQ!u@5q%MS9VzfWC6;Qwn?c6>J!@|i`#zEp zwJicK=|=YAF+I6*6s_7ohh9>`K@p$&@ah`!4!{ya0Q^>(z*-JlN}*m%Z%gde4{F;# z%kLqX?Raf-Qq*@pN2}#22a2^tSWbQITYEj+--wo*>!jhVs>Vka71ONmmdqfC8k1zK z3==(V7W0dXaFyF=7?n}a^cKB!POUUY1#ggXu zz#!iy%b94gZ9#RgaDe-+ffVvy6O+aRjv10dL0|j*@r7dTV<==A=`WwUT^{>mEA(V=oAVKhF4Utk`mhZB9IOV>SrlZl zf>kywjiHC@ky2SNviH=0DbTuHtaKI9KoVwn(N-K$TUB-Z+u!hL@jU-%1|^~d?{}Z6%NxzUBK~bID1#t)rhuAN zr=~ZOCO&J~(=NqJa zY^Kf`GHbK`2xu%@s@@ovveM zETY)6(-9-0w8Sw(FfbwjJh}?9GHbNPrqMU;@_#7=b(ixoE4Wfb78{;udHKGTegO3* zFsaoT>EV9w#w-qk@<-evhn$-2azC*whF{nI@dzJK`R=uX<8O}Y(!RYWTI;Cjv34g} z^zuKXEcLg{D7(7vuD~WJSWI2mCOZ6oEfwlQNH0=miwKDi9<1ptI<|X-R4&(3)$cNQ zQx-D#!9jam8!j$vA>*kNa)OFz#Ip`*o`-d+k~oKlVO2=Zv|_q9iFJnl)FXqNv=sJs zDx{oKv;#DlRr9MX^zN$>q`x0mJn;-G1R1Iv&rY7Cq(qD{I19;%(@6iwQ_Q)biwU&+HZfBl-!GyF814=MyM)st62@ ztXeUb&Wx$cLeIDMYU_5@OFEgquP28&hS#3n65CsdMwG#Fj0J{+MbIb<6u`VrJ$K&q z2mSz+SGRd}GV7Io@mu%^w)?N~8T%`*A-x^9o%0KmPM`2_YyE{`7Zt z5Kl>PI9%qW_cAt8o7ys~d^51*0f$NPN(Kuj~20QKD7lh+dZ611L=Khzxhf1s%z zMs+&OT+Vk~7X1#<^T7Wf0mTeUfci?aR$6dR9r)=4NGH%OTrF5nq1H-ISnht)fg4;f z0C(FXVZawr!E0xP|G6XO7LieQ%civ%{uwbmK10k28pHoO9R%YdvN&^}RrV=aOtH~O viEhwUl>t{%wj0hi&ZhkX>%a{SVdNK5*^2;T#i8tnCyJ1OIDZkZrpNyWi^NuZ literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/figure/bes2600_hb_set.png b/zh-cn/device-dev/porting/figure/bes2600_hb_set.png new file mode 100644 index 0000000000000000000000000000000000000000..6cadca71b5dac5a945c16754085631dab3f9a626 GIT binary patch literal 13405 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 GU;hU?=iin9 literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/figure/bes2600_newlib_make_menuconfig.png b/zh-cn/device-dev/porting/figure/bes2600_newlib_make_menuconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..2b844544b987abcb8346e56a27098ff150707705 GIT binary patch literal 7832 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 CJPK3* literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md b/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md new file mode 100644 index 0000000000..0ccb117fcc --- /dev/null +++ b/zh-cn/device-dev/porting/porting-bes2600w-on-minisystem-display-demo.md @@ -0,0 +1,1304 @@ + + +# 轻量带屏解决方案之恒玄芯片移植案例 + +本文章基于恒玄科技`BES2600W`芯片的欧智通[Multi-modal V200Z-R开发板](https://gitee.com/openharmony/device_board_fnlink),进行轻量带屏开发板的标准移植,开发了智能开关面板样例,同时实现了`ace_engine_lite`、`graphic_ui`、`aafwk_lite`、`appexecfwk_lite`、`HDF`等部件基于`OpenHarmony LiteOS-M`内核的适配。移植架构上采用`Board`与`SoC`分离的方案,工具链`Newlib C`库与`Musl C`库可选,`LiteOS-M`内核编译采用`gn`结合`Kconfig`图形化配置等需求。 + +## 编译构建 + +### 目录规划 + +本案例在芯片移植架构方面进行了一些改进,以前的芯片适配目录规划为: + +``` +device +└── +    └── +``` + +这样会导致,小熊派`BearPi-HM Nano`开发板与润和的`HiSpark Pegasus`开发板使用小海思的`hi3861`的`SoC`时,需要在这两款开发板里面都放置一份重复的代码。为了解决该问题,本案例将单板厂商与`SoC`厂商进行分离,可以参考[Board和SoC解耦的设计思路](https://gitee.com/openharmony-sig/sig-content/blob/master/devboard/docs/board-soc-arch-design.md),并把芯片适配目录规划为: + +``` +device +├── board --- 单板厂商目录 +│   └── fnlink --- 单板厂商名字:欧智通 +│   └── v200zr --- 单板名:v200zr +└── soc --- SoC厂商目录 + └── bestechnic --- SoC厂商名字:恒玄 + └── bes2600 --- SoC Series名:bes2600是一个系列,里面包含bes2600w等SoC名 +``` + +产品样例目录规划为: + +``` +vendor +└── bestechnic --- 开发产品样例厂商目录,恒玄开发的带屏样例,因此以bestechnic命名 + └── display_demo --- 产品名字:以智能开关面板的带屏显示样例 +``` + +### 预编译适配 + +在进行移植之前,需要进行预编译适配。 + +预编译适配主要使用`hb set`命令,设置整个项目的根目录、单板目录、产品目录、单板公司名等环境变量,为编译做准备。 + +具体的预编译适配步骤如下: + +1. 在`vendor/bestechnic/display_demo`目录下新增`config.json`文件,用于描述这个产品样例所使用的单板、内核等信息,描述信息可参考如下内容: + +``` +{ + "product_name": "display_demo", --- 用于hb set进行选择时,显示的产品名称 + "type": "mini", --- 构建系统的类型,mini/small/standard + "version": "3.0", --- 构建系统的版本,1.0/2.0/3.0 + "device_company": "fnlink", --- 单板厂商名,用于编译时找到/device/board/fnlink目录 + "board": "v200zr", --- 单板名,用于编译时找到/device/board/fnlink/v200zr目录 + "kernel_type": "liteos_m", --- 内核类型,因为OpenHarmony支持多内核,一块单板可能适配了多个内核,所以需要指定某个内核进行编译 + "kernel_version": "3.0.0", --- 内核版本,一块单板可能适配了多个linux内核版本,所以需要指定某个具体的内核版本进行编译 + "subsystems": [ ] --- 选择所需要编译构建的子系统 +} +``` + +2. 在`vendor/bestechnic/display_demo`目录下新增`config.json`文件,用于描述这个产品样例所使用的单板、内核等信息,描述信息可参考如下内容: + +``` +# Kernel type, e.g. "linux", "liteos_a", "liteos_m". +kernel_type = "liteos_m" --- 内核类型,跟config.json中kernel_type对应 + +# Kernel version. +kernel_version = "3.0.0" --- 内核版本,跟config.json中kernel_version对应 +``` + +3. 验证`hb set`配置是否正确,输入`hb set`能够显示如下图片表示配置正确。 + + 详细地,执行`hb set`输入项目根目录,并且回车,遍历所有`//vendor//`目录下的`config.json`,给出可选产品编译选项,`config.json`的`product_name`用于显示产品名,`device_company`和`board`用于关联出`//device/board//`目录,并且匹配`/config.gni`文件,如果能够匹配多个文件,表示该单板适配了多个内核,那么可以根据`config.json`的`kernel_type`和`kernel_version`来唯一匹配`config.gni`的`kernel_type`和`kernel_version`,这样就可以确定了需要编译适配了哪个内核的单板。 + +![hb set](figure/bes2600_hb_set.png) + +​ 通过`hb env`可以查看选择出来的预编译环境变量。 + +![hb env](figure/bes2600_hb_env.png) + +在执行`hb build`之前,需要准备好`LiteOS-M`内核适配,具体适配步骤请参考[内核移植](内核移植)。 + +## 内核移植 + +内核移植需要完成`LiteOS-M Kconfig`适配、`gn`的编译构建和内核启动最小适配。 + +### LiteOS-M Kconfig适配 + +在`//kernel/liteos_m`目录下执行`make menuconfig`命令,完成编译配置选项的选择。在`Makefile`文件中,会将`hb env`的结果转换成环境变量,即`PRODUCT_PATH`、`DEVICE_PATH`和`BOARD_COMPANY`。如下代码块所示: + +``` +$(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line))) +ifneq ($(ohos_kernel),liteos_m) +$(error The selected product ($(ohos_product)) is not a liteos_m kernel type product) +endif +--- 将hb env的每一行输出转化为变量形式,例如将[OHOS INFO] device company: fnlink转换为ohos_device_company=fnlink + +…… + +ifeq ($(BOARD_COMPANY),) +BOARD_COMPANY:=$(ohos_device_company) +endif +…… +export BOARD_COMPANY +--- 将ohos_device_company转化为BOARD_COMPANY环境变量 +``` + +在`//kernel/liteos_m/Kconfig`文件中使用这些导出的环境变量,`Kconfiglib`采用`ulfalizer`开发基于`python`的版本,[源码地址](https://github.com/ulfalizer/Kconfiglib),[功能介绍连接参考](https://github.com/zephyrproject-rtos/zephyr/blob/main/scripts/kconfig/kconfiglib.py),里面用到了`orsource`关键字,其中`o`表示`optional`,表示这个文件是否存在可选,`r`表示`relative`,表示这个文件相对当前文件的相对路径。 + +``` +config SOC_COMPANY + string "SoC company name to locate soc build path" + help + This option specifies the SoC company name, used to locate the build path for soc. This option is set by the + SoC's Kconfig file, and should be exactly the same with SoC company path, and the user should generally avoid + modifying it via the menu configuration. + +orsource "../../device/board/*/Kconfig.liteos_m.shields" --- 将所有扩展板配置信息加载进来,因为单板厂商A提供扩展板可以给单板厂商B使用,所以这里使用*匹配所有的扩展板,而非BOARD_COMPANY。另外由于OpenHarmony支持多内核设计,Kconfig文件采用liteos_m作为后缀,在进行单板适配过程中,其他内核在适配过程中,可以使用对应的内核名作为后缀名进行扩展。 + +orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards" --- 加载BOARD_COMPANY的所有单板预定义配置 + +choice + prompt "Board Selection" + +orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards" --- 提供Board选择列表 + +endchoice + +orsource "../../device/soc/*/Kconfig.liteos_m.defconfig" --- 加载所有SoC的默认配置定义 + +choice + prompt "SoC Series Selection" + +orsource "../../device/soc/*/Kconfig.liteos_m.series" --- 提供所有SoC Series选择列表 + +endchoice + +orsource "../../device/soc/*/Kconfig.liteos_m.soc" --- 加载所有SoC配置 +``` + +从`//kernel/liteos_m/Kconfig`文件可以看出需要在`//device/board/fnlink`目录下新增如下`Kconfig`文件进行适配: + +``` +. +├── v200zr --- v200zr单板配置目录 +│   ├── Kconfig.liteos_m.board --- 提供v200zr单板的配置选项 +│   ├── Kconfig.liteos_m.defconfig.board --- 提供v200zr单板的默认配置项 +│   └── liteos_m +│   └── config.gni +├── Kconfig.liteos_m.boards --- 提供fnlink单板厂商下Boards配置信息 +├── Kconfig.liteos_m.defconfig.boards --- 提供fnlink单板厂商下Boards默认配置信息 +├── Kconfig.liteos_m.shields --- 提供fnlink单板厂商下扩展板配置信息 +└── shields --- fnlink单板厂商的扩展板目录 + ├── v200zr-t0 --- fnlink单板厂商的扩展板v200zr-t0 + │   ├── Kconfig.liteos_m.defconfig.shield --- 扩展板v200zr-t0默认配置 + │   └── Kconfig.liteos_m.shield --- 扩展板v200zr-t0配置信息 + ├── v200zr-t1 + │   ├── Kconfig.liteos_m.defconfig.shield + │   └── Kconfig.liteos_m.shield + └── Kconfig.liteos_m.shields +``` + +在 `v200zr/Kconfig.liteos_m.board`需要配置选择该单板的选项,以及它依赖的`SoC`,如下: + +``` +config BOARD_v200zr + bool "select board v200zr" + depends on SOC_BES2600W --- v200zr单板用的bes2600w的SoC,只有 bes2600w的SoC被选择后,v200zr单板配置选项才可见,可以被选择。 +``` + +在 `v200zr/Kconfig.liteos_m.defconfig.board`需要配置选择该单板后,默认定义 `BOARD` 的名字为 `"v200zr"` ,如下: + +``` +if BOARD_v200zr +config BOARD + string --- string后没有带提示,因此用户不可见 + default "v200zr" + +endif # BOARD_v200zr +``` + +从`//kernel/liteos_m/Kconfig`文件可以看出需要在`//device/soc/bestechnic`目录下新增如下`Kconfig`文件进行适配: + +``` +. +├── bes2600 --- bes2600 SoC系列 +│   ├── Kconfig.liteos_m.defconfig.bes2600w --- bestechnic芯片厂商bes2600w SoC Series配置 +│   ├── Kconfig.liteos_m.defconfig.series --- bestechnic芯片厂商bes2600默认配置 +│   ├── Kconfig.liteos_m.series --- bestechnic芯片厂商bes2600 SoC Series配置 +│   └── Kconfig.liteos_m.soc --- bestechnic芯片厂商bes2600 SoC配置 +├── Kconfig.liteos_m.defconfig --- bestechnic芯片厂商SoC默认配置 +├── Kconfig.liteos_m.series --- bestechnic芯片厂商SoC Series配置 +└── Kconfig.liteos_m.soc --- bestechnic芯片厂商 SoC配置 +``` + +在 `bes2600/Kconfig.liteos_m.series` 需要配置`bes2600 SoC series`,以及它的芯片架构等信息,如下: + +``` +config SOC_SERIES_BES2600 --- 提供bes2600 SoC Series选项 + bool "Bestechnic 2600 Series" + select ARM --- 选择bes2600后,默认选择ARM架构 + select SOC_COMPANY_BESTECHNIC --- 选择bes2600后,默认选择bestechnic芯片公司,驱动会依赖这个宏配置,选择配置编译对应厂商的驱动 + select CPU_CORTEX_M33 --- 选择bes2600后,默认选择cortex-m33 CPU + help + Enable support for Bestechnic 2600 series +``` + +在 `bes2600/Kconfig.liteos_m.soc` 需要提供`bes2600 SoC series`下有多少个具体的`SoC`可供选择,如下: + +``` +choice + prompt "Bestechnic 2600 series SoC" + depends on SOC_SERIES_BES2600 --- 只有选择了bes2600 Series后,才会出现如下配置选项 + +config SOC_BES2600W --- 增加bes2600w SoC配置选择项 + bool "SoC BES2600w" + +endchoice +``` + +在 `bes2600/Kconfig.liteos_m.defconfig.series` 需要提供`bes2600 SoC series`选择后的默认配置,如下: + +``` +if SOC_SERIES_BES2600 --- 选择了bes2600 Series后,才会增加如下默认配置选项 + +rsource "Kconfig.liteos_m.defconfig.bes2600w" --- 增加bes2600w SoC的默认配置 + +config SOC_SERIES --- 增加SOC_SERIES的默认配置 + string + default "bes2600" + +endif +``` + +配置完成后,还需要根据 `kernel/liteos_m/Makefile` 文件配置`make menuconfig`的`defconfig`保存路径: + +``` +ifeq ($(TEE:1=y),y) +tee = _tee +endif +ifeq ($(RELEASE:1=y),y) +CONFIG ?= $(PRODUCT_PATH)/kernel_configs/release$(tee).config +else +CONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).config --- 配置文件保存在$(CONFIG)中,由产品最终定义 +endif + +…… + +update_config menuconfig: + $(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig $(args) && savedefconfig --out "$(CONFIG)" +``` + +在这个例子中,`defconfig`配置路径为 `$(PRODUCT_PATH)/kernel_configs/debug.config`,创建该文件后,内容为空,产品的目录文件结构如下: + +``` +. +└── display_demo + ├── config.json + └── kernel_configs + └── debug.config +``` + +配置完成后,在 `kernel/liteos_m` 目录下执行 `make menuconfig`能够对`SoC Series`/`SoC`/`Board`进行选择,如下: + +![board make menuconfig](figure/bes2600_board_make_menuconfig.png) + +结果将自动保存在`$(PRODUCT_PATH)/kernel_configs/debug.config`,下次执行`make menuconfig`时会导出保存的结果。 + +### gn编译适配 + +在上一步`Kconfig`的图形化配置后,将其生成的配置结果可以作为`gn`编译的输入,以控制不同模块是否编译。另外为了解决之前`gn`编写时,随意include的问题,内核编译做了模块化编译的设计,使得整个编译逻辑更加清晰,设计思路请参考[LiteOS-M内核BUILD.gn编写指南](https://gitee.com/caoruihong/kernel_liteos_m/wikis/LiteOS-M%E5%86%85%E6%A0%B8BUILD.gn%E7%BC%96%E5%86%99%E6%8C%87%E5%8D%97)。 + +在 `kernel/liteos_m/BUILD.gn` 中,指定了`Board`和`SoC`的编译入口为`//device/board/fnlink`和`//device/soc/bestechnic`。 + +``` +deps += [ "//device/board/$device_company" ] +deps += [ "//device/soc/$LOSCFG_SOC_COMPANY" ] +``` + +在`//device/board/fnlink/BUILD.gn`中,新增内容如下: + +``` +if (ohos_kernel_type == "liteos_m") { --- 由于多内核设计,对于LiteOS-M内核适配,需要用宏来隔离 + import("//kernel/liteos_m/liteos.gni") --- 引入内核gn编写模板 + module_name = get_path_info(rebase_path("."), "name") --- 动态获取当前文件目录作为模块名,防止目录名修改后,这里还需要跟着修改 + module_group(module_name) { --- 采用module_group模板 + modules = [ --- 添加需要编译的模块 + ] + } +} +``` + +同理`//device/soc/bestechnic/BUILD.gn`也是一样。 + +### 内核启动适配 + +内核启动适配的文件路径在 `//device/soc/bestechnic/bes2600/liteos_m/sdk/bsp/rtos/liteos/liteos_m/board.c` + +内核启动适配总体思路如下: + +1. 中断向量的初始化`os_vector_init` ,初始化中断的处理函数。 +2. 内核初始化`osKernelInitialize` 。 +3. 创建线程`board_main`,进行芯片平台初始化。 +4. 内核启动,开始调度线程`osKernelStart` 。 + +其中,本章节详细对第3步进行展开,其他几步为对内核函数调用,不作详细描述。 + +第3步中`board_main`在启动`OHOS_SystemInit`之前,需要初始化必要的动作,如下: + +``` +... + if(!ret) { + ... + OhosSystemAdapterHooks(); --- 系统启动时候设置钩子,启动OpenHarmonyOHOS_SystemInit的之前完成打印和驱动的初始化 + ... + OHOS_SystemInit(); --- 启动OpenHarmony服务,以及组件初始化 + } +.... +``` + +`OhosSystemAdapterHooks`函数在`device/soc/bestechnic/bes2600/liteos_m/components/utils/src/hm_sys.c`文件中,如下: + +``` +int OhosSystemAdapterHooks(void) +{ + init_trace_system(); --- 初始化打印函数 + DeviceManagerStart(); --- 调用DeviceManagerStart函数进行HDF驱动初始化,这个过程会调用单板代码中的驱动配置文件hdf.hcs以及drivers源码实现 + return 0; +} + +``` + +### littlefs文件系统移植 + +文件系统使用的是`littlefs`,适配过程中,需要在指定路径下放置文件系统预置文件,根据配置可自动生成文件系统镜像,可以实现自动化生成和打包到烧录包中。 + +1. 配置指定目录放置打包文件系统`config.json`,通过`flash_partition_dir`指定目录: + +``` + "flash_partition_dir": "fs" --- 表示在vendor/bestechnic/display_demo/fs目录下放置文件系统预置文件 +``` + +2. 在指定目录`vendor/bestechnic/display_demo/fs`下放置两部分内容: + + - `wifi_Download_cfg.yaml`:镜像的烧录配置文件,可以根据实际情况调整分区。 + - `/data/data`:第一个/`data`是挂载的根目录;第二个`data`是根目录里面的`data`目录,里面可以存放预置文件,或者在第二个`data`的同级目录再创建一个目录,打包的时候只认第一个`data`挂载根目录。 + +3. `config.json`中根据`wifi_Download_cfg.yaml`最后调整结果。 + + - `fs_src`配置文件系统挂载名字。 + - `fs_name`是最后生成文件系统的名字。 + - `block_size`配置成`4K`对齐,建议不修改。 + - `fs_size`是生成文件系统的大小。 + - `burn_name`是烧录`bin`名字的大小。 + - `enable` 表示是否生成这个文件系统 + +4. 在`//device/soc/bestechnic/bes2600/liteos_m/components/hdf_config/hdf.hcs`文件配置文件系统的烧录的起始地址、文件系统的大小以及读数据块的大小`block_size`等信息,参考配置如下: + +``` + misc { + fs_config { + littlefs_config { + match_attr = "littlefs_config"; + mount_points = ["/data"]; + partitions = [10]; + block_size = [4096]; + block_count = [1024]; + } + } + storage_config { + flash_config { + match_attr = "flash_config"; + partitions = [10]; + owner = [0]; + description = ["littlefs"]; + start_addr = [0xB60000]; + length = [0x400000]; + options = [3]; + } + } + } +``` + +最后在`device/soc/bestechnic/bes2600/liteos_m/components/fs/fs_init.c`中,通过`hdf`加载数据,进行读写`flash`,如下: + +``` +static int32_t FsDriverInit(struct HdfDeviceObject *object) +{ + if (object == NULL) { + return HDF_FAILURE; + } + if (object->property) { + if (FsGetResource(fs, object->property) != HDF_SUCCESS) { + HDF_LOGE("%s: FsGetResource failed", __func__); + return HDF_FAILURE; + } + } + for (int i = 0; i < sizeof(fs) / sizeof(fs[0]); i++) { + if (fs[i].mount_point == NULL) + continue; + + fs[i].lfs_cfg.read = littlefs_block_read; + fs[i].lfs_cfg.prog = littlefs_block_write; + fs[i].lfs_cfg.erase = littlefs_block_erase; + fs[i].lfs_cfg.sync = littlefs_block_sync; + + fs[i].lfs_cfg.read_size = 256; + fs[i].lfs_cfg.prog_size = 256; + fs[i].lfs_cfg.cache_size = 256; + fs[i].lfs_cfg.lookahead_size = 16; + fs[i].lfs_cfg.block_cycles = 1000; + + SetDefaultMountPath(i, fs[i].mount_point); + int ret = mount(NULL, fs[i].mount_point, "littlefs", 0, &fs[i].lfs_cfg); + HDF_LOGI("%s: mount fs on '%s' %s\n", __func__, fs[i].mount_point, (ret == 0) ? "succeed" : "failed"); + } + return HDF_SUCCESS; +} +``` + + + +### C库适配 + +在轻量系统中,C库适配比较复杂,设计思路请参考[LiteOS-M内核支持musl与newlib平滑切换方案](https://gitee.com/arvinzzz/ohos_kernel_design_specification/blob/master/liteos_m/%E6%94%AF%E6%8C%81newlib/%E5%86%85%E6%A0%B8%E9%80%82%E9%85%8Dnewlib%E6%96%B9%E6%A1%88%E6%80%9D%E8%B7%AF.md),由于我们的工具链采用 [gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2](https://gitee.com/link?target=https%3A%2F%2Fdeveloper.arm.com%2F-%2Fmedia%2FFiles%2Fdownloads%2Fgnu-rm%2F10.3-2021.10%2Fgcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2) 自带`newlib`的C库,那么系统移植整体采用`newlib`的C库。那么在内核的`make menuconfig`中选择`newlib`,如下图: + +![image-20211212191013553](figure/bes2600_newlib_make_menuconfig.png) + +#### malloc适配 + +malloc适配参考[The Red Hat newlib C Library-malloc](https://sourceware.org/newlib/libc.html#malloc)。实现malloc适配有以下两种方法: + +- 实现 `_sbrk_r` 函数。这种方法中,内存分配函数使用`newlib`中的。 + +- 实现 `_malloc_r`, `_realloc_r`, `_reallocf_r`, `_free_r`, `_memalign_r`, 和 `_malloc_usable_size_r`。这种方法中,内存分配函数可以使用内核的。 + +为了方便地根据业务进行内存分配算法调优和问题定位,在这两种方法中,本案例选择后者。 + +首先,由于`newlib`中已经存在这些函数的符号,因此需要用到`gcc`的`wrap`的链接选项替换这些函数符号为内核的实现,内核的实现为 `//kernel/liteos_m/kal/libc/newlib/porting/src/malloc.c`。 + +然后,在`//device/board/fnlink/v200zr/liteos_m/config.gni`的新增这些函数的`wrap`链接选项。 + +``` +board_ld_flags += [ + "-Wl,--wrap=_malloc_r", + "-Wl,--wrap=_realloc_r", + "-Wl,--wrap=_reallocf_r", + "-Wl,--wrap=_free_r", + "-Wl,--wrap=_memalign_r", + "-Wl,--wrap=_malloc_usable_size_r", +] +``` + +#### vsprintf等适配 + +参考 https://sourceware.org/newlib/libc.html#vfprintf ,实现 `vprintf`, `vfprintf`, `printf`, `snprintf` 和`sprintf`。 + +类似`malloc`适配,首先要提供这些函数的实现,`//device/soc/bestechnic/bes2600/liteos_m/components/utils/src/printf.c`,本案例直接采用开源协议友好的实现。与`malloc`适配不同的是,这个函数由芯片原厂提供。因为就打印来说,根据项目的需要,实现可大可小,内核不方便提供统一的实现。 + +然后,在`//device/board/fnlink/v200zr/liteos_m/config.gni`的新增这些函数的wrap链接选项。 + +``` +board_ld_flags += [ + "-Wl,--wrap=printf", + "-Wl,--wrap=sprintf", + "-Wl,--wrap=snprintf", + "-Wl,--wrap=vsnprintf", + "-Wl,--wrap=vprintf", +] +``` + +#### open等适配 + +这部分实现由内核统一实现,芯片适配无须关注,内核文件`//kernel/liteos_m/kal/libc/newlib/porting/src/fs.c`,适配了`newlib`的`_read`、`_write`等函数,如下: + +``` +…… +ssize_t _read(int fd, void *buf, size_t nbyte) +{ + return LOS_Read(fd, buf, nbyte); +} + +ssize_t _write(int fd, const void *buf, size_t nbyte) +{ + return LOS_Write(fd, buf, nbyte); +} + +off_t _lseek(int fd, off_t offset, int whence) +{ + return LOS_Lseek(fd, offset, whence); +} +…… +``` + +## 板级系统移植 + +### 驱动移植 + +#### SoC芯片平台HDF驱动移植 + +驱动适配相关文件放置在`drivers/adapter/platform`中,对应有`gpio`,`i2c`,`pwm`,`spi`,`uart`,`watchdog`,都是通过`HDF`机制加载,本章节以`gpio`为例进行详细说明。 + +##### GPIO驱动适配 + +`gpio`驱动适配需要完成编译的适配、源码的适配。 + +在`//drivers/adapter/platform/gpio/BUILD.gn`文件中,描述了恒玄`gpio`驱动的编译适配。如下: + +``` +module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO) --- 如果打开HDF的GPIO配置开关,才进行如下编译 +module_name = get_path_info(rebase_path("."), "name") + +hdf_driver(module_name) { + sources = [] + if (defined(LOSCFG_SOC_COMPANY_BESTECHNIC)) { --- 如果打开恒玄的芯片配置开关,才进行恒玄GPIO的驱动编译 + sources += [ "gpio_bes.c" ] + } + + include_dirs = [ "." ] +} +``` + +在`//drivers/adapter/platform/gpio/gpio_bes.c`文件中,描述了恒玄`gpio`驱动的源码适配。 +首先,按照`OpenHarmony`的`HDF`驱动框架加载驱动基本适配框架,如下: + +``` +struct HdfDriverEntry g_GpioDriverEntry = { + .moduleVersion = 1, + .moduleName = "BES_GPIO_MODULE_HDF", + .Bind = GpioDriverBind, + .Init = GpioDriverInit, + .Release = GpioDriverRelease, +}; +HDF_INIT(g_GpioDriverEntry); --- 通过HDF_INIT 加载GPIO驱动 +``` + +然后,在初始化的时候会获取`hcs`参数进行初始化,如下: + +``` +static int32_t GpioDriverInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct GpioCntlr *gpioCntlr = NULL; + + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + gpioCntlr = GpioCntlrFromDevice(device); --- gpioCntlr节点变量就可以获取具体gpio配置 + if (gpioCntlr == NULL) { + ... +``` + +编码规范和设计思想见[bes 驱动适配PR](https://gitee.com/openharmony/drivers_adapter/pulls/278)的评论。 + +#### Board外设器件HDF驱动移植 + +`Board`外设器件表示通过`SoC`平台总线连接的外设器件,在本案例中,显示屏属于外设器件,其驱动适配放在`//device/board/fnlink/drivers/liteos_m`目录中。 + +##### 显示驱动适配 + +同`SoC`驱动适配,在`//device/board/fnlink/drivers/liteos_m/display/BUILD.gn`文件中,根据`hdf_driver`模板加载驱动模块,如下: + +``` +module_name = get_path_info(rebase_path("."), "name") +hdf_driver(module_name) { + sources = [ + "zzw395.c", + ] + include_dirs = [ + "//drivers/peripheral/display/interfaces/include", + ... + ] +} +``` + +在`//device/board/fnlink/drivers/liteos_m/display/zzw395.c`文件中,根据驱动框架加载显示驱动,如下: + +``` +static struct HdfDriverEntry g_ZZW395DriverEntry = { + .moduleVersion = 1, + .moduleName = "HDF_PANEL_ZZW395", + .Bind = PanelDriverBind, + .Init = PanelDriverInit, + .Release = PanelDriverRelease, +}; + +HDF_INIT(g_ZZW395DriverEntry); +``` + +其中的驱动参数根据`hcs`配置,在`PanelDriverInit`初始化时加载,如下: + +``` +static int32_t PanelDriverInit(struct HdfDeviceObject *object) +{ + if (object == NULL) { + return HDF_FAILURE; + } + HDF_LOGD("%s entry !!!", __func__); + if (object->property) { + if (PanelGetResource(&priv, object->property) != HDF_SUCCESS) { + HDF_LOGE("%s: PanelGetResource failed", __func__); + return HDF_FAILURE; + } + } +... +``` + +### OpenHarmony子系统适配 + +`OpenHarmony`子系统适配一般包含两部分: + +- 在`config.json`中增加对应子系统和部件,这样编译系统会将该部件纳入编译目标中。 +- 针对该部件的`HAL`层接口进行硬件适配,或者可选的软件功能适配。 + +#### communication子系统适配 + +##### wifi_lite部件适配 + +首先,在`config.json`文件中,增加`communication`子系统的`wifi_lite`部件,如下: + +``` + { + "subsystem": "communication", + "components": [ + { + "component": "wifi_lite", + "optional": "true" + } + ] + }, +``` + +`wifi_lite`部件在`//build/lite/components/communication.json`文件中,描述如下: + +``` + { + "component": "wifi_lite", +…… + "targets": [ + "//foundation/communication/wifi_lite:wifi" --- wifi_lite的编译目标 + ], +…… + }, + +``` + +在`//foundation/communication/wifi_lite/BUILD.gn`文件中,描述需要适配的接口头文件路径,如下: + +``` +config("include") { + include_dirs = [ "interfaces/wifiservice" ] --- 因为wifi_lite只提供头文件,不提供wifi的具体实现,所以wifi模块暴露出适配的目录路径提供给硬件厂商来适配,厂商提供wifi协议栈源码实现。 +} + +group("wifi") { + public_configs = [ ":include" ] +} +``` + +因为在本案例中,`wifi`属于`SoC`提供的功能,所以适配源码放在`SoC`的`//device/soc/bestechnic/hals/communication/wifi_lite/wifiservice`目录下,包含`wifi_device.c`和`wifi_hotspot.c`分别适配`wifi_device.h`和`wifi_hotspot.h`。如下: + +``` +…… +WifiErrorCode Scan(void) --- wifi_device.c中扫描wifi热点的函数,对wifi_device.h中Scan函数的适配实现 +{ + WifiErrorCode ret = ERROR_WIFI_BUSY; + + + if (IsWifiActive() != WIFI_STA_ACTIVE) + return ERROR_WIFI_IFACE_INVALID; + + if (g_HalHmosWifiInfo.scan_state == SCAN_REQUEST || + g_HalHmosWifiInfo.scan_state == SCAN_TRIGGER) + return ERROR_WIFI_BUSY; + + HalHmosWifiLock(); + ret = ((HalHmosSendEvent(HMOS_ON_WIFI_SCAN_STATE_CHANGED, NULL) == 0) ? WIFI_SUCCESS : ERROR_WIFI_BUSY); + HalHmosWifiUnLock(); + + return ret; +} +…… +int GetSignalLevel(int rssi, int band) --- wifi_hotspot.c中获取wifi信号热点函数,对wifi_hotspot.h中GetSignalLevel函数的适配实现。 +{ + if (band == HOTSPOT_BAND_TYPE_2G) { + if (rssi >= RSSI_LEVEL_4_2_G) + return RSSI_LEVEL_4; + if (rssi >= RSSI_LEVEL_3_2_G) + return RSSI_LEVEL_3; + if (rssi >= RSSI_LEVEL_2_2_G) + return RSSI_LEVEL_2; + if (rssi >= RSSI_LEVEL_1_2_G) + return RSSI_LEVEL_1; + } + + if (band == HOTSPOT_BAND_TYPE_5G) { + if (rssi >= RSSI_LEVEL_4_5_G) + return RSSI_LEVEL_4; + if (rssi >= RSSI_LEVEL_3_5_G) + return RSSI_LEVEL_3; + if (rssi >= RSSI_LEVEL_2_5_G) + return RSSI_LEVEL_2; + if (rssi >= RSSI_LEVEL_1_5_G) + return RSSI_LEVEL_1; + } + return ERROR_WIFI_INVALID_ARGS; +} +``` + +##### LWIP部件适配 + +`LiteOS-M kernel`目录下默认配置了`lwip`,因而具有编译功能,可以在`kernel`组件中指定`lwip`编译的目录。如下: + +``` + { + "subsystem": "kernel", + "components": [ + { + "component": "liteos_m", + "features": [ + "ohos_kernel_liteos_m_lwip_path = \"//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1\"" --- 指定在芯片厂商目录中进行适配 + ] + } + ] + }, +``` + +在`//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/BUILD.gn`文件中,描述了`lwip`的编译,如下: + +``` +import("//kernel/liteos_m/liteos.gni") +import("$LITEOSTHIRDPARTY/lwip/lwip.gni") +import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni") + +module_switch = defined(LOSCFG_NET_LWIP_SACK) +module_name = "lwip" +kernel_module(module_name) { + sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - + [ "$LWIPDIR/api/sockets.c" ] + [ "porting/src/ethernetif.c" ] --- 增加ethernetif.c文件,用以适配ethernet网卡的初始化适配 + defines = [ "LITEOS_LWIP=1" ] + defines += [ "CHECKSUM_BY_HARDWARE=1" ] +} + +config("public") { + defines = [ "_BSD_SOURCE=1" ] + include_dirs = + [ "porting/include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS +} + +``` + +在`//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/porting/include/lwip/lwipopts.h`文件中,说明原有`lwip`配置选项保持不变,软总线会依赖这些配置选项,并且新增硬件适配的配置项,如下: + +``` +#ifndef _PORTING_LWIPOPTS_H_ +#define _PORTING_LWIPOPTS_H_ + +#include_next "lwip/lwipopts.h" --- 保持原来的配置项不变 + +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_CHECKSUM_ON_COPY 0 +#define CHECKSUM_GEN_UDP 0 --- 新增硬件适配选项 + +#endif /* _PORTING_LWIPOPTS_H_ */ + +``` + +在`//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/porting/src/ethernetif.c`文件中,说明对`ethernet`网卡初始化的适配,如下: + +``` +err_t +ethernetif_init(struct netif *netif) +{ +…… +#ifdef CHECKSUM_BY_HARDWARE + eth_hw_checksum_init(); +#endif +…… + netif->linkoutput = low_level_output; + + netif->drv_send = liteos_low_level_output; + netif->hwaddr_len = NETIF_MAX_HWADDR_LEN; + low_level_init(netif); + driverif_init(netif); + return ERR_OK; +…… +} +``` + +#### 系统基本能力适配 + +本小节主要从移植的角度出发,分析适配过程中,需要操作或者注意的事项。 + +##### startup子系统适配 + +``startup`子系统适配`bootstrap_lite`/`syspara_lite`两个部件。请在`vendor/bestechnic_bak/display_demo/config.json`中新增对应的配置选项。 + +``` +{ + "subsystem": "startup", + "components": [ + { + "component": "bootstrap_lite" --- bootstrap_lite 部件 + }, + { + "component": "syspara_lite", --- syspara_lite 部件 + "features": [ + "enable_ohos_startup_syspara_lite_use_posix_file_api = true" + ] + } + ] +}, +``` + +适配`bootstrap_lite`部件时,需要在连接脚本文件`//device/soc/bestechnic/bes2600/liteos_m/sdk/bsp/out/best2600w_liteos/_best2001.lds`中手动新增如下段: + +``` + __zinitcall_bsp_start = .; + KEEP (*(.zinitcall.bsp0.init)) + KEEP (*(.zinitcall.bsp1.init)) + KEEP (*(.zinitcall.bsp2.init)) + KEEP (*(.zinitcall.bsp3.init)) + KEEP (*(.zinitcall.bsp4.init)) + __zinitcall_bsp_end = .; + __zinitcall_device_start = .; + KEEP (*(.zinitcall.device0.init)) + KEEP (*(.zinitcall.device1.init)) + KEEP (*(.zinitcall.device2.init)) + KEEP (*(.zinitcall.device3.init)) + KEEP (*(.zinitcall.device4.init)) + __zinitcall_device_end = .; + __zinitcall_core_start = .; + KEEP (*(.zinitcall.core0.init)) + KEEP (*(.zinitcall.core1.init)) + KEEP (*(.zinitcall.core2.init)) + KEEP (*(.zinitcall.core3.init)) + KEEP (*(.zinitcall.core4.init)) + __zinitcall_core_end = .; + __zinitcall_sys_service_start = .; + KEEP (*(.zinitcall.sys.service0.init)) + KEEP (*(.zinitcall.sys.service1.init)) + KEEP (*(.zinitcall.sys.service2.init)) + KEEP (*(.zinitcall.sys.service3.init)) + KEEP (*(.zinitcall.sys.service4.init)) + __zinitcall_sys_service_end = .; + __zinitcall_sys_feature_start = .; + KEEP (*(.zinitcall.sys.feature0.init)) + KEEP (*(.zinitcall.sys.feature1.init)) + KEEP (*(.zinitcall.sys.feature2.init)) + KEEP (*(.zinitcall.sys.feature3.init)) + KEEP (*(.zinitcall.sys.feature4.init)) + __zinitcall_sys_feature_end = .; + __zinitcall_run_start = .; + KEEP (*(.zinitcall.run0.init)) + KEEP (*(.zinitcall.run1.init)) + KEEP (*(.zinitcall.run2.init)) + KEEP (*(.zinitcall.run3.init)) + KEEP (*(.zinitcall.run4.init)) + __zinitcall_run_end = .; + __zinitcall_app_service_start = .; + KEEP (*(.zinitcall.app.service0.init)) + KEEP (*(.zinitcall.app.service1.init)) + KEEP (*(.zinitcall.app.service2.init)) + KEEP (*(.zinitcall.app.service3.init)) + KEEP (*(.zinitcall.app.service4.init)) + __zinitcall_app_service_end = .; + __zinitcall_app_feature_start = .; + KEEP (*(.zinitcall.app.feature0.init)) + KEEP (*(.zinitcall.app.feature1.init)) + KEEP (*(.zinitcall.app.feature2.init)) + KEEP (*(.zinitcall.app.feature3.init)) + KEEP (*(.zinitcall.app.feature4.init)) + __zinitcall_app_feature_end = .; + __zinitcall_test_start = .; + KEEP (*(.zinitcall.test0.init)) + KEEP (*(.zinitcall.test1.init)) + KEEP (*(.zinitcall.test2.init)) + KEEP (*(.zinitcall.test3.init)) + KEEP (*(.zinitcall.test4.init)) + __zinitcall_test_end = .; + __zinitcall_exit_start = .; + KEEP (*(.zinitcall.exit0.init)) + KEEP (*(.zinitcall.exit1.init)) + KEEP (*(.zinitcall.exit2.init)) + KEEP (*(.zinitcall.exit3.init)) + KEEP (*(.zinitcall.exit4.init)) + __zinitcall_exit_end = .; +``` + +需要新增上述段是因为`bootstrap_init`提供的对外接口,见`//utils/native/lite/include/ohos_init.h`文件,采用的是灌段的形式,最终会保存到上述链接段中。主要的服务自动初始化宏如下表格所示: + +| 接口名 | 描述 | +| ---------------------- | -------------------------------- | +| SYS_SERVICE_INIT(func) | 标识核心系统服务的初始化启动入口 | +| SYS_FEATURE_INIT(func) | 标识核心系统功能的初始化启动入口 | +| APP_SERVICE_INIT(func) | 标识应用层服务的初始化启动入口 | +| SYS_FEATURE_INIT(func) | 标识应用层功能的初始化启动入口 | + +![](../public_sys-resources/icon-note.gif) **说明:** + 通过上面加载的组件编译出来的lib文件需要手动加入强制链接。 + +​ 如在 `vendor/bestechnic/display_demo/config.json` 中配置了`bootstrap_lite` 部件 + +``` + { + "subsystem": "startup", + "components": [ + { + "component": "bootstrap_lite" + }, + ... + ] + }, +``` + +​ `bootstrap_lite`部件会编译`//base/startup/bootstrap_lite/services/source/bootstrap_service.c`,该文件中,通过`SYS_SERVICE_INIT`将`Init`函数符号灌段到`__zinitcall_sys_service_start`和`__zinitcall_sys_service_end`中,由于`Init`函数是没有函数显示调用它,所以需要将它强制链接到最终的镜像。如下: + +``` +static void Init(void) +{ + static Bootstrap bootstrap; + bootstrap.GetName = GetName; + bootstrap.Initialize = Initialize; + bootstrap.MessageHandle = MessageHandle; + bootstrap.GetTaskConfig = GetTaskConfig; + bootstrap.flag = FALSE; + SAMGR_GetInstance()->RegisterService((Service *)&bootstrap); +} +SYS_SERVICE_INIT(Init); --- 通过SYS启动即SYS_INIT启动就需要强制链接生成的lib +``` + +​ 在`//base/startup/bootstrap_lite/services/source/BUILD.gn`文件中,描述了在`out/v200zr/display_demo/libs` 生成 `libbootstrap.a`,如下: + +``` +static_library("bootstrap") { + sources = [ + "bootstrap_service.c", + "system_init.c", + ] + .... +``` + +​ 那么需要在 `vendor/bestechnic/display_demo/config.json` 配置强制链接库`bootstrap`,如下: + +``` + "bin_list": [ + { + "elf_name": "wifiiot", + "bsp_target_name": "best2600w_liteos", + "signature": "false", + "burn_name": "rtos_main", + "enable": "true", + "force_link_libs": [ + "bootstrap", --- 强制链接libbootstrap.a + ... + ] + }, +``` + + + +适配`syspara_lite`部件时,系统参数会最终写到文件中进行持久化保存。在轻量系统中,文件操作相关接口有`POSIX`接口与`HalFiles`接口这两套实现。 + +因为对接内核的文件系统,采用`POSIX`相关的接口,所以`features`字段中需要增加`enable_ohos_startup_syspara_lite_use_posix_file_api = true`。 + +如果对接`HalFiles`相关的接口实现的,则无须修改。 + +在适配`GetSerial`接口时,开发板不像产线生产过程那样,会写入一个具体的`Serial Number`,因而需要确定一个数据对开发板进行唯一标识。本案例采用`WiFi Mac`地址进行适配。 + +``` +#define ETH_ALEN 6 +#define MAC_BITS 4 +#define MAC_HIGH_MASK 0xf0 +#define MAC_LOW_MASK 0x0f +#define HEX_A 0xa +#define CHAR_NUM_OFFSET 0x30 +#define CHAR_CAPITAL_OFFSET 0x37 +#define STR_END_FLAG '\0' + +typedef unsigned char u8; + +static char serialNumber[2*ETH_ALEN + 1]; --- 最后一位留作'\0'结束符标识 + + +static char Hex2Char(u8 hex) +{ + if (hex < HEX_A) { + return hex + CHAR_NUM_OFFSET; --- 将数值0转为char的'0' + } else { + return hex + CHAR_CAPITAL_OFFSET; --- 将数值0xa转为char的'A' + } +} + +const char* HalGetSerial(void) +{ + char macAddr[ETH_ALEN]; + // as devboard has no production serial number, we just + // use wifi mac address as device serial number. + if (serialNumber[0] == STR_END_FLAG) { --- 只有第一次调用时,才去获取mac地址 + extern int bwifi_get_own_mac(u8 *addr); + bwifi_get_own_mac(macAddr); --- 获取mac地址 + int j = 0; + for (int i = 0; i < ETH_ALEN; i++) { + u8 lowFour, highFour; + highFour = (macAddr[i] & MAC_HIGH_MASK) >> MAC_BITS; + serialNumber[j] = Hex2Char(highFour); + j++; + lowFour = macAddr[i] & MAC_LOW_MASK; + serialNumber[j] = Hex2Char(lowFour); + j++; + } --- 将mac地址值转化为serial number + } + return serialNumber; +} +``` + + + +##### hiviewdfx子系统适配 + +进行`hiviewdfx`子系统适配需要添加`hilog_lite`部件,直接在`config.json`文件配置即可。 + +``` +{ + "subsystem": "hiviewdfx", + "components": [ + { + "component": "hilog_lite", + "optional": "true" + } + ] +}, +``` + +配置完成之后,在`//device/soc/bestechnic/bes2600/liteos_m/components/utils/src/hm_sys.c`中注册日志输出实现函数。 + +``` +boolean HilogProc_Impl(const HiLogContent *hilogContent, uint32 len) +{ + char tempOutStr[LOG_FMT_MAX_LEN] = {0}; + if (LogContentFmt(tempOutStr, sizeof(tempOutStr), hilogContent) > 0) { + printf(tempOutStr); +#ifdef LOG_FLUSH + hHiviewRegisterHilogProc(HilogProc_Impl);al_trace_flush_buffer(); +#endif + } + return TRUE; +} + +HiviewRegisterHilogProc(HilogProc_Impl); +``` + +##### distributedschedule子系统适配 + +进行`distributedschedule`子系统适配需要添加`samgr_lite`部件,直接在`config.json`配置即可。 + +``` +{ + "subsystem": "distributedschedule", + "components": [ + { + "component": "samgr_lite", + "features": [ + "config_ohos_distributedschedule_samgr_lite_shared_task_size = 4096" + ] + } + ] +}, +``` + +在轻量系统中,`samgr_lite`配置的共享任务栈大小默认为`0x800`。当函数调用栈较大时,会出现栈溢出的问题。在本次适配过程中,将其调整为`0x1000`。 + +##### utils子系统适配 + +进行`utils`子系统适配需要添加`kv_store`/`js_builtin`/`timer_task`/`kal_timer`部件,直接在`config.json`配置即可。 + +``` +{ + "subsystem": "utils", + "components": [ + { + "component": "kv_store", + "features": [ + "enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true" + ] + }, + { + "component": "js_builtin" + }, + { + "component": "timer_task" + }, + { + "component": "kal_timer", + } + ] +}, +``` + +与适配`syspara_lite`部件类似,适配`kv_store`部件时,键值对会写到文件中。在轻量系统中,文件操作相关接口有`POSIX`接口与`HalFiles`接口这两套实现。因为对接内核的文件系统,采用`POSIX`相关的接口,所以`features`需要增加`enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true`。如果对接`HalFiles`相关的接口实现的,则无须修改。 + +#### 图形显示子系统适配 + +##### graphic子系统适配 + +进行`graphic`子系统适配需要添加`graphic_utils`部件,直接在`config.json`配置即可。 + +``` + "components": [ + { + "component": "graphic_utils", + "features": [ + "enable_ohos_graphic_utils_product_config = true" + ] + }, + { + "component": "ui" + } + ] + } +``` + +`graphic`配置文件见 `//vendor/bestechnic/display_demo/graphic_config/product_graphic_lite_config.h`。 + +`graphic`适配见`//device/soc/bestechnic/bes2600/liteos_m/components/ui`, 主要功能如下: + +- `display_device`:实例化`BaseGfxEngine`。 +- `touch_input`:实例化`PointerInputDevice`。 +- `UiMainTask`:初始化字体引擎,执行渲染任务等。 + +`graphic`子系统层次: + +``` +aafwk_lite + appexecfwk_lite (AMS + BMS) + | +ace_engine_lite + jerryscript + i18n_lite + resmgr_lite + utils/native/lite/... (ACE,JS引擎及其依赖) + | +graphic_ui + graphic_utils (图形框架) + | +giflib + libjpeg + libpng + qrcodegen + freetype... (图形第三方库) +``` + +图形应用示例见文件`//vendor/bestechnic/display_demo/tests/app.cpp`,如下: + +``` +/* ui app entry */ +void RunApp() +{ +#ifdef UI_TEST + AnimatorDemoStart(); --- native ui demo +#elif defined(ABILITY_TEST) + StartJSApp(); --- js demo +#endif +} + +void AppEntry(void) +{ + UiMain(); +} + +APP_FEATURE_INIT(AppEntry); +``` + +##### ace子系统适配 + +进行`ace`子系统适配需要添加`ace_engine_lite`部件,直接在`config.json`配置即可。 + + { + "subsystem": "ace", + "components": [ + { + "component": "ace_engine_lite", + "features": [ + "enable_ohos_ace_engine_lite_product_config = true" + ] + } + ] + }, + +`ace_engine_lite`部件配置文件见 `//vendor/bestechnic/display_demo/ace_lite_config/product_acelite_config.h`。 + +`ace_lite`的应用采用js语言进行开发,详细步骤如下: + +1. 用`DevEco Studio`编写js应用,参考[轻量级智能穿戴开发](https://developer.harmonyos.com/cn/docs/documentation/doc-references/lite-wearable-file-0000001176751380)。 +2. 使用预览功能进行预览,并且得到js包:`entry\.preview\intermediates\res\debug\lite\assets\js\default`。 +3. 将js包放到对应的文件系统目录下,文件系统路径为`vendor/bestechnic/display_demo/fs/data/data/js`,如下: + +``` +├── app.js +├── common +├── i18n +├── manifest.json +└── pages +``` + +4. 最终编译生成系统镜像,烧录到单板后,系统会从`app.js`加载启动`ace`的应用。 + +##### aafwk子系统适配 + +进行`aafwk`子系统适配需要添加`aafwk_lite`部件,直接在`config.json`配置即可。 + +``` + { + "subsystem": "aafwk", + "components": [ + { + "component": "aafwk_lite", + "features": [ + "enable_ohos_appexecfwk_feature_ability = true", --- 支持FA特性,即包含图形能力 + "config_ohos_aafwk_ams_task_size = 4096" --- 配置ams栈的大小 + ] + } + ] + }, +``` + +`aafwk_lite`相关的应用样例见`vendor/bestechnic/display_demo/tests/ability`目录,包含`launcher`和`js app`这两类应用,应用的函数调用流程描述如下: + +1. `launcher`应用,通过`InstallLauncher`安装`BundleName`为 `"com.huawei.launcher"`的`native ui`应用,在`AbilityMgrSliteFeature`启动后会调用`AbilityMgrHandler::StartLauncher()`启动`launcher`应用。 + +2. `StartJSApp`应用,通过`StartAbility`启动任意`Want`,通过将`want data`传递`JS_APP_PATH`, + `SetWantData(&want, JS_APP_PATH, strlen(JS_APP_PATH) + 1)`。 + +##### appexecfwk子系统适配 + +进行`appexecfwk`子系统适配需要添加`appexecfwk_lite`部件,直接在`config.json`配置即可。 + +``` + { + "subsystem": "appexecfwk", + "components": [ + { + "component": "appexecfwk_lite" + } + ] + }, +``` + +## PCS兼容性认证 + +### XTS用例 + +`XTS`测试参考资料见[xts参考资料](https://www.openharmony.cn/xts/),进行`XTS`子系统适配需要添加`xts_acts`/`xts_tools`部件,直接在`config.json`配置即可,配置如下: + + { + "subsystem": "xts", + "components": [ + { "component": "xts_acts", "features": + [ + "config_ohos_xts_acts_utils_lite_kv_store_data_path = \"/data\"", + "enable_ohos_test_xts_acts_use_thirdparty_lwip = true" + ] + }, + { "component": "xts_tools", "features":[] } + ] + } + +其中, + +- `config_ohos_xts_acts_utils_lite_kv_store_data_path` 是配置挂载文件系统根目录的名字。 +- `enable_ohos_test_xts_acts_use_thirdparty_lwip` 表示如果使用`thirdparty/lwip`目录下的源码编译,则设置为`true`,否则设置为`false`。 + +全部跑完会有显示`xx Tests xx Failures xx Ignored`,如下: + +``` +... +[16:53:43:438]../../../test/xts/acts/utils_lite/kv_store_hal/src/kvstore_func_test.c:793:testKvStoreMaxSize004:PASS +[16:53:43:438]+-------------------------------------------+ +[16:53:43:438] +[16:53:43:438]----------------------- +[16:53:43:438]32 Tests 0 Failures 0 Ignored +[16:53:43:438]OK +[16:53:43:439]All the test suites finished! +``` + +### 报告提交 + +将上图`XTS`用例的情况保存为测试报告,上传到`OpenHarmony`兼容性测试网站进行认证,作为`sig`仓库转正到`master`仓库的必要条件。详细步骤如下: + +步骤1:将`XTS`测试报告压缩成`zip`文件。 + +步骤2:生成测试报告的`SHA`校验码。本案例是将`zip`文件传到在线生成`hash`的[网站]( https://tool.lmeee.com/jiami/filehash)生成`SHA`校验码。 + +步骤3:进入`OpenHarmony`[兼容性测试网站](https://www.openharmony.cn/old/#/Compatibility_test)上传报告。 + + - 其中`API Level`填写报告中的`"sdkApiLevel"`字段 + - `OS`版本号填写报告中的`"OS Version"`字段。 + +步骤4:点击`个人空间`-`我的兼容性测试`看到查看审核状态。 +![审核状态](figure/bes2600_xts_state.png) + +## todo + +后续会补充以下方面的移植: + +- 蓝牙 +- `bms`包安装 +- 音频播放 +- 验证运行`JS`的`bytecode` +- 分布式能力:`dsoftbus`、`dms`、`dm` +- 分布式音乐播放器样例 + diff --git a/zh-cn/device-dev/porting/porting-minichip-cases.md b/zh-cn/device-dev/porting/porting-minichip-cases.md new file mode 100644 index 0000000000..7eeeed62ab --- /dev/null +++ b/zh-cn/device-dev/porting/porting-minichip-cases.md @@ -0,0 +1,4 @@ +# 轻量系统芯片移植案例 + +- **[轻量带屏解决方案之恒玄芯片移植案例](porting-bes2600w-on-minisystem-display-demo.md)** + diff --git a/zh-cn/readme.md b/zh-cn/readme.md index ac183bb6a8..e441fb9d73 100644 --- a/zh-cn/readme.md +++ b/zh-cn/readme.md @@ -24,6 +24,7 @@ - porting:移植适配 - [轻量和小型系统三方库移植指导](device-dev/porting/porting-thirdparty.md) - [轻量系统芯片移植指导](device-dev/porting/porting-minichip.md) + - [轻量系统芯片移植案例](device-dev/porting/porting-minichip-cases.md) - [小型系统芯片移植指导](device-dev/porting/porting-smallchip.md) - bundles:HPM Bundle开发 -- GitLab