[OpenHarmony RK3568]四WIFI芯片适配

一、概述

  本文讲述RK3568上移植OpenHarmony 3.2适配WIFI以及相关内容。
  硬件芯片:海华AW-NM372S
  芯片模组:43438A1

注:芯片的具体模组可以在芯片手册上查看,一般分为Boardcom(博通)/Cypress,realtek,海思等

其中海华AW-NM372S芯片基于博通43438A1模组,常见的还有正基AP6xxx芯片,都是基于博通模组;博通已经被cypress收购

1.1 WLAN固件

  WLAN固件是相当于WLAN芯片里面的一个小系统,你可以把WLAN芯片看成一个单片机,里面需要跑代码才可以和我们的SoC进行PY交易,这份固件由原厂提供,为.bin后缀。一般名字中会包含43438A1之类的芯片模组。

注:使用另外的文件作为固件的有博通和海思,而realtek则是把固件写到了驱动中去

1.2 nvram.txt

  这个文件用给固件读取并修正一些参数,来使得wlan芯片工作在最好状态下,同样由原厂提供。

二、内核部分

2.1 修改设备树

  其中:
  (1)sdio_pwrseq节点用于自动上点,其中reset-gpios是用于复位,对应wlan芯片上的wreg_on引脚,这里特别需要主要电平属性,高电平复位就选择GPIO_ACTIVE_HIGH,低电平复位就GPIO_ACTIVE_LOW,根据你的板子设计来调整引脚号和引脚的电平属性;如果你的芯片还有一个引脚控制wlan芯片供电的话,需要添加power-gpios子节点**(这里笔者记得不是很清楚了,可以调试一下)**
  (2)wireless_wlan节点是wifi的适配节点,wifi_chip_type 这个属性可以被忽略,填ap-6255即可,host_wake_irq引脚根据你核心板来定义
  (3)sdmmc2对应sdio的接口的属性,这里面的节点不做过多追溯,自己看下

/ {	

	sdio_pwrseq: sdio-pwrseq {
		compatible = "mmc-pwrseq-simple";
		pinctrl-names = "default";
		pinctrl-0 = <&wifi_enable_h>;
		reset-gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
		status = "okay";
	};

	wireless_wlan: wireless-wlan {
		compatible = "wlan-platdata";
		rockchip,grf = <&grf>;
		wifi_chip_type = "ap-6255";
		clocks = <&rk809 1>;
		clock-names = "ext_clock";

		pinctrl-names = "default";
		pinctrl-0 = <&wifi_wake_host>;

		WIFI,host_wake_irq = <&gpio4 RK_P2 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};
};

&sdmmc2 {
	max-frequency = <150000000>;
	supports-sdio;
	bus-width = <4>;
	disable-wp;
	cap-sd-highspeed;
	cap-sdio-irq;
	keep-power-in-suspend;
	mmc-pwrseq = <&sdio_pwrseq>;
	non-removable;
	pinctrl-names = "default";
	pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;
	sd-uhs-sdr104;
	status = "okay";
};


