詳解sd協議以及裸機和u-boot中的sd卡驅動(1)

2020-09-10 韋東山嵌入式Linux


來源:百問網論壇

作者:漸進

本文字數:4611,閱讀時長:5分鐘

1. 引入

1.1 使用場景

對於sd卡的使用,相信大家都已經很是熟悉:

  1. 無文件系統首先調用初始化函數,然後便可以調用讀寫函數進行讀寫扇區的操作,但是更多的使用場景是在文件系統之上。
  2. 有文件系統
  • pc端,以windows為例:將sd卡(或通過usb讀卡器)插在電腦的插槽裡面,然後出現一個sd卡的盤符,點進去便可以訪問裡面的文件;
  • 開發板:將sd卡插在開發板的插槽裡面,進入linux根文件系統的shell,執行mount命令掛載在某個目錄下,然後進入該目錄,便可以訪問裡面的文件;

1.2 背後原理

那麼上述使用過程背後的實現原理是什麼呢?為了更形象的講解,我畫了如下的一幅圖:

以在開發板中使用為例(不使用DMA):

  • 當我們插上sd卡後,sd卡便通過導線與s3c2440晶片引出的對應管腳相連,而這些引出的管腳最終會接到晶片內部的sd控制器上,
  • 當我們需要讀sd卡時,cpu讀寫sd控制器內部的寄存器,以此來控制其發出各種信號,主要包括讀取的地址、大小等;sd控制器發出的信號通過導線傳輸到sd卡內部;sd卡接收到信號,從中解析出要讀取的地址以及大小等,並以此讀取其內部存儲單元,接著將讀取到的數據通過相同的路徑傳回到cpu內部的寄存器;cpu將獲取到的數據通過sdram控制器寫入到sdram中,完成此次讀操作。
  • 當我們需要寫sd卡時,cpu通過sdram控制器讀取sdram中存儲的需要寫入到sd卡中的數據;cpu讀寫sd控制器內部的寄存器,以此來控制其發出各種信號,主要包括寫入的地址、數據等;sd控制器發出的信號通過導線傳輸到sd卡內部;sd卡接收到信號,從中解析出要寫入的地址以及數據等,並將數據寫入該地址對應的內部存儲單元。

1.3 提出問題

針對上述過程,我們重點關注以下幾個問題:

  1. sd控制器與sd卡之間如何通過信號來進行數據交換?
  2. cpu如何控制sd控制器來發出各種信號?

1.4 回答

1. 對於上述問題1的回答,便是sd協議所規定的內容,具體在第2章進行說明。

2. 對於上述問題2的回答,便是sd驅動的內容,具體在第3章進行說明。

2. sd協議

註:本章關於協議的內容,主要參考自sd協議書以及網絡,在此感謝這些不知名的分享者(^_^)

現在我們來回答問題1:sd控制器與sd卡之間如何通過信號來進行數據交換?

答案就是:sd協議

  1. 首先,通信的第一步需要有源、目的以及媒介,所以,sd協議規定了:sd控制器與sd卡之間相連接的物理線路sd卡的引腳sd卡內部的寄存器,用來保存sd卡本身的一些信息
  2. 接著,我們知道,物理線路上傳輸的肯定是一串二進位的比特流,而要想利用這些比特流進行通信,就必須要對這些比特流進行一定的組織,並且通信雙方都應該遵守,為此,sd協議規定了:這些比特流被分為三種基本的單位,包括命令、響應以及數據,每種基本單位都有固定的格式
  3. 然後,基本單位以及其格式有了,sd協議在此基礎上,又將命令和響應按照功能定義了多個種類,比如:復位命令CMD0、單塊讀命令CMD17等等不同類型的響應
  4. 最後,sd協議利用這些不同功能的命令以及響應,定義了一個具體的通信流程。

對於以上各部分更具體的描述,請看下文。

2.1 物理層面

2.1.1 sd卡引腳定義

我們這裡說的sd卡包括:

  • 標準尺寸的sd卡
  • micro sd卡

具體引腳定義如下圖所示:

2.1.2 sd卡內部寄存器定義

SD卡有六個寄存器OCR、CID、CSD、RCA、DSR以及SCR,其中前四個保存卡的特定信息,後兩個用來對卡進行配置。

  • OCR寄存器保存有卡支持的工作電壓,支持的話相應的位置1,否則為0,具體內容如下:

  • CID寄存器保存有卡的身份信息,具體內容如下:

  • CSD寄存器保存有如何訪問卡的信息,具體內容如下:

  • RCA寄存器保存有卡的地址信息
  • DSR寄存器用於配置卡,默認值為0x404
  • SCR寄存器保存卡的特定信息,具體內容如下:

