一.先拿到驱动源码

   获取源:咨询模组厂商,让他们提供即可

   比如我这里获取到的驱动源码包名称是:ZTOP_ACEV100_Android_wifi_bt_20260326214112.tar.gz

   解压后的目录截图如下:

需要确认的项:

    确认项目上使用的内核版本是:linux 5.10

    确认mp_hi3781v735时arm32还是arm64: arm64

二.编译

1.源码应该放在哪里?

     这里的OH 6.1 release的项目根目录是在 hisi73561_0410

   直接放在项目跟目录下面:

2.如何让驱动源码参与编译

1.修改如下配置:

2.编译:

变量指令: sudo ./build_linux.sh mp_hi3781v735

三.如何加载wifi驱动的ko

1.编译生成的ko:ZTOP_ACEV100_Android_wifi_bt_20260326214112\wifi_driver\build\output\ztop_wifi_driver.ko

2.厂商随驱动提供的固件:ZTOP_ACEV100_Android_wifi_bt_20260326214112\wifi_driver\fw\zt9612_fw.bin

3.打包文件到镜像中:

将上诉两个文件(ztop_wifi_driver.ko合zt9612_fw.bin)拷贝到项目目录vendor目录下:

比如此处的:vendor\hisilicon\mp_hi3781v735

新建一个目录wifi_ztop

vendor\hisilicon\mp_hi3781v735\wifi_ztop\BUILD.gn的内容如下:

# Copyright (c) 2022 Huawei Device Co., Ltd.
# 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")

ohos_prebuilt_etc("rwnx_karst") {
  source = "rwnx_karst.ini"
  part_name = "product_mp_hi3781v735"
  subsystem_name = "product_mp_hi3781v735"
  install_enable = true
  install_images = [ chipset_base_dir ]
  relative_install_dir = "../firmware"
}

ohos_prebuilt_etc("ztop_wifi_driver") {
  source = "ztop_wifi_driver.ko"
  part_name = "product_mp_hi3781v735"
  subsystem_name = "product_mp_hi3781v735"
  install_enable = true
  install_images = [ chipset_base_dir ]
  relative_install_dir = "../etc/ko"
}

# 后续wifi固件都应存放在/vendor/firmware目录
ohos_prebuilt_etc("zt9612_fw") {
  source = "zt9612_fw.bin"
  part_name = "product_mp_hi3781v735"
  subsystem_name = "product_mp_hi3781v735"
  install_enable = true
  install_images = [ chipset_base_dir ]
  relative_install_dir = "../firmware"
}

# 汇总所有依赖
group("ztop_wifi_drivers") {
  deps = [
    ":rwnx_karst",
    ":ztop_wifi_driver",
    ":zt9612_fw",
  ]
}

4.加载ko

四.编译镜像上板验证

1.静态验证,看是否ko和bin都被打包到了正确的目录下面:

2.手动insmod /vendor/etc/ko/ztop_wifi_drvier.ko看是否生成了wlan0接口

查看命令:ifconfig -a

有wlan0说明wifi驱动加载成功!

五.打开wifi流程失败问题解决

问题现象:

    行 16357: 01-01 08:00:20.087  4877  4914 I C01560/HalDeviceManager: HalDeviceManager::HalDeviceManager
    行 16358: 01-01 08:00:20.087  4877  4914 I C01560/HalDeviceManager: StartChipHdi start...
    行 16385: 01-01 08:00:20.096  3631  4077 E C02510/devsvc_manager_stub: StubGetService service chip_interface_service not found
    行 16387: 01-01 08:00:20.096  4877  4914 E C02510/hdi_servmgr_client: get hdi service chip_interface_service failed, -1

    行 16388: 01-01 08:00:20.097  4877  4914 E C02510/chip_controller_proxy: Get:get remote object failed!
    行 16389: 01-01 08:00:20.097  4877  4914 I C01560/HalDeviceManager: Pointer g_IWifi in StartChipHdi is NULL!

    行  40978: 01-01 08:24:23.988  6079  6079 I C01560/WifiNAPIUtils: Call wifi func: EnableWifi (start)
    行  40980: 01-01 08:24:23.989  4828  4831 I C01560/WifiDeviceServiceImpl: EnableWifi(), pid:6079, uid:20010017, BundleName:.
    行  40990: 01-01 08:24:23.994  4828  4896 I C01560/WifiControllerMachine: Should start wifi or scanonly.
    行  40996: 01-01 08:24:23.994  4828  5282 I C01560/WifiServiceScheduler: AutoStartStaService, current sta state:0
    行  40997: 01-01 08:24:23.994  4828  5282 I C01560/HalDeviceManager: CreateStaIface, ifaceName: , instId = 0
    行  40998: 01-01 08:24:23.994  4828  5282 I C01560/HalDeviceManager: Pointer g_IWifi in CheckChipHdiStarted is NULL!
    行  41000: 01-01 08:24:23.994  4828  5282 E C01560/HalDeviceManager: chip hdi is not started
    行  41001: 01-01 08:24:23.994  4828  5282 E C01560/HalDeviceManager: CreateStaIface CheckReloadChipHdiService failed
    行  41002: 01-01 08:24:23.994  4828  5282 E C01560/WifiServiceScheduler: PreStartWifi, create iface failed!

 

