SD卡啟動詳解


主流的外存設備介紹

  • 內存和外存的區別:一般把這種RAM(random access memory)隨機訪問存儲器,特點是任意字節讀寫,掉電丟失叫內存,把ROM叫外存(read only memory)只讀存儲器,類似於Flash,SD卡之類的,用來存儲東西,掉電不丟失,不能隨機訪問,只能以塊為單位來訪問)叫外存。

軟盤、硬盤、光盤、CD、磁帶

  • 存儲原理大多數位次磁存儲,缺點是讀寫速度可靠性等,優點是技術成熟價格便宜。廣泛使用在桌面電腦中,在嵌入式設備中幾乎不用。
  • 線代的存儲發展方向是Flash存儲,閃存技術是利用電學原理存儲1和0,從而制成存儲設備。所以閃存設備沒有物理運動(磁盤中的磁頭),所以讀寫速度很快,且無物理損耗。

純粹的Flash:Nandflash、Norflash

  • 這些是最早出現的,最原始的Flash顆粒組成芯片,也就是說Nandflash、Norflash芯片只是對存儲單元做了最基本的讀寫接口,然后要 求外部的SoC來提供Flash讀寫控制器以和Flash進行讀寫時序

缺陷:

  • 讀寫接口時序比較復雜,
  • 內部無壞塊處理機制,需要SoC自己來管理Flash壞塊
  • 各廠家的Flash接口不一致,甚至同一個廠家的不同型號、系列的Flash接口都不一致,這就造成產品升級麻煩

分類:

Nandflash分為MLC和SLC兩種。SLC技術比較早,可靠性高,缺點是容量做不大(或者說容量做大了太貴,一般SLC的Nand容量都在512M以下),MLC技術比較新,不成熟可靠性差,優點是可以做的很便宜,容量可以做的很大。現在基本都在發展MLC技術。

SD卡、MMC卡、MicroSD、TF卡

  • 這些卡其實內部就是Flsah存儲顆粒,比直接的Nandflash芯片多了統一的外部封裝和接口。
  • 卡都有統一的標准,譬如SD卡都是遵照SD規范來發布的。這些規范規定了SD卡的讀寫接口時序、讀寫命令集、卡的大小尺寸,引腳個數及定義。這樣做的好處就是不同的廠商可以通用。

iNand、MoveiNand、essD

  • 電子產品比如:手機相機等,前些年的趨勢用SD卡/TF卡等擴展存儲容量;但是近些年的趨勢是直接內置大容量的Flash芯片而不是外部擴展卡。
  • 外部擴展卡時間長了,卡槽可能造成接觸不良,導致不可靠
  • 現在主流的發展方向是使用iNand、MoviNand、eSSD(還有一些別的名字)來做電子產品的存儲芯片。這些東西的本質還是Nandflash,內部由Nand的存儲顆粒構成,再集成了塊設備管理單元,綜合了SD卡為代表的卡的優勢和原始的NandFlash芯片的優勢。
  • 優勢1、向SD卡學習,有統一的接口標准(包括引腳定義、物理封裝、接口時序)
  • 優勢2:向原始的Nand學習,以芯片的方式來發布而不是以卡的方式
  • 優勢3:內部內置了Flash管理模塊,提供了諸如壞塊管理等功能,讓Nand的管理容易了起來

SSD(固態硬盤)

 

SD卡的特點和背景知識

SD卡和MMC卡的關系

  • MMC卡比SD卡的標准早,SD卡標准兼容MMC卡標准。
  • MMC卡可以被SD讀卡器讀寫,而SD卡不可以被MMC讀卡器讀寫

SD卡和Nand、Nor等Flash芯片差異

  • SD卡/MMC卡等卡類有統一的接口標准,而Nand芯片沒有統一的標准(各家產品會有差異)

SD卡與MicroSD的區別

  • 體積大小區別而已,傳輸與原理完全相同

SD卡與TF卡的區別

  • 外觀上,SD卡答而TF卡小,用途上,SD卡用於數碼相機等而TF卡廣泛應用於手機、GPS等
  • 時間上,SD卡1999年推出,TF卡於2004年推出,SD卡由日本松下、東芝與美國SanDisk共同推出,而TF卡Motorola和SanDisk共同推出
  • SD卡由寫保護而TF卡沒有,TF卡可以通過卡套轉成SD卡使用

SD卡編程接口

SD卡的物理接口

  • SD卡的物理接口由9個真叫與外接進行物理連接,這9個腳中有2個地,1個電源,6個信號線

SD協議與SPI協議

  • SD卡與SRAM/DDR/SROM之類的東西的不同:SRAM/DDR/SROM之類的存儲芯片是總線式的,只要連接上初始化好之后就可以由SoC直接以地址的方式來訪問。但是SD卡不能直接通過接口給地址來訪問,他的訪問需要按照一定的接口協議(時序)來訪問
  • SD卡雖然只有一種物理接口,但是卻支持兩種讀寫協議:SD協議和SPI協議

