AP6236 WiFi模块调试记录

基于ESP32与LVGL构建Homelab SSH控制面板:从嵌入式图形化到远程命令执行 SSH(Secure Shell)是用于远程登录和管理服务器的核心网络协议,其基于加密通道实现安全的命令执行与文件传输。在嵌入式系统领域,ESP32系列芯片凭借其强大的网络连接能力与适中的处理性能,成为构建物联网终端和交互设备的理想选择。结合LVGL(Light and Versatile Graphics Library)这一轻量级嵌入式图形库,开发者能够在资源受限的设备上创建流畅的图形用户界面,将复杂的命令行操作封装为直观的触控按钮,极大提升了运维效率与交互体验。这种技术组合的价值在于实现了专业运维工具 阅读详情

AP6236 WiFi模块调试记录

Platform: RK3368
OS: Android 6.0
Kernel: 3.10.0

内核驱动移植

1. 更新驱动

先将供应商给的最新wifi驱动更新到kernel中:drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/

1.1 修改驱动代码,适配rk平台

修改Makefile中的WiFi配置:

diff --git a/Makefile b/Makefile
index 5beada4..fdd9e22 100644
--- a/Makefile
+++ b/Makefile
@@ -2,16 +2,17 @@
 # 1. WL_IFACE_COMB_NUM_CHANNELS must be added if Android version is 4.4 with Kernel version 3.0~3.4,
 #    otherwise please remove it.
 
-#CONFIG_BCMDHD := m
-#CONFIG_BCMDHD_SDIO := y
+CONFIG_BCMDHD := y
+CONFIG_BCMDHD_SDIO := y
 #CONFIG_BCMDHD_PCIE := y
 #CONFIG_BCMDHD_USB := y
 
-#CONFIG_BCMDHD_OOB := y
+CONFIG_BCMDHD_OOB := y
 #CONFIG_BCMDHD_CUSB := y
 CONFIG_BCMDHD_PROPTXSTATUS := y
+#CONFIG_BCMDHD_AG := y
 #CONFIG_DHD_USE_STATIC_BUF := y
-#CONFIG_VTS_SUPPORT := y
+CONFIG_VTS_SUPPORT := y
 
 CONFIG_MACH_PLATFORM := y
 #CONFIG_BCMDHD_DTS := y
@@ -25,7 +26,9 @@ DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DBCMDRIVER                 \
        -DMULTIPLE_SUPPLICANT -DTSQ_MULTIPLIER -DMFP                          \
        -DWL_EXT_IAPSTA                                                       \
        -DENABLE_INSMOD_NO_FW_LOAD                                            \
-       -Idrivers/net/wireless/bcmdhd -Idrivers/net/wireless/bcmdhd/include
+       -Idrivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd                    \
+       -Idrivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include
+
 
 DHDOFILES = aiutils.o siutils.o sbutils.o bcmutils.o bcmwifi_channels.o   \
        dhd_linux.o dhd_linux_platdev.o dhd_linux_sched.o dhd_pno.o           \

修改dhd_gpio.c添加WiFi模块电源控制和sdio卡检测:

diff --git a/dhd_gpio.c b/dhd_gpio.c
index 0819d0c..25a44ba 100644
--- a/dhd_gpio.c
+++ b/dhd_gpio.c
@@ -2,6 +2,7 @@
 #include <osl.h>
 #include <dhd_linux.h>
 #include <linux/gpio.h>
+#include <linux/rfkill-wlan.h>
 
 #ifdef CUSTOMER_HW_PLATFORM
 #include <plat/sdhci.h>
@@ -64,6 +65,7 @@ dhd_wlan_set_power(int on
                }
 #endif /* BCMPCIE */
 #endif /* BUS_POWER_RESTORE */
+               rockchip_wifi_power(1);
                /* Lets customer power to get stable */
                mdelay(100);
        } else {
@@ -92,6 +94,7 @@ dhd_wlan_set_power(int on
                                return -EIO;
                        }
                }
+               rockchip_wifi_power(0);
        }
 
        return err;
@@ -116,6 +119,7 @@ static int dhd_wlan_set_carddetect(int present)
 #elif defined(BCMPCIE)
                printf("======== Card detection to detect PCIE card! ========\n");
 #endif
+               rockchip_wifi_set_carddetect(1);
        } else {
 #if defined(BCMSDIO)
                printf("======== Card detection to remove SDIO card! ========\n");
@@ -125,6 +129,7 @@ static int dhd_wlan_set_carddetect(int present)
 #elif defined(BCMPCIE)
                printf("======== Card detection to remove PCIE card! ========\n");
 #endif
+               rockchip_wifi_set_carddetect(0);
        }
 #endif /* BUS_POWER_RESTORE */
 
