Platform: ROCKCHIP
Chip: RK3399
OS: Android7.1.2
Kernel: 4.4.126

背景

硬件替换芯片rtl8822cs;未改代码情况下,WIFI:点pown on立即跳到off
bt:点on 无反应,串口打印

[  875.649281] ret = 0
[  875.704811] [BT_RFKILL]: bt shut off power
[  875.726554] [BT_RFKILL]: rfkill_rk_set_power: set bt wake_host high!
[  875.771901] [BT_RFKILL]: ENABLE UART_RTS
[  875.875559] [BT_RFKILL]: DISABLE UART_RTS
[  875.875683] [BT_RFKILL]: bt turn on power
[  875.875708] [BT_RFKILL]: Request irq for bt wakeup host
[  875.875748] [BT_RFKILL]: ** disable irq

代码改动

1.修改WIFI配置的dtsi:

wireless-wlan {compatible = "wlan-platdata";rockchip,grf = <&grf>;wifi_chip_type = "rtl8822cs";sdio_vref = <1800>;WIFI,host_wake_irq = <&gpio0 3 GPIO_ACTIVE_HIGH>; /* GPIO0_a3 */status = "okay";};

2.2.添加驱动
将供应商提供的驱动放在目录:kernel\drivers\net\wireless\rockchip_wlan
修改当前目录下makefile:

obj-$(CONFIG_RTL8822CS)    += rtl8822cs/
修改kconfig:
source "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig"

修改rtl8822cs/makefile:

    CONFIG_PLATFORM_I386_PC=nCONFIG_PLATFORM_ARM_RK3188=y
make ARCH=arm64 menuconfig 添加勾选Device Drivers  --->  [*] Network device support  --->  [*]   Wireless LAN  --->    [*]   Rockchip Wireless LAN support  --->  <M>   Realtek 8822C SDIO WiFi

3.添加芯片类型枚举:
kernel/net/rfkill/rfkill-wlan.c