SPI協議特點(低速、接口操作時序簡單、適合單片機)

  • SPI協議是單片機中廣泛使用的一種通信協議,並不是為SD卡專門發明的
  • SPI協議相對於SD協議來說速度比較低
  • SD卡支持SPI協議就是為了方便單片機使用

SD協議特點(高速、接口時序復雜、適合有SDIO接口的SoC)

  • SD協議是專門用來和SD卡通信的
  • SD協議要求SoC中有SD控制器,運行在高速率下,要求SoC主頻不能太低

S5PV210的SD/MMC控制器

  • 數據手冊Section8.7,為SD卡/MMC卡控制器介紹
  • SD卡內部處理存儲單元Flash外,還有SD卡管理模塊,我們SoC和SD卡通信時,通過9針引腳以SD協議/SPI協議向SD卡管理模塊發送命令、時鍾、數據等信息、然后從SD卡返回信息給SoC來交互。工作時,每個任務,譬如初始化SD卡,譬如讀一個塊,譬如寫,譬如擦除都需要一定的時序來完成。所謂的時序就是先向SD卡發送XX命令,SD卡回xx消息,然后再向SD卡發送XX命令........

 S5PV210的SD卡啟動詳解1

SoC為何要支持SD卡啟動

  • (1)一個普遍性的原則就是:SoC支持的啟動方式越多,用戶的可選擇型就越大,SoC的適用面就越廣。
  • (2)SD卡啟動有一些好處:譬如可以在不借用專用燒錄工具(類型Jlink)的情況下對SD卡進行刷機,然后刷機后的SD卡插入卡槽,SoC即可啟動.像X210開發板板子貼片好的時候,內部iNand是空的,此時直接啟動無啟動。板子出廠前官方刷機時是把實現做好的量產卡插入卡槽,然后打到iNand方式啟動;因為此時的iNand是空的,所以第一啟動方式失敗,轉為第二啟動方式,就是從外部的SD2通道的SD卡啟動。啟動后會執行刷機操作對iNand進行刷機,刷機完成后自動重啟(這回iNand中已經有image了,所以可以啟動了)。刷機完成后SD量產卡拔掉,燒機48小時,無死機后可以裝箱待發貨。

SD卡啟動的難點在哪里(ARAM、DDR、SDCard)

  • SRAM、DDR都是總線式訪問的,SRAM不需要初始化就可以直接訪問而DDR需要初始化才能使用,但是總之,CPU可以直接和SRAM或者DRAM打交道。而SD卡需要時序訪問,CPU不可以直接和SD卡打交道。NorFlash讀取是可以總線式訪問,所以NorFlash啟動非常簡單,可以直接啟動,但是SD/NandFlash不行
  • 以前只有NorFlash可以作為啟動介質,台式機筆記本的BIOS就是NorFlash做的,后來三星在 2440中使用了SteppingStone的技術,讓NandFlash也可以作啟動介質。SteppingStone(翻譯為啟動基石)技術就是在SoC內部內置4KB的SRAM,然后開機時SoC根據OMpin判斷用戶設置的啟動方式,如果是NandFlash啟動,則SoC的啟動部分的硬件直接從外部的NandFlash中讀取開頭的4KB到內部的SRAM作為啟動內容。
  • 啟動基石技術進一步發展在6410中進一步發展,在210中已經發展成熟。210中有96KB的SRAM並且有一段IROM代碼作為BL0,然后BL0再去啟動BL1,實際上210中做的事情在210中也有,只不過那時候是硬件自動完成的,而且體系沒有210這么詳細。

S5PV210的啟動過程回顧

  • 210啟動首先執行內部iROM(也就是BL0),BL0會判斷從哪個設備啟動,如果啟動設備是SD卡,則BL0則會從SD卡讀取16KB(不一定是16KB,反正16KB是工作的)到SRAM中執行(這部分就是BL1,這就是stepping stone技術)
  • BL1執行之后剩下的就是軟件的事情了,SoC就不用再操心了

SD卡啟動流程(bin文件小於16KB時和大於16KB時)

  • 啟動的第一種情況時整個鏡像大小小於16KB,這時候相當於整個鏡像作為BL1被stepping stone直接硬件加載執行了而已。
  • 啟動的第二種情況就是整個鏡像大小大於16KB(只要大於16KB哪怕是17KB或者是700MB都是一樣的),這時候整個鏡像就要分為兩個部分,第一部分16KB大小,剩下的部分作為第二部分。然后第一部分作為BL1啟動,負責初始化DRAM並且負責將第二部分加載到DRAM中執行(uboot就是這么做的)。

