日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sdio设备无法识别

發(fā)布時間:2024/3/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.96874275START
    1.9687453DIR:from Host
    1.9687478CMD:52
    1.968763ARG:0x00
    1.9688441CRC:0x1C
    1.96886185STOP
    1.9696981START
    1.96970065DIR:from Host
    1.96970315CMD:52
    1.96971835ARG:0x08
    1.96979945CRC:0x4F
    1.9698172STOP
    1.9719129START
    1.9719154DIR: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)容還不錯,歡迎將生活随笔推薦給好友。