sdio设备无法识别
最近遇到sdio设备无法识别问题,一直解决不掉很痛苦,好在最终解决,分享下
模块:
用的是有WIFI和BT功能的芯片,WIFI采用sdio接口,由WL_EN控制上电;BT是UART接口,由BT_EN控制上电;
基础知识:
首先sdio属于mmc子系统中设备,mmc子系统包括:sdio,sd,mmc
sdio设备在加载driver之前,首先得被mmc子系统识别到,才能进行后续操作
- drivers/mmc/core/core.c,在4个频率下扫描设备(400kHZ,300kHZ,200kHZ,100kHZ)
static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };void mmc_rescan(struct work_struct *work)
{ ......for (i = 0; i < ARRAY_SIZE(freqs); i++) {if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) {extend_wakelock = true;break;}if (freqs[i] <= host->f_min)break;}......
}
- 在扫描前先发个sdio_reset(CMD52)命令,只有sdio设备会有响应
之后按照sdio(CMD5),sd,mmc的顺序扫描,一旦扫到立即返回
static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
{....../** sdio_reset sends CMD52 to reset card. Since we do not know* if the card is being re-initialized, just send it. CMD52* should be ignored by SD/eMMC cards.*/sdio_reset(host);mmc_go_idle(host);mmc_send_if_cond(host, host->ocr_avail);/* Order's important: probe SDIO, then SD, then MMC */if (!mmc_attach_sdio(host))return 0;if (!mmc_attach_sd(host))return 0;if (!mmc_attach_mmc(host))return 0;mmc_power_off(host);return -EIO;
}
如果成功检测到设备,便会进行后续的mmc_sdio_init_card和mmc_add_card,进行建立设备节点等操作
检测到设备的check方式:
- 查看节点
- 看开机kernel log <6>[ 8.382000] mmc0: new SDIO card at address 0001
实验经历
以上都check过后,sdio设备依然对CMD52和CMD没有response,于是做了下面的实验
- 测量波形
用示波器量开机时候的波形,确认是否有信号出来;结果是发现开机过程中是有信号的,正常开完机就没有了
(黄色SDIO_CLK,蓝色SDIO_CMD),所以猜测这个信号可能是host端发给sdio设备的检测信号,但sdio是否有回复呢?
可以用逻辑分析仪看一下结果,逻辑分析仪用法可以参考上篇博文https://blog.csdn.net/miss_lazygoat/article/details/84105304
截取一段逻辑分析仪的结果来看,全是从host端发出的cmd,没有slave的回应,CMD52也是符合预期的
Time [s] | Value |
1.96874275 | START |
1.9687453 | DIR:from Host |
1.9687478 | CMD:52 |
1.968763 | ARG:0x00 |
1.9688441 | CRC:0x1C |
1.96886185 | STOP |
1.9696981 | START |
1.96970065 | DIR:from Host |
1.96970315 | CMD:52 |
1.96971835 | ARG:0x08 |
1.96979945 | CRC:0x4F |
1.9698172 | STOP |
1.9719129 | START |
1.9719154 | DIR:from Host |
既然能确认host端已发送检测命令,没有response就是slave端的问题了,给芯片供应商去排查就好了。
最后发现问题所在:WL_EN和BT_EN需同时拉高模组才能正常工作(由于模块bug),之后sdio便能正常被识别了
关键log
- 没有response,request返回的都是-110
<7>[ 8.261000] mmc0: req failed (CMD5): -110, retrying...
<7>[ 8.261000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00000000 CMDR=0x20000045 CMD(5)
<6>[ 8.261000] ftyreset module initialized.
<6>[ 8.261000] [HWLOCK] drv verify simlock init ok!
<7>[ 8.262000] mmc0: req done (CMD5): -110: 00000000 00000000 00000000 00000000
<7>[ 8.262000] mmc0: starting CMD55 arg 00000000 flags 000000f5
<7>[ 8.262000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00000000 CMDR=0x20000177 CMD(55)
<6>[ 8.263000] SIO data mode[0], clk mode[1], clk rate[2048000]
<7>[ 8.263000] mmc0: req done (CMD55): -110: 00000000 00000000 00000000 00000000
- 有response,request返回0,最后能找到SDIO card
<7>[ 8.410000] mmc0: starting CMD52 arg 00227800 flags 00000195
<7>[ 8.410000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00227800 CMDR=0x20000174 CMD(52)
<7>[ 8.410000] mmc0: req done (CMD52): 0: 00001082 00000000 00000000 00000000
<7>[ 8.410000] mmc0: starting CMD52 arg 00227a00 flags 00000195
<7>[ 8.410000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00227a00 CMDR=0x20000174 CMD(52)
<7>[ 8.410000] mmc0: req done (CMD52): 0: 00001001 00000000 00000000 00000000
<7>[ 8.410000] mmc0: starting CMD52 arg 00227c00 flags 00000195
<7>[ 8.410000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00227c00 CMDR=0x20000174 CMD(52)
<7>[ 8.410000] mmc0: req done (CMD52): 0: 000010df 00000000 00000000 00000000
<4>[ 8.410000] mmc0: queuing unknown CIS tuple 0x82 (1 bytes)
<7>[ 8.410000] mmc0: starting CMD52 arg 00227e00 flags 00000195
<7>[ 8.410000] dwmmc_balong 900ae000.dwmmc1: start command: ARGR=0x00227e00 CMDR=0x20000174 CMD(52)
<7>[ 8.410000] mmc0: req done (CMD52): 0: 000010ff 00000000 00000000 00000000
<6>[ 8.410000] mmc0: new SDIO card at address 0001
sdio设备无法识别相关推荐
- W806 SDIO 设备 扩展 荔枝派 V3s IO 使用
全志V3s 不论焊接还是使用很方便,唯一缺点就是IO不够,偶然发现联德盛 W806 竟然自带SDIO 设备接口,当然肯定还有ESP32模块 也是带的(,这里并不适用),选择SDIO 优点是速度快,方便 ...
- Android5.1设备无法识别exFAT文件系统的64G TF卡问题
64G TF卡刚买回来的时候默认exFAT文件系统,在电脑端(XP和WIN7)可以识别,但在我们Android5.1S设备无法识别,采用guiformat工具格式化为FAT32文件系统后才可以正常识别 ...
- 移动金融业务风控框架及设备风险识别的意义(下)
随着移动金融业务的广泛开展,金融行业面临的业务风险也发生了巨大的变化,传统个人信贷业务发生在线下渠道,加上业务流程的设计,主要是解决信用风险的问题. 但随着信贷业务渠道由实转虚,客群逐步下沉,由此带来 ...
- 37、SDIO设备驱动
SD(Secure Digital Memory Card)IO卡是在SD内存卡接口基础之上发展起来的接口.SDIO协议类似于USB总线协议.<?xml:namespace prefix = o ...
- win10设备管理没有android,win10无法识别安卓手机usb设备怎么办_win10连接安卓设备无法识别的修复方法-爱纯净...
当我们外出游玩时,用手机拍摄的图片等都会拷贝到电脑里.或者手机连接电脑下载电影音乐是都是再普通不过的了.不过最近有的win10纯净版电脑连接上安卓手机后,发现无法识别,错误提示"第三方inf ...
- linux运维基础[系统磁盘管理]——————存储设备的识别、df、du、fsck
文章目录 1. 本地存储设备的识别 1.1 fdisk -l 1.2 cat /proc/partition 1.3 blkid 1.4 df 2.文件系统常用命令 2.1 df 2.1.1 -h 2 ...
- 计算机无法识别华为usb设备,华为路由A1插上USB储存设备无法识别怎么办
华为路由A1可以在插上USB储存设备(U盘.移动硬盘等)之后开启路由器的文件共享功能,将设备中的文件分享给连接到路由器wifi的用户.但如果插上USB储存设备后路由器无法识别怎么办,可能是什么原因,怎 ...
- 计算机老是跳出usb设备无法识别,如何解决电脑一直弹出USB设备无法识别的问题?...
如何解决电脑一直弹出USB设备无法识别的问题? 我们在电脑上传输文件的时候都会使用到USB,但是有的时候会出现USB无法识别的情况,如果我们碰到这种问题应该如何操作呢?今天,小编就教大家解决电脑一直弹 ...
- USB设备无法识别也无法读取怎么办?
文章来源:https://www.reneelab.com.cn/usb-device-not-recognized.html 目录 一.导致USB无法识别/读取的原因 二.USB设备无法识别也无法读 ...
最新文章
- activeRecord 绑定属性的属性
- Qt 不再使用 LGPLv2.1 授权
- Sqoop 同步数据到mysql, Can't parse input data: '\N'
- 微信防撤回python代码_Python实现微信防撤回
- Python教程: 闭包及陷阱
- test - delete category 060 in X3C - R3MATCLASS and perform customizing download
- JavaBean 持久化
- c# nat udp转发
- jQuery如何在线导入js包
- docker集群理解
- C# 数据库连接字符串拼接
- 初学Python01
- jmeter之badboy
- STM32开发工具-keil5安装
- 怎么样学习Java?
- [音乐天堂]辛德勒名单原声大碟
- android 简单快速 倒计时动画
- 水处理离子交换设备详解
- 优化OpenSearch的搜索结果
- python100到200的素数_python 100~200的素数和