2.2 信號格式

2.2.1 分類

sd卡與host端通信的基本單位包括:

  • 命令:在CMD線上傳輸的用於啟動一個操作的比特流,由主機發往從機,可以是點對點也可以是廣播的;
  • 響應:在CMD線上傳輸的用於響應命令的比特流,由從機發往主機;
  • 數據:在DAT線上傳輸的用於傳輸數據的比特流,雙向傳輸;

註:

比特流:簡單來說,軟體層面表現為包含任意個0或1的2進位串,硬體層面表現為任意個高低電平;

廣播命令:給所有卡都發送,某些命令需要響應;

點對點命令:給指定地址的卡發送,需要響應;

2.2.2 命令

2.2.2.1 命令格式

總共48位,首先是1個起始位0,接著是1個方向位(主機發送位1),6個命令位( 0-63 ),32位參數(有些命令需要),7位CRC校驗,1個停止位,具體如下圖所示:

2.2.2.2 命令分類

卡命令根據不同的類型分成了不同的Class,見下表,其中Class0,2,4,5,8是每個卡都必須支持的命令,不同的卡所支持的命令保存在CSD中

2.2.2.3 命令詳細描述

  • 基本命令Class0

  • 讀命令Class2

  • 寫命令Class4

  • 擦除命令Class5

  • 應用特定命令Class8

  • 下表中的所有命令使用前都應先跟一個APP_CMD(CMD55)命令

2.2.3 響應

總共有如下四種類型的響應:

  • R1:長度為48位,注意每個塊傳輸完成後有一個BUSY位

  • R1b:與R1類似,只是將BUSY位加入響應中
  • R2(CID CSD寄存器):長度為136位,CID為CMD2和CMD10的響應,CSD為CMD9的響應

  • R3(OCR寄存器):長度為48位,作為ACMD41的響應

  • R6(RCA地址響應):長度為48位

2.2.4 數據

具體格式如下:

2.3 通信流程

2.3.1 工作模式

  1. 卡識別模式主機上電復位後即處於此模式,它會在總線上等待卡。卡復位後也處於此模式,直到SEND_RCA(CMD3)命令到來。
  2. 數據傳輸模式卡收到SEND_RCA(CMD3)命令後即進入此模式,主機識別到卡後也進入此模式

具體模式以及狀態分類如下表所示:

2.3.2 卡識別模式

此模式下主機復位總線所有的卡, 之後驗證工作電壓,詢問卡的地址,並且這個模式下所有數據的傳輸都是只通過CMD線來完成

  1. 卡的復位當卡上電或收到GO_IDLE_STATE (CMD0)命令後,卡即進入Idle State狀態,此時卡將其RCA設為0,相關寄存器設為傳輸穩定的最優模式
  2. 工作電壓驗證每個卡的最高和最低工作電壓存儲在OCR,只有當電壓匹配時,CID和CSD的數據才能正常傳輸給主機SD_SEND_OP_COND (ACMD41)命令用來判斷卡的工作電壓是否符合,如果不符合的話,卡應該放棄總線操作,進入Inactive State狀態。在發送SD_SEND_OP_COND (ACMD41)命令前記得要首先發送APP_CMD (CMD55)ACMD41命令響應中的BUSY位也用於卡表示其還沒準備好,主機此時應重發ACMD41命令,直到卡準備好主機在這個階段的ACMD41中不允許改變工作電壓,如果確實想改變的話,應該先發送CMD0,然後再發送改變後的ACMD41GO_INACTIVE_STATE (CMD15)命令用於使指定地址的卡進入Inactive State模式
  3. 卡識別過程ALL_SEND_CID (CMD2)命令用於獲取卡的CID信息,如果卡處於Ready State,它就會在CMD線上傳送它的CID信息,然後進入Identification State模式,緊接著發送CMD3 (SEND_RELATIVE_ADDR)命令,用於設置卡新的地址,卡收到新的地址後進入Stand-by State模式

具體狀態轉換如下圖:

2.3.3 數據傳輸模式

具體狀態轉換圖如下:

