生活随笔
收集整理的這篇文章主要介紹了
sdio设备无法识别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近遇到sdio設(shè)備無法識別問題,一直解決不掉很痛苦,好在最終解決,分享下
模塊:
用的是有WIFI和BT功能的芯片,WIFI采用sdio接口,由WL_EN控制上電;BT是UART接口,由BT_EN控制上電;
基礎(chǔ)知識:
首先sdio屬于mmc子系統(tǒng)中設(shè)備,mmc子系統(tǒng)包括:sdio,sd,mmc
sdio設(shè)備在加載driver之前,首先得被mmc子系統(tǒng)識別到,才能進行后續(xù)操作
drivers/mmc/core/core.c,在4個頻率下掃描設(shè)備(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;}......
}
在掃描前先發(fā)個sdio_reset(CMD52)命令,只有sdio設(shè)備會有響應(yīng)
之后按照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;
}
如果成功檢測到設(shè)備,便會進行后續(xù)的mmc_sdio_init_card和mmc_add_card,進行建立設(shè)備節(jié)點等操作
檢測到設(shè)備的check方式:
查看節(jié)點? ? ? ? ? ? ? 看開機kernel log? ? ? ? <6>[ ? ?8.382000] mmc0: new SDIO card at address 0001
實驗經(jīng)歷
以上都check過后,sdio設(shè)備依然對CMD52和CMD沒有response,于是做了下面的實驗
用示波器量開機時候的波形,確認(rèn)是否有信號出來;結(jié)果是發(fā)現(xiàn)開機過程中是有信號的,正常開完機就沒有了
(黃色SDIO_CLK,藍色SDIO_CMD),所以猜測這個信號可能是host端發(fā)給sdio設(shè)備的檢測信號,但sdio是否有回復(fù)呢?
可以用邏輯分析儀看一下結(jié)果,邏輯分析儀用法可以參考上篇博文https://blog.csdn.net/miss_lazygoat/article/details/84105304
截取一段邏輯分析儀的結(jié)果來看,全是從host端發(fā)出的cmd,沒有slave的回應(yīng),CMD52也是符合預(yù)期的
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
既然能確認(rèn)host端已發(fā)送檢測命令,沒有response就是slave端的問題了,給芯片供應(yīng)商去排查就好了。
最后發(fā)現(xiàn)問題所在:WL_EN和BT_EN需同時拉高模組才能正常工作(由于模塊bug),之后sdio便能正常被識別了
關(guān)鍵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
?
總結(jié)
以上是生活随笔 為你收集整理的sdio设备无法识别 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。