@@ -157,6 +162,7 @@ static int dhd_wlan_get_mac_addr(unsigned char *buf)
                bcopy(macpad, buf+6, sizeof(macpad));
        }
 #endif /* EXAMPLE_GET_MAC_VER2 */
+       err = rockchip_wifi_mac_addr(buf);
 
        return err;
 }

修改dhd_linux.c添加WiFi驱动模块加载入口和指定WiFi固件路径:

diff --git a/dhd_linux.c b/dhd_linux.c
index 936a6c8..c63333f 100644
--- a/dhd_linux.c
+++ b/dhd_linux.c
@@ -481,7 +481,7 @@ static int is_reboot = 0;
 dhd_pub_t      *g_dhd_pub = NULL;
 #endif /* defined (BT_OVER_SDIO) */
 
-atomic_t exit_in_progress = ATOMIC_INIT(0);
+static atomic_t exit_in_progress = ATOMIC_INIT(0);
 
 typedef struct dhd_if_event {
        struct list_head        list;
@@ -9915,6 +9915,8 @@ int dhd_bus_get_fw_mode(dhd_pub_t *dhdp)
        return dhd_get_fw_mode(dhdp->info);
 }
 
+extern int rkwifi_set_firmware(char *fw, char *nvram);
+
 bool dhd_update_fw_nv_path(dhd_info_t *dhdinfo)
 {
        int fw_len;
@@ -9925,6 +9927,8 @@ bool dhd_update_fw_nv_path(dhd_info_t *dhdinfo)
        const char *nv = NULL;
        const char *clm = NULL;
        const char *conf = NULL;
+       char firmware[100] = {0};
+       char nvram[100] = {0};
 #ifdef DHD_UCODE_DOWNLOAD
        int uc_len;
        const char *uc = NULL;
@@ -9946,11 +9950,16 @@ bool dhd_update_fw_nv_path(dhd_info_t *dhdinfo)
 
        /* set default firmware and nvram path for built-in type driver */
 //     if (!dhd_download_fw_on_driverload) {
+               rkwifi_set_firmware(firmware, nvram);
 #ifdef CONFIG_BCMDHD_FW_PATH
                fw = CONFIG_BCMDHD_FW_PATH;
+#else
+               fw = firmware;
 #endif /* CONFIG_BCMDHD_FW_PATH */
 #ifdef CONFIG_BCMDHD_NVRAM_PATH
                nv = CONFIG_BCMDHD_NVRAM_PATH;
+#else
+               nv = nvram;
 #endif /* CONFIG_BCMDHD_NVRAM_PATH */
 //     }
 
@@ -13276,7 +13285,7 @@ dhd_module_cleanup(void)
        printf("%s: Exit\n", __FUNCTION__);
 }
 
-static void __exit
+static void 
 dhd_module_exit(void)
 {
        atomic_set(&exit_in_progress, 1);
@@ -13285,11 +13294,12 @@ dhd_module_exit(void)
        dhd_destroy_to_notifier_skt();
 }
 