說明:

  1. 進入數據傳輸模式後,主機先不停的發送SEND_CSD (CMD9)命令獲取卡的CSD信息
  2. SET_DSR (CMD4)用於設置卡的DSR寄存器,包括數據總線寬度、總線上卡的數目、總線頻率,當設置成功後,卡的工作頻率也隨之改變,此步操作是可選的
  3. CMD7命令用於使指定地址的卡進入傳輸模式,任何指定時刻只能有一個卡處於傳輸模式,傳輸模式下所有的數據傳輸都是點對點的, 並且所有有地址的命令都需要有響應.
  4. 總線寬度選擇命令ACMD6命令用於選擇總線寬度,此命令只有在Transfer State有效,應在CMD7命令後使用
  5. 塊讀命令塊是數據傳輸的最小單位,在CSD (READ_BL_LEN)中定義,SD卡為固定的512B,每個塊傳輸的後面都跟著一個CRC校驗。CMD17(READ_SINGLE_BLOCK)用於傳輸單個塊,傳輸完之後,卡進入Transfer State。CMD18 (READ_MULTIPLE_BLOCK)用於多個塊的傳輸,直到收到一個CMD12命令
  6. 塊寫命令與塊讀命令類似, 每個塊傳輸的後面都跟著一個CRC校驗.卡寫數據時會進行CRC校驗,另外,多塊寫比重複的單塊寫更能提高效率如果CSD中的WRITE_BLK_MISALIGN沒設置, 並且發送的數據不是塊對齊的, 卡會設置狀態寄存器中的ADDRESS_ERROR位,並且進入Receive-data-State狀態等待停止命令.此時寫操作也會停止, 並且卡會設置其的WP_VIOLATION位.如果寫緩衝滿的話, 卡會停止接受WRITE_BLOCK命令. 此時主機應發送SEND_STATUS (CMD13)命令, 卡返回數據的READY_FOR_DATA位標誌卡是否準備好接受新的數據.在多塊寫操作中通過事先發送ACMD23命令可提高寫速度. ACMD23用於定義接下來要寫數據的塊的數目. 每次多塊寫操作後, 這個值又被設為默認的1.ACMD22會使卡返回寫成功的塊數目.
  7. 擦除命令擦除命令的順序是:ERASE_WR_BLK_START(CMD32),ERASE_WR_BLK_END(CMD33),ERASE (CMD38)如果上述命令接收到出錯信息, 卡會設置狀態寄存器中的ERASE_SEQ_ERROR 位並且重新等待新的命令時序如果接收到時序錯誤命令, 卡會設置其ERASE_RESET位並且重新等待新的命令時序

其他:

  • 所有讀命令都可以由CMD12命令停止,之後卡進入Transfer State. 讀命令包括單塊讀(CMD17), 多塊讀(CMD18), 發送防寫(CMD30), 發送scr(ACMD51)和讀模式一般命令(CMD56).
  • 所有寫命令都可以由CMD12命令停止. 寫命令包括單塊讀(CMD24), 多塊讀(CMD25), 寫CID(CMD26), 寫CSD(CMD27),鎖和解鎖命令(CMD42)和寫模式一般命令(CMD56).
  • 參數設置命令在卡被編程時是不允許發送的, 這些命令包括設置塊長度(CMD16), 擦除塊起始(CMD32)和擦除塊結束(CMD33).
  • 用CMD7使另一個卡進入Transfer State不會終止當前卡的編程和擦除, 當前卡會進入Disconnect State並且釋放DAT線.
  • Disconnect State模式的卡可通過CMD7重新被選中,此時卡進入Programming State並且使能busy信號.
  • 防寫管理,有如下三種機制:防寫物理開關卡內部防寫:通過設置CSD中的WP_GRP_ENABLE位和WP_GRP_SIZE位, SET_WRITE_PROT和CLR_WRITE_PROT命令用來設置和清除保護機制密碼保護

全文在百問網論壇

點擊「了解更多」閱讀更多相關章節

