RK:RK3368 wifi bt compatible for android 5.1
一,常用wifi型号
a.RelTek系列 AP系列
1 2 3 4 5 6 7 8 9 10 | wifi型号 接口 功能 RTL8188EU USB 单wifi+ 2 .4g RTL8189FTV SDIO 单wifi+ 2 .4g RTL8189ETV SDIO 单wifi+ 2 .4g RTL8723BU USB wifi+bt+ 2 .4g RTL8723BS SDIO wifi+bt+ 2 .4g AP6181 SDIO 单wifi+ 2 .4g AP6236 SDIO wifi+bt+ 2 .4g AP6255 SDIO wifi+bt+ 2 .4g+5g AP6330 SDIO wifi+bt+ 2 .4g+5g |
hardware\libhardware_legacy\wifi\rk_wifi_ctrl.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | static wifi_device supported_wifi_devices[] = { { "RTL8188EU" , "0bda:8179" }, { "RTL8188EU" , "0bda:0179" }, { "RTL8723BU" , "0bda:b720" }, { "RTL8723BS" , "024c:b723" }, { "RTL8188FU" , "0bda:f179" }, { "RTL8189ES" , "024c:8179" }, { "RTL8189FS" , "024c:f179" }, { "RTL8192DU" , "0bda:8194" }, { "RTL8812AU" , "0bda:8812" }, { "SSV6051" , "3030:3030" }, { "ESP8089" , "6666:1111" }, { "AP6354" , "02d0:4354" }, { "AP6330" , "02d0:4330" }, { "AP6255" , "02d0:a9bf" }, { "AP6236" , "02d0:a9a6" }, { "AP6181" , "02d0:a962" }, { "AP6335" , "02d0:4335" } }; |
二.Android5.1 移植说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 内核修改说明: 内核修改牵涉到四个部分: 一. DTS以及config配置 1.1 将AP6XXX系列的WIFI和RelTek系列WIFI驱动将build in方式修改为module方式,文件arch/arm64/configs/rockchip_defconfig添加如下内容。 +CONFIG_BUILD_REALTEK_WIFI_MODULES=y +CONFIG_RTL8723BS=m +CONFIG_RTL8189ES=m +CONFIG_RTL8188FU=m +CONFIG_RTL8723BS_VQ0=m +CONFIG_RTL8723BU=m +CONFIG_RTL8189FS=m +CONFIG_RTL8188EU=m +CONFIG_RTL8812AU=m +CONFIG_ESP8089=m +CONFIG_RKWIFI=m 1.2 rk3368-tb_8846.dts里面,无需配置WIFI芯片类型,SDIO CLK 配置为150M。 --- a/arch/arm64/boot/dts/rk3368-tb_8846.dts +++ b/arch/arm64/boot/dts/rk3368-tb_8846.dts @@ - 27 , 7 + 27 , 7 @@ * rtl8188eu, rtl8723bs, rtl8723bu * esp8089 */ - wifi_chip_type = "ap6335" ; + wifi_chip_type = "" ; sdio_vref = < 1800 >; //1800mv or 3300mv @@ - 300 , 8 + 300 , 8 @@ }; &sdio { - clock-frequency = < 50000000 >; - clock-freq-min-max = < 200000 50000000 >; + clock-frequency = < 150000000 >; + clock-freq-min-max = < 200000 150000000 >; 二. SDIO部分 该部分修改,兼容支持SDIO 3.0 和 SDIO 2.0 的WIFI模块, 可以直接在内核根目录打rk3368_sdio_for_wifi_compatible.patch 方法 1 : patch -p1 < rk3368_sdio_for_wifi_compatible.patch 方法 2 :根据补丁文件夹kernel/drivers/mmc路径下源码对比修改。 三. WIFI驱动部分 WIFI驱动修改Kconfig和Makefile,加载方式修改为module. 将WIFI驱动目录drivers/net/wireless/rockchip_wlan下的WIFI驱动直接替换即可。 四. rfkill-wlan.c中添加开机对模块上电并进行sdio扫描动作,详细见rfkill-wlan.c 内核编译说明: 1 .WIFI驱动ko编译方法: 进入内核目录,执行make ARCH=arm64 rockchip_defconfig && make ARCH=arm64 rk3368-tb_8846.img -j16 && make ARCH=arm64 modules -j16后,各个驱动目录下会生产相应的wifi ko文件。 2 . 编译WIFI 驱动ko文件与自动拷贝到android/vendor/rockchip/common/wifi/modules方法: 目前由于WIFI驱动使用ko方式,不再build in 到内核,所以建议编译内核后,建议在编译android固件之前先编译make ARCH=arm64 modules -j16,将ko拷贝到android/vendor/rockchip/common/wifi/modulesmul 编译android固件前执行build_wifi_ko.sh编译KO,并拷贝到device/rockchip/common/wifi/modules目录,具体可以参考build_wifi_ko.sh ==================================================================================================================================================================== Android 部分: 1 .目前wifi驱动已经编译好放到补丁device目录,将wifi ko文件放到android/vendor/rockchip/common/wifi/modules目录,编译到系统system/lib/modules目录。 2 .直接替换补丁hardware/libhardware_legacy/wifi/文件,该文件夹下源码实现wifi芯片自动识别功能,通过识别不同的WIFI芯片,加载不同的WIFI驱动。 ==================================================================================================================================================================== 硬件说明: 目前方案支持一套固件兼容AP系列和RelTek系列的WIFI,因此所有板子的设计,WIFI供电管教必须一致。 AP系列是支持SDIO 3.0 ,因此硬件上WIFI IO电源必须为 1 .8V。 目前WIFI兼容方案可以兼容并且验证过的模块如下: AP6XXX系列:ap6330、AP6354、AP6335、 EelTek WIFI系类:RTL8723BS、RTL8188FU、RTL8189ES、RTL8723BU、RTL8188EU、RTL8189FS |
三.wifi
1 2 3 | wifi 型号 #define WIFI_CHIP_TYPE_PATH "/sys/class/rkwifi/chip" #define WIFI_CHIP_TYPE_PATH "/data/wifi_chip" |
getWifiNameString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.io.IOException; import java.io.BufferedReader; import java.io.FileReader; private String getWifiNameString(String path) { String defString = "AP6181" ; try { @SuppressWarnings ( "resource" ) BufferedReader reader = new BufferedReader( new FileReader(path)); defString = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } return defString; } String wifiName = getWifiNameString( "/data/wifi_chip" ); if (wifiName.contains( "RTL8188EU" ) |
四.RK Kernel 3.10 平台 BT 不工作异常排查
表现出的异常现象为:设置中打开 BT,一直显示正在打开,或者打开后自动关闭
需要通过以下几点排查:
3.1.确认 BT_RFKILL 驱动是否加载成功
1 | [BT_RFKILL]: ap6335 device registered. |
驱动代码在:kernel/net/rfkill/rfkill-bt.c
如果成功了 请检查确认蓝牙供电控制是否正常(以 rfkill0 为供电控制节点为例)
1 2 | echo 1 > /sys/ class /rkfkill/rfkill0/state echo 0 > /sys/ class /rfkill/rfkill0/state |
3.2. 确认UART USB 接口是否打开
2.1 如果打开正常会有如下 logcat 打印:
1 | userial vendor open: opening /dev/ttyS0 |
注意:RTL8723AU/BU 使用的是 USB 接口,所以不使用这个接口,使用:/dev/rtk_btusb
如果打开失败,需要确认:
1) 是否存在这个节点;
2) 是否有权限访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 11 - 25 10 : 15 : 49.557 D/WifiHW ( 1930 ): found device pid:vid : 0bda:b720 11 - 25 10 : 15 : 49.557 D/WifiHW ( 1930 ): wifi detectd return ret: 0 11 - 25 10 : 15 : 49.557 D/WifiHW ( 1930 ): USB WIFI identify sucess 11 - 25 10 : 15 : 49.557 D/WifiHW ( 1930 ): check_wifi_chip_type_string: RTL8723BU 11 - 25 10 : 15 : 49.557 D/bt_vendor( 1930 ): vendor_open load libbt-vendor_usb.so 11 - 25 10 : 15 : 49.561 I/bt_vendor( 1930 ): alloc value 0xf3f0c301 11 - 25 10 : 15 : 49.561 I/bt_vendor( 1930 ): init 11 - 25 10 : 15 : 49.561 I/bt_hci ( 1930 ): start_up bluetooth_rtk_h5_flag : 0 11 - 25 10 : 15 : 49.561 D/bt_vendor( 1930 ): op for 0 11 - 25 10 : 15 : 49.561 D/bt_vendor( 1930 ): op for 0 11 - 25 10 : 15 : 49.561 D/bt_hci ( 1930 ): start_up starting async portion 11 - 25 10 : 15 : 49.561 I/bt_hci ( 1930 ): event_finish_startup 11 - 25 10 : 15 : 49.561 I/bt_hci_h4( 1930 ): hal_open 11 - 25 10 : 15 : 49.561 D/bt_vendor( 1930 ): op for 3 11 - 25 10 : 15 : 49.561 I/bt_vendor( 1930 ): userial vendor open: opening /dev/rtk_btusb 11 - 25 10 : 15 : 49.561 I/bt_vendor( 1930 ): device fd = 52 open 11 - 25 10 : 15 : 49.562 D/bt_vendor( 1930 ): op for 1 11 - 25 10 : 15 : 49.562 E/bt_vendor( 1930 ): Bt_vendor_rtk Op for BT_VND_OP_FW_CFG 11 - 25 10 : 15 : 50.419 E/bt_vendor( 1930 ): Bt_vendor_rtk Download Fw Success 11 - 25 10 : 15 : 50.419 I/bt_vendor( 1930 ): firmware callback 11 - 25 10 : 15 : 50.419 I/bt_hci ( 1930 ): firmware_config_callback 11 - 25 10 : 15 : 50.420 I/bt_btu ( 1930 ): btu_task pending for preload complete event 11 - 25 10 : 15 : 50.420 I/bt_btu_task( 1930 ): Bluetooth chip preload is complete 11 - 25 10 : 15 : 50.420 I/bt_btu ( 1930 ): btu_task received preload complete event 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_HCI 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_L2CAP 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_RFCOMM 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_AVDT 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_AVRC 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_A2D 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_BNEP 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_BTM 11 - 25 10 : 15 : 50.426 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_GAP 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_PAN 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_SDP 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_GATT 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_SMP 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_BTAPP 11 - 25 10 : 15 : 50.427 I/ ( 1930 ): BTE_InitTraceLevels -- TRC_BTIF 11 - 25 10 : 15 : 50.488 E/rtk_parse( 1930 ): ERROR in sendto 11 - 25 10 : 15 : 50.518 I/bt_btm_sec( 1930 ): BTM_SecRegister p_cb_info->p_le_callback == 0x0xf3e8a191 11 - 25 10 : 15 : 50.518 I/bt_btm_sec( 1930 ): BTM_SecRegister btm_cb.api.p_le_callback = 0x0xf3e8a191 11 - 25 10 : 15 : 50.540 I/bt_btif_storage( 1930 ): btif_storage_get_adapter_property service_mask: 0x20000000 11 - 25 10 : 15 : 50.541 D/BluetoothAdapterProperties( 1930 ): Address is: 22 : 22 : 29 :3C:1B: 17 11 - 25 10 : 15 : 50.543 D/BluetoothAdapterProperties( 1930 ): Name is: rk3368 11 - 25 10 : 15 : 50.546 D/BluetoothAdapterProperties( 1930 ): Scan Mode: 20 11 - 25 10 : 15 : 50.546 D/BluetoothAdapterProperties( 1930 ): Discoverable Timeout: 120 |
五.bcmdhd固件加载 AP系列 wifi/bt
5.0. 第一次开机 跑 system\core\drmservice\drmservice.c 加载 ko
5.1. kernel\drivers\net\wireless\rockchip_wlan\rkwifi\rk_wifi_config.c
int chip = get_wifi_chip_type(); 加载wifi、bt固件
5.2. 识别wifi型号get_wifi_chip_type kernel\net\rfkill\rfkill-wlan.c
这里看dts 未定义则默认 WIFI_AP6210
---> #include <linux/rfkill-wlan.h> wifi型号
5.3. 最后这里加载 kernel\drivers\net\wireless\rockchip_wlan\rkwifi\bcmdhd\dhd_linux.c
extern int rkwifi_set_firmware(char *fw, char *nvram);
rkwifi_set_firmware(firmware, nvram);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】