Linux SD卡驅動開發(二) —— SD 卡驅動分析HOST篇
Linux SD卡驅動開發(三) —— SD 卡驅動分析CORE篇
Linux SD卡驅動開發(四) —— SD 控制器之真正的硬件操作
Linux SD卡驅動開發(五) —— SD 卡驅動分析Core補充篇
Linux SD卡驅動開發(六) —— SD卡啓動過程總體分析
一.SD/MMC卡基礎概念
1.1.什麼是MMC卡
MMC:MMC就是MultiMediaCard的縮寫,即多媒體卡。它是一種非易失性存儲器件,體積小巧(24mm*32mm*1.4mm),容量大,耗電量低,傳輸速度快,廣泛應用於消費類電子產品中。
1.2.什麼是SD卡
SD:SD卡爲Secure Digital Memory Card, 即安全數碼卡。它在MMC的基礎上發展而來,增加了兩個主要特色:SD卡強調數據的安全安全,可以設定所儲存的使用權限,防止數據被他人複製;另外一個特色就是傳輸速度比2.11版的MMC卡快。在數據傳輸和物理規範上,SD卡(24mm*32mm*2.1mm,比 MMC卡更厚一點),向前兼容了MMC卡.所有支持SD卡的設備也支持MMC卡。SD卡和2.11版的MMC卡完全兼容。
1.3.什麼是SDIO
SDIO:SDIO是在SD標準上定義了一種外設接口,它和SD卡規範間的一個重要區別是增加了低速標準。在SDIO卡只需要SPI和1位SD傳輸模式。低速卡的目標應用是以最小的硬件開銷支持低速IO能力。
1.4.什麼是MCI
MCI:MCI是Multimedia Card Interface的簡稱,即多媒體卡接口。上述的MMC,SD,SDI卡定義的接口都屬於MCI接口。MCI這個術語在驅動程序中經常使用,很多文件,函數名字都包括”mci”.
1.5.MMC/SD/SDIO卡的區別
SDIO 是目前我們比較關心的技術,SDIO 故名思義,就是 SD 的 I/O 接口(interface )的意思,不過這樣解釋可能還有點抽像。更具體的說明,SD 本來是記憶卡的標準,但是現在也可以把 SD 拿來插上一些外圍接口使用,這樣的技術便是 SDIO 。
所以 SDIO 本身是一種相當單純的技術,透過 SD 的 I/O 接腳來連接外部外圍,並且透過 SD 上的I/O 數據接位與這些外圍傳輸數據,而且 SD 協會會員也推出很完整的 SDIO stack 驅動程序,使得SDIO 外圍(我們稱爲 SDIO 卡)的開發與應用變得相當熱門。
現在已經有非常多的手機或是手持裝置都支持 SDIO 的功能(SD 標準原本就是針對 mobile device而制定),而且許多 SDIO 外圍也都被開發出來,讓手機外接外圍更加容易,並且開發上更有彈性(不需要內建外圍)。目前常見的 SDIO 外圍(SDIO 卡)有:
·Wi-Fi card (無線網絡卡)
·CMOS sensor card (照相模塊)
·GPS card
·GSM/GPRS modem card
·Bluetooth card
·Radio/TV card (很好玩)
SDIO 的應用將是未來嵌入式系統最重要的接口技術之一,並且也會取代目前 GPIO 式的 SPI 接口。
二、開發板SD資源
以Exynos4412開發板爲例,其SD卡硬件原理圖如下:
圖中可以看到,SD卡設備的連接方式就是SDIO總線的驅動方式,這裏使用EINT7作爲NCD的控制器,當SD卡設備插入/取出時均會中斷響應。
三、 SD協議概要
1、 總線接口
按照SD卡的協議的描述可分爲2種總線的接口
SD BUS
物理層定義:
D0-D3 數據傳送
CMD 進行CMD 和Respons
CLK 大家最熟悉的HOST時鐘信號線了
VDD VSS 電源和地
SPI BUS
一般用SPI協議的接口來做
物理層定義:
CLK HOST時鐘信號線了
DATAIN HOST-àSD Card數據信號線
DATAOUT SD Card àHOST數據信號線
2、請求處理流程
根據協議,MMC/SD卡的驅動被分爲:卡識別階段和數據傳輸階段。
在卡識別階段通過命令使MMC/SD處於:空閒(idle)、準備(ready)、識別(ident)、等待(stby)、不活動(ina)幾種不同的狀態;
而在數據傳輸階段通過命令使MMC/SD處於:發送(data)、傳輸(tran)、接收(rcv)、程序(prg)、斷開連接(dis)幾種不同的狀態。
所以可以總結MMC/SD在工作的整個過程中分爲兩個階段和十種狀態。下面使用圖形來描述一下在兩個階段中這十種狀態之間的轉換關係。
a -- 卡識別階段
b -- 數據傳輸階段
四、 MMC/SD設備驅動在Linux中的結構層次
在Linux中MMC/SD卡的記憶體都當作塊設備。MMC/SD設備驅動代碼在linux-2.6.38.2\drivers\mmc 分別有card、core和host三個文件夾,
card層 要把操作的數據以塊設備的處理方式寫到記憶體上或從記憶體上讀取;
core層 則是將數據以何種格式,何種方式在 MMC/SD主機控制器與MMC/SD卡的記 憶體(即塊設備)之間進行傳遞,這種格式、方式被稱之爲規範或協議,
host層 下的代碼就是你要動手實現的具體MMC/SD設備驅動了,包括RAM芯片中的 SDI控制器(支持對MMC/SD卡的控制,俗稱MMC/SD主機控制器)和SDI控制器與MMC/SD卡的硬件接口電路。
那麼,card、core和host這三層的關係,我們用一幅圖來進行描述,圖如下:
從這幅圖中的關係可以看出,整個MMC/SD模塊中最重要的部分是Core核心層,他提供了一系列的接口函數,對上提供了將主機驅動註冊到系統,給應用程序提供設備訪問接口,對下提供了對主機控制器控制的方法及塊設備請求的支持。對於主機控制器的操作就是對相關寄存器進行讀寫,而對於MMC/SD設備的請求處理則比較複雜。