1 2 3# Combo解决方案之ASR芯片移植案例 4 5本方案基于OpenHarmony LiteOS-M内核,使用ASR582X芯片的[DEV.WIFI.A开发板](https://gitee.com/openharmony/device_board_lango)进行开发移植。作为典型的IOT Combo(Wi-Fi+BLE)解决方案,本文章介绍ASR582X的适配过程。 6 7## 编译移植 8 9### 目录规划 10 11本方案的目录结构使用[Board和Soc解耦的思路](https://gitee.com/openharmony-sig/sig-content/blob/master/devboard/docs/board-soc-arch-design.md): 12 13``` 14device 15├── board --- 单板厂商目录 16│ └── lango --- 单板厂商名字:朗国 17│ └── dev_wifi_a --- 单板名:DEV.WIFI.A 18└── soc --- SoC厂商目录 19 └── asrmicro --- SoC厂商名字:翱捷科技 20 └── asr582x --- SoC Series名:ASR582X系列芯片 21``` 22 23产品样例目录规划为: 24 25``` 26vendor 27└── asrmicro --- 开发产品样例厂商目录,翱捷科技的产品样例 28 ├── wifi_demo --- 产品名字:Wi-Fi样例代码 29 └── xts_demo --- 产品名字: XTS测试样例 30``` 31 32### 产品定义 33 34以`vendor/asrmicro/wifi_demo`为例,这里描述了产品使用的内核、单板、子系统等信息。其中,内核、单板型号、单板厂商需要提前规划好,也是预编译指令(`hb set`)所关注的。这里填入的信息与规划的目录相对应。例如: 35 36``` 37{ 38 "product_name": "wifi_demo", --- 产品名 39 "type": "mini", --- 系统类型: mini 40 "version": "3.0", --- 系统版本: 3.0 41 "device_company": "lango", --- 单板厂商:lango 42 "board": "dev_wifi_a", --- 单板名:dev_wifi_a 43 "kernel_type": "liteos_m", --- 内核类型:liteos_m 44 "kernel_version": "3.0.0", --- 内核版本:3.0.0 45 "subsystems": [] --- 子系统 46} 47``` 48这里的device_company和board用于关联出//device/board/<device_company>/<board>目录。 49 50### 单板配置 51 52在关联到的<board>目录下,以`device/board/lango/dev_wifi_a`为例,需要在liteos_m目录下放置config.gni文件,这个配置文件用于描述该单板的信息,包括CPU、toolchain、kernel、compile flags等。例如: 53 54``` 55# 内核类型 56kernel_type = "liteos_m" 57 58# 内核版本 59kernel_version = "3.0.0" 60 61# 单板CPU类型 62board_cpu = "cortex-m4" 63 64# 工具链,这里使用arm-none-eabi 65board_toolchain = "arm-none-eabi" 66 67# 工具链路径,可以使用系统路径,填"",也可以自定义,如下: 68board_toolchain_path = rebase_path("//device/soc/asrmicro/gcc/gcc-arm-none-eabi/Linux64/bin") 69 70# 单板相关的编译参数 71board_cflags = [] 72 73# 单板相关的链接参数 74board_ld_flags = [] 75 76# 单板相关的头文件 77board_include_dirs = [] 78``` 79 80### 预编译 81 82在正确配置好产品的目录、产品定义、单板配置后,在工程根目录下输入预编译指令`hb set`,在显示的列表中就可以找到相关的产品。 83 84![ohos_config.json](figures/asr582x_ohos_config.png) 85 86选择好产品后,输入回车就会在根目录下自动生成`ohos_config.json`文件,这里会将要编译的产品信息列出。 87 88 89## 内核移植 90 91### Kconfig适配 92 93在//kernel/liteos_m的编译中,需要在相应的单板以及SoC目录下使用`Kconfig`文件进行索引。 94 95单板目录的`Kconfig`,以`//device/board/lango`为例: 96``` 97├── dev_wifi_a --- dev_wifi_a单板配置目录 98│ ├── Kconfig.liteos_m.board --- 单板的配置选项 99│ ├── Kconfig.liteos_m.defconfig.board --- 单板的默认配置项 100│ └── liteos_m 101│ └── config.gni --- 单板的配置文件 102├── Kconfig.liteos_m.boards --- 单板厂商下Boards配置信息 103└── Kconfig.liteos_m.defconfig.boards --- 单板厂商下Boards默认配置信息 104``` 105 106在 `dev_wifi_a/Kconfig.liteos_m.board`中,配置只有SOC_ASR5822S被选后,BOARD_DEV_WIFI_A才可被选: 107 108``` 109config BOARD_DEV_WIFI_A 110 bool "select board DEV_WIFI_A" 111 depends on SOC_ASR5822S 112``` 113 114SoC目录的`Kconfig`,以`//device/soc/asrmicro`为例: 115 116``` 117├── asr582x --- ASR582X系列 118│ ├── Kconfig.liteos_m.defconfig.asr5822s --- ASR5822S芯片默认配置 119│ ├── Kconfig.liteos_m.defconfig.series --- ASR582X系列默认配置 120│ ├── Kconfig.liteos_m.series --- ASR582X系列配置 121│ └── Kconfig.liteos_m.soc --- ASR582X芯片配置 122├── Kconfig.liteos_m.defconfig --- SoC默认配置 123├── Kconfig.liteos_m.series --- Series配置 124└── Kconfig.liteos_m.soc --- SoC配置 125``` 126 127在 asr582x/Kconfig.liteos_m.series中: 128 129``` 130config SOC_SERIES_ASR582X 131 bool "ASR582X Series" 132 select ARM 133 select SOC_COMPANY_ASRMICRO --- 选择 SOC_COMPANY_ASRMICRO 134 select CPU_CORTEX_M4 135 help 136 Enable support for ASR582X series 137``` 138 139只有选择了 SOC_SERIES_ASR582X,在 asr582x/Kconfig.liteos_m.soc中才可以选择SOC_ASR5822S: 140 141``` 142choice 143 prompt "ASR582X series SoC" 144 depends on SOC_SERIES_ASR582X 145 146config SOC_ASR5822S --- 选择 SOC_ASR5822S 147 bool "SoC ASR5822S" 148 149endchoice 150``` 151 152综上所述,要编译单板BOARD_DEV_WIFI_A,则要分别选中:SOC_COMPANY_ASRMICRO、SOC_SERIES_ASR582X、SOC_ASR5822S,可以在`kernel/liteos_m`中执行`make menuconfig`进行选择配置 153 154![asr5822s_select.json](figures/asr5822s_select.png) 155 156配置后的文件会默认保存在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`,也可以直接填写debug.config: 157 158``` 159LOSCFG_BOARD_DEV_WIFI_A=y 160LOSCFG_SOC_COMPANY_ASRMICRO=y 161LOSCFG_SOC_SERIES_ASR582X=y 162LOSCFG_SOC_ASR5822S=y 163``` 164 165### 模块化编译 166 167`Board`和`SoC`的编译采用模块化的编译方法,从`kernel/liteos_m/BUILD.gn`开始逐级向下递增。本方案的适配过程如下: 168 1691. 在`//device/board/lango`中新建文件BUILD.gn,新增内容如下: 170 171 ``` 172 if (ohos_kernel_type == "liteos_m") { 173 import("//kernel/liteos_m/liteos.gni") 174 module_name = get_path_info(rebase_path("."), "name") 175 module_group(module_name) { 176 modules = [ 177 "dev_wifi_a", # 单板模块 178 "hcs", # hcs文件的对应模块 179 ] 180 } 181 } 182 ``` 183 184 在上述BUILD.gn中,dev_wifi_a以及hcs即是按目录层级组织的模块名。 185 1862. 在`//device/soc/asrmicro`中,使用同样的方法,新建文件BUILD.gn,按目录层级组织,新增内容如下: 187 188 ``` 189 if (ohos_kernel_type == "liteos_m") { 190 import("//kernel/liteos_m/liteos.gni") 191 module_name = get_path_info(rebase_path("."), "name") 192 module_group(module_name) { 193 modules = [ 194 "asr582x", 195 ] 196 } 197 } 198 ``` 199 2003. 在`//device/soc/asrmicro`各个层级模块下,同样新增文件BUILD.gn,将该层级模块加入编译,以`//device/soc/asrmicro/asr582x/liteos_m/sdk/startup/BUILD.gn`为例: 201 202 ``` 203 import("//kernel/liteos_m/liteos.gni") 204 205 config("public") { 206 include_dirs = [ "." ] # 公共头文件 207 } 208 209 kernel_module("asr_startup") { # 编译的模块 210 sources = [ # 编译的源文件 211 "startup.c", 212 "board.c", 213 "startup_cm4.S", 214 ] 215 216 include_dirs = [ # 模块内使用到的头文件 217 "...", 218 ] 219 } 220 ``` 221 2224. 为了组织链接以及一些编译选项,在`//device/soc/asrmicro/asr582x/liteos_m/sdk/config/BUILD.gn`下的config("public")填入了相应的参数: 223 224 ``` 225 config("public") { 226 include_dirs = [] # 公共头文件 227 ldflags = [] # 链接参数,包括ld文件 228 libs = [] # 链接库 229 defines = [] # 定义 230 ``` 231 232 ![](../public_sys-resources/icon-note.gif) **说明:** 233 建议公共的参数选项以及头文件不在各个组件中重复填写。 234 2355. 为了组织一些产品侧的应用,本方案在vendor相应的config.json加入了相应的list来组织,以`//vendor/asrmicro/wifi_demo/config.json`为例,在config.json增加对应的list: 236 ``` 237 "tests_list": [ --- demo list 238 { 239 "enable": "true", --- list开关 240 "test_modules": [ 241 "example", --- OS基础demo 242 "wifi_test" --- Wi-Fi demo 243 ] 244 } 245 ] 246 ``` 247 248 这里将demo作为了模块来管理,开启/关闭某个demo,在tests_list中增减项即可。tests_list在gn中可以直接被读取,需要在`//device/board/lango/dev_wifi_a/liteos_m/config.gni`加入以下内容: 249 250 ``` 251 product_conf = read_file("${product_path}/config.json", "json") 252 product_name = product_conf.product_name 253 tests_list = product_conf.tests_list 254 ``` 255 256 读取list后即可在相应的链接选项上加入相关的组件库,需要在`//device/soc/asrmicro/asr582x/liteos_m/sdk/config/BUILD.gn`加入以下内容: 257 258 ``` 259 foreach(test_item, tests_list) { 260 test_enable = test_item.enable 261 if(test_enable == "true") 262 { 263 foreach(test_module, test_item.test_modules) { 264 ldflags += [ "-l${test_module}" ] 265 } 266 } 267 } 268 ``` 269 270### C库适配 271 272为了整个系统不区分用户态内核态,上层组件与内核共用一套基于musl的C库,本方案使用musl C,三方库见`//third_party/musl/porting/liteos_m/kernel/BUILD.gn`。 273 274kernel另外对malloc相应的code进行了改造适配,适配文件见`//kernel/liteos_m/kal/libc/musl/porting/src/malloc.c`。 275 276在本方案中,printf相关的接口使用开源代码实现,适配文件见 `//device/soc/asrmicro/asr582x/liteos_m/sdk/drivers/platform/system/printf-stdarg.c`。 277 278为了满足printf相关接口的链接调用,需要在`//device/board/lango/dev_wifi_a/liteos_m/config.gni`的新增这些函数的wrap链接: 279 280``` 281board_ld_flags += [ 282 "-Wl,--wrap=printf", 283 "-Wl,--wrap=sprintf", 284 "-Wl,--wrap=snprintf", 285 "-Wl,--wrap=vprintf", 286 "-Wl,--wrap=vsprintf", 287 "-Wl,--wrap=vsnprintf", 288] 289``` 290### shell适配 291 292为了方便调试,本方案集成了内核的shell组件,可以在make menuconfig中的Debug中选中 Enable Shell,或者在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`文件中填入LOSCFG_SHELL=y 293shell组件需要进行初始化,可参考`device/soc/asrmicro/asr582x/liteos_m/sdk/startup/board.c`: 294 295``` 296ret = LosShellInit(); 297if (ret != LOS_OK) { 298 printf("LosShellInit failed! ERROR: 0x%x\n", ret); 299} 300ret = OsShellInit(); 301if (ret != LOS_OK) { 302 printf("OsShellInit failed! ERROR: 0x%x\n", ret); 303} 304``` 305 306在初始化之后,每个shell命令需要进行注册,例如:`vendor/asrmicro/wifi_demo/tests/wifi/wifi_app.c`: 307 308``` 309osCmdReg(CMD_TYPE_STD, "wifi_open", 0, (CMD_CBK_FUNC)ap_conn_func); // 连接AP的指令,这里可以带参 310osCmdReg(CMD_TYPE_EX, "wifi_close", 0, (CMD_CBK_FUNC)ap_close_func); // 断开指令 311``` 312 313### 内核启动适配 314 315单板进入到main函数后,首先会进行单板初始化,然后需要注册中断,之后再进行内核的初始化和调度。 316注册中断,可参考`//device/soc/asrmicro/asr582x/liteos_m/sdk/startup/board.c`: 317 318``` 319ArchHwiCreate(UART1_IRQn,configLIBRARY_NORMAL_INTERRUPT_PRIORITY,0,UART1_IRQHandler,0); // UART中断 320ArchHwiCreate(GPIO_IRQn,configLIBRARY_NORMAL_INTERRUPT_PRIORITY,0,GPIO_IRQHandler,0); // GPIO中断 321``` 322 323内核初始化示例如下: 324``` 325osStatus_t ret = osKernelInitialize(); // 内核初始化 326 327if(ret == osOK) 328{ 329 threadId = osThreadNew((osThreadFunc_t)sys_init,NULL,&g_main_task); // 创建init线程 330 331 if(threadId!=NULL) 332 { 333 osKernelStart(); // 线程调度 334 } 335} 336``` 337 338在`sys_init`中,需要对OpenHarmony的系统组件进行初始化: 339 340``` 341... 342DeviceManagerStart(); // HDF初始化 343 344OHOS_SystemInit(); // OpenHarmony系统组件初始化 345.... 346``` 347 348### HDF驱动框架适配 349 350HDF驱动框架提供了一套应用访问硬件的统一接口,可以简化应用开发,添加HDF组件需要在`//vendor/asrmicro/wifi_demo/kernel_configs/debug.config`添加: 351 352``` 353LOSCFG_DRIVERS_HDF=y 354LOSCFG_DRIVERS_HDF_PLATFORM=y 355``` 356 357同时需在board中新增对应开发板硬件配置描述文件,位于`//device/board/lango/hcs`。本案例以GPIO以及UART为例,移植过程如下: 358 359#### GPIO适配 360 3611. 芯片驱动适配文件位于`//drivers/hdf_core/adapter/platform`目录,在gpio目录增加gpio_asr.c文件,在BUILD.gn中增加新增的驱动文件编译条件: 362 363 ``` 364 if (defined(LOSCFG_SOC_COMPANY_ASRMICRO)) { 365 sources += [ "gpio_asr.c" ] 366 } 367 ``` 368 3692. gpio_asr.c中驱动描述文件如下: 370 371 ``` 372 struct HdfDriverEntry g_GpioDriverEntry = { 373 .moduleVersion = 1, 374 .moduleName = "ASR_GPIO_MODULE_HDF", 375 .Init = GpioDriverInit, 376 .Release = GpioDriverRelease, 377 }; 378 HDF_INIT(g_GpioDriverEntry); 379 ``` 380 3813. 在`//device/board/lango/hcs`添加gpio硬件描述信息文件gpio.hcs, 映射后的gpio0控制板卡上的可编程LED,gpio1对应用户按键,hcs内容如下: 382 383 ``` 384 root { 385 platform { 386 gpio_config { 387 match_attr = "gpio_config"; 388 pin = [0, 1]; 389 // led3: GPIO9 390 // user key: GPIO7 391 realPin = [9, 7]; 392 config = [5, 1]; 393 pinNum = 2; 394 } 395 } 396 } 397 ``` 398 3994. gpio.hcs的配置信息会在GpioDriverInit进行加载,并执行对应GPIO引脚的初始化。应用层控制LED灯和读取按键信息只需要以下简单的代码: 400 401 ``` 402 int32_t GpioKeyIrqFunc(uint16_t gpio, void *data) 403 { 404 printf("user key %d pressed\n", gpio); 405 } 406 GpioSetIrq(1, OSAL_IRQF_TRIGGER_FALLING, GpioKeyIrqFunc, NULL); 407 408 GpioWrite(0, 0); 409 lega_rtos_delay_milliseconds(1000); 410 GpioWrite(0, 1); 411 ``` 412 413#### UART适配 414 4151. 芯片驱动适配文件位于`//drivers/adapter/platform`目录,在uart目录增加uart_asr.c和uart_asr.h文件,在BUILD.gn中增加新增的驱动文件编译条件: 416 417 ``` 418 if (defined(LOSCFG_SOC_COMPANY_ASRMICRO)) { 419 sources += [ "uart_asr.c" ] 420 } 421 ``` 422 4232. uart_asr.c中驱动描述文件如下: 424 425 ``` 426 struct HdfDriverEntry g_hdfUartDevice = { 427 .moduleVersion = 1, 428 .moduleName = "HDF_PLATFORM_UART", 429 .Bind = HdfUartDeviceBind, 430 .Init = HdfUartDeviceInit, 431 .Release = HdfUartDeviceRelease, 432 }; 433 434 HDF_INIT(g_hdfUartDevice); 435 ``` 436 4373. 在`//device/board/lango/hcs`添加gpio硬件描述信息文件uart.hcs, hcs内容如下: 438 439 ``` 440 controller_uart0 :: uart_controller { 441 match_attr = "asr582x_uart_0"; 442 port = 0; /* UART_ID_0 */ 443 444 pin_tx_pin = 0; /* IO_PIN_10 */ 445 pin_tx_mux = 25; /* IO_MUX_2 */ 446 447 pin_rx_pin = 1; /* IO_PIN_11 */ 448 pin_rx_mux = 25; /* IO_MUX_2 */ 449 tx_rx = 3; /* TX_RX MODE */ 450 } 451 ``` 452 4534. gpio.hcs的配置信息会在HdfUartDeviceInit进行加载,并执行对应串口引脚的初始化。应用层测试串口代码如下: 454 455 ``` 456 DevHandle uart_handle = UartOpen(0); 457 UartSetBaud(uart_handle, 115200); 458 ... 459 attr.dataBits = UART_ATTR_DATABIT_8; 460 attr.parity = UART_ATTR_PARITY_NONE; 461 attr.stopBits = UART_ATTR_STOPBIT_1; 462 ret = UartSetAttribute(uart_handle, &attr); 463 ret = UartWrite(uart_handle, send_data, strlen(send_data)); 464 ret = UartRead(uart_handle, recv_data, sizeof(recv_data) - 1); 465 ... 466 ``` 467 468## OpenHarmony组件移植 469 470子系统的编译选项入口在相应产品config.json下,以下以`//vendor/asrmicro/wifi_demo/config.json`为例。 471 472### lwIP组件 473 474lwIP组件的源码在`//third_party/lwip`,OpenHarmony在kernel中做了定制化,`//kernel/liteos_m/components/net/lwip-2.1`,包括一些接口的重定义,结构体的重定义等。 475 476lwIP组件适配: 477 478lwIP是一个小型开源的TCP/IP协议栈,LiteOS-M已对开源lwIP做了适配和功能增强,lwIP代码分为两部分: 479 480 481- third_party/lwip目录下是lwIP开源代码,里面只做了少量的侵入式修改,为了适配增强功能。 482 483- kernel/liteos_m/components/net/lwip-2.1目录下是lwIP适配和功能增强代码,里面提供了lwIP的默认配置文件。 484 485 486如果需要使用lwIP组件,请按如下步骤适配: 487 488 4891. 在产品目录下新建一个目录用来存放产品的适配文件,如lwip_adapter。 490 4912. 在lwip_adapter目录下新建一个目录include,用来存放适配的头文件。 492 4933. 在include目录下新建目录lwip,并在lwip目录下新建头文件lwipopts.h,代码如下所示,如果默认配置不能满足产品使用,可自行根据产品使用情况修改配置,如关闭DHCP功能。 494 495 ``` 496 #ifndef _LWIP_ADAPTER_LWIPOPTS_H_ 497 #define _LWIP_ADAPTER_LWIPOPTS_H_ 498 499 #include_next "lwip/lwipopts.h" 500 501 #undef LWIP_DHCP#define LWIP_DHCP 0 // 关闭DHCP功能 502 503 #endif /* _LWIP_ADAPTER_LWIPOPTS_H_ */ 504 ``` 505 5064. 将kernel/liteos_m/components/net/lwip-2.1目录下的BUILD.gn复制到lwip_adapter目录下,并按如下修改。 507 508 ``` 509 import("//kernel/liteos_m/liteos.gni") 510 import("$LITEOSTHIRDPARTY/lwip/lwip.gni") 511 import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni") 512 module_switch = defined(LOSCFG_NET_LWIP_SACK) 513 module_name = "lwip"kernel_module(module_name) { 514 sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - [ "$LWIPDIR/api/sockets.c" ] 515 include_dirs = [ "//utils/native/lite/include" ] 516 } 517 #添加新增加的适配头文件路径include 518 config("public") { 519 include_dirs = [ "include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS 520 } 521 ``` 522 5235. 在产品的配置文件(如config.json)中设置lwIP的编译路径,即步骤4中BUILD.gn的路径。 524 525 ``` 526 { 527 "subsystem": "kernel", 528 "components": [ 529 { "component": "liteos_m", "features":["ohos_kernel_liteos_m_lwip_path = \"//xxx/lwip_adapter\"" ] } 530 ] 531 }, 532 ``` 533 5346. 在产品的内核编译配置文件中,如kernel_config/debug.config,打开编译lwIP的开关。 535 536 ``` 537 LOSCFG_NET_LWIP=y 538 ``` 539 540本案例在config.json中设置lwIP的路径如下: 541 542 ``` 543 "subsystem": "kernel", 544 "components": [ 545 { 546 "component": "liteos_m", 547 "features": [ 548 "ohos_kernel_liteos_m_lwip_path = \"//device/soc/asrmicro/asr582x/liteos_m/components/net/lwip-2.1\"" 549 ] 550 } 551 ] 552 ``` 553 554另外,需在内核编译配置文件kernel_config/debug.config中,打开编译lwIP的开关,如下: 555 556``` 557LOSCFG_NET_LWIP=y 558``` 559 560### security组件 561 562security需要在config.json中打开相应的选项,本案例移植了三方库中的mbedtls(`//third_party/mbedtls`)作为加密模块,选项配置如下: 563 564``` 565"subsystem": "security", 566"components": [ 567 { "component": "huks", "features": 568 [ 569 ... 570 "ohos_security_huks_mbedtls_porting_path = \"//device/soc/asrmicro/asr582x/liteos_m/components/mbedtls\"" 571 ] 572 } 573] 574``` 575 576在上述目录中,需要对mbedtls做配置,可见`config/config_liteos_m.h`。需要注意的是,如果使用mbedtls的RNG的能力(比如dsoftbus组件在`//foundation/communication/dsoftbus/adapter/common/mbedtls/softbus_adapter_crypto.c`中有使用),要指定产生随机数的熵源。本案例使用了ASR582X的硬件随机数能力,需要打开如下宏定义: 577 578``` 579#define MBEDTLS_ENTROPY_HARDWARE_ALT 580``` 581 582打开此宏后,需要实现entropy_hardware_alt接口,可见`library/entropy_hardware_alt.c`。 583 584### wifi_lite组件 585 586wifi_lite组件的选项配置如下: 587 588``` 589"subsystem": "communication", 590"components": [ 591 { "component": "wifi_lite", "features":[] } 592 ] 593``` 594 595与Wi-Fi有关的实现在`//device/soc/asrmicro/asr582x/liteos_m/sdk/hal/src/wifi_adapter.c`下。 596 597本案例也提供了使用wifi_lite相关接口的Demo,可见`//vendor/asrmicro/wifi_demo/tests/wifi/wifi_app.c`,这里提供了两个连接的测试指令: 598 599表 1 ASR Wi-Fi 连接指令 600 601| 指令 | 参数 | 说明 | 602|------------|--------|--------| 603| wifi_open | sta [SSID] [KEY] | 连接路由指令,例如:wifi_open sta ASR_AP test123456 | 604| wifi_close | 无 | 断开连接指令 | 605 606### xts组件 607 608xts组件的适配,以`//vendor/asrmicro/xts_demo/config.json`为例,需要加入组件选项: 609 610``` 611"subsystem": "xts", 612"components": [ 613 { "component": "xts_acts", "features": 614 [ 615 "enable_ohos_test_xts_acts_use_thirdparty_lwip = true" 616 ] 617 }, 618 { "component": "xts_tools", "features":[] } 619] 620``` 621 622另外,xts功能也使用了list来组织,可参考[模块化编译],在config.json文件中增减相应模块: 623 624``` 625"xts_list": [ 626 { 627 "enable": "true", 628 "xts_modules": [ 629 "ActsKvStoreTest", 630 "ActsDfxFuncTest", 631 "ActsHieventLiteTest", 632 "ActsSamgrTest", 633 "ActsParameterTest", 634 "ActsWifiServiceTest", 635 "ActsWifiIotTest", 636 "ActsBootstrapTest" 637 ] 638 } 639], 640``` 641 642### dsoftbus组件 643 644dsoftbus组件提供了设备间的发现连接、组网和传输能力,本方案以Wi-Fi设备间的软总线能力为例。 645 646依赖组件:lwIP组件、security组件、wifi_lite组件。 647 648前置条件:设备需先连接路由,所有的组网设备需在同一局域网中。 649 650dsoftbus组件的选项配置如下: 651 652``` 653"subsystem": "communication", 654"components": [ 655 { "component": "dsoftbus", "features":[] } 656 ] 657``` 658 659在`//vendor/asrmicro/wifi_demo`下提供了dsoftbus的测试Demo,打开该功能需修改`//vendor/asrmicro/wifi_demo/tests/BUILD.gn`: 660 661``` 662declare_args() { 663 asr_dsoftbus_test = true # 打开dsoftbus demo编译 664} 665``` 666 667另外,需在`//vendor/asrmicro/wifi_demo/config.json`中添加dsoftbus_test模块: 668 669``` 670"tests_list": [ 671 { 672 "enable": "true", 673 "test_modules": [ 674 "wifi_test", 675 "dsoftbus_test" # 打开dsoftbus_test模块 676 ] 677 } 678] 679``` 680 681dsoftbus组件的启动接口可参考`//vendor/asrmicro/wifi_demo/tests/dsoftbus/dsoftbus_app.c`: 682 683``` 684InitSoftBusServer(); 685``` 686 687dsoftbus组件的运行需至少预留80KB RAM。如资源不够,可对其它地方进行剪裁。例如,可在以下文件修改lwIP组件: 688`//kernel_liteos_m/blob/master/components/net/lwip-2.1/porting/include/lwip/lwipopts.h`: 689 690``` 691#define TCPIP_THREAD_STACKSIZE 0x2000 // 缩小TCPIP任务栈大小 692``` 693 694在communication_dsoftbus仓中,加入了-fPIC编译选项,这样会让编译器产生与位置无关代码,并使用相对地址,但是在LiteOS-M核中使用的是静态库,不推荐使用。 695建议开发者手动注释-fPIC编译选项,后续会推进OpenHarmony统一规划此编译选项的开关。修改方法是在如下的四个文件中,找到"-fPIC"选项,并全部注释: 696`//foundation/communication/dsoftbus/core/common/BUILD.gn` 697`//foundation/communication/dsoftbus/core/frame/BUILD.gn` 698`//foundation/communication/dsoftbus/sdk/BUILD.gn` 699`//foundation/communication/dsoftbus/components/nstackx_mini/nstackx_ctrl/BUILD.gn` 700 701软总线的组网需要通过设备认证,在研发阶段,可以把认证跳过,先行调试组网以及传输能力,需将文件`//foundation/communication/dsoftbus/core/authentication/src/auth_manager.c`中的HandleReceiveDeviceId函数替换为如下实现: 702 703``` 704void HandleReceiveDeviceId(AuthManager *auth, uint8_t *data) 705{ 706 uint8_t tempKey[SESSION_KEY_LENGTH] = {0}; 707 if (auth == NULL || data == NULL) { 708 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid parameter"); 709 return; 710 } 711 if (AuthUnpackDeviceInfo(auth, data) != SOFTBUS_OK) { 712 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthUnpackDeviceInfo failed"); 713 AuthHandleFail(auth, SOFTBUS_AUTH_UNPACK_DEVID_FAILED); 714 return; 715 } 716 if (auth->side == SERVER_SIDE_FLAG) { 717 if (EventInLooper(auth->authId) != SOFTBUS_OK) { 718 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth EventInLooper failed"); 719 AuthHandleFail(auth, SOFTBUS_MALLOC_ERR); 720 return; 721 } 722 if (AuthSyncDeviceUuid(auth) != SOFTBUS_OK) { 723 AuthHandleFail(auth, SOFTBUS_AUTH_SYNC_DEVID_FAILED); 724 } 725 (void)memset_s(tempKey, SESSION_KEY_LENGTH, 1, SESSION_KEY_LENGTH); 726 AuthOnSessionKeyReturned(auth->authId, tempKey, SESSION_KEY_LENGTH); 727 return; 728 } 729 //VerifyDeviceDevLvl(auth); --- 这里注释认证过程 730 (void)memset_s(tempKey, SESSION_KEY_LENGTH, 1, SESSION_KEY_LENGTH); 731 AuthOnSessionKeyReturned(auth->authId, tempKey, SESSION_KEY_LENGTH); 732} 733``` 734 735在正确配置并编译烧录后,设备使用wifi_open指令连接路由,连接成功后,设备会自动进行组网。如下为组网成功截图: 736 737![dsoftbus_join_LNN](figures/asr582x_dsoftbus_join_LNN.png) 738 739 740其它组件的适配过程与官方以及其它厂商的过程类似,不再赘述。 741 742## todo 743 744- 待支持BLE 745- 待丰富Wi-Fi测试指令