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__,
之后重新编译烧录再次测试