在int get_wifi_chip_type(void)添加} else if (strcmp(wifi_chip_type_string, "rtl8822cs") == 0) {type = WIFI_RTL8822CS;
kernel/include/linux/rfkill-wlan.h
添加芯片枚举:
    enum {WIFI_RK901,WIFI_RK903,WIFI_AP6181,WIFI_AP6210,WIFI_AP6XXX_SERIES,WIFI_RTL8188EU,WIFI_RTL8192DU,WIFI_RTL8723AS,WIFI_RTL8723BS,WIFI_RTL8822CS,WIFI_RTL8812AU,WIFI_RTL8822CS,WIFI_RTL_SERIES,WIFI_ESP8089,TYPE_MAX,};
  1. 然后编译内核 编译出8822cs.ko
    5.上层VID PID加进去,命令查看后调整正确。
cat /sys/bus/sdio/devices/mmc2:0001:1/uevent
DRIVER=rtl88x2cs
SDIO_CLASS=07
SDIO_ID=024C:C822
MODALIAS=sdio:c07v024CdC822

这一步如果devices目录下没有节点 可以检查下硬件。

添加: \hardware\libhardware_legacy\wifi\rk_wifi_ctrl.c

static wifi_device supported_wifi_devices[] = {+   {"RTL8822CS",   "024c:c822"},{"RTL8188FU",    "0bda:f179"},{"RTL8822BU",    "0bda:b82c"},{"RTL8189ES",    "024c:8179"},
          ALOGD("PCIE WIFI identify sucess");else {ALOGD("maybe there is no usb wifi or sdio or pcie wifi,set default wifi module Brocom APXXX");
-           strcpy(recoginze_wifi_chip, "APXXX");
+           strcpy(recoginze_wifi_chip, "RTL8822CS");identify_sucess = 1 ;}}

diff --git a/wifi/wifi.c b/wifi/wifi.c
index 04da01c…73d0f5d 100755
— a/wifi/wifi.c
+++ b/wifi/wifi.c
@@ -95,6 +95,7 @@ extern int ifc_down(const char *name);

#define RTL8192DU_DRIVER_MODULE_PATH "/system/lib/modules/8192du.ko"
#define RTL8812AU_DRIVER_MODULE_PATH "/system/lib/modules/8812au.ko"
#define RTL8822BE_DRIVER_MODULE_PATH "/system/lib/modules/8822be.ko"
+#define RTL8822CS_DRIVER_MODULE_PATH "/system/lib/modules/8822cs.ko"
#define SSV6051_DRIVER_MODULE_PATH   "/system/lib/modules/ssv6051.ko"
#define ESP8089_DRIVER_MODULE_PATH   "/system/lib/modules/esp8089.ko"
#define BCM_DRIVER_MODULE_PATH       "/system/lib/modules/bcmdhd.ko"
@@ -112,6 +113,7 @@ extern int ifc_down(const char *name);
#define RTL8189FS_DRIVER_MODULE_NAME "8189fs"
#define RTL8192DU_DRIVER_MODULE_NAME "8192du"
#define RTL8812AU_DRIVER_MODULE_NAME "8812au"
+#define RTL8812AU_DRIVER_MODULE_NAME "8822cs"
#define SSV6051_DRIVER_MODULE_NAME      "ssv6051"
#define ESP8089_DRIVER_MODULE_NAME      "esp8089"
#define BCM_DRIVER_MODULE_NAME       "bcmdhd"
@@ -206,6 +208,7 @@ wifi_ko_file_name module_list[] ={"RTL8189ES", RTL8189ES_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},{"RTL8723BS", RTL8723BS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},{"RTL8723CS", RTL8723CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},
+       {"RTL8822CS", RTL8822CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},{"RTL8723DS", RTL8723DS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},{"RTL8812AU", RTL8812AU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},{"RTL8189FS", RTL8189FS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},

调试命令

            cat /sys/bus/sdio/devices/mmc2:0001:1/uevent         //可查看SDIO设备ID  cat /sys/kernel/debug/mmcx/ios                         //可查看WIFI_sdio 相关信息logcat | grep WifiHW                                //查看WIFI加载信息

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 类型后加载不同的 wpa_supplicant 参数启动 wifi。

所遇问题

1.打印如下:-5 :IO error

18:15:12[    2.938387] mmc_host mmc2: Bus speed (slot 0) = 400000Hz (slot req 400000Hz, actual 400000HZ div = 0)
18:15:12[    2.951718] dwmmc_rockchip fe310000.dwmmc: 1 slots initialized
18:15:12[    2.952814] rockchip-dmc dmc: Failed to get leakage
18:15:12[    2.953123] rockchip-dmc dmc: Failed to get pvtm
18:15:12[    2.954708] rockchip-dmc dmc: could not find power_model node
18:15:12[    2.961065] dwmmc_rockchip fe310000.dwmmc: card claims to support voltages below defined range
18:15:12[    2.961680] rk808-rtc rk808-rtc: setting system clock to 2013-01-18 09:54:29 UTC (1358502869)
18:15:12[    2.963159] It doesn't contain Rogue gpu
18:15:12[    2.975194] mmc_host mmc2: Voltage change didn't complete
18:15:12[    2.977144] mmc2: error -5 whilst initialising SDIO card

2.sdio_clk输出只到200khz 没达到50Mhz
3.sdio的reset脚 复位后拉低

解决

1 . 2.3 问题:打入补丁后正常
Realtek 88x2BS系列: SDIO 3.0是1.8V,原先代码是走到一个函数里设置信号电压为1.8V,正常就可继续流程 错误返回I/O error ;所以要跳过设置信号电压这个步骤即可

--- a/drivers/mmc/core/sdio.c
+++ b/drivers/mmc/core/sdio.c
@@ -648,8 +648,14 @@ try_again:* to make sure which speed mode should work.*/if (!powered_resume && (rocr & ocr & R4_18V_PRESENT)) {+#if 0 /* SDIO 3.0 patch for Realtek 88x2BS */err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180,ocr_card);
+#else
+        pr_warn("%s: Skip set signal voltage to 1.8v\n",
+                mmc_hostname(host));
+        err = 0;
+#endifif (err == -EAGAIN) {mmc_sdio_resend_if_cond(host, card);retries--;

BT模块

1.替换rtkbt
2.打入system.patch

[RK3399 Android7.1.2]新增wifibt模块:rtl8822cs驱动以及解决所遇问题相关推荐

  1. [RK3288 Android7.1.2 ]新增wifi模块ap6256

    Platform: ROCKCHIP Chip: RK3288 OS: Android7.1.2 Kernel: 4.4.143 背景 旧板wifi模块ap6235,硬件将wifi模块替换成ap625 ...

  2. [RK3399][Android7.1] 4通道ADC芯片ES7210驱动源码

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 说明: 内核里并没有关于ADC芯片ES7210的源码,驱动基于ES7243,分享给大家. /** AL ...

  3. java获取apk启动activity_[RK3399] android7.1 设置开机启动apk

    平台: RK3399+android7.1 开机启动apk (1)修改类: ./frameworks/base/services/core/java/com/android/server/am/Act ...

  4. [RK3399][Android7.1] 调试笔记 --- 系统默认时钟配置

    OS: Android 7.1 Board: Firefly-RK3399 Kernel: v4.4.55 分两个模块,一个是cpu,还有一个是pmu模块,这里只举例cpu,cpu又分在两个文件中定义 ...

  5. railgun项目的不足和将来会逐步新增的模块

    问答: Q:这个框架适合做什么类型的游戏? A:适合棋牌类.卡牌类(炉石传说).回合制(梦幻西游).半回合制(阴阳师).暂时不适合即时类游戏(星际争霸.DOTA.LOL.CS) 不足: 1.数据库操作 ...

  6. 火鸟地方门户3.9全能完整无错版源码 新增二手车模块

    火鸟地方门户3.9全能完整无错版源码,新增分站自定义配置SEO.LOGO.模板功能,新增二手车模块,房产发布功能全新改版等近30项改进,压缩包内包含详情的测试配置安装测试教程. 火鸟门户采用新的模板引 ...

  7. RK3399 Android7.1 编译

    RK3399 Android7.1 编译 文章目录 RK3399 Android7.1 编译 前言 设置 Linux 编译环境 安装 JDK 可选- 更新默认的 Java 版本 安装所需的程序包(Ub ...

  8. android手机底噪,[RK3399][Android7.1] 调试笔记 --- Codec播放音乐会有底噪

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 背景: 移植完Codec RT5640之后,发现播放声音的时候底部有噪声. 用示波器测量到的左右声道波 ...

  9. [RK3399][Android7.1] 调试笔记 --- I2S1工作输出是12MHz问题

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 使用I2S1通道,测量到的I2S MCLK是12MHz. 理论上应该是11.288MHz. 原 ...

  10. RK3399 Android7.1 RTC导致系统无法进入休眠

    现象:系统进入休眠后马上被唤醒,然后重复进休眠-被唤醒-进休眠-被唤醒的过程,无法真正进入到休眠状态. 原因:HYM8563的中断信号接在了RK3399的默认低电平的GPIO上,而RTC的中断也是低电 ...

最新文章

  1. MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk
  2. checkboxlist 数据库连接代码
  3. Python---编写一函数,将摄氏温度与华氏温度互转。
  4. 【若依(ruoyi)】字典管理
  5. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...
  6. python使用redis教程 敲黑板划重点
  7. 浏览器中的事件循环机制
  8. windows的回车换行“\r\n“,Linux的回车换行“\n“
  9. LeetCode-1.两数之和(哈希表)
  10. PHP树形结构数据增加每层的级别
  11. 如何使用迅雷下载百度网盘资源
  12. 传染病模型SIS及相应的matlab代码
  13. 电机的力矩、转速和功率
  14. 编辑PDF用什么软件,如何修改PDF文件内容
  15. arccos用计算机,arccos0(arccos在线计算器)
  16. AutoHotKey映射方向键和Home, End键
  17. 稻盛和夫:只有极度认真工作,才能扭转人生
  18. Pytorch 中的 forward理解
  19. 苏州IT外包公司如何选择?IT外包服务案例分析
  20. ARCGIS中按照某字段属性批量导出shp ,即将一个shp图层分割成单个的shp

热门文章

  1. CS5460基本读写程序(无bug版本)
  2. Windows下的YouTube-dl与FFmpeg下载安装配置
  3. 新计算机c盘太小,Windows自带C盘扩容方法,c盘太小怎么重新分区
  4. oracle 设置 锁模式,oracle表锁的几种模式v$locked_object-locked_mode
  5. 一个案例,看懂用户画像如何做出效益
  6. HDU 1277全文检索(字典树)
  7. 简洁明了的单例模式及其五种写法
  8. 做B2BB2C电商商城有哪些运营模式?
  9. 三星:大小屏QLED和OLED两手都要抓,都要硬
  10. 服务器主动向客户端发送信息机制