rk3128平台Android7.1调试USB接口wifi总结

调试 usb wifi marvell 8897u

rk平台Wifi驱动加载方式说明
方式 1:wifi 驱动build in到内核,内核启动阶段直接加载wifi驱动
方式 2:wifi 驱动build in到内核,打开wifi再加载驱动
方式 3:wifi 驱动以ko方式存在于系统,打开wifi再加载ko

wifi芯片识别流程如下:

  1. 开机对 wifi 模块上电,并自动进行扫描 sdio 操作
  2. 系统启动打开 wifi 操作时,分别对系统 sys/bus/sdio(sdio wifi), sys/bus/usb(usb wifi),sys/bus/pic (pcie wifi )文件系统下的 uevent 进行读取。
  3. 获取到 wifi 芯片 vid pid之后加载相应的wifi ko驱动。
  4. 识别到相应的wifi模块后,即可知道相应的bt型号,走不同的bluedroid协议栈。

移植USB wifi步骤简要说明:
1、wifi 驱动KO编译方法
1.1 将驱动解压到内核 kernel/drivers/net/wireless/rockchip_wlan目录下(可参考其他wifi模块),在kernel/drivers/net/wireless目录添加相应的wifi模块的Kconfig和Makefile,有的模块还需要修改 wifi 驱动的 Kconfig 和 Makefile(根据特定的 wifi 模块驱动做修改)

1.2 然后修改驱动源码包中的 Makefile 文件
ARCH := arm //arm64代表驱动是64BIT,arm代表驱动是32BIT
CROSS_COMPILE:= /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
KSRC := /xxxx/kernel #这个改成实际内核的路径,也就是具体项目的内核路径.

1.3 在内核根目录直接运行 make ARCH = arm modules 即可编译出相应的 wifi ko文件,我这里是使用kernel默认的编译工具,所以不需要配置编译工具。

2、wifi.c 添加wifi兼容
2.1 添加wifi名称和wifi vid pid

在hardware/libhardware_legacy/wifi/rk_wifi_ctrl.c 代码 supported_wifi_devies[]结构体中添加 wifi 模块的名称和对应 vid pid,vid pid 可以根据下面章节手动读取 uevent 进行查看,以AP6356S 为例:AP6356S 为模块名称,02d0:4356 为 vid pid。我这里是8897u,则添加如下:
+++ b/wifi/rk_wifi_ctrl.c
@@ -90,6 +90,7 @@ static wifi_device supported_wifi_devices[] = {
{“AP6335”, “02d0:4335”},
{“AP6255”, “02d0:a9bf”},
{“RTL8822BE”, “10ec:b822”},
+ {“8897U”, “1286:2045”}, //这里遇到个问题就是,pid会变,有时候是2045,有时候是2046,
+ //就会导致wifi识别不到vid pid,无法加载ko文件。
+ //可以添加两组vid pid来解决这个问题
+ {“8897U”, “1286:2046”},

可以 cat 如下路径下的 uevent 文件进行确认:
sys/bus/sdio/devices
sys/bus/usb/devices
例如:
rk3128_box:/ # cat sys/bus/usb/devices/1-1.3/uevent
MAJOR=189
MINOR=3
DEVNAME=bus/usb/001/004
DEVTYPE=usb_device
DRIVER=usb
PRODUCT=1286/2046/3201
TYPE=224/1/1
BUSNUM=001
DEVNUM=004

2.2 HAL层添加 wifi 驱动 ko 文件存放路径
hardware/libhardware_legacy/wifi/wifi.c 中 wifi_ko_file_name module_list[]结构体存放的是wifi模块的ko驱动存放路径和加载 wifi ko 驱动所需的参数,wifi ko 存放路径统一采用XXXX_DRIVER_MODULE_PATH 的命名方式。如果 ismod wifi ko 不需要带参数,那么可以使用 UNKKOWN_DRIVER_MODULE_ARG,如果需要额外参数,请根据wifi模块的移植文档进行相应处理即可。

对于USB WiFi ,正常枚举到USB设备会有如下类似打印
log识别到usb wifi设备信息:

[ 1.649051] usb 1-1.3: new high-speed USB device number 3 using rockchip_ehci_host
[ 1.678314] [WLAN_RFKILL]: wifi turn on power. 30
[ 1.678338] mmc2:mmc host rescan start!
[ 1.760107] usb 1-1.3: New USB device found, idVendor=1286, idProduct=2045
[ 1.760136] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1.760156] usb 1-1.3: Product: Marvell Wireless Device
[ 1.760173] usb 1-1.3: Manufacturer: Marvell
[ 1.760189] usb 1-1.3: SerialNumber: 0000000000000000

上面log得到vid,pid(分别是厂商id和产品id):idVendor=1286, idProduct=2045,添加到hal目录hardware/libhardware_legacy/wifi/rk_wifi_ctrl.c文件中。

添加驱动到kernel目录,然后make ARCH = arm modules,编译出驱动的wifi ko文件。

Android根目录已经集成了wifi ko的编译和拷贝。
脚本位置:device/rockchip/common/build_wifi_ko.sh, 该脚本在android源码根目录执行build.sh的时候会自动执行。

调试过程问题点汇总:

