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
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);