-static int __init
+static int 
 dhd_module_init(void)
 {
        int err;
        int retry = POWERUP_MAX_RETRY;
+       atomic_set(&exit_in_progress, 0);
 
        printf("%s: in %s\n", __FUNCTION__, dhd_version);
 
@@ -13347,7 +13357,46 @@ dhd_reboot_callback(struct notifier_block *this, unsigned long code, void *unuse
        return NOTIFY_DONE;
 }
 
+#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
+static int wifi_init_thread(void *data)
+{
+       dhd_module_init();
+
+       return 0;
+}
+#endif
+
+int rockchip_wifi_init_module_rkwifi(void)
+{
+    printk("=======================================================\n");
+    printk("==== Launching Wi-Fi driver! (Powered by Rockchip) ====\n");
+    printk("=======================================================\n");
+#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
+       struct task_struct *kthread = kthread_run(wifi_init_thread, NULL, "wifi_init_thread");
+       if (IS_ERR(kthread))
+               pr_err("create wifi_init_thread failed.\n");
+    return 0; 
+#else
+       return dhd_module_init();
+#endif
+}
+
+void rockchip_wifi_exit_module_rkwifi(void)
+{
+    printk("=======================================================\n");
+    printk("== Dis-launching Wi-Fi driver! (Powered by Rockchip) ==\n");
+    printk("=======================================================\n");
+       dhd_module_exit();
+}
 
+#ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP
+late_initcall(rockchip_wifi_init_module_rkwifi);
+module_exit(rockchip_wifi_exit_module_rkwifi);
+#else
+EXPORT_SYMBOL(rockchip_wifi_init_module_rkwifi);
+EXPORT_SYMBOL(rockchip_wifi_exit_module_rkwifi);
+#endif
+#if 0
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
 #if defined(CONFIG_DEFERRED_INITCALLS) && !defined(EXYNOS_PCIE_MODULE_PATCH)
 #if defined(CONFIG_MACH_UNIVERSAL7420) || defined(CONFIG_SOC_EXYNOS8890) || \
@@ -13370,6 +13419,7 @@ module_init(dhd_module_init);
 
 module_exit(dhd_module_exit);
 
+#endif
 /*
  * OS specific functions required to implement DHD driver in OS independent way
  */

修改dhd_linux_platdev.c,替换中断标志:

diff --git a/dhd_linux_platdev.c b/dhd_linux_platdev.c
index 3c6c171..a71a7d8 100644
--- a/dhd_linux_platdev.c
+++ b/dhd_linux_platdev.c
@@ -172,11 +172,19 @@ void* wifi_platform_get_prealloc_func_ptr(wifi_adapter_info_t *adapter)
 
 int wifi_platform_get_irq_number(wifi_adapter_info_t *adapter, unsigned long *irq_flags_ptr)
 {
+       if (irq_flags_ptr) {
+               *irq_flags_ptr = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE) & IRQF_TRIGGER_MASK;
+       }
+
+       return rockchip_wifi_get_oob_irq();
+
+/*
        if (adapter == NULL)
                return -1;
        if (irq_flags_ptr)
                *irq_flags_ptr = adapter->intr_flags;
        return adapter->irq_num;
+       */
 }
 
 int wifi_platform_set_power(wifi_adapter_info_t *adapter, bool on, unsigned long msec)

2. 修改RK平台代码

添加模块信息:
menuconfig添加AP6236选项,用来适配此wifi模块:

diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
index 10c0979409d..6c14c58909e 100755
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -92,6 +92,10 @@ choice
                bool "AP6234"
                depends on RKWIFI
 
+       config AP6236
+               bool "AP6236"
+               depends on RKWIFI
+
        config AP6330
                bool "AP6330"
                depends on RKWIFI

添加AP6236的固件所在路径:

diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/rk_wifi_config.c b/drivers/net/wireless/rockchip_wlan/rkwifi/rk_wifi_config.c
index db94e7e79f6..562e1c91268 100644
--- a/drivers/net/wireless/rockchip_wlan/rkwifi/rk_wifi_config.c
+++ b/drivers/net/wireless/rockchip_wlan/rkwifi/rk_wifi_config.c
@@ -62,6 +62,11 @@ if (chip == WIFI_AP6234) {
        sprintf(nvram, "%s%s", ANDROID_FW_PATH, "nvram_AP6234.txt");
 }
 
