【Linux驅動學習】SD卡規範學習,linuxsd卡規範

來源:互聯網
上載者:User

【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核心驅動程式就會容易點。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.