相關焦點

  • 手機不能讀取SD卡怎麼辦 手機SD卡不能用的解決方法【詳解】
    手機不能讀取SD卡怎麼辦?   設有SD卡插槽的設備能夠使用較簿身的MMC卡,但是標準的SD卡卻不能插入到MMC卡插槽。SD卡能夠於CF卡和PCMCIA卡上,插上轉接器使用。 下面,我們就來看看手機SD卡不能用的解決方法。
  • Linux SD/MMC/SDIO驅動分析
    Host:針對不同主機端的SDHC、MMC控制器的驅動,這部分需要由驅動工程師來完成;         Core:整個MMC的核心層,這部分完成不同協議和規範的實現,為host層和設備驅動層提供接口函數。
  • SD卡原理
    BL0是s5pv210內部IROM固化的代碼,這段代碼根據OM引腳配置狀態來選擇從哪個外部存儲設備加載BL1段代碼(實際上BL1代碼就是我們編寫的UBOOT的前8K代碼,這段代碼要包含完整的將後半部UBOOT代碼複製和清bss段的功能,當然我們要從SD卡啟動燒寫在上面的UBOOT,OM引腳就必須配置為從SD卡啟動配置)。
  • tf卡和sd卡的區別 tf卡和sd卡有什麼不同
    大家都知道,sd卡就是所謂的儲存卡。以前的手機可以將sd卡拆卸下來,因此可以購買大內存的sd卡來儲存文件。但是,現在大多數手機都是一體機,是不能拆卸的,因此也就不能換成更大的內存。除此之外,還有一種卡是tf卡。二者有什麼區別呢?一起來看看!
  • 手機sd卡讀不出來怎麼辦 手機sd卡無法讀取原因【圖文】
    sd卡,又被稱作是安全數碼卡,是一種在手機、數位相機等各類可攜式的電子電氣裝置中被廣泛使用的具有存儲功能的記憶設備。sd卡是半導體快閃記憶體工藝技術發展的成果之一,具有著存儲容量大、性能穩定、安全保障行高的特點,是人們對對電子數碼設備進行擴容時的首選產品。  手機是人們日常生活中最常用的工具,而手機sd卡也隨之成為了人們最常用的sd卡。
  • 乾坤合一~Linux SD/MMC/SDIO驅動分析
    >MMC代碼分布MMC子系統代碼主要在drivers/mmc目錄下,共有三個目錄:Card:存放快閃記憶體卡(塊設備)的相關驅動,如MMC/SD卡設備驅動,SDIOUART;Host:針對不同主機端的SDHC、MMC控制器的驅動,這部分需要由驅動工程師來完成;Core:整個MMC的核心層,這部分完成不同協議和規範的實現,為host層和設備驅動層提供接口函數
  • 手機sd卡是什麼
    相信還有很多新手朋友不知道sd卡是什麼意思,有什麼用?下面就和小編一起來看看吧!sd卡是以個快閃記憶體儲存卡,通常用於數位相機,手機或是掌上電腦用的。因為是快閃記憶體,所以是可以用來存放文件的,類似於U盤一樣。不過你需要透過一個讀卡器才能在普通的臺式機上讀取或是寫入sd卡。
  • sd卡受損怎麼修復?修復SD卡,恢復數據很簡單!
    sd卡受損怎麼修復?修復SD卡,恢復數據很簡單!SD卡也是一種儲存設備,當出現sd卡數據丟失,或者出現sd卡無法讀取的情況,那麼有什麼方法可以快速修復呢?下面讓我們一起看看SD卡快速修複方法吧!修復SD卡也好,恢復SD中的數據也好,其實並不難!
  • SD卡受損怎麼修復?sd卡數據恢復高能預警
    SD卡受損怎麼修復?sd卡數據恢復高能預警!sd卡在我們手機以及相機等是比較常用的,當然遇到SD卡受損,裡面的資料數據丟失的情況也是比比皆是;上周就遇到了一個粉絲,他的數據是存在老手機的sd卡上,但是現在手機開不了機,裡面存了大量的照片JPG,還有很多rmvb格式的視頻,當時沒有想到過手機會開不了機,因為都是自己學生時代的照片,比較寶貴,找到我後,給我打電話說就算是付費也要恢復試試看。
  • SD卡是什麼 SD卡介紹
    在日常生活中,我們對於硬碟的需求越來越大,因為他們隨時隨地存儲文件和資料十分的方便。那麼sd卡是什麼?下面小編帶大家來了解一下。為一種用於儲存數碼數據的存儲卡,SD卡被廣泛地應用在便攜數碼設備上,例如數字相機、平板電腦、多媒體播放器等。  SD存儲卡是一種基於半導體快閃記憶體的新一代高速存儲設備。SD存儲卡的技術是從MMC卡格式上發展而來,在兼容SD存儲卡基礎上發展了SDIO( SD Input/ Output)卡,此兼容性包括機械,電子,電力,信號和軟體,通常將SD、SDIO卡俗稱SD存儲卡。
  • 怎麼修復強制格式化的sd卡?sd卡數據恢復!
    怎麼修復強制格式化的sd卡?sd卡數據恢復!sd卡的出現給我們的生活帶來了很大的方便,並且它所應用的範圍也都是比較廣泛的,可以用於手機,相機,音響或其它電子設備中存儲相關的數據。然而在日常使用SD卡存儲數據過程中,往往也都容易受到外界病毒的損害或者誤操作後導致其內部的數據出現丟失的現象。那麼對於SD卡誤刪後的數據來水,還能進行恢復嗎?事實上大部分情況下,只要我們沒有對誤刪後的數據進行覆蓋的話,可以藉助相關的數據恢復軟體進行恢復。
  • 手機sd卡價格怎麼樣 手機sd卡價格大全【圖文】
    SD卡也叫安全數碼卡,是存儲更多媒體資料的工具,最大的功能是擴充容量,使設備運行的更快。相信每個人的手機裡都有一張手機SD卡,一張好的手機SD卡具有堅固耐用,防水防磁,讀取數據快的優點。手機SD卡的知名品牌有Kingston/金士頓,三星,飛毛腿,Sandisk等,今天小編就來匯總知名品牌手機sd卡價格供大家參考。
  • SD EXPRESS – SD 記憶卡的革命性創新
    SD Express 緊跟著移動裝置和客戶端運算、照片及視頻成像及汽車電子系統不斷增長的性能水平等趨勢,領先採用專為高速數據處理而設計的高速傳輸接口PCIe和嵌入存儲協議NVMe。 「通過 SD Express,我們引入了一款全新的記憶卡,它使用的協議更快,能將卡轉變為移動 SSD。」
  • 手機sd卡修復工具軟體下載 解決SD卡無法識別問題
    手機sd卡修復工具是通常SD SDHC 存儲卡文件系統以普通作業系統格式化軟體被格式化,這個sd卡修復工具不遵照SD存儲卡規格,從而不被手機或讀卡器識別,或出現SD卡的容量變小。不能存儲。存儲不穩定的現象   手機sd卡修復工具是通常SD/SDHC 存儲卡文件系統以普通作業系統格式化軟體被格式化,這個sd卡修復工具不遵照SD存儲卡規格,從而不被手機或讀卡器識別,或出現SD卡的容量變小。不能存儲。存儲不穩定的現象。
  • sd卡廠家推薦及其熱銷產品介紹
    大家對sd肯定不會陌生,作為一款存儲介質,sd卡很好的彌補了手機內存不足而不得已必須把資料清空的尷尬,可以說是一些人群的福音。因此選擇一款好的sd卡便十分重要。那麼中國生產sd卡廠家有哪些呢?它們生產的sd卡質量和口碑如何呢?這些廠家旗下的熱銷sd卡介紹和評測怎麼樣呢?今天帶大家去了解一下sd卡廠家的相關信息,希望對大伙兒有所幫助。
  • sd卡修復工具(SDFix2G)
    sd卡修復工具(SDFix2G) 其它工具 大小: 108.0 KB
  • SD卡受損怎麼恢復裡面的文件?
    當我們SD卡用了很長時間,有不少用戶會出現SD卡受損的提示,想要打開SD的時候會提示用戶選擇是否格式化,一不小心,SD卡內的數據就會徹底消失。那麼,SD卡受損數據可以恢復嗎? 不要擔心,你來對地方了。易我數據恢復軟體在全球深受超過 72,000,000 用戶的信任。
  • 華為P8提示sd卡已損壞怎麼辦 華為P8修復sd卡教程【圖文】
    不過在使用過程中,有用戶遇到了華為P8提示「sd卡已損壞」的情況,那麼,華為P8提示「sd卡已損壞」怎麼辦?下面,就和小編一起來看看吧。   華為P8提示「sd卡已損壞」  1.首先要連接電腦,至少要在我的電腦裡有一個「可移動磁碟」(SD卡)。
  • WIN10下快速修復U盤SD卡
    U盤SD卡是我們經常使用的記憶設備,但是也經常會出現各種各樣的問題,比如sd卡數據丟失,或者出現U盤卡無法讀取的情況,最近有位win10系統用戶使用電腦的時候想要快速修復U盤卡,但是卻不知道怎麼操作,為此非常苦惱,那麼win10系統怎麼快速修復U盤sd卡呢?
  • sd卡損壞怎麼恢復數據?方法教程
    sd卡損壞怎麼恢復數據?SD卡是人們生活中經常用到的存儲設備,隨著科技的發展,SD卡因其小巧又方便攜 帶,而且可以存儲大量數據而被廣泛地應用到手機、相機或其它存儲設備中,而且也越來越受到人們的青睞1.找一款讀卡器sd卡損壞怎麼恢復數據?一般SD損壞時系統總會提示我們格式化,如果你想保留上面的任何數據,別格式化磁碟。在你試過恢復卡上的任何文件之後,再對防寫的SD卡格式化也不遲。