RV1126 WIFI移植记录AP6256

AP系列驱动位置,这个是ap通用驱动

kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd

查看原理图和ap6256手册

确认gpio口对应情况,检查供电

WIFI_WAKE_HOST是中断脚,当WiFi开始工作时,唤醒cpu,从低功耗模式到工作模式

HOST_WAKE_WIFI是电源使能脚,WiFi即使在低功耗模式也需要一直使能,否则会造成WiFi内部状态丢失,导致唤醒失败

我这里用万用表检查过供电情况,对照手册确认是工作在正常电压范围内,调试一切硬件都要确保供电正常,这是硬件能否工作的决定性因素。

设备树配置

另外我的AP6256是有37.4MHz的晶振提供时钟的,因此不用主板去给他提供时钟了

WiFi使能脚我不是通过gpio供电的,而是硬件只连的方式,所以设备树没写使能脚

    sdio_pwrseq: sdio-pwrseq {
        compatible = "mmc-pwrseq-simple";
//        clocks = <&hym8563>;                        //时钟由WiFi自带37.4MHz晶振提供
//        clock-names = "ext_clock";
        pinctrl-names = "default";
        pinctrl-0 = <&wifi_enable_h>;

        /*
         * On the module itself this is one of these (depending
         * on the actual card populated):
         * - SDIO_RESET_L_WL_REG_ON
         * - PDN (power down when low)
         */
        reset-gpios = <&gpio1 RK_PD1 GPIO_ACTIVE_LOW>;
    };    
 
     wireless_wlan: wireless-wlan {
        compatible = "wlan-platdata";
        rockchip,grf = <&grf>;
//        clocks = <&hym8563>;                        //时钟由WiFi自带37.4MHz晶振提供
//        clock-names = "clk_wifi";
        pinctrl-names = "default";
        pinctrl-0 = <&wifi_wake_host>;
        wifi_chip_type = "ap6256";
        WIFI,host_wake_irq = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
        status = "okay";
    };

 
 
//pinctrl配置情况                                                                                                                                                                                          

&pinctrl {


    sdio-pwrseq {
        /omit-if-no-ref/
        wifi_enable_h: wifi-enable-h {
            rockchip,pins = <1 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };

    wireless-wlan {
        /omit-if-no-ref/
        wifi_wake_host: wifi-wake-host {
            rockchip,pins = <1 RK_PD0 0 &pcfg_pull_up>;
        };
    };

 
};

驱动配置如下

在kernel目录下

make ARCH=arm rv1126_defconfig
make ARCH=arm menuconfig

______________________________

Device Drivers
    [*] Network device support
        [*] Wireless LAN
            <*> Rockchip Wireless LAN support
                [*] Broadcom Wireless Device Driver Support
                    <M> Select driver version for ap6xxx chips
                    <M>  stable version(wifi5)
                    
____________________________

保存退出
make ARCH=arm savedefconfig
cp defconfig arch/arm/rv1126_defconfig

cd ../
./build.sh kernel

编译完的ko文件为drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmdhd.ko

将ko文件粘贴进指定文件夹下

cp bcmdhd.ko buildroot buildroot/output/rockchip_rv1126_rv1109/target/vendor/lib/modules
./build.sh rootfs
./build.sh updateimg

烧录镜像文件,启动系统

insmod vendor/lib/modules/bcmdhd.ko
ifconfig wlan0 up
wifi_start.sh test1 1234567890    //test1 123456789 为WiFi名和密码

问题:

ifconfig wlan0 up遇到如下问题

ifconfig: SIOCSIFFLAGS: Operation not possible due to RF-kill

这个是buildroot系统配置问题,配置如下,注意这里的config文件要根据个人情况具体来配置

vim buildroot/configs/rockchip_rv1126_rv1109_defconfig

buildroot配置修改如下配置并保存:
BR2_PACKAGE_IPC_DAEMON = n
BR2_PACKAGE_NETSERVER = n
BR2_PACKAGE_CONNMAN = n
BR2_PACKAGE_DHCPCD = y
删掉中间文件:
buildroot/output/rockchip_rv1126_rv1109_xxx/target/etc/init.d/S45connman
buildroot/output/rockchip_rv1126_rv1109_xxx/target/usr/bin/connmanctl
buildroot/output/rockchip_rv1126_rv1109_xxx/target/usr/sbin/connmand

SDK/app/netserver/main.c文件做如下修改

SDK/app/netserver$ git diff main.c
diff --git a/main.c b/main.c
index 2bbb37b..dc0232a 100644
--- a/main.c
+++ b/main.c
@@ -67,6 +67,8 @@ static const struct option long_options[] = {

 int main( int argc , char ** argv)
 {
+
+    return 0;
 #ifdef ENABLE_MINILOGGER
     enable_minilog = 1;

drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c文件做如下修改

--- a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c
+++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c

@@ -338,7 +338,7 @@ int dhd_wlan_init_gpio(void)

 #else
        host_oob_irq_flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_SHAREABLE;
 #endif
-
+       host_oob_irq_flags = 0x4;
        dhd_wlan_resources[0].start = dhd_wlan_resources[0].end = host_oob_irq;
        dhd_wlan_resources[0].flags = host_oob_irq_flags;

        printf("%s: WL_HOST_WAKE=%d, oob_irq=%d, oob_irq_flags=0x%x\n", __FUNCTION__,

之后重新编译烧录再次测试