01-01 08:00:21.375  4943  4948 I C01560/HalDeviceManager: HalDeviceManager::HalDeviceManager
01-01 08:00:21.375  4943  4948 I C01560/HalDeviceManager: StartChipHdi start...
01-01 08:00:21.377  4006  4098 I C01566/HDF_LOG_TAG: AddWifiDeathRecipient
01-01 08:00:21.377  4943  4948 I C01560/HalDeviceManager: Chip Hdi service add death recipient success
01-01 08:00:21.377  4006  4098 I C01566/HDF_LOG_TAG: Wifi HAL start enter
01-01 08:00:21.378  4006  4098 W C03f07/MUSL-LDSO: load libwifi_hal_hw.z.so failed, namespace=ndk no inherits, errno=2
01-01 08:00:21.378  4006  4098 W C03f07/MUSL-LDSO: load libwifi_hal_hw.z.so failed, namespace=default, errno=2
01-01 08:00:21.378  4006  4098 W C03f07/MUSL-LDSO: dlopen_impl load library header failed for libwifi_hal_hw.z.so

01-01 08:00:21.378  4006  4098 E C01566/HDF_LOG_TAG: failed to open vendor hal library: libwifi_hal_hw.z.so
01-01 08:00:21.378  4006  4098 E C01566/HDF_LOG_TAG: Wifi HAL start failed.
01-01 08:00:21.378  4943  4948 E C02510/chip_controller_proxy: Init_ failed, error code is -1
01-01 08:00:21.378  4943  4948 E C01560/HalDeviceManager: StartChipHdi, call Init failed! ret:-1

 

    行 78911: 01-01 08:00:54.026  4847  4918 I C01560/WifiHdiWpaProxy: HdiAddWpaIface ifName:wlan0, confName:/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
    行 78914: 01-01 08:00:54.027  3998  4089 I C01566/HDF_LOG_TAG: enter WpaInterfaceAddWpaIface Ready to add iface, ifName: wlan0, confName: /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
    行 78921: 01-01 08:00:54.029  3998  6156 I C05200/wpa_supplicant: CTRL_IFACE GLOBAL INTERFACE_ADD 'wlan0    /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 78922: 01-01 08:00:54.029  3998  6156 I C05200/wpa_supplicant: Initializing interface 'wlan0' conf '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
    行 78923: 01-01 08:00:54.029  3998  6156 I C05200/wpa_supplicant: Configuration file '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf' -> '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 78924: 01-01 08:00:54.029  3998  6156 I C05200/wpa_supplicant: Reading configuration file '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 78925: 01-01 08:00:54.029  3998  6156 E C05200/wpa_supplicant: Failed to open config file '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf', error: Permission denied
    行 78926: 01-01 08:00:54.030  3998  6156 E C05200/wpa_supplicant: Failed to read or parse configuration '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'.
    行 78927: 01-01 08:00:54.030  3998  6156 I C05200/wpa_supplicant: Enter eapol_sm_deinit
    行 78928: 01-01 08:00:54.031  3998  6156 I C05200/wpa_supplicant: : Cancelling scan request
    行 78929: 01-01 08:00:54.033  3998  6156 I C05200/wpa_supplicant: : CTRL-EVENT-DSCP-POLICY clear_all
    行 78931: 01-01 08:00:54.033  3998  4089 I C01566/HdiWpaHal: WpaCliAddIface failed, cmd: INTERFACE_ADD wlan0    /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf, buf: FAIL

 

    行 85321: 01-01 08:01:06.817  3957  4200 I C01566/HDF_LOG_TAG: enter WpaInterfaceStart: wpa_supplicant begin to start
    行 85325: 01-01 08:01:06.824  3957  6168 I C05200/wpa_supplicant: Successfully initialized wpa_supplicant
    行 85338: 01-01 08:01:06.922  3957  4200 I C01566/HDF_LOG_TAG: WpaInterfaceStart: wpa_supplicant start successfully!
    行 85352: 01-01 08:01:06.926  4895  4930 I C01560/WifiHdiWpaProxy: HdiAddWpaIface ifName:wlan0, confName:/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
    行 85355: 01-01 08:01:06.926  3957  4200 I C01566/HDF_LOG_TAG: enter WpaInterfaceAddWpaIface Ready to add iface, ifName: wlan0, confName: /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
    行 85362: 01-01 08:01:06.929  3957  6168 I C05200/wpa_supplicant: CTRL_IFACE GLOBAL INTERFACE_ADD 'wlan0    /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 85363: 01-01 08:01:06.929  3957  6168 I C05200/wpa_supplicant: Initializing interface 'wlan0' conf '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
    行 85364: 01-01 08:01:06.929  3957  6168 I C05200/wpa_supplicant: Configuration file '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf' -> '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 85365: 01-01 08:01:06.929  3957  6168 I C05200/wpa_supplicant: Reading configuration file '/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf'
    行 85366: 01-01 08:01:06.931  3957  6168 I C05200/wpa_supplicant: wpa_config_process_country: set country code
    行 85368: 01-01 08:01:06.932  3957  6168 I C05200/wpa_supplicant: Read configuration file finished.
    行 85369: 01-01 08:01:06.941  3957  6168 I C05200/wpa_supplicant: set driver success, set driver: (null), get driver: nl80211
    行 85370: 01-01 08:01:06.941  3957  6168 I C05200/wpa_supplicant: Enter wpa driver nl80211 finish init, interface: wlan0.
    行 85371: 01-01 08:01:06.943  3957  6168 I C05200/wpa_supplicant: nl80211: Set mode ifindex 8 iftype 2 (STATION)
    行 85372: 01-01 08:01:06.944  3957  6168 E C05200/wpa_supplicant: nl80211: Failed to set interface 8 to mode 2: -1 (Operation not permitted)
    行 85373: 01-01 08:01:06.949  3957  6168 E C05200/wpa_supplicant: Could not set interface wlan0 flags (UP): Operation not permitted
    行 85374: 01-01 08:01:06.949  3957  6168 E C05200/wpa_supplicant: nl80211: Could not set interface 'wlan0' UP
    行 85375: 01-01 08:01:06.949  3957  6168 I C05200/wpa_supplicant: nl80211: deinit ifname=wlan0 disabled_11b_rates=0
    行 85376: 01-01 08:01:06.949  3957  6168 I C05200/wpa_supplicant: nl80211: Set mode ifindex 8 iftype 2 (STATION)
    行 85377: 01-01 08:01:06.949  3957  6168 E C05200/wpa_supplicant: nl80211: Failed to set interface 8 to mode 2: -1 (Operation not permitted)
    行 85378: 01-01 08:01:06.950  3957  6168 E C05200/wpa_supplicant: wlan0: Failed to initialize driver interface
    行 85379: 01-01 08:01:06.950  3957  6168 I C05200/wpa_supplicant: Enter eapol_sm_deinit
    行 85380: 01-01 08:01:06.951  3957  6168 I C05200/wpa_supplicant: wlan0: Cancelling scan request
    行 85381: 01-01 08:01:06.952  3957  6168 I C05200/wpa_supplicant: wlan0: CTRL-EVENT-DSCP-POLICY clear_all
    行 85382: 01-01 08:01:06.952  3957  6168 I C05200/wpa_supplicant: config->openssl_ciphers is NULL
    行 85384: 01-01 08:01:06.952  3957  4200 I C01566/HdiWpaHal: WpaCliAddIface failed, cmd: INTERFACE_ADD wlan0    /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf, buf: FAIL

 