1、编译器搞错了,Makefile文件没有修改使用kernel的编译器,没有把arm64改成arm,编译出了64bit的ko文件不能用。
2、读取到的pid会变,有时候是2045,有时候是2046,就会导致wifi识别不到vid pid,无法加载对应wifi ko文件。可以添加两组vid pid来解决这个问题。
3、加载wifi有两个ko,要先加载mlan.ko再加载usb8xxxx.ko,wifi才能打开。
4、加载wifi ko(usb8xxxx.ko)的时候没有添加加载参数,导致wifi打不开,insmod后面加了参数之后,可以打开扫描到热点。
5、没有把对应hardware/marvell的libbt_vendor.so编译出来copy到对应目录,编译了realtek的libbt_vendor.so,导致上层加载的是broadcom的so,无法打开蓝牙,后面去掉编译这个broadcom的libbt_vendor.so,直接mmm编译hardware/marvell的libbt_vendor.so push进机器system/vendor/lib目录之后就可以打开了。
6、把加载蓝牙的ko添加到wifi.c文件,导致有时候不先打开一下wifi打不开蓝牙,所以加载BT的ko要改个地方insmod,否则会有出现打不开蓝牙的情况,logcat报错未识别到节点:bt_vendor_mrvl: Fail to open port /dev/mbtchar0。
7、上层open libbt-vendor.so的地方。可以通过设置一个属性在这里做兼容。我的修改如下:

--- a/wifi/rk_wifi_ctrl.c
+++ b/wifi/rk_wifi_ctrl.c
@@ -143,6 +143,12 @@ int get_wifi_device_id(const char *bus_dir, const char *prefix)
                                    if (0 == strncmp(temp, supported_wifi_devices[i].wifi_vid_pid, 9)) {
                                            ALOGD("found device pid:vid : %s", temp);
                                            strcpy(recoginze_wifi_chip, supported_wifi_devices[i].wifi_name);
+                                               //add for mrvl 8897u
+                                               if (strcmp(recoginze_wifi_chip, "9987U") == 0) {
+                                                       property_set("gt.wifi.type", "mrvl8897u");
+                                                       ALOGD("%s: line = %d, set gt.wifi.type as mrvl8897\n", __func__, __LINE__);
+                                               }
+                                               //add end
                                            identify_sucess = 1 ;

rk3128_7.1_box/system/bt$ git diff

diff --git a/hci/src/vendor.c b/hci/src/vendor.c
old mode 100644
new mode 100755
index c6bbd43..8d653fa
--- a/hci/src/vendor.c
+++ b/hci/src/vendor.c
@@ -28,9 +28,12 @@
 #include "bta_av_api.h"
 #include "osi/include/log.h"
 #include "osi/include/osi.h"
+#include 
+#include 


 static const char *VENDOR_LIBRARY_NAME = "libbt-vendor.so";
+static const char *VENDOR_LIBRARY_NAME_MRVL = "libbt-vendor_mrvl.so";
 static const char *VENDOR_LIBRARY_SYMBOL_NAME = "BLUETOOTH_VENDOR_LIB_INTERFACE";

 static const vendor_t interface;
 @@ -50,12 +53,27 @@ static bool vendor_open(
   assert(lib_handle == NULL);
   hci = hci_interface;

-  lib_handle = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);
-  if (!lib_handle) {
-    LOG_ERROR(LOG_TAG, "%s unable to open %s: %s", __func__, VENDOR_LIBRARY_NAME, dlerror());
-    goto error;
-  }
-
+       char bt_vendor_mrvl[PROPERTY_VALUE_MAX];
+
+       memset(bt_vendor_mrvl, 0, PROPERTY_VALUE_MAX);
+       property_get("gt.wifi.type", bt_vendor_mrvl, NULL);
+       if (strcmp(bt_vendor_mrvl, "mrvl8897u") == 0) {
+               LOG_INFO(LOG_TAG, "%s, load libbt-vendor_mrvl.so\n", __func__);
+               lib_handle = dlopen(VENDOR_LIBRARY_NAME_MRVL, RTLD_NOW);
+       }
+
+       else {
+               LOG_INFO(LOG_TAG, "%s, load libbt-vendor.so\n", __func__);
+               lib_handle = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);
+       }
   lib_interface = (bt_vendor_interface_t *)dlsym(lib_handle, VENDOR_LIBRARY_SYMBOL_NAME);

一些常用命令总结:

##手动加载usb wifi驱动
加载驱动
insmod /system/usb8xxx.ko
启动wlan0
busybox ifconfig wlan0 up
禁用wlan0
busybox ifconfig wlan0 down
卸载驱动
rmmod usb8xxx

命令:ifconfig -a wlan0查看是否有wlan0节点存在;
rk3128_box:/ # ifconfig -a wlan0
wlan0 Link encap:Ethernet HWaddr 00:50:43:02:fe:01
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:0

###iw命令的简单使用
扫描wifi并打印出扫描到wifi的SSID
iw dev wlan0 scan |grep “SSID:” -i
连接wifi A5
iw wlan0 connect A5

常用命令汇总:

mount -o rw,remount -t auto /system

insmod /system/usb8xxx.ko
busybox ifconfig wlan0 up 

busybox ifconfig wlan0 down
rmmod usb8xxx

setprop ctl.start p2p_supp_rtl
setprop ctl.stop p2p_supp_rtl

setprop ctl.start wpa_supplicant
setprop ctl.stop wpa_supplicant

logcat -c
svc wifi enable
ps -ef | grep "wpa_supplicant"
logcat 

getprop |grep supp
ps |grep wpa -i

iw dev wlan0 scan |grep "SSID:" -i   
iw wlan0 connect xmzw

你可能感兴趣的:(Android驱动开发,RK系列驱动开发)