【Linux驅動學習】SD卡規範學習,linuxsd卡規範
摘要:
學習SD卡的相關規範,包括定義,硬體特性,資料轉送,命令系統等。不涉及代碼。
文章針對Linux驅動開發而寫,以助於理解SD卡驅動,不會涉及過多硬體內容。
綱要:
1. SD卡介紹
2. SD卡硬體規範
3. SD卡指令規範
4. SD卡寄存器
1. SD卡介紹1.1 各類型儲存卡/介面
首先瞭解一下我們在SD卡驅動學習中會碰到的主要幾個儲存卡名詞:
SD:Security Digital Memory Card,新一代多媒體儲存卡,高速,安全(但安全機制貌似很少用到)
MMC:Multimedia Card,SD卡的上一代多媒體儲存卡,已基本被SD卡代替
eMMC:Embedded Multimedia Card,內嵌式儲存空間,一般焊在PCB上。內建主控制器,以實現統一MMC介面(在傳統MMC介面上拓展,整合了整套理論),Nand Flash就是eMMC
SDIO:Secure Digital Input and Output Card,SD標準上定義了一種外設介面,有很多裝置模組採用。如Wifi,GPS,Bluetooth
1.2 SD卡特性
以下是SD卡的部分特性。
- 正向相容MMC卡:能插SD卡的介面也可以插MMC卡
- 最大10個堆疊的卡
- SD模式和SPI模式
- 可變時鐘(0~25MHz),可變電壓(2.0~3.6V)
- 帶電插拔保護
- 安全系統,雙方認證和“新的密碼演算法”技術
更多的特性請閱讀SD卡官方規範。
2. SD卡硬體規範 2.1 SD卡物理介面
是SD卡和MMC卡的針腳:
可以看到,SD卡在MMC卡基礎上增加了8、9兩個針腳,這兩個針腳將被用作資料轉送,以支援SD傳輸模式。SD卡支援SD模式(4資料線)和SPI模式(2資料線),MMC卡只支援SPI模式。
SD卡針腳對應的功能:(SD模式)
SD模式:資料並行傳輸,2地,1電源,1時鐘,1命令,4資料線(4出入)(SD模式的命令通過命令線傳輸)
SPI模式:資料串列傳輸,2地,1電源,1時鐘,1片選,2資料線(1入1出)(SPI模式的命令通過資料線傳輸)
以下內容,如無分開說明,預設指SD模式。(本文不會涉及SPI模式學習)
2.2 SD卡與主機的串連
SD模式和SPI模式中與主機的串連拓撲圖如下:
在SD模式中,資料線和命令線是分開串連到主機各GPIO口中的。在SPI模式中,片選線分別串連到主機各GPIO口,資料線在同一條匯流排上。
因為SPI模式的資料線在同一匯流排上,所以需要片選來選擇不同的儲存卡;SD模式分別串連到主機,不需要片選線。
3. SD卡命令規範3.1 命令類型
SD卡有數十種指令,但無非都是一些擷取資訊,資料轉送的功能,並不會很難理解。規範書上有詳細的狀態轉換圖,下面會有介紹。
下面是4種指令類型:
- 廣播指令,無應答(代號bc):發送完此類命令後,並不會有反饋,但操作已經生效。
- 廣播指令,有應答(代號bcr):發送完此類命令後,SD卡會給予反饋。可能是一些寄存器資訊,可能是
- 定址(點對點)指令(代號ac):發送完此類命令後,只有指定地址的SD卡會給予反饋(地址通過命令請求SD卡發布,是唯一的)。此時DAT線上無資料轉送。
- 定址(點對點)資料轉送指令(adtc):發送完此類命令後,只有制定地址的SD卡會給予反饋。此時DAT線上有資料轉送。
3.2命令表
官方文檔將命令分成了好幾種功能。下面將所有命令列出,僅作查閱瞭解用,不需要每個命令都記住:
基礎命令:用於重設、切換SD卡狀態,擷取相關資訊
讀塊命令:讀單個、多個塊資料,設定塊長度
寫塊命令:寫單個、多個塊資料,設定塊長度
擦除塊命令:把對應的塊資料擦除
防寫保護命令:設定、取消對應地址的資料的防寫保護,可以使其他程式無法寫入指定的地址,達到保護目的。用的情況不太多。
鎖卡命令:設定、取消鎖卡。鎖卡後要求輸入密碼才能訪問SD卡。
SDIO命令:預留給SDIO裝置使用(CMD5也是預留給SDIO裝置),在SD卡官方文檔中沒有說明具體用途
SD卡專用命令:MMC卡無法使用這些命令,裡麵包括如設定資料匯流排位寬,擷取SD卡資訊(寄存器)。
3.2 命令/資料轉送方式
命令的傳輸協議大致如下:
- 0開頭,1結尾
- 大端傳輸:先MSB,最後LSB
- CRC校正
下面這幅圖是無響應和無資料兩種命令的傳輸情況:
非常清晰易懂,就不贅述了。
下面這幅圖是多塊資料讀的資料轉送情況:
主機發送多塊讀命令時,首先sd卡會做出回應,同時準備資料。資料準備完成後開始發送,並在每個block傳輸完成後加入crc校正碼。傳輸完一個block和crc後緊跟著下一個block的資料轉送,直到傳輸完成,或主機發送了新的命令。
SD模式有4根資料線,一次可以傳輸半個位元組,兩次一個位元組。他們的傳輸方式如:
同樣是先傳MSB,再傳LSB,一次傳半個位元組,這樣做可以方便主機做位移組合成一個位元組。如果每條線單獨傳一個位元組,則需要移位8次才可以獲得一個完整的byte。
3.3 狀態轉換
為SD卡狀態轉換圖。重新上電時為Idle狀態:
看起來這個狀態圖很複雜,其實我們要走的流程並不複雜。Linux驅動對SD卡做初始化會經過如下步驟:
CMD0上電重設到idle狀態(防止一些機型關機不掉電,如某些FPGA平台)->ACMD41擷取SD卡支援的電壓資訊(還需要通過主機控制器設定電壓)->CMD2擷取卡商資訊->CMD3請求SD卡發布相對位址->CMD9擷取CSD寄存器,即卡的電氣特性資料(需要使用SD卡相對位址)->CMD7通過相對位址選擇對應的SD卡,該卡進入資料轉送Transfer State狀態->各種CMD進行block讀寫
3.4 流程差異
不同種類的卡初始化過程是不一樣的,通過流程差異我們可以判斷不同類型的卡。
SDIO:CMD0之後執行CMD5,CMD5隻有SDIO類型才會有響應。
MMC:ACMD 41換為CMD1,ACMD類命令只有SD或SDIO卡才有響應。所以要先檢測是否是SDIO,再檢測是否是SD,最後檢測是否是MMC(core層代碼中也是這個順序),否則會出現誤判。
4. SD卡寄存器
SD卡一共有6個寄存器,我們用的對多的是CID(卡商資訊),RCA(相對位址)和OCR(電壓資訊):
CID:卡資訊:生產商,OEM,產品名,版本,出產日期,CRC校正(所有寄存器都有,下同),常用
RCA:卡地址:在初始化時發布,用於與host通訊,0x0000表示與所有卡通訊,常用
DSR:驅動相關,匯流排電流大小,上升沿時間,最大開啟時間,最小開啟時間
CSD:資料轉送要求:包括讀寫時間,讀寫電壓最大最低值,防寫保護,塊讀寫錯誤
SCR:特性支援,如CMD支援,匯流排數量支援
OCR:支援的電壓,常用
SSR:特有特性,卡類型(OTP,SD等),一次擦除塊數量
CSR:R1返回指令的卡狀態,此寄存器用與傳輸卡狀態給host
命令系統中有對應的指令擷取這6個寄存器。
著作權,轉載請註明出處:
http://www.cnblogs.com/sickworm/p/4015932.html
linux驅動怎學習
1)推薦《linux driver 3th》, 《linux 驅動編程第三版》希望你閱讀。
2)閱讀一下kernel的drive 下的代碼,可以參考usb 的
3)瞭解你要編寫驅動對應的硬體和相關協議。
供你參考。
想學Linux下驅動,該怎學習
首先我熟悉ARM的體繫結構,能夠寫ARM得到裸板驅動。然後在看Linux核心驅動程式就會容易點。