+if (chip == WIFI_AP6236) {
+    sprintf(fw, "%s%s", ANDROID_FW_PATH, "fw_bcm43436b0.bin");
+       sprintf(nvram, "%s%s", ANDROID_FW_PATH, "nvram_ap6236.txt");
+}
+
 if (chip == WIFI_AP6441) {
     sprintf(fw, "%s%s", ANDROID_FW_PATH, "fw_bcm43341b0_ag.bin");
        sprintf(nvram, "%s%s", ANDROID_FW_PATH, "nvram_AP6441.txt");

diff --git a/drivers/net/wireless/rockchip_wlan/wifi_sys/rkwifi_sys_iface.c b/drivers/net/wireless/rockchip_wlan/wifi_sys/rkwifi_sys_iface.c
index 2746daf3ae7..7fb560d08e6 100755
--- a/drivers/net/wireless/rockchip_wlan/wifi_sys/rkwifi_sys_iface.c
+++ b/drivers/net/wireless/rockchip_wlan/wifi_sys/rkwifi_sys_iface.c
@@ -46,7 +46,12 @@ static ssize_t wifi_chip_read(struct class *cls, struct class_attribute *attr, c
            count = sprintf(_buf, "%s", "AP6234");
            printk("Current WiFi chip is AP6234.\n");
        }
-       
+
+       if(type == WIFI_AP6236) {
+           count = sprintf(_buf, "%s", "AP6236");
+           printk("Current WiFi chip is AP6236.\n");
+       }
+
        if(type == WIFI_AP6330) {
            count = sprintf(_buf, "%s", "AP6330");
            printk("Current WiFi chip is AP6330.\n");

diff --git a/include/linux/rfkill-wlan.h b/include/linux/rfkill-wlan.h
index 071f1b86c0b..4bf29511171 100755
--- a/include/linux/rfkill-wlan.h
+++ b/include/linux/rfkill-wlan.h
@@ -49,6 +49,7 @@ enum {
     WIFI_AP6210,
     WIFI_AP6212,
     WIFI_AP6234,
+    WIFI_AP6236,
     WIFI_AP6330,
     WIFI_AP6335,
     WIFI_AP6354,

diff --git a/net/rfkill/rfkill-wlan.c b/net/rfkill/rfkill-wlan.c
index 411dbfba70e..ba041bd10ee 100755
--- a/net/rfkill/rfkill-wlan.c
+++ b/net/rfkill/rfkill-wlan.c
@@ -88,6 +88,8 @@ static const char wlan_name[] =
     #endif
 #elif defined(CONFIG_AP6330)
                "ap6330"
+#elif defined(CONFIG_AP6236)
+               "ap6236"
 #elif defined(CONFIG_AP6476)
                "ap6476"
 #elif defined(CONFIG_AP6493)
@@ -113,6 +115,8 @@ int get_wifi_chip_type(void)
         type = WIFI_AP6181;
     } else if (strcmp(wifi_chip_type_string, "ap6234") == 0) {
         type = WIFI_AP6234;                            
+    } else if (strcmp(wifi_chip_type_string, "ap6236") == 0) {
+        type = WIFI_AP6236;
     } else if (strcmp(wifi_chip_type_string, "ap6330") == 0) {
         type = WIFI_AP6330;
     } else if (strcmp(wifi_chip_type_string, "ap6335") == 0) {

AP6236的蓝牙需要添加串口RTS控制,否则串口不通:

diff --git a/net/rfkill/rfkill-bt.c b/net/rfkill/rfkill-bt.c
index 3df55f92d07..072cacb0e5f 100755
--- a/net/rfkill/rfkill-bt.c
+++ b/net/rfkill/rfkill-bt.c
@@ -97,6 +97,8 @@ static const char bt_name[] =
     #endif
 #elif defined(CONFIG_AP6330)
                "ap6330"
+#elif defined(CONFIG_AP6236)
+                       "ap6236"
 #elif defined(CONFIG_AP6476)
                "ap6476"
 #elif defined(CONFIG_AP6493)
@@ -266,7 +268,7 @@ static int rfkill_rk_set_power(void *data, bool blocked)
        struct rfkill_rk_data *rfkill = data;
     struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio;
     struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio;
-#if defined(CONFIG_AP6210) || defined(CONFIG_AP6335)
+#if defined(CONFIG_AP6210) || defined(CONFIG_AP6335) || defined(CONFIG_AP6236)
     struct rfkill_rk_gpio* rts = &rfkill->pdata->rts_gpio;
     struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
 #endif
@@ -307,7 +309,7 @@ static int rfkill_rk_set_power(void *data, bool blocked)
             msleep(20);
                        gpio_direction_output(reset->io, reset->enable);
         }
-#if defined(CONFIG_AP6210) || defined(CONFIG_AP6335)
+#if defined(CONFIG_AP6210) || defined(CONFIG_AP6335) || defined(CONFIG_AP6236)
         if (pinctrl != NULL && gpio_is_valid(rts->io))
         {
             pinctrl_select_state(pinctrl, rts->gpio_state);

3 修改dts文件中的wifi配置,修改wireless-wlan节点里面:

	wireless-wlan {
		compatible = "wlan-platdata";
				rockchip,grf = <&grf>;

				/* wifi_chip_type - wifi chip define
				 * ap6210, ap6330, ap6335
				 * rtl8188eu, rtl8723bs, rtl8723bu
				 * esp8089
				*/
				wifi_chip_type = "ap6236";

		sdio_vref = <3300>; //1800mv or 3300mv

		//keep_wifi_power_on;

		//power_ctrl_by_pmu;
 		//power_pmu_regulator = "rk818_ldo8_reg";
		//power_pmu_enable_level = <1>; //1->HIGH, 0->LOW

		//vref_ctrl_enable;
		//vref_ctrl_gpio = <&gpio0 GPIO_A2 GPIO_ACTIVE_HIGH>;
 		//vref_pmu_regulator = "rk818_ldo8_reg";
		//vref_pmu_enable_level = <1>; //1->HIGH, 0->LOW

		WIFI,poweren_gpio = <&gpio3 GPIO_A4 GPIO_ACTIVE_HIGH>;
		WIFI,host_wake_irq = <&gpio3 GPIO_A7 GPIO_ACTIVE_LOW>;
		//WIFI,reset_gpio = <&gpio0 GPIO_A2 GPIO_ACTIVE_LOW>;

		status = "okay";
	};

	wireless-bluetooth {
		compatible = "bluetooth-platdata";

		//wifi-bt-power-toggle;

		uart_rts_gpios = <&gpio2 GPIO_D3 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default","rts_gpio";
		pinctrl-0 = <&uart0_rts>;
		pinctrl-1 = <&uart0_rts_gpio>;

		//BT,power_gpio = <&gpio3 GPIO_A3 GPIO_ACTIVE_HIGH>;
		BT,reset_gpio = <&gpio3 GPIO_D5 GPIO_ACTIVE_HIGH>; //bt_dis
		BT,wake_gpio = <&gpio3 GPIO_A6 GPIO_ACTIVE_HIGH>;
		BT,wake_host_irq = <&gpio3 GPIO_A2 GPIO_ACTIVE_HIGH>;

		status = "okay";
	};

Android系统适配

将wifi的firmware和nvram加到Android源码目录external/wlan_loader,与前面添加的模块信息中的文件名一致,编译时会自动复制到system/etc/firmware/:

firmware/fw_bcm43436b0.bin b/firmware/fw_bcm43436b0.bin
firmware/fw_bcm43436b0_apsta.bin b/firmware/fw_bcm43436b0_apsta.bin
firmware/nvram_ap6236.txt

遇到的问题

1. 蓝牙打不开

日志:

01-21 11:30:01.591  1122  1172 I bt_bluedroid: enable
01-21 11:30:01.592  1122  1173 D bt_stack_manager: event_start_up_stack is bringing up the stack.
01-21 11:30:01.605  1122  1173 I bt_hci  : start_up
01-21 11:30:01.611  1122  1173 D WifiHW  : check_wifi_chip_type_string: AP6236
01-21 11:30:01.611  1122  1173 D bt_vendor: vendor_open load libbt-vendor.so
01-21 11:30:01.622  1122  1173 I bt_vendor: alloc value 0xf3bf9301
01-21 11:30:01.622  1122  1173 I bt_vendor: init
01-21 11:30:01.622  1122  1173 E bt_userial_vendor: /dev/ttyS0 vnd_userial.port_name=libbt-vendor.so
01-21 11:30:01.622  1122  1173 I bt_vnd_conf: Attempt to load conf from /etc/bluetooth/bt_vendor.conf
01-21 11:30:01.623  1122  1173 I bt_hci  : start_up bluetooth_rtk_h5_flag :0
01-21 11:30:01.623  1122  1173 D bt_vendor: op for 0
01-21 11:30:01.623  1122  1173 D bt_upio : is_emulator_context : 0
01-21 11:30:01.623  1122  1173 D bt_upio : is_rfkill_disabled ? [0]
01-21 11:30:01.623  1122  1173 D bt_upio : is_rfkill_disabled ? [0]
01-21 11:30:01.650  1122  1173 D bt_upio : Delay 500ms for bluetooth power up
01-21 11:30:02.150  1122  1173 D bt_vendor: op for 0
01-21 11:30:02.150  1122  1173 D bt_upio : is_emulator_context : 0
01-21 11:30:02.150  1122  1173 D bt_upio : is_rfkill_disabled ? [0]
01-21 11:30:02.290  1122  1173 D bt_upio : Delay 500ms for bluetooth power up
01-21 11:30:02.790  1122  1173 D bt_vendor: Delay for a while after BT power on
01-21 11:30:02.991  1122  1173 D bt_hci  : start_up starting async portion
01-21 11:30:02.991  1122  1203 I bt_hci  : event_finish_startup
01-21 11:30:02.991  1122  1203 I bt_hci_h4: hal_open
01-21 11:30:02.991  1122  1203 D bt_vendor: op for 3
01-21 11:30:02.991  1122  1203 I bt_userial_vendor: userial vendor open: opening /dev/ttyS0
01-21 11:30:02.992  1122  1203 I bt_userial_vendor: device fd = 52 open
01-21 11:30:02.993  1122  1203 D bt_vendor: op for 1
01-21 11:30:03.000  1122  1203 I bt_hwcfg: bt vendor lib: set UART baud 1500000
01-21 11:30:03.203  1122  1203 D bt_hwcfg: Chipset BCM43430B0
01-21 11:30:03.204  1122  1203 D bt_hwcfg: Target name = [BCM43430B0]
01-21 11:30:03.204  1122  1203 D WifiHW  : check_wifi_chip_type_string: AP6236
01-21 11:30:03.204  1122  1203 I bt_hwcfg: BT module name is: AP6236, p_chip_id_str = BCM43430B0
01-21 11:30:03.204  1122  1203 I bt_hwcfg: Target HCD file name is: BCM43430B0.hcd
01-21 11:30:03.206  1122  1203 D bt_hwcfg: Target name = [BCM43430]
01-21 11:30:03.206  1122  1203 D WifiHW  : check_wifi_chip_type_string: AP6236
01-21 11:30:03.206  1122  1203 I bt_hwcfg: BT module name is: AP6236, p_chip_id_str = BCM43430
01-21 11:30:03.206  1122  1203 I bt_hwcfg: Target HCD file name is: BCM43430.hcd
01-21 11:30:03.207  1122  1203 E bt_hwcfg: vendor lib preload failed to locate firmware patch file
01-21 11:30:03.207  1122  1203 I bt_hwcfg: Setting local bd addr to 22:22:95:1C:00:01
01-21 11:30:03.208  1122  1203 I bt_hwcfg: vendor lib fwcfg completed
01-21 11:30:03.208  1122  1203 I bt_vendor: firmware callback
01-21 11:30:03.208  1122  1203 I bt_hci  : firmware_config_callback

解决办法:
将BCM43430.hcd文件放到vendor/rockchip/common/bluetooth/lib/firmware/目录下面,编译时会自动拷贝到/system/vendor/firmware/目录下面.

2. 在系统设置->WLAN中打开WiFi自动关闭

具体现象:

在系统设置->WLAN中,先连接一个WiFi热点,然后重启板子;进入系统后WiFi已经自动连接上之前保存的SSID,然后关闭WiFi再打开WiFi,出现打开WiFi自动关闭情况.

logcat:

[   73.378836]  [0:WifiStateMachin:  629] wl_android_wifi_on: Success
[   73.418263]  [0:WifiStateMachin:  629] [dhd] CFG80211-ERROR) __wl_update_wiphybands : error reading vhtmode (-23)
[   73.432993]  [0:WifiStateMachin:  629] dhd_open : the lock is released.
[   73.433079]  [0:WifiStateMachin:  629] dhd_open: Exit ret=0
[   73.754200]  [0: wpa_supplicant: 1394] P2P interface registered
[   73.754343]  [0: wpa_supplicant: 1394] wl_cfgp2p_add_p2p_disc_if: wdev: ffffffc02302ec00, wdev->net:           (null)
[   73.766470]  [2:        dhd_dpc: 1389] WLC_E_IF: NO_IF set, event Ignored
[   73.769732]  [1: wpa_supplicant: 1394] P2P interface started
[   73.861211]  [3: wpa_supplicant: 1394] dhd_ioctl_entry module exit in progress
[   73.862132]  [3: wpa_supplicant: 1394] dhd_ioctl_entry module exit in progress
[   73.863011]  [3: wpa_supplicant: 1394] dhd_ioctl_entry module exit in progress
[   73.869035]  [3: wpa_supplicant: 1394] dhd_ioctl_entry module exit in progress

解决办法:

修改WiFi驱动dhd_linux.c,将exit_in_progress初始化放到dhd_module_init中;因为驱动时build-in方式编译进kernel的,所以需要注意atomic的配对使用.

3. sdmmc通信报错

出错日志:

rk_sdmmc: ERROR Cmd response timeout hold times overflow. [mmc0]

解决办法:
修改/system/etc/firmware/config.txt,关闭自动休眠.

dhd_slpauto=0

或者采用轮询方式

dhd_poll=0

4. 32k晶振不起振

查看规格书发现32K晶振1脚需要悬空.

5. Wifi信号差

26M晶振的CL参数需要调整;

Linux 内核蓝牙驱动移植 阅读详情

相关推荐

Rk3399-linux-适配ap6256

wifi驱动:/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmdhd.ko。蓝牙驱动:/kernel/drivers/bluetooth/hci_uart.ko。

Paper_Love的博客 1741

STM32MP157 AP6236 WiFi蓝牙模块

AP6236是采用BCM43436B0方案,2.4G单频单通道SDIO接口支持BT4.2单频蓝牙WiFi二合一模块。

Sonboy的博客 3168

RK3399驱动开发 | 14 - AP6255 SDIO WiFi 调试(基于linux5.4.32内核)

NULL

Mculover666的博客(嵌入式) 2434

AP6236调试-网卡检测不到,数据接收不到等问题

希望大家都能顺利跳坑

kof98765的专栏 1571

wifi ap6212驱动移植及调试分析技术笔记

这次帮客户调试wifi模块ap6212模块( BCM43438),由于硬件设计的问题,导致出现了各种驱动加载报错信息,而且网上很少这些报错信息,这才让人头疼,只好慢慢去摸索。本次是基于imx6平台进行调试,在imx6dl和imx6ul两个型号都调试成功。 驱动加载 将驱动加载到内核里,我没有将wifi编译成模块.ko,如果成功加载会打印以下信息。 dhd_module_init in Power-up adapter 'DHD generic adapter' - irq 50 [flags 1044],

qq_45147279的博客 1万+

Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记

这次的WiFi模块调试相比上次ap6212WiFi驱动调试笔记又有不一样的收获,这次是纠结在bus-width=为4线一直不行,当把bus-width改为1后(sdio单线模式)后,就能顺利加载模块了。电压不一样也会影响WIFI不能正常工作,如何去切换SDIO3.0和SDIO2.0模式。

qq_45147279的博客 1万+

基于韦东山STM32MP157开发板实现智能家居项目(蓝牙驱动求助)

本文记录了基于STM32MP157开发板进行蓝牙驱动开发的尝试过程。作者原计划使用HC-05模块,后发现开发板自带AP6236 WiFi/蓝牙二合一模块(支持BT4.2)。通过分析设备树配置,确认SDIO接口用于WiFi、UART接口用于蓝牙,相关驱动已由官方配置完成。测试中虽能通过hciconfig和hcitool检测到蓝牙设备,但无法实现与手机端的配对连接。文章详细列出了设备树中关于WiFi、蓝牙和RTC的配置信息,并寻求解决手机端无法发现开发板蓝牙的问题。最终目标功能未能实现,期待获得相关技术指导。

jony_jyyds的博客 769

AP6236固件.zip

AMPAK台湾正基WIFI模块AP6236固件资料,AP6256是正基2017年推出的一款单通道单通道802.11a/b/g/n/ac的WIFI+BT5.0模块,也是最先一批应用蓝牙5.0标准的一批模块,AP6256采用SDIO3.0接口进行WIFI功能的通信,UART及PCM接口做为蓝牙功能的通信

ESP32-P4+C5双芯架构:不堆模块,一块屏如何成为物联网网关

物联网网关的核心在于协议转换与本地算力,传统方案依赖主控外挂无线模块,常面临资源竞争与通信瓶颈。ESP32-P4与ESP32-C5的双芯架构将人机交互与网络接入拆分为独立硬件通路,通过高速片间总线协作,实现显示刷新与无线通信互不干扰。这种设计不仅提升了多协议并发能力,还支持Wi-Fi 6双频与Thread边界路由器,让智能家居中控屏、工业HMI面板等设备在断网时仍可本地控制。片间通信协议与双芯OTA协同是工程落地的关键,合理配置SDIO或SPI通道可平衡带宽与成本。

weixin_34343000的博客 381

AP6256驱动.7z

AP6256驱动,应用Linux系统

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 309

bluez5.50+pulseaudio实现蓝牙音响音频播放

使用bluez5.50完成蓝牙音响连接和音频播放操作,基于全志T507平台

跑不了的你的博客 6641

TBtools的序列提取步骤

本教程详细介绍了如何使用TBtools软件从原来的FASTA序列中提取特定的DNA序列。

weixin_47509995的博客 1万+

基于TGAM与ESP32-CYD的无线脑电波形采集系统设计与实现

脑电信号采集在医疗、人机交互与可穿戴设备中应用广泛,但传统方案多依赖有线连接,束缚了使用场景。本文从脑电模块的原始数据输出原理出发,探讨如何通过串口转Wi-Fi技术将单导联脑电数据无线化传输,再借助自带屏幕的ESP32-CYD开发板实现实时波形显示与WebSocket网页推送。这种嵌入式物联网链路设计,兼顾了数据完整性、低延迟与工程可调试性,适合用于专注度监测、生物反馈训练等原型验证。文章详细拆解了TGAM模块协议解析、BW16无线搬运、增量绘制及眨眼伪迹处理等关键环节,为搭建家用级实时脑电可视化系统提供了

weixin_33827731的博客 443

安装部署 Guacamole 远程桌面网关

Guacamole 是Apache基金会提供的一组基于web的远程桌面访问工具,支持 VNC、RDP、SSH、 Telnet 等协议,支持远程透传音视频。

UsamaBinLaden6976498的专栏 1963

063.CI/CD for ML:给YOLO项目装上自动化流水线

本文分享了为YOLO目标检测项目搭建CI/CD流水线的实践经验。作者通过手动调试模型导出问题的经历,意识到重复验证工作比模型改进更耗时,提出需要自动化解决方案。文章详细介绍了四阶段流水线设计:1)代码质量检查;2)快速训练验证;3)推理性能基准测试;4)模型注册部署。同时总结了环境不一致、GPU资源争抢等常见问题及解决方案,建议从简单规则开始逐步完善,强调模型版本管理的重要性。实施后不仅提高了效率,还促使团队形成更规范的开发习惯。

