1、源码获取

        可以通过瑞芯微公司提供的ftp文档服务器中查找对应usbwifi驱动源码或找模块供应商要到wifi模块驱动源码

2、拷贝源码

        将上面提取到的usb wifi驱动拷贝到内核drivers/net/wireless/rockchip_wlan/rtl8812au目录中

3、修改内核config文件

    打开arch/arm64/configs/rockchip_defconfig
        修改内容:
            CONFIG_CFG80211=y
            CONFIG_MAC80211=y
            CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=n
            #CONFIG_AP6XXX=y
            CONFIG_RTL8188EU=n
            CONFIG_WIFI_BUILD_MODULE=y
            CONFIG_RTL8812AU=m

4、添加Makefile与Kconfig

    drivers\net\wireless\rockchip_wlan\Makefile
        obj-$(CONFIG_RTL8812AU)	+= rtl8812au/
    drivers\net\wireless\rockchip_wlan\Kconfig
        source "drivers/net/wireless/rockchip_wlan/rtl8812au/Kconfig"

5、修改代码生成方式,使用动态加载模块

    #ifdef CONFIG_RTL_WIRELESS_SOLUTION
            if (type < WIFI_RTL_SERIES) {
                    /*if (enable > 0)
                            ret = rockchip_wifi_init_module_rtkwifi();
                    else
                            rockchip_wifi_exit_module_rtkwifi();*/
                    return ret;
            }
    #endif

注释调驱动其他加载方式

   //#ifdef CONFIG_WIFI_BUILD_MODULE
    module_init(rockchip_wifi_init_module_rtkwifi);
    module_exit(rockchip_wifi_exit_module_rtkwifi);
    /*#else
    #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
    #ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
    late_initcall(rockchip_wifi_init_module_rtkwifi);
    module_exit(rockchip_wifi_exit_module_rtkwifi);
    #else
    EXPORT_SYMBOL(rockchip_wifi_init_module_rtkwifi);
    EXPORT_SYMBOL(rockchip_wifi_exit_module_rtkwifi);
    #endif
    #else
    #ifdef CONFIG_ANDROID_4_2
    module_init(rockchip_wifi_init_module);
    module_exit(rockchip_wifi_exit_module);
    #else
    EXPORT_SYMBOL(rockchip_wifi_init_module);
    EXPORT_SYMBOL(rockchip_wifi_exit_module);
    #endif
    #endif
    #endif*/

6、驱动编译方式

方式一:
        rk3399编译usb wifi驱动采用ko的方式在系统中加载,使用对应的脚本进行编译,脚本文件
        device/rockchip/common/build_wifi_ko.sh
    方式二:
        在内核中输入命令
        make ARCH=arm64 modules -j8 
        在驱动代码目录下会生成对应的ko文件

7、上层驱动加载

    上层驱动加载直接在代码中insmod对应的ko文件
            将usbwifi的ko文件拷贝到系统/sys/lib/modules目录下,开启wifi会自动加载wifi驱动。
        在编译系统时build_wifi_ko.sh脚本会将编译生成ko文件拷贝到对应的目录下。

8、问题分析

在编译生成ko驱动后,拷贝到Android系统/sys/lib/modules目录下,开启wifi发现wifi开启失败,上层服务调用失败。

打开usbwifi驱动LOG打印,发现上层做系统调用时驱动对上层应用返回过空指针

 

查找rtw_cfgvendor_lstats_get_info函数,发现该函数由CONFIG_RTW_CFGVEDNOR_LLSTATS宏控制

 

    在usbwifi驱动的Makefile中关闭上述宏
    #EXTRA_CFLAGS += -DCONFIG_RTW_CFGVEDNOR_LLSTATS
    再次编译usbwifi驱动代码,更换ko文件,重新启动系统,wifi开启成功

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