http://blog.csdn.net/zqixiao_09/article/details/51039595
分兩步學(xué)習(xí)
1.協(xié)議
2.驅(qū)動(dòng)
協(xié)議:
1篙挽、SDIO接口
??SDIO故名思義,就是SD 的 I/O 接口(interface)的意思瓤帚,不過這樣解釋可能還有點(diǎn)抽像份企。更具體的說明赦肋,SD 本來是記憶卡的標(biāo)準(zhǔn)第队,但是現(xiàn)在也可以把 SD 拿來插上一些外圍接口使用,這樣的技術(shù)便是 SDIO纷闺。
所以 SDIO 本身是一種相當(dāng)單純的技術(shù)算凿,透過 SD 的 I/O 接腳來連接外部外圍,并且透過 SD 上的 I/O 數(shù)據(jù)接位與這些外圍傳輸數(shù)據(jù)犁功,而且 SD 協(xié)會(huì)會(huì)員也推出很完整的 SDIO stack 驅(qū)動(dòng)程序氓轰,使得 SDIO 外圍(我們稱為SDIO 卡)的開發(fā)與應(yīng)用變得相當(dāng)熱門。
? ? ? ?現(xiàn)在已經(jīng)有非常多的手機(jī)或是手持裝置都支持 SDIO 的功能(SD 標(biāo)準(zhǔn)原本就是針對(duì) mobile device 而制定)浸卦,而且許多 SDIO 外圍也都被開發(fā)出來戒努,讓手機(jī)外接外圍更加容易,并且開發(fā)上更有彈性(不需要內(nèi)建外圍)。目前常見的 SDIO 外圍(SDIO 卡)有:
· Wi-Fi card(無線網(wǎng)絡(luò)卡)?
· CMOS sensor card(照相模塊)?
· GPS card?
· GSM/GPRS modem card?
· Bluetooth card?
? ? ? ? SDIO 的應(yīng)用將是未來嵌入式系統(tǒng)最重要的接口技術(shù)之一储玫,并且也會(huì)取代目前 GPIO 式的 SPI 接口。
2萤皂、SDIO總線
SDIO總線 和 USB總線 類似撒穷,SDIO也有兩端,其中一端是HOST端裆熙,另一端是device端端礼。所有的通信都是由HOST端 發(fā)送 命令 開始的,Device端只要能解析命令入录,就可以相互通信蛤奥。
CLK信號(hào):HOST給DEVICE的 時(shí)鐘信號(hào),每個(gè)時(shí)鐘周期傳輸一個(gè)命令僚稿。
CMD信號(hào):雙向 的信號(hào)凡桥,用于傳送 命令 和 反應(yīng)。
DAT0-DAT3 信號(hào):四條用于傳送的數(shù)據(jù)線蚀同。
VDD信號(hào):電源信號(hào)缅刽。
VSS1,VSS2:電源地信號(hào)蠢络。
3衰猛、SDIO熱插拔原理
方法:設(shè)置一個(gè)定時(shí)器檢查或插拔中斷檢測
硬件:假如GPG10(EINT18)用于SD卡檢測
GPG10 為高電平 即沒有插入SD卡
GPG10為低電平 ?即插入了SD卡
4、SDIO命令
? ? ? SDIO總線上都是HOST端發(fā)起請(qǐng)求刹孔,然后DEVICE端回應(yīng)請(qǐng)求啡省。sdio命令由6個(gè)字節(jié)組成。
a -- Command:用于開始傳輸?shù)拿钏柘迹怯蒆OST端發(fā)往DEVICE端的卦睹。其中命令是通過CMD信號(hào)線傳送的。
b -- Response:回應(yīng)是DEVICE返回的HOST的命令酸茴,作為Command的回應(yīng)分预。也是通過CMD線傳送的。
c -- Data:數(shù)據(jù)是雙向的傳送的薪捍×裕可以設(shè)置為1線模式,也可以設(shè)置為4線模式酪穿。數(shù)據(jù)是通過DAT0-DAT3信號(hào)線傳輸?shù)摹?/p>
? ? ? SDIO的每次操作都是由HOST在CMD線上發(fā)起一個(gè)CMD凳干,對(duì)于有的CMD,DEVICE需要返回Response被济,有的則不需要救赐。
? ? ?對(duì)于讀命令,首先HOST會(huì)向DEVICE發(fā)送命令,緊接著DEVICE會(huì)返回一個(gè)握手信號(hào)经磅,此時(shí)泌绣,當(dāng)HOST收到回應(yīng)的握手信號(hào)后,會(huì)將數(shù)據(jù)放在4位的數(shù)據(jù)線上预厌,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著CRC校驗(yàn)碼阿迈。當(dāng)整個(gè)讀傳送完畢后,HOST會(huì)再次發(fā)送一個(gè)命令轧叽,通知DEVICE操作完畢苗沧,DEVICE同時(shí)會(huì)返回一個(gè)響應(yīng)。
? ? 對(duì)于寫命令炭晒,首先HOST會(huì)向DEVICE發(fā)送命令待逞,緊接著DEVICE會(huì)返回一個(gè)握手信號(hào),此時(shí)网严,當(dāng)HOST收到回應(yīng)的握手信號(hào)后识樱,會(huì)將數(shù)據(jù)放在4位的數(shù)據(jù)線上,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著CRC校驗(yàn)碼屿笼。當(dāng)整個(gè)寫傳送完畢后牺荠,HOST會(huì)再次發(fā)送一個(gè)命令,通知DEVICE操作完畢驴一,DEVICE同時(shí)會(huì)返回一個(gè)響應(yīng)休雌。
卡識(shí)別階段
數(shù)據(jù)傳輸階段
在卡識(shí)別階段通過命令使MMC/SD處于:空閑(idle)、準(zhǔn)備(ready)肝断、識(shí)別(ident)杈曲、等待(stby)、不活動(dòng)(ina)幾種不同的狀態(tài)胸懈;
? ? 而在數(shù)據(jù)傳輸階段通過命令使MMC/SD處于:發(fā)送(data)担扑、傳輸(tran)、接收(rcv)趣钱、程序(prg)涌献、斷開連接(dis)幾種不同的狀態(tài)。
驅(qū)動(dòng):
card
core
host
?MMC/SD設(shè)備驅(qū)動(dòng)在Linux中的結(jié)構(gòu)層次 ?
?在Linux中MMC/SD卡的記憶體都當(dāng)作塊設(shè)備首有。MMC/SD設(shè)備驅(qū)動(dòng)代碼在linux-2.6.38.2\drivers\mmc ?分別有card燕垃、core和host三個(gè)文件夾, ? ?
card層 ? ?要把操作的數(shù)據(jù)以塊設(shè)備的處理方式寫到記憶體上或從記憶體上讀染卜壕;
core層 ?則是將數(shù)據(jù)以何種格式,何種方式在 MMC/SD主機(jī)控制器與MMC/SD卡的記 憶體(即塊設(shè)備)之間進(jìn)行傳遞烙常,這種格式轴捎、方式被稱之為規(guī)范或協(xié)議,
host層 ??下的代碼就是你要?jiǎng)邮謱?shí)現(xiàn)的具體MMC/SD設(shè)備驅(qū)動(dòng)了,包括RAM芯片中的 SDI控制器(支持對(duì)MMC/SD卡的控制侦副,俗稱MMC/SD主機(jī)控制器)和SDI控制器與MMC/SD卡的硬件接口電路侦锯。
那么,card秦驯、core和host這三層的關(guān)系率触,我們用一幅圖來進(jìn)行描述,圖如下:
從這幅圖中的關(guān)系可以看出汇竭,整個(gè)MMC/SD模塊中最重要的部分是Core核心層,他提供了一系列的接口函數(shù)穴张,對(duì)上提供了將主機(jī)驅(qū)動(dòng)注冊(cè)到系統(tǒng)细燎,給應(yīng)用程序提供設(shè)備訪問接口,對(duì)下提供了對(duì)主機(jī)控制器控制的方法及塊設(shè)備請(qǐng)求的支持皂甘。對(duì)于主機(jī)控制器的操作就是對(duì)相關(guān)寄存器進(jìn)行讀寫玻驻,而對(duì)于MMC/SD設(shè)備的請(qǐng)求處理則比較復(fù)雜。
1.host
控制器驅(qū)動(dòng)
platform driver
probe中 分配mmc ,填充 host偿枕,用于向上提供操作接口
2.core
Linux在內(nèi)核源碼的drivers/mmc/core文件夾下為我們的提供了一系列SD卡的接口服務(wù)函數(shù)璧瞬。可以查看Makefile如下
可見渐夸,core文件夾下有針對(duì)總線的服務(wù)bus.c嗤锉,針對(duì)主控制器的服務(wù)host.c,針對(duì)SD卡的服務(wù)sd.c, sd_ops.c等等墓塌。
其中瘟忱,最為核心的一個(gè)函數(shù)便是之前提到的位于core.c的mmc_rescan,概括來講苫幢,主要完成兩項(xiàng)任務(wù)访诱,即
掃描SD總線,插入SD卡
掃描SD總線韩肝,拔出SD卡
3.card