&pinctrl {
	wireless-wlan {
		wifi_wake_host: wifi-wake-host {
			rockchip,pins = <4 RK_PA2 RK_FUNC_GPIO &pcfg_pull_down>;
		};
    };

	sdio-pwrseq {
		wifi_enable_h: wifi-enable-h {
			rockchip,pins = <4 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};
};

2.2 内核配置部分

  这里可以去看rockchip_linux_defconfig或者rk3568_defconfig这个文件(rockchip_linux_defconfig只是rk3568_defconfig在编译内核时候的拷贝),那么你可以看到android和openharmony的区别了,android中,wlan芯片的驱动是编译成.ko,然后再复制到系统中,在启动的时候根据SDIO中读取的PID和VID值去比对,再加载对应驱动;在openharmony中,wlan驱动模块是一开始就加载到内核中去,随着内核启动一起启动。
  android的这种做法可以同时兼容多个wlan芯片,这个我觉得openharmony可以考虑一下去改进。
  这里的CONFIG_BCMDHD_FW_PATH和CONFIG_BCMDHD_NVRAM_PATH指定了frimware的固件和nvram.txt的路径

CONFIG_WL_ROCKCHIP=y
# CONFIG_WIFI_BUILD_MODULE is not set
CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
# CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set
CONFIG_BCMDHD=y
CONFIG_AP6XXX_WIFI6=y
CONFIG_BCMDHD_FW_PATH="/vendor/etc/firmware/fw_bcm43438a1.bin"
CONFIG_BCMDHD_NVRAM_PATH="/vendor/etc/firmware/nvram.txt"
# CONFIG_BCMDHD_STATIC_IF is not set
# CONFIG_MAC80211_HWSIM is not set
CONFIG_USB_NET_RNDIS_WLAN=y
# CONFIG_VIRT_WIFI is not set

三、系统适配部分

  那么接下来就是搬运固件和nvram.txt即可;
  首先在device/soc/rockchip/rk3568/hardware/wifi目录下面创建属于我们芯片的目录比如nm372,
  然后把我们从原厂那里拿到的固件放进去,再修改以下内容,其中 NM372_ETC_DIR 就是我们刚才创建的目录,group(“nm372”) 中deps ohos_prebuilt_etc(“fw_bcm43438a1.bin”) 和ohos_prebuilt_etc(“nvram.txt”),意思是nm372这个组依赖于fw_bcm43438a1.bin和nvram.txt两个编译动作。
  并且可以看到resolv.conf被我单独抽出来作为一个组,因为所有芯片都会用到这个文件,所以剥离出来。

device/soc/rockchip/rk3568/hardware/wifi/BUILD.gn

# Copyright (C) 2021 HiHope Open Source Organization .
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/ohos.gni")

AP6XXX_ETC_DIR = "//device/soc/rockchip/rk3568/hardware/wifi/ap6xxx"
NM372_ETC_DIR = "//device/soc/rockchip/rk3568/hardware/wifi/nm372"
DNS_CONFIG_DIR = "//device/soc/rockchip/rk3568/hardware/wifi"

ohos_prebuilt_etc("clm_bcm43752a2_ag.blob") {
  source = "$AP6XXX_ETC_DIR/clm_bcm43752a2_ag.blob"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}

ohos_prebuilt_etc("fw_bcm43752a2_ag_apsta.bin") {
  source = "$AP6XXX_ETC_DIR/fw_bcm43752a2_ag_apsta.bin"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}

ohos_prebuilt_etc("fw_bcm43752a2_ag.bin") {
  source = "$AP6XXX_ETC_DIR/fw_bcm43752a2_ag.bin"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}

ohos_prebuilt_etc("nvram_ap6275s.txt") {
  source = "$AP6XXX_ETC_DIR/nvram_ap6275s.txt"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}


ohos_prebuilt_etc("fw_bcm43438a1.bin") {
  source = "$NM372_ETC_DIR/fw_bcm43438a1.bin"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}

ohos_prebuilt_etc("nvram.txt") {
  source = "$NM372_ETC_DIR/nvram.txt"
  install_images = [ vendor_base_dir ]
  relative_install_dir = "firmware"
  part_name = "rockchip_products"
  install_enable = true
}


ohos_prebuilt_etc("resolv.conf") {
  source = "$DNS_CONFIG_DIR/etc/resolv.conf"
  install_images = [ "system" ]
  part_name = "rockchip_products"
  install_enable = true
}



group("ap6xxx") {
  deps = [
    ":clm_bcm43752a2_ag.blob",
    ":fw_bcm43752a2_ag.bin",
    ":fw_bcm43752a2_ag_apsta.bin",
    ":nvram_ap6275s.txt",
  ]
}

group("nm372") {
  deps = [
    ":fw_bcm43438a1.bin",
    ":nvram.txt",
  ]
}

group("resolv_conf") {
  deps = [
    ":resolv.conf",
  ]
}

我们抽出一个来进行细看

ohos_prebuilt_etc("fw_bcm43438a1.bin") {
  source = "$NM372_ETC_DIR/fw_bcm43438a1.bin"  //源文件
  install_images = [ vendor_base_dir ]  //安装路径以/vendor为基础
  relative_install_dir = "firmware" //安装到/vendor/firmware下
  part_name = "rockchip_products" //rockchip_products是总的part名,可以不理会
  install_enable = true //使能安装
}

那么我们的nm372这个group又由谁制定呢?我们来看上一层的BUILD.gn,把它改成下面的形式,记得也把wifi:resolv_conf这个使能

device/soc/rockchip/rk3568/hardware/BUILD.gn

import("//build/ohos.gni")

group("hardware_group") {
  deps = [
    "//device/soc/rockchip/rk3568/hardware/gpu:mali-bifrost-g52-g2p0-ohos",
    "//device/soc/rockchip/rk3568/hardware/isp:isp",
    "//device/soc/rockchip/rk3568/hardware/mpp:mpp",
    "//device/soc/rockchip/rk3568/hardware/wifi:nm372",
    "//device/soc/rockchip/rk3568/hardware/wifi:resolv_conf",
  ]
}

由于hardware_group已经被指定编译,那么编译的时候就会顺着这个几个编译路径一直走下去,最终把我们需要的文件复制到对应的路径去。

原文地址:https://blog.csdn.net/qq_46391974" target="_blank" rel="noopener" title="Fenix.Lee">Fenix.Lee</a> <img class="article-time-img article-heard-img" src="https://csdnimg.cn/release/b

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1.4k次。被@Observed装饰的类,可以被观察到属性的变化;子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中是属性,这个属性同样也需要被@Observed装饰。单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。_鸿蒙ark对象数组
文章浏览阅读1k次。Harmony OS_harmonyos创建数据库
文章浏览阅读1.1k次,点赞25次,收藏23次。自定义组件Header.ets页面(子组件)//自定义组件@Component//组件声明private title:ResourceStr//接收的参数build(){Row() {index.ets(父组件)//导入自定义组件@Entry@Componentbuild() {Column() {/*** 1. 自定义组件调用-----自定义组件------* 2. 在调用的组件上设置样式*/ShopTitle({ title: '商品列表' })
文章浏览阅读952次,点赞11次,收藏25次。ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。_支持ios 安卓 鸿蒙next的跨平台方案
文章浏览阅读735次。​错误: 找不到符号符号: 变量 Layout_list_item位置: 类 ResourceTable_错误: 找不到符号 符号: 变量 resourcetable 位置: 类 mainabilityslice
文章浏览阅读941次,点赞23次,收藏21次。harmony ARKTS base64 加解密_鸿蒙 鸿蒙加解密算法库
文章浏览阅读860次,点赞21次,收藏24次。使用自定义布局,实现子组件自动换行功能。图1自定义布局的使用效果创建自定义布局的类,并继承ComponentContainer,添加构造方法。//如需支持xml创建自定义布局,必须添加该构造方法实现ComponentContainer.EstimateSizeListener接口,在onEstimateSize方法中进行测量。......@Override//通知子组件进行测量//关联子组件的索引与其布局数据idx++) {//测量自身。_鸿蒙javaui
文章浏览阅读917次,点赞25次,收藏25次。这里需要注意的是,真机需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。当前,真机调试需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。另外,由于样式的解析是基于组件文件的纬度的,因此样式文件只能应用于被其引用的组件文件中,而不能跨文件应用,并且样式文件也只支持类选择器。_鸿蒙 小程序
文章浏览阅读876次,点赞17次,收藏4次。2. HarmonyOS应用开发DevEcoStudio准备-1HUAWEI DevEco Studio为运行在HarmonyOS和OpenHarmony系统上的应用和服务(以下简称应用/服务)提供一站式的开发平台。
文章浏览阅读811次。此对象主要映射JSON数组数据,比如服务器传的数据是这样的。_arkts json
文章浏览阅读429次。鸿蒙小游戏-数字华容道_华为鸿蒙手机自带小游戏
文章浏览阅读1.1k次,点赞24次,收藏19次。Ability是应用/服务所具备的能力的抽象,一个Module可以包含一个或多个Ability。
文章浏览阅读846次。本文带大家使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发主板_mqtt 如何对接第三方iot平台
文章浏览阅读567次。HarmonyOS_arkts卡片
文章浏览阅读1k次,点赞19次,收藏20次。ArkTS开发鸿蒙OS连接mongoDB(后端node.js)2024最新教程
文章浏览阅读1.2k次,点赞23次,收藏15次。HarmonyOS与OpenHarmony(1)本质上的不同是:HarmonyOS是鸿蒙操作系统,而OpenHarmony则是从开源项目。这里可以联想一下Android,比如小米手机在Android开源系统的基础上开发了MIUI的手机操作系统,HarmonyOS就类似于MIUI,OpenHarmony类似Android基础底座。(2)HarmonyOS:是双框架,内聚了AOSP(Android Open Source Project )和OpenHarmony等。_鸿蒙模拟器开了怎么跑代码
文章浏览阅读1.1k次,点赞21次,收藏21次。鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件。
文章浏览阅读2k次。由于之前的哥们匆忙离职了,所以鸿蒙手表项目的新版本我临时接过来打包发布,基本上之前没有啥鸿蒙经验,但是一直是做Android开发的,在工作人员的指导下发现打包配置基本上和Android一样,所以这些都不是问题,这里记录一下使用过程中遇到的问题。!过程和遇到的问题基本上都讲解了,关机睡觉,打卡收工。_鸿蒙系统adb命令
文章浏览阅读7.3k次,点赞9次,收藏29次。39. 【多选题】_column和row容器中,设置子组件在主轴方向上的对齐格式
文章浏览阅读1.1k次,点赞13次,收藏24次。18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器点击button按钮显示月份与获取的时间。_harmonyos农历获取