六.解决方案:

1.drivers\peripheral\wlan\wlan.gni:

    drivers_peripheral_wlan_feature_vendor = "default"

    解决问题:HDF_LOG_TAG: failed to open vendor hal library: libwifi_hal_hw.z.so

2.vendor\hisilicon\mp_hi3781v735\hdf_config\uhdf\device_info.hcs:

         wlan :: host {
            hostName = "wifi_host";
            priority = 50;
            wifi_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    moduleName = "libwifi_hdi_device.z.so";
                    serviceName = "wlan_hal_service";
                }
            }
            chip_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    moduleName = "libchip_hdi_driver.z.so";
                    serviceName = "chip_interface_service";
                }
            }

        }
        wifi :: host {
            hostName = "wifi_c_host";
            priority = 50;
            uid = "root";
            gid = ["root", "wifi_group", "wifi", "wifi_host"];

            wifi_c_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    moduleName = "libwifi_hdi_c_device.z.so";
                    serviceName = "wlan_hal_c_service";
                }
            }
            wpa_c_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    preload = 2;
                    moduleName = "libwpa_hdi_c_device.z.so";
                    serviceName = "wpa_interface_service";
                }
            }
        }

   解决问题:service chip_interface_service not found问题以及权限相关问题

3.vendor\hisilicon\mp_hi3781v735\image_cfg\system\cfg\init.shaolingun.cfg

            "name" : "fs",
            "cmds" : [
                "insmod /vendor/lib64/modules/eth_gmac.ko",
                "insmod /vendor/etc/ko/ztop_wifi_driver.ko",
                "insmod /vendor/etc/rtk_btusb.ko",
                "chmod 666 /dev/uhid",
                "chmod 777 /dev/rtkbt_dev"
            ]

    解决问题:开机自动加载ko问题

4.解决扫描结果被过滤掉的问题:

5.解决连接wpa3加密方式的热点失败的问题:

6.解决关闭wifi再打开失败的问题:

drivers\peripheral\wlan\wpa\interfaces\hdi_service\wpa_interface_drivers.c

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