From 77cf2bb8e38aee5e55e7189346d8a5d15b3d800c Mon Sep 17 00:00:00 2001 From: weicheng Date: Wed, 6 Apr 2022 17:54:01 +0800 Subject: [PATCH] update asr582x porting doc Signed-off-by: weicheng --- zh-cn/device-dev/porting/Readme-CN.md | 1 + .../porting/figures/asr5822s_select.png | Bin 0 -> 15133 bytes .../figures/asr582x_dsoftbus_join_LNN.png | Bin 0 -> 46649 bytes .../porting/figures/asr582x_ohos_config.png | Bin 0 -> 7399 bytes .../porting/porting-asr582x-combo-demo.md | 683 ++++++++++++++++++ .../porting/porting-minichip-cases.md | 2 +- 6 files changed, 685 insertions(+), 1 deletion(-) mode change 100755 => 100644 zh-cn/device-dev/porting/Readme-CN.md create mode 100644 zh-cn/device-dev/porting/figures/asr5822s_select.png create mode 100644 zh-cn/device-dev/porting/figures/asr582x_dsoftbus_join_LNN.png create mode 100644 zh-cn/device-dev/porting/figures/asr582x_ohos_config.png create mode 100755 zh-cn/device-dev/porting/porting-asr582x-combo-demo.md diff --git a/zh-cn/device-dev/porting/Readme-CN.md b/zh-cn/device-dev/porting/Readme-CN.md old mode 100755 new mode 100644 index a9416ed929..eaf9ebad40 --- a/zh-cn/device-dev/porting/Readme-CN.md +++ b/zh-cn/device-dev/porting/Readme-CN.md @@ -61,4 +61,5 @@ repo init -u https://gitee.com/openharmony-sig/manifest.git -b master -m devboar - [轻量系统芯片移植案例](porting-minichip-cases.md) - [带屏解决方案之恒玄芯片移植案例](porting-bes2600w-on-minisystem-display-demo.md) + - [Combo解决方案之ASR芯片移植案例](porting-asr582x-combo-demo.md) diff --git a/zh-cn/device-dev/porting/figures/asr5822s_select.png b/zh-cn/device-dev/porting/figures/asr5822s_select.png new file mode 100644 index 0000000000000000000000000000000000000000..98f06026b478f6a12877019bd72e8c35a4c72f8a GIT binary patch literal 15133 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 literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/figures/asr582x_dsoftbus_join_LNN.png b/zh-cn/device-dev/porting/figures/asr582x_dsoftbus_join_LNN.png new file mode 100644 index 0000000000000000000000000000000000000000..679492eb747960ea6a3111d1bc91d42a491646f7 GIT binary patch literal 46649 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 Ks#VI*BK`+VS(?-U literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/porting/porting-asr582x-combo-demo.md b/zh-cn/device-dev/porting/porting-asr582x-combo-demo.md new file mode 100755 index 0000000000..dc07773c0d --- /dev/null +++ b/zh-cn/device-dev/porting/porting-asr582x-combo-demo.md @@ -0,0 +1,683 @@ + + +# Combo解决方案之ASR芯片移植案例 + +本方案基于OpenHarmony LiteOS-M内核,使用ASR582X芯片的[DEV.WIFI.A开发板](https://gitee.com/openharmony/device_board_lango)进行开发移植。作为典型的IOT Combo(Wi-Fi+BLE)解决方案,本文章介绍ASR582X的适配过程。 + +## 编译移植 + +### 目录规划 + +本方案的目录结构使用[Board和Soc解耦的思路](https://gitee.com/openharmony-sig/sig-content/blob/master/devboard/docs/board-soc-arch-design.md): + +``` +device +├── board --- 单板厂商目录 +│   └── lango --- 单板厂商名字:朗国 +│   └── dev_wifi_a --- 单板名:DEV.WIFI.A +└── soc --- SoC厂商目录 + └── asrmicro --- SoC厂商名字:翱捷科技 + └── asr582x --- SoC Series名:ASR582X系列芯片 +``` + +产品样例目录规划为: + +``` +vendor +└── asrmicro --- 开发产品样例厂商目录,翱捷科技的产品样例 + ├── wifi_demo --- 产品名字:Wi-Fi样例代码 + └── xts_demo --- 产品名字: XTS测试样例 +``` + +### 产品定义 + +以`vendor/asrmicro/wifi_demo`为例,这里描述了产品使用的内核、单板、子系统等信息。其中,内核、单板型号、单板厂商需要提前规划好,也是预编译指令(`hb set`)所关注的。这里填入的信息与规划的目录相对应。例如: + +``` +{ + "product_name": "wifi_demo", --- 产品名 + "type": "mini", --- 系统类型: mini + "version": "3.0", --- 系统版本: 3.0 + "device_company": "lango", --- 单板厂商:lango + "board": "dev_wifi_a", --- 单板名:dev_wifi_a + "kernel_type": "liteos_m", --- 内核类型:liteos_m + "kernel_version": "3.0.0", --- 内核版本:3.0.0 + "subsystems": [] --- 子系统 +} +``` +这里的device_company和board用于关联出//device/board//目录。 + +### 单板配置 + +在关联到的目录下,以`device/board/lango/dev_wifi_a`为例,需要在liteos_m目录下放置config.gni文件,这个配置文件用于描述该单板的信息,包括cpu、toolchain、kernel、compile flags等。例如: + +``` +# 内核类型 +kernel_type = "liteos_m" + +# 内核版本 +kernel_version = "3.0.0" + +# 单板CPU类型 +board_cpu = "cortex-m4" + +# 工具链,这里使用arm-none-eabi +board_toolchain = "arm-none-eabi" + +# 工具链路径,可以使用系统路径,填"",也可以自定义,如下: +board_toolchain_path = rebase_path("//device/soc/asrmicro/gcc/gcc-arm-none-eabi/Linux64/bin") + +# 单板相关的编译参数 +board_cflags = [] + +# 单板相关的链接参数 +board_ld_flags = [] + +# 单板相关的头文件 +board_include_dirs = [] +``` + +### 预编译 + +在正确配置好产品的目录、产品定义、单板配置后,在工程根目录下输入预编译指令`hb set`,在显示的列表中就可以找到相关的产品。 + +![ohos_config.json](figures/asr582x_ohos_config.png) + +选择好产品后,输入回车就会在根目录下自动生成`ohos_config.json`文件,这里会将要编译的产品信息列出。 + + +## 内核移植 + +### Kconfig适配 + +在//kernel/liteos_m的编译中,需要在相应的单板以及SoC目录下使用`Kconfig`文件进行索引。 + +单板目录的`Kconfig`,以`//device/board/lango`为例: +``` +├── dev_wifi_a --- dev_wifi_a单板配置目录 +│   ├── Kconfig.liteos_m.board --- 单板的配置选项 +│   ├── Kconfig.liteos_m.defconfig.board --- 单板的默认配置项 +│   └── liteos_m +│   └── config.gni --- 单板的配置文件 +├── Kconfig.liteos_m.boards --- 单板厂商下Boards配置信息 +└── Kconfig.liteos_m.defconfig.boards --- 单板厂商下Boards默认配置信息 +``` + +在 `dev_wifi_a/Kconfig.liteos_m.board`中,配置只有SOC_ASR5822S被选后,BOARD_DEV_WIFI_A才可被选: + +``` +config BOARD_DEV_WIFI_A + bool "select board DEV_WIFI_A" + depends on SOC_ASR5822S +``` + +SoC目录的`Kconfig`,以`//device/soc/asrmicro`为例: + +``` +├── asr582x --- ASR582X系列 +│ ├── Kconfig.liteos_m.defconfig.asr5822s --- ASR5822S芯片默认配置 +│ ├── Kconfig.liteos_m.defconfig.series --- ASR582X系列默认配置 +│ ├── Kconfig.liteos_m.series --- ASR582X系列配置 +│ └── Kconfig.liteos_m.soc --- ASR582X芯片配置 +├── Kconfig.liteos_m.defconfig --- SoC默认配置 +├── Kconfig.liteos_m.series --- Series配置 +└── Kconfig.liteos_m.soc --- SoC配置 +``` + +在 asr582x/Kconfig.liteos_m.series中: + +``` +config SOC_SERIES_ASR582X + bool "ASR582X Series" + select ARM + select SOC_COMPANY_ASRMICRO --- 选择 SOC_COMPANY_ASRMICRO + select CPU_CORTEX_M4 + help + Enable support for ASR582X series +``` + +只有选择了 SOC_SERIES_ASR582X,在 asr582x/Kconfig.liteos_m.soc中才可以选择SOC_ASR5822S: + +``` +choice + prompt "ASR582X series SoC" + depends on SOC_SERIES_ASR582X + +config SOC_ASR5822S --- 选择 SOC_ASR5822S + bool "SoC ASR5822S" + +endchoice +``` + +综上所述,要编译单板BOARD_DEV_WIFI_A,则要分别选中:SOC_COMPANY_ASRMICRO、SOC_SERIES_ASR582X、SOC_ASR5822S,可以在`kernel/liteos_m`中执行`make menuconfig`进行选择配置 + +![asr5822s_select.json](figures/asr5822s_select.png) + +配置后的文件会默认保存在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`,也可以直接填写debug.config: + +``` +LOSCFG_BOARD_DEV_WIFI_A=y +LOSCFG_SOC_COMPANY_ASRMICRO=y +LOSCFG_SOC_SERIES_ASR582X=y +LOSCFG_SOC_ASR5822S=y +``` + +### 模块化编译 + +`Board`和`SoC`的编译采用模块化的编译方法,从`kernel/liteos_m/BUILD.gn`开始逐级向下递增。本方案的适配过程如下: + +1. 在`//device/board/lango`中新建文件BUILD.gn,新增内容如下: + + ``` + if (ohos_kernel_type == "liteos_m") { + import("//kernel/liteos_m/liteos.gni") + module_name = get_path_info(rebase_path("."), "name") + module_group(module_name) { + modules = [ + "dev_wifi_a", --- 单板模块 + "hcs", --- hcs文件的对应模块 + ] + } + } + ``` + + 在上述BUILD.gn中,dev_wifi_a以及hcs即是按目录层级组织的模块名。 + +2. 在`//device/soc/asrmicro`中,使用同样的方法,新建文件BUILD.gn,按目录层级组织,新增内容如下: + + ``` + if (ohos_kernel_type == "liteos_m") { + import("//kernel/liteos_m/liteos.gni") + module_name = get_path_info(rebase_path("."), "name") + module_group(module_name) { + modules = [ + "asr582x", + ] + } + } + ``` + +3. 在`//device/soc/asrmicro`各个层级模块下,同样新增文件BUILD.gn,将该层级模块加入编译,以`//device/soc/asrmicro/asr582x/liteos_m/sdk/startup/BUILD.gn`为例: + + ``` + import("//kernel/liteos_m/liteos.gni") + + config("public") { + include_dirs = [ "." ] --- 公共头文件 + } + + kernel_module("asr_startup") { --- 编译的模块 + sources = [ --- 编译的源文件 + "startup.c", + "board.c", + "startup_cm4.S", + ] + + include_dirs = [ --- 模块内使用到的头文件 + "...", + ] + } + ``` + +4. 为了组织链接以及一些编译选项,在`//device/soc/asrmicro/asr582x/liteos_m/sdk/config/BUILD.gn`下的config("public")填入了相应的参数: + + ``` + config("public") { + include_dirs = [] --- 公共头文件 + ldflags = [] --- 链接参数,包括ld文件 + libs = [] --- 链接库 + defines = [] --- 定义 + ``` + + ![](../public_sys-resources/icon-note.gif) **说明:** + 建议公共的参数选项以及头文件不在各个组件中重复填写。 + +5. 为了组织一些产品侧的应用,本方案在vendor相应的config.json加入了相应的list来组织,以`//vendor/asrmicro/wifi_demo/config.json`为例,在config.json增加对应的list: + ``` + "tests_list": [ --- demo list + { + "enable": "true", --- list开关 + "test_modules": [ + "example", --- OS基础demo + "wifi_test" --- Wi-Fi demo + ] + } + ] + ``` + + 这里将demo作为了模块来管理,开启/关闭某个demo,在tests_list中增减项即可。tests_list在gn中可以直接被读取,需要在`//device/board/lango/dev_wifi_a/liteos_m/config.gni`加入以下内容: + + ``` + product_conf = read_file("${product_path}/config.json", "json") + product_name = product_conf.product_name + tests_list = product_conf.tests_list + ``` + + 读取list后即可在相应的链接选项上加入相关的组件库,需要在`//device/soc/asrmicro/asr582x/liteos_m/sdk/config/BUILD.gn`加入以下内容: + + ``` + foreach(test_item, tests_list) { + test_enable = test_item.enable + if(test_enable == "true") + { + foreach(test_module, test_item.test_modules) { + ldflags += [ "-l${test_module}" ] + } + } + } + ``` + +### C库适配 + +为了整个系统不区分用户态内核态,上层组件与内核共用一套基于musl的C库,本方案使用musl C,三方库见`//third_party/musl/porting/liteos_m/kernel/BUILD.gn`。 + +kernel另外对malloc相应的code进行了改造适配,适配文件见`//kernel/liteos_m/kal/libc/musl/porting/src/malloc.c`。 + +在本方案中,printf相关的接口使用开源代码实现,适配文件见 `//device/soc/asrmicro/asr582x/liteos_m/sdk/drivers/platform/system/printf-stdarg.c`。 + +为了满足printf相关接口的链接调用,需要在`//device/board/lango/dev_wifi_a/liteos_m/config.gni`的新增这些函数的wrap链接: + +``` +board_ld_flags += [ + "-Wl,--wrap=printf", + "-Wl,--wrap=sprintf", + "-Wl,--wrap=snprintf", + "-Wl,--wrap=vprintf", + "-Wl,--wrap=vsprintf", + "-Wl,--wrap=vsnprintf", +] +``` +### shell适配 + +为了方便调试,本方案集成了内核的shell组件,可以在make menuconfig中的Debug中选中 Enable Shell,或者在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`文件中填入LOSCFG_SHELL=y +shell组件需要进行初始化,可参考`device/soc/asrmicro/asr582x/liteos_m/sdk/startup/board.c`: + +``` +ret = LosShellInit(); +if (ret != LOS_OK) { + printf("LosShellInit failed! ERROR: 0x%x\n", ret); +} +ret = OsShellInit(); +if (ret != LOS_OK) { + printf("OsShellInit failed! ERROR: 0x%x\n", ret); +} +``` + +在初始化之后,每个shell命令需要进行注册,例如:`vendor/asrmicro/wifi_demo/tests/wifi/wifi_app.c`: + +``` +osCmdReg(CMD_TYPE_STD, "wifi_open", 0, (CMD_CBK_FUNC)ap_conn_func); --- 连接AP的指令,这里可以带参 +osCmdReg(CMD_TYPE_EX, "wifi_close", 0, (CMD_CBK_FUNC)ap_close_func); --- 断开指令 +``` + +### 内核启动适配 + +单板进入到main函数后,首先会进行单板初始化,然后需要注册中断,之后再进行内核的初始化和调度。 +注册中断,可参考`//device/soc/asrmicro/asr582x/liteos_m/sdk/startup/board.c`: + +``` +ArchHwiCreate(UART1_IRQn,configLIBRARY_NORMAL_INTERRUPT_PRIORITY,0,UART1_IRQHandler,0); --- UART中断 +ArchHwiCreate(GPIO_IRQn,configLIBRARY_NORMAL_INTERRUPT_PRIORITY,0,GPIO_IRQHandler,0); --- GPIO中断 +``` + +内核初始化示例如下: +``` +osStatus_t ret = osKernelInitialize(); --- 内核初始化 + +if(ret == osOK) +{ + threadId = osThreadNew((osThreadFunc_t)sys_init,NULL,&g_main_task); --- 创建init线程 + + if(threadId!=NULL) + { + osKernelStart(); --- 线程调度 + } +} +``` + +在`sys_init`中,需要对Openharmony的系统组件进行初始化: + +``` +... +DeviceManagerStart(); --- HDF初始化 + +OHOS_SystemInit(); --- Openharmony系统组件初始化 +.... +``` + +### HDF驱动框架适配 + +HDF驱动框架提供了一套应用访问硬件的统一接口,可以简化应用开发,添加HDF组件需要在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`添加: + +``` +LOSCFG_DRIVERS_HDF=y +LOSCFG_DRIVERS_HDF_PLATFORM=y +``` + +同时需在board中新增对应开发板硬件配置描述文件,位于`//device/board/lango/hcs`。本案例以GPIO以及UART为例,移植过程如下: + +#### GPIO适配 + +1. 芯片驱动适配文件位于`//drivers/adapter/platform`目录,在gpio目录增加gpio_asr.c和gpio_asr.h文件,在BUILD.gn中增加新增的驱动文件编译条件: + + ``` + if (defined(LOSCFG_SOC_COMPANY_ASRMICRO)) { + sources += [ "gpio_asr.c" ] + } + ``` + +2. gpio_asr.c中驱动描述文件如下: + + ``` + struct HdfDriverEntry g_GpioDriverEntry = { + .moduleVersion = 1, + .moduleName = "ASR_GPIO_MODULE_HDF", + .Init = GpioDriverInit, + .Release = GpioDriverRelease, + }; + HDF_INIT(g_GpioDriverEntry); + ``` + +3. 在`//device/board/lango/hcs`添加gpio硬件描述信息文件gpio.hcs, 映射后的gpio0控制板卡上的可编程LED,gpio1对应用户按键,hcs内容如下: + + ``` + root { + platform { + gpio_config { + match_attr = "gpio_config"; + pin = [0, 1]; + // led3: GPIO9 + // user key: GPIO7 + realPin = [9, 7]; + config = [5, 1]; + pinNum = 2; + } + } + } + ``` + +4. gpio.hcs的配置信息会在GpioDriverInit进行加载,并执行对应GPIO引脚的初始化。应用层控制LED灯和读取按键信息只需要以下简单的代码: + + ``` + int32_t GpioKeyIrqFunc(uint16_t gpio, void *data) + { + printf("user key %d pressed\n", gpio); + } + GpioSetIrq(1, OSAL_IRQF_TRIGGER_FALLING, GpioKeyIrqFunc, NULL); + + GpioWrite(0, 0); + lega_rtos_delay_milliseconds(1000); + GpioWrite(0, 1); + ``` + +#### UART适配 + +1. 芯片驱动适配文件位于`//drivers/adapter/platform`目录,在uart目录增加uart_asr.c和uart_asr.h文件,在BUILD.gn中增加新增的驱动文件编译条件: + + ``` + if (defined(LOSCFG_SOC_COMPANY_ASRMICRO)) { + sources += [ "uart_asr.c" ] + } + ``` + +2. uart_asr.c中驱动描述文件如下: + + ``` + struct HdfDriverEntry g_hdfUartDevice = { + .moduleVersion = 1, + .moduleName = "HDF_PLATFORM_UART", + .Bind = HdfUartDeviceBind, + .Init = HdfUartDeviceInit, + .Release = HdfUartDeviceRelease, + }; + + HDF_INIT(g_hdfUartDevice); + ``` + +3. 在`//device/board/lango/hcs`添加gpio硬件描述信息文件uart.hcs, hcs内容如下: + + ``` + controller_uart0 :: uart_controller { + match_attr = "asr582x_uart_0"; + port = 0; /* UART_ID_0 */ + + pin_tx_pin = 0; /* IO_PIN_10 */ + pin_tx_mux = 25; /* IO_MUX_2 */ + + pin_rx_pin = 1; /* IO_PIN_11 */ + pin_rx_mux = 25; /* IO_MUX_2 */ + tx_rx = 3; /* TX_RX MODE */ + } + ``` + +4. gpio.hcs的配置信息会在HdfUartDeviceInit进行加载,并执行对应串口引脚的初始化。应用层测试串口代码如下: + + ``` + DevHandle uart_handle = UartOpen(0); + UartSetBaud(uart_handle, 115200); + ... + attr.dataBits = UART_ATTR_DATABIT_8; + attr.parity = UART_ATTR_PARITY_NONE; + attr.stopBits = UART_ATTR_STOPBIT_1; + ret = UartSetAttribute(uart_handle, &attr); + ret = UartWrite(uart_handle, send_data, strlen(send_data)); + ret = UartRead(uart_handle, recv_data, sizeof(recv_data) - 1); + ... + ``` + +## Openharmony组件移植 + +子系统的编译选项入口在相应产品config.json下,以下以`//vendor/asrmicro/wifi_demo/config.json`为例。 + +### LWIP组件 + +lwip组件的源码在`//third_party/lwip`,Openharmony在kernel中做了定制化,`//kernel/liteos_m/components/net/lwip-2.1`,包括一些接口的重定义,结构体的重定义等。 + +移植过程可参考:[lwIP组件适配](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/porting-chip-board-lwip.md) + +本案例在config.json中设置lwip的路径如下: + + ``` + "subsystem": "kernel", + "components": [ + { + "component": "liteos_m", + "features": [ + "ohos_kernel_liteos_m_lwip_path = \"//device/soc/asrmicro/asr582x/liteos_m/components/net/lwip-2.1\"" + ] + } + ] + ``` + +另外,需在内核编译配置文件kernel_config/debug.config中,打开编译lwIP的开关 + +``` +LOSCFG_NET_LWIP=y +``` + +### security组件 + +security需要在config.json中打开相应的选项,本案例移植了三方库中的mbedtls(`//third_party/mbedtls`)作为加密模块,选项配置如下: + +``` +"subsystem": "security", +"components": [ + { "component": "huks", "features": + [ + ... + "ohos_security_huks_mbedtls_porting_path = \"//device/soc/asrmicro/asr582x/liteos_m/components/mbedtls\"" + ] + } +] +``` + +在上述目录中,需要对mbedtls做配置,可见`config/config_liteos_m.h`。需要注意的是,如果使用mbedtls的RNG的能力(比如dsoftbus组件在`//foundation/communication/dsoftbus/adapter/common/mbedtls/softbus_adapter_crypto.c`中有使用),要指定产生随机数的熵源。本案例使用了ASR582X的硬件随机数能力,需要打开如下宏定义: + +``` +#define MBEDTLS_ENTROPY_HARDWARE_ALT +``` + +打开此宏后,需要实现entropy_hardware_alt接口,可见`library/entropy_hardware_alt.c`。 + +### wifi_lite组件 + +wifi_lite组件的选项配置如下: + +``` +"subsystem": "communication", +"components": [ + { "component": "wifi_lite", "features":[] } + ] +``` + +与Wi-Fi有关的实现在`//device/soc/asrmicro/asr582x/liteos_m/sdk/hal/src/wifi_adapter.c`下。 + +本案例也提供了使用wifi_lite相关接口的Demo,可见`//vendor/asrmicro/wifi_demo/tests/wifi/wifi_app.c`,这里提供了两个连接的测试指令: + +表 1 ASR Wi-Fi 连接指令 + +| 指令 | 参数 | 说明 | +|------------|--------|--------| +| wifi_open | sta [SSID] [KEY] | 连接路由指令,例如:wifi_open sta ASR_AP test123456 | +| wifi_close | 无 | 断开连接指令 | + +### xts组件 + +xts组件的适配,以`//vendor/asrmicro/xts_demo/config.json`为例,需要加入组件选项: + +``` +"subsystem": "xts", +"components": [ + { "component": "xts_acts", "features": + [ + "enable_ohos_test_xts_acts_use_thirdparty_lwip = true" + ] + }, + { "component": "xts_tools", "features":[] } +] +``` + +另外,xts功能也使用了list来组织,可参考[模块化编译],在config.json文件中增减相应模块: + +``` +"xts_list": [ + { + "enable": "true", + "xts_modules": [ + "ActsKvStoreTest", + "ActsDfxFuncTest", + "ActsHieventLiteTest", + "ActsSamgrTest", + "ActsParameterTest", + "ActsWifiServiceTest", + "ActsWifiIotTest", + "ActsBootstrapTest" + ] + } +], +``` + +### dsoftbus组件 + +dsoftbus组件提供了设备间的发现连接、组网和传输能力,本方案以Wi-Fi设备间的软总线能力为例。 + +依赖组件:LWIP组件、security组件、wifi_lite组件。 + +前置条件:设备需先连接路由,所有的组网设备需在同一局域网中。 + +dsoftbus组件的选项配置如下: + +``` +"subsystem": "communication", +"components": [ + { "component": "dsoftbus", "features":[] } + ] +``` + +在`//vendor/asrmicro/wifi_demo`下提供了dsoftbus的测试Demo,打开该功能需修改`//vendor/asrmicro/wifi_demo/tests/BUILD.gn`: + +``` +declare_args() { + asr_dsoftbus_test = true --- 打开dsoftbus demo编译 +} +``` + +另外,需在`//vendor/asrmicro/wifi_demo/config.json`中添加dsoftbus_test模块: + +``` +"tests_list": [ + { + "enable": "true", + "test_modules": [ + "wifi_test", + "dsoftbus_test" --- 打开dsoftbus_test模块 + ] + } +] +``` + +dsoftbus组件的启动接口可参考`//vendor/asrmicro/wifi_demo/tests/dsoftbus/dsoftbus_app.c`: + +``` +InitSoftBusServer(); +``` + +dsoftbus组件的运行需至少预留80KB RAM,如资源不够,可对其它地方进行剪裁,例如LWIP组件,可修改 +`//kernel_liteos_m/blob/master/components/net/lwip-2.1/porting/include/lwip/lwipopts.h`: + +``` +#define TCPIP_THREAD_STACKSIZE 0x2000 --- 缩小TCPIP任务栈大小 +``` + +在communication_dsoftbus仓中,加入了-fPIC编译选项,这样会让编译器产生与位置无关代码,并使用相对地址,但是在LiteOS-M核中使用的是静态库,不推荐使用。 +建议开发者手动注释-fPIC编译选项,后续会推进Openharmony统一规划此编译选项的开关。修改方法是在如下的四个文件中,找到"-fPIC"选项,并全部注释: +`//foundation/communication/dsoftbus/core/common/BUILD.gn` +`//foundation/communication/dsoftbus/core/frame/BUILD.gn` +`//foundation/communication/dsoftbus/sdk/BUILD.gn` +`//foundation/communication/dsoftbus/components/nstackx_mini/nstackx_ctrl/BUILD.gn` + +软总线的组网需要通过设备认证,在研发阶段,可以把认证跳过,先行调试组网以及传输能力,需将文件`//foundation/communication/dsoftbus/core/authentication/src/auth_manager.c`中的HandleReceiveDeviceId函数替换为如下实现: + +``` +void HandleReceiveDeviceId(AuthManager *auth, uint8_t *data) +{ + uint8_t tempKey[SESSION_KEY_LENGTH] = {0}; + if (auth == NULL || data == NULL) { + SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid parameter"); + return; + } + if (AuthUnpackDeviceInfo(auth, data) != SOFTBUS_OK) { + SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthUnpackDeviceInfo failed"); + AuthHandleFail(auth, SOFTBUS_AUTH_UNPACK_DEVID_FAILED); + return; + } + if (auth->side == SERVER_SIDE_FLAG) { + if (EventInLooper(auth->authId) != SOFTBUS_OK) { + SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth EventInLooper failed"); + AuthHandleFail(auth, SOFTBUS_MALLOC_ERR); + return; + } + if (AuthSyncDeviceUuid(auth) != SOFTBUS_OK) { + AuthHandleFail(auth, SOFTBUS_AUTH_SYNC_DEVID_FAILED); + } + (void)memset_s(tempKey, SESSION_KEY_LENGTH, 1, SESSION_KEY_LENGTH); + AuthOnSessionKeyReturned(auth->authId, tempKey, SESSION_KEY_LENGTH); + return; + } + //VerifyDeviceDevLvl(auth); --- 这里注释认证过程 + (void)memset_s(tempKey, SESSION_KEY_LENGTH, 1, SESSION_KEY_LENGTH); + AuthOnSessionKeyReturned(auth->authId, tempKey, SESSION_KEY_LENGTH); +} +``` + +在正确配置并编译烧录后,设备使用wifi_open指令连接路由,连接成功后,设备会自动进行组网,如下为组网成功截图: + +![dsoftbus_join_LNN](figures/asr582x_dsoftbus_join_LNN.png) + + +其它组件的适配过程与官方以及其它厂商的过程类似,不再赘述。 + +## todo + +- 待支持BLE +- 待丰富Wi-Fi测试指令 \ No newline at end of file diff --git a/zh-cn/device-dev/porting/porting-minichip-cases.md b/zh-cn/device-dev/porting/porting-minichip-cases.md index 7eeeed62ab..420f1fd6ac 100644 --- a/zh-cn/device-dev/porting/porting-minichip-cases.md +++ b/zh-cn/device-dev/porting/porting-minichip-cases.md @@ -1,4 +1,4 @@ # 轻量系统芯片移植案例 - **[轻量带屏解决方案之恒玄芯片移植案例](porting-bes2600w-on-minisystem-display-demo.md)** - +- **[Combo解决方案之ASR芯片移植案例](porting-asr582x-combo-demo.md)** -- GitLab