RK平台SDIO基础知识及排查文档 一、硬件:
首先看下硬件:主要的部分都在绿色方框内 WIFI_D0~3:数据线,平时为高,电压取决于VCCIO_WL的电压; WIFI_CMD:命令线,平时为高,电压取决于VCCIO_WL的电压; WIFI_CLK:时钟,平时为低,电压取决于VCCIO_WL的电压; VBAT_WL:WIFI模组供电电源,一直都为高,供电需打印3.3v; VCCIO_WL:给DATA/CMD/CLK的IO供电电源,可以为3.3或者1.8v,但SDIO3.0 必须为1.8v; WIFI_REG_ON: 正常工作时为3.3v,WiFi关闭时为0v; 两个晶振:32K和26M/37.4M,正常工作时都会有波形输出; 遇到WIFI SDIO问题时: 1、首先以上的电压以及晶振问题; 2、VBAT_WL和VCCIO_WL的电源是长供电,但有时候会因为这两路电源和其他模块公用一个电源,可能会出现电压塌陷问题,导致WIFI模组异常;比如下图,有非常多外设都会挂在VCC_IO上面; 二、软件: 首先介绍下SDIO波形基本组成: 下图是WIFI SDIO识别模式时的典型的波形时序图: 简单说一下识别SDIO的方式:主控发出48clk并携带48bit的数据发给SDIO,而SDIO要回应给主控48clk加48bit的数据;如下图: 下图是SDIO数据传输阶段的时序图: 实例: 绿色:SDMMC_CLK 黄色:SDMMC_CMD SDMMC_CMD空闲时一直处于高电平; 主控发出的波形: 当最开始的两个电平有一高一低时,是主控发出去的命令; SD卡响应的波形: 当最开始的两个电平有连续的两个低电平是表示卡端有响应; 其次主控和响应一般包含48个bit的数据,所以48个clk为一个完整的包。要确认的就是:主控发出去命令包后,SD卡端是否有响应。 (注意:dts中的相关节点sdio一定要okay,其次是io管脚不要被复用) 三、错误典型实例: (1)、电压问题,排查WIFI_DATA线的电压以及VCCIO_WL电压 [ 100.086615] slot->flags = 3 [ 100.086628] CPU: 0 PID: 113 Comm: kworker/u8:3 Tainted: P W O 3.10.0 #250 [ 100.086644] Workqueue: kmmcd mmc_rescan [ 100.086663] [<c0013e04>] (unwind_backtrace+0x0/0xe0) from [<c0011720>] (show_stack+0x10/0x14) [ 100.086677] [<c0011720>] (show_stack+0x10/0x14) from [<c050d3b4>] (dw_mci_set_ios+0x9c/0x21c) [ 100.086689] [<c050d3b4>] (dw_mci_set_ios+0x9c/0x21c) from [<c04fabd4>] (mmc_power_up+0x60/0xa0) [ 100.086700] [<c04fabd4>] (mmc_power_up+0x60/0xa0) from [<c04faeac>] (mmc_rescan_try_freq+0x14/0xd0) [ 100.086710] [<c04faeac>] (mmc_rescan_try_freq+0x14/0xd0) from [<c04fb7b4>] (mmc_rescan+0x204/0x298) [ 100.086722] [<c04fb7b4>] (mmc_rescan+0x204/0x298) from [<c00471f0>] (process_one_work+0x29c/0x458) [ 100.086734] [<c00471f0>] (process_one_work+0x29c/0x458) from [<c0047540>] (worker_thread+0x194/0x2d4) [ 100.086745] [<c0047540>] (worker_thread+0x194/0x2d4) from [<c004ca28>] (kthread+0xa0/0xac) [ 100.086759] [<c004ca28>] (kthread+0xa0/0xac) from [<c000da98>] (ret_from_fork+0x14/0x3c) [ 100.086767] 1400..dw_mci_set_ios: wait for unbusy timeout....... STATUS = 0x206 [mmc2] [ 102.546615] 1009..mci_send_cmd: wait for unbusy timeout.......[mmc2] [ 102.595819] mmc_host mmc1: Timeout sending command (cmd 0x202000 arg 0x0 status 0x80202000) (2)、有两种可能: a) WiFi异常,排查VBAT_WL和WIFI_REG_ON以及晶振是否正常 b) 走线太长导致波形质量很差,降频或者修改硬件 dwmmc_rockchip 10218000.rksdmmc: req failed (CMD52): error = 110, timeout = 8000ms [mmc2] - Timeout recovery procedure start -- rk_sdmmc: BOOT dw_mci_setup_bus: argue clk_mmc workaround out 800000Hz for init[mmc2] mmc_host mmc2: Bus speed (slot 0) = 37500000Hz (slot req 400000Hz, actual 398936HZ div = 47) rk_sdmmc: BOOT dw_mci_setup_bus: argue clk_mmc workaround out 800000Hz for init[mmc2] [mmc2] -- Timeout recovery procedure finished -- (3)、走线太长导致波形质量很差,降频或者修改硬件 [ 200.731403] [mmc2] Data transmission error !!!! MINTSTS: [0x00000080] [ 200.731426] [mmc2] host was already tuning, Don't need to retry tune again ignore 0. (4)、WIFI_REG_ON异常 rk_sdmmc: BOOT dw_mci_setup_bus: argue clk_mmc workaround out 800000Hz for init[mmc2] rk_sdmmc: BOOT dw_mci_setup_bus: argue clk_mmc workaround out 400000Hz for init[mmc2] rk_sdmmc: BOOT dw_mci_setup_bus: argue clk_mmc workaround out 600000Hz for init[mmc2]
|