2603_95664987的博客 235

rk3399 linux AP6236蓝牙调试

本文主要介绍上层命令调试,驱动调试可参考WiFi调试等文档操作。 1、开启节点 echo 0 > /sys/class/rfkill/rfkill0/state sleep 2 echo 1 > /sys/class/rfkill/rfkill0/state sleep 2 2、加载蓝牙驱动 brcm_patchram_plus1 --bd_addr_rand --enable_hci --no2byte...

qq_32645109的博客 3800

YOLOv11-Pose部署RK3588实战:人体姿态识别精度翻倍,边缘推理速度突破瓶颈

本教程从YOLOv11-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

m0_64661770的博客 138

Android中的sdio配置备忘

Android中的sdio配置备忘 rockchip卡侦测:rockchip_wifi_set_carddetect(1) allwinner卡侦测:sunxi_mmc_rescan_card(-1) android dtsi sdio配置 路径:kernel/arch/arm64/boot/dts &sdio0 { status = "okay"; max-frequency = <150000000>; //sd卡的配置,最大运行频率为150Mhz bus-width = &

qq_42781475的博客 2005

GEE 案例:基于陆地卫星8号(大气层顶反射率数据)LANDSAT/LC08/C02/T1_TOA的生态遥感指数RSEI计算、可视化和下载

摘要:基于GEE的遥感生态指数(RSEI)计算方法 本文介绍了利用Google Earth Engine(GEE)平台计算遥感生态指数(RSEI)的全流程方法。主要内容包括:研究区域定义、Landsat8数据获取与去云预处理、关键生态指标计算(地表温度LST、植被指数NDVI、湿度指数WET和建筑指数NDBSI)、主成分分析(PCA)降维处理,以及结果可视化与数据导出。通过结合多源遥感指标并采用归一化处理,构建了综合反映区域生态环境质量的RSEI指数。该方法为生态环境监测提供了高效的技术方案,所有计算过程均

此星光明博客 450

百万 Token 压力实测:1M Context 的真实能力边界在哪里?

本文揭示了长上下文模型的性能衰减规律:1M上下文存在"容量曲线"与"质量曲线"的分歧,512K是可靠拐点。通过MRCR测试发现,不同任务类型衰减差异显著——检索任务在512K后性能下降30.6%,而生成任务仅下降5%。研究提出三阶段补偿策略:三明治注入(首尾指令强化)、语义面包屑(位置标记)、引用检查(强制溯源),可将512K-1M区间的可用性提升20%。工程实践表明,中段区域(30-70%位置)是注意力薄弱区,需要特殊处理。最终建议:关键检索任务控制在512K内,关联推理任务可扩展至

liuzhupeng的专栏 338

全志A33学习笔记及问题汇总

全志A33学习笔记及问题汇总 全过程: 1.编译环境配置       首次编译,需要导入vstar方案的内核配置,进入linux3.4目录, 如果开启WIFI需修改a33_vstar_defconfig 1294行,改为:CONFIG_BCMDHD_OOB=n   #与硬件电路相关 cp a33_vstar_defconfig   .config ./build.sh  config

YYGY731793898的专栏 7069

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Linux、Android、Windows 等操作系统带有在引导期间启动的蓝牙守护进程/蓝牙服务。 对于与监视器连接并使用 GUI(如 GTK 等)运行的设备,只需多次单击即可轻松启用并连接到附近的设备。 但是在无头设备的情况下,我们必须依赖于需要在命令行上运行的不同命令。 这篇博客我们将讨论如何在无头树莓派上通过蓝牙设备连接附近。

视觉与物联智能 2745

【蓝牙驱动】RTL8723DU驱动(wifi+蓝牙)

rtl8723du reboot不正常 断电重启正常 移植过程

weixin_34799243的博客 4012

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

AP6236固件资源介绍:高性能WIFI+BT模块固件,助力无线通信

AP6236固件资源介绍:高性能WIFI+BT模块固件,助力无线通信 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代无线通信领域,模块化设计已成为提升产品性能和可靠性的关键因素。AP6236固件资源介绍项目,为您提供了一款高性能的WIFI+BT模块——AP6236的固件及相关资源。AP6236固件.zip文件包含了丰富的技术文档和固件,旨在帮助开发者和工程师快速...

gitblog_06723的博客 464

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WIF调试分享(ap6256)

板子rk3568模块ap6256平台android11。

lkdom 9196

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: RK3368 Edp屏调试,利用EDID做兼容
下一篇: rk3368 Android9.0调试记录之系统分区调整
D00PING
博客等级 码龄12年 96粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值