RK:RK3368 wifi bt compatible for android 5.1
一,常用wifi型号
a.RelTek系列 AP系列
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
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 移植说明
内核修改说明: 内核修改牵涉到四个部分: 一. 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
wifi 型号 #define WIFI_CHIP_TYPE_PATH "/sys/class/rkwifi/chip" #define WIFI_CHIP_TYPE_PATH "/data/wifi_chip"
getWifiNameString
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 驱动是否加载成功
[BT_RFKILL]: ap6335 device registered.
驱动代码在:kernel/net/rfkill/rfkill-bt.c
如果成功了 请检查确认蓝牙供电控制是否正常(以 rfkill0 为供电控制节点为例)
echo 1 > /sys/class/rkfkill/rfkill0/state echo 0 > /sys/class/rfkill/rfkill0/state
3.2. 确认UART USB 接口是否打开
2.1 如果打开正常会有如下 logcat 打印:
userial vendor open: opening /dev/ttyS0
注意:RTL8723AU/BU 使用的是 USB 接口,所以不使用这个接口,使用:/dev/rtk_btusb
如果打开失败,需要确认:
1) 是否存在这个节点;
2) 是否有权限访问
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);