最重要的但是卻隱含未講的

  • 問題:iROM究竟是怎樣讀取我們的SD卡/NandFlash的?

三星在iROM中事先內置了一些代碼去初始化外部SD卡/NandFlash,並且內置了讀取各種SD卡/NandFlash的代碼在iROM中。BL0執行時就是通過調用這些device copy function來讀取外部SD卡/NandFlash中的BL1

 S5PV210的SD卡啟動詳解2

SoC支持SD卡啟動的秘密(iROM代碼)

  • 三星系列SoC支持SD卡/NandFlash啟動,主要是依賴stepping stone技術,具體在S5PV210中支持stepping stone技術的是內部的iROM代碼。

SDHC卡和SD卡的區別?

  • SDHC卡相當於高容量的SD卡。
  • SD卡一般支持最大位2GB,而SDHC最大支持32GB,SDXC最大支持2TB

再看iROM Application note:block device copy function

 扇區和塊的概念

  • 早期的的塊設備就會軟盤硬盤這類次存儲設備,這種設備的存儲單元不是以字節為單位而是以扇區為單位。儲存設備讀寫的最小單元就是扇區,不應該只讀或者寫部分扇區,也成為了編程時必須遵守的規律。
  • 一個扇區有好多個字節,一般是512字節,早起的磁盤扇區是512字節,實際上后來的磁盤扇區可以做的比較大,譬如1024字節,2048字節,4096字節,但是因為原先最早就是512字節,很多的軟件和操作系統已經默認了512字節,因此后來的硬件雖然物理上可能支持更多更大的扇區,但是實際上還是兼容512字節的方法。
  • 一個扇區可以看成是一個塊(塊的概念就是:不是一個字節,是多個字節組成一個共同的操作單元塊),於是就有了塊的概念,所以就把這類的設備稱為塊設備,常見的塊設備有:磁存儲設備硬盤,軟盤、DVD和Flash設備(U盤、SSD、SD卡、NandFlash、eMMC、iNand)
  • linux里有個mtd驅動,就是用來管理塊設備的
  • 磁盤和我們的Flash以塊位單位來讀寫就決定了我們啟動時,device copy function只能以整塊來讀取SD卡。

函數指針調用device copy function

  • 第一種方法:宏定義的方式來調用。好處是簡單方便,壞處是編譯器不能自動做參數的靜態類型檢查。
  • 第二種方法:用函數指針方式來調用

S5PV210的SD卡啟動實戰1

任務:大於16KB的bin文件,使用SD卡啟動

總體思路:將我們的代碼分為兩個部分:第一部分BL1為小於等於16KB,第二部分位任意大小。iROM代碼執行完成后從SD卡啟動會自動讀取BL1到SRAM中執行。BL1執行時負責初始化DDR,然后手動將BL2從SD卡copy到DDR中的正確位置,然后BL1跳轉到BL2中執行BL2部分

  • 細節1:我們的程序怎么安排?:整個程序分為兩個文件夾BL1和BL2,各自管理各自的項目。
  • 細節2:BL1中要完成:關看門狗、設置棧、開icache,初始化DDR、從SD卡復制BL2到DDR特定位置,跳轉執行BL2
  • 細節3:BL1在SD卡中必須從Block1開始(Block0不能用,這個是三星官方該規定的),長度為16KB內,我們就定義位16KB(也就是32個Block)
  • BL1理論上可以從32扇區開始,但是實際上我們安全都會留一些空扇區作為隔離譬如可以從45扇區開始,長度由自己定(實際根據自己的BL2大小來分配長度,我們BL2實驗時非常小,因此我們定義BL2長度位為16KB,也就是32扇區)
  • 細節4:DDR初始化好后,整個DDR都可以使用,這時在其中選擇一段長度足夠BL2的DDR空間即可。我們選0x23E00000(因為我們BL1只初始化了DDR1,地址空間范圍為:0x20000000~0x2FFFFFFF)

代碼分為兩個部分(BL1和BL2)

  • BL1中的重定位
  • BL2遠跳轉

因為我們BL1和BL2其實是2個獨立的程序,鏈接時也是獨立分開鏈接的,所以不能像以前一樣使用ldr pc, =main這種方式來通過鏈接地址實現元跳轉到BL2。

我們的解決方案是使用地址進行強制跳轉,因為我們知道BL2在內存地址0x23E00000處,所以直接去執行即可。

 

S5PV210的SD卡啟動實戰2

燒錄啟動試驗

  • 代碼分為2部分啟動(上一節講的缺陷)
  • 代碼分為兩個部分,這種技技術叫做分散加載。這種分散加載的方法可以解決問題但是比價麻煩。
  • 分散加載的缺陷:第一,代碼完全分為兩個部分,代碼編寫和組織上比較麻煩。第二,無法讓工程項目兼容SD卡啟動和Nand啟動、NorFlash啟動等各種方式

uboot中的做法

第二種思路:程序代碼仍然包括BL1,BL2兩個部分但是組織形式上不分為兩個部分而是作為一個整體來組織。它的實現方式是:iROM啟動,然后從SD卡的扇區1開始讀取16KB的BL1,BL1負責初始化DDR,然后從SD卡中讀取整個程序(BL1+BL2)到DDR中,然后從DDR中執行(利用ldr pc, =main這種方式以遠跳轉從SRAM中運行的BL1跳轉到DDR中運行的BL2)。

再來分析uboot的SD卡啟動細節

  • (1)uboot編譯好之后有200多KB,超出了16KB。uboot的組織方式就是前面16KB為BL1,剩下的部分為BL2.
  • (2)uboot在燒錄到SD卡的時候,先截取uboot.bin的前16KB(實際腳本截取的是8KB)燒錄到SD卡的block1~bolck32;然后將整個uboot燒錄到SD卡的某個扇區中(譬如49扇區)
  • (3)實際uboot從SD卡啟動時是這樣的:iROM先執行,根據OMpin判斷出啟動設備是SD卡,然后從S卡的block1開始讀取16KB(8KB)到SRAM中執行BL1,BL1執行時負責初始化DDR,並且從SD卡的49扇區開始復制整個uboot到DDR中指定位置(0x23E00000)去備用;然后BL1繼續執行直到ldr pc, =main時BL1跳轉到DDR上的BL2中接着執行uboot的第二階段。

總結:uboot中的這種啟動方式比上節講的分散加載的好處在於:能夠兼容各種啟動方式。

解決X210開發板的軟開關按鍵問題

X210開發板的軟啟動電路詳解

  • (1)210供電需要的電壓比較穩定,而外部適配器的輸出電壓不一定那么穩定,因此板載了一個文穩壓器件MP1482.這個穩壓芯片的作用就是外部適配器電壓在一定范圍內變化時穩壓芯片的輸出電壓都是5V。
  • (2)MP1482芯片有一個EN(Enable)引腳,這個引腳可以讓穩壓芯片輸出或關閉輸出。EN為高電平時有輸出電壓,EN引腳為低電平時穩壓芯片無輸出。
  • (3)兩個因素可以影響EN引腳的電平:第一個是POWER按鍵(SW1),POWER按鍵按下時EN為高電平,POWER按鍵彈起時EN為低電平;第二個是POWER_LOCK(EINT0)引腳,這個引腳為POWER_LOCK模式下高電平,則EN為高;若這個引腳為EINT0模式或者為POWER_LOCK模式但輸出為低電平,則EN為低。
  • (4)圖中還有EINT1引腳,這個引腳的作用是用來做中斷,提供給CPU用來喚醒的。

為什么要軟啟動

  • (1)一般的電路設計都是用撥碼開關來做電源開關的(打到一側則接通,打到另一側則關閉)。這種方式的優點是設計簡單,缺點是電路太簡單,整個主板要么有電要么沒電無法做休眠模式、低功耗模式等。
  • (2)軟啟動電路是比較接近於實際產品的,其他開發板的硬開關其實是簡化版的,和實際產品還有差異。

開發板供電置鎖原理和分析

  • (1)軟開關在設計時有一個置鎖電路,用EINT0(也就是GPH0_2)引腳來控制的。
  • (2)EINT0這個引腳是有復用設計(兩個完全不相干的功能擠在同一個引腳上,同時我們只能讓這個引腳用於其中一種功能,這就叫復用)的,一個是GPIO(也就是GPH0_2引腳)、一個是PS_HOLD_CONTROL。(注意:EINT0功能算是GPIO下的一個子功能)
  • (3)PS_HOLD在Section2.4 Power Management章節下的4.10.5.8節下。
  • (4)PS_HOLD_CONTROL寄存器(0xE010E81C),共有3個位有用。
  • bit0, 0表示這個引腳為GPIO功能,1表示這個引腳為PS_HOLD功能
  • bit9,0表示這個引腳方向為輸入,1表示這個引腳方向為輸出
  • bit8,0表示這個引腳輸出為低電平,1表示輸出為高電平。
  • 分析:我們要使用軟啟動置鎖,則需要將bit0、8、9都置為1即可。

寫代碼+實驗驗證

  • (1)要想讓開發板和普通的開發板一樣,一按下按鍵程序運行后即可松手不會斷電,則只要在程序的開頭部分添加代碼去置鎖開關板即可。
  • (2)置鎖代碼的方法是:給PS_HOLD_CONTROL寄存器的bit0、8、9均寫入1即可。
  • (3)注意:此時開發板已經置鎖,POWER按鍵已經失效,關機時需要按下復位按鍵。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM