1. 程式人生 > >《10.SD卡啟動詳解》

《10.SD卡啟動詳解》

《10.SD卡啟動詳解》

第一部分、章節目錄
1.10.1.主流的外存裝置介紹
1.10.2.SD卡的特點和背景知識
1.10.3.SD卡的程式設計介面
1.10.4.S5PV210的SD卡啟動詳解1
1.10.5.S5PV210的SD卡啟動詳解2
1.10.6.S5PV210的SD卡啟動實戰1
1.10.7.S5PV210的SD卡啟動實戰2
1.10.8.解決X210開發板的軟開關按鍵問題

第二部分、章節介紹
1.10.1.主流的外存裝置介紹
本節主要講解目前為止出現過的主流外部儲存裝置如磁儲存裝置、Flash類儲存裝置以及其主要特點。
1.10.2.SD卡的特點和背景知識
本節主要講解SD卡的簡單背景,以及SD卡與MMC卡,SD卡與TF卡、MicroSD卡等的關聯和區別。
1.10.3.SD卡的程式設計介面
本節從程式設計角度講解SD卡的介面特徵,SD協議和SPI協議訪問SD卡的各自特點,主要目標是希望大家搞清楚SD卡的時序式訪問和SRAM/DDR等的匯流排式訪問的區別。
1.10.4.S5PV210的SD卡啟動詳解1
本節介紹S5PV210的S卡啟動的基礎知識,通過回顧S5PV210的iROM application note文件中的啟動過程描述,來分析SD卡啟動的方法。
1.10.5.S5PV210的SD卡啟動詳解2
本節著重講解扇區和塊的概念,試圖讓大家建立塊裝置的概念,並且明白Flash的以塊為單位進行讀寫的操作特徵。
1.10.6.S5PV210的SD卡啟動實戰1
本節詳細分析210的iROM中的block device copy function及其使用細節,為程式設計實戰打好基礎,同時將程式設計中的細節引數都確定好。
1.10.7.S5PV210的SD卡啟動實戰2
本節帶大家從零開始寫程式碼並進行除錯,實現分散載入的SD卡啟動。
1.10.8.解決X210開發板的軟開關按鍵問題
本節講解X210開發板的軟啟動開關電路設計原理,通過分析教會大家如何在原有程式中新增程式碼來實現開發板置鎖,以解決要不停按下POWER按鍵給開發板供電的問題。

第三部分、隨堂記錄
1.10.1.主流的外存裝置介紹
記憶體和外存的區別:一般是把這種RAM(random access memory,隨機訪問儲存器,特點是任意位元組讀寫,掉電丟失)叫記憶體,把ROM(read only memory,只讀儲存器,類似於Flash SD卡之類的,用來儲存東西,掉電不丟失,不能隨機地址訪問,只能以塊為單位來訪問)叫外存
1.10.1.1、軟盤、硬碟、光碟、CD、磁帶
(1)儲存原理大部分為磁儲存,缺點是讀寫速度、可靠性等。優點是技術成熟、價格便宜。廣泛使用在桌面電腦中,在嵌入式裝置中幾乎無使用。
(2)現代儲存的發展方向是Flash儲存,快閃記憶體技術是利用電學原理來儲存1和0,從而製成儲存裝置。所以快閃記憶體裝置沒有物理運動(硬碟中的磁頭),所以讀寫速度可以很快,且無物理損耗。
1.10.1.2、純粹的Flash:NandFlash、NorFlash
(1)這些是最早出現的、最原始的Flash顆粒組成晶片。也就是說NandFlash、NorFlash晶片中只是對儲存單元做了最基本的讀寫介面,然後要求外部的SoC來提供Flash讀寫的控制器以和Flash進行讀寫時序。
(2)缺陷:1、讀寫介面時序比較複雜。2、內部無壞塊處理機制,需要SoC自己來管理Flash的壞塊;3、各家廠家的Flash介面不一致,甚至同一個廠家的不同型號、系列的Flash介面都不一致,這就造成產品升級時很麻煩。
(3)NandFlash分MLC和SLC兩種。SLC技術比較早,可靠性高,缺點是容量做不大(或者說容量大了太貴,一般SLC Nand都是512MB以下);MLC技術比較新,不成熟,可靠性差,優點是容量可以做很大很便宜,現在基本都在發展MLC技術。
1.10.1.3、SD卡、MMC卡、MicroSD、TF卡
(1)這些卡其實內部就是Flash儲存顆粒,比直接的Nand晶片多了統一的外部封裝和介面。
(2)卡都有統一的標準,譬如SD卡都是遵照SD規範來發布的。這些規範規定了SD卡的讀寫速度、讀寫介面時序、讀寫命令集、卡大小尺寸、引腳個數及定義。這樣做的好處就是不同廠家的SD卡可以通用。
1.10.1.4、iNand、MoviNand、eSSD
(1)電子產品如手機、相機等,前些年趨勢是用SD卡/TF卡等擴充套件儲存容量;但是近年來的趨勢是直接內建大容量Flash晶片而不是外部擴充套件卡。
(2)外部擴充套件卡時間長了卡槽可能會接觸不良導致不可靠。
(3)現在主流的發展方向是使用iNand、MoviNand、eSSD(還有別的一些名字)來做電子產品的儲存晶片。這些東西的本質還是NandFlash,內部由Nand的儲存顆粒構成,再集成了塊裝置管理單元,綜合了SD卡為代表的各種卡的優勢和原始的NandFlash晶片的優勢。
(4)優勢:1、向SD卡學習,有統一的介面標準(包括引腳定義、物理封裝、介面時序)。2、向原始的Nand學習,以晶片的方式來發布而不是以卡的方式;3、內部內建了Flash管理模組,提供了諸如壞塊管理等功能,讓Nand的管理容易了起來。
1.10.1.5、SSD(固態硬碟)

1.10.2.SD卡的特點和背景知識
1.10.2.1、SD卡和MMC卡的關係
(1)MMC標準比SD標準早,SD標準相容MMC標準。
(2)MMC卡可以被SD讀卡器讀寫,而SD卡不可以被MMC讀卡器讀寫。
1.10.2.2、SD卡和Nand、Nor等Flash晶片差異
(1)SD卡/MMC卡等卡類有統一的介面標準,而Nand晶片沒有統一的標準(各家產品會有差異)
1.10.2.3、SD卡與MicroSD的區別
(1)體積大小區別而已,傳輸與原理完全相同。
1.10.2.4、SD卡與TF卡的區別
(1)外觀上,SD卡大而TF卡小;用途上,SD卡用於數碼相機等而TF卡廣泛用於手機、GPS等;
(2)時間上,SD卡1999年推出,TF卡於2004年推出;SD卡由日本松下、東芝與美國SanDisk共同推出,而TF卡由Motorola與SanDisk共同推出。
(3)SD卡有防寫而TF卡沒有,TF卡可以通過卡套轉成SD卡使用。

1.10.3.SD卡的程式設計介面
1.10.3.1、SD卡的物理介面
(1)SD卡由9個針腳與外界進行物理連線,這9個腳中有2個地,1個電源,6個訊號線。
1.10.3.2、SD協議與SPI協議
(1)SD卡與SRAM/DDR/SROM之類的東西的不同:SRAM/DDR/SROM之類的儲存晶片是匯流排式的,只要連線上初始化好之後就可以由SoC直接以地址方式來訪問;但是SD卡不能直接通過介面給地址來訪問,它的訪問需要按照一定的介面協議(時序)來訪問。
(2)SD卡雖然只有一種物理介面,但是卻支援兩種讀寫協議:SD協議和SPI協議。

1.10.3.3、SPI協議特點(低速、介面操作時序簡單、適合微控制器)
(1)SPI協議是微控制器中廣泛使用的一種通訊協議,並不是為SD卡專門發明的。
(2)SPI協議相對SD協議來說速度比較低。
(3)SD卡支援SPI協議,就是為了微控制器方便使用。

1.10.3.4、SD協議特點(高速、介面時序複雜,適合有SDIO介面的SoC)
(1)SD協議是專門用來和SD卡通訊的。
(2)SD協議要求SoC中有SD控制器,執行在高速率下,要求SoC的主頻不能太低。

1.10.3.5、S5PV210的SD/MMC控制器
(1)資料手冊Section8.7,為SD/MMC控制器介紹。
(2)SD卡內部除了儲存單元Flash外,還有SD卡管理模組,我們SoC和SD卡通訊時,通過9針引腳以SD協議/SPI協議向SD卡管理模組傳送命令、時鐘、資料等資訊,然後從SD卡返回資訊給SoC來互動。工作時每一個任務(譬如初始化SD卡、譬如讀一個塊、譬如寫、譬如擦除····)都需要一定的時序來完成(所謂時序就是先向SD卡傳送xx命令,SD卡回xx訊息,然後再向SD卡傳送xx命令····)

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

1.10.4.2、SD卡啟動的難點在哪裡(SRAM、DDR、SDCard)
(1)SRAM、DDR都是匯流排式訪問的,SRAM不需初始化既可直接使用而DDR需要初始化後才能使用,但是總之CPU可以直接和SRAM/DRAM打交道;而SD卡需要時序訪問,CPU不能直接和SD卡打交道;NorFlash讀取時可以匯流排式訪問,所以Norflash啟動非常簡單,可以直接啟動,但是SD/NandFlash不行。
(2)以前只有Norflash可以作為啟動介質,桌上型電腦筆記本的BIOS就是Norflash做的。後來三星在2440中使用了SteppingStone的技術,讓Nandflash也可以作為啟動介質。SteppingStone(翻譯為啟動基石)技術就是在SoC內部內建4KB的SRAM,然後開機時SoC根據OMpin判斷使用者設定的啟動方式,如果是NandFlash啟動,則SoC的啟動部分的硬體直接從外部NandFlash中讀取開頭的4KB到內部SRAM作為啟動內容。
(3)啟動基石技術進一步發展,在6410晶片中得到完善,在210晶片時已經完全成熟。210中有96KB的SRAM,並且有一段iROM程式碼作為BL0,BL0再去啟動BL1(210中的BL0做的事情在2440中也有,只不過那時候是硬體自動完成的,而且體系沒有210中這麼詳細)。

1.10.4.3、S5PV210的啟動過程回顧
(1)210啟動首先執行內部的iROM(也就是BL0),BL0會判斷OMpin來決定從哪個裝置啟動,如果啟動裝置是SD卡,則BL0會從SD卡讀取前16KB(不一定是16,反正16是工作的)到SRAM中去啟動執行(這部分就是BL1,這就是steppingstone技術)
(2)BL1執行之後剩下的就是軟體的事情了,SoC就不用再去操心了。

1.10.4.4、SD卡啟動流程(bin檔案小於16KB時和大於16KB時)
(1)啟動的第一種情況是整個映象大小小於16KB。這時候相當於我的整個映象作為BL1被steppingstone直接硬體載入執行了而已。
(2)啟動的第二種情況就是整個映象大小大於16KB。(只要大於16KB,哪怕是17KB,或者是700MB都是一樣的)這時候就要把整個映象分為2部分:第一部分16KB大小,第二部分是剩下的大小。然後第一部分作為BL1啟動,負責去初始化DRAM並且將第二部分載入到DRAM中去執行(uboot就是這樣做的)。
1.10.4.5、最重要的但是卻隱含未講的東西
(1)問題:iROM究竟是怎樣讀取SD卡/NandFlash的?
(2)三星在iROM中事先內建了一些程式碼去初始化外部SD卡/NandFlash,並且內建了讀取各種SD卡/NandFlash的程式碼在iROM中。BL0執行時就是通過呼叫這些device copy function來讀取外部SD卡/NandFlash中的BL1的。

1.10.5.S5PV210的SD卡啟動詳解2
1.10.5.1、SoC支援SD卡啟動的祕密(iROM程式碼)
(1)三星系列SoC支援SD卡/NandFlash啟動,主要是依靠SteppingStone技術,具體在S5PV210中支援steppingstone技術的是內部的iROM程式碼。
1.10.5.2、再看iROM application note:block device copy function

1.10.5.3、扇區和塊的概念
(1)早期的塊裝置就是軟盤硬碟這類磁儲存裝置,這種裝置的儲存單元不是以位元組為單位,而是以扇區為單位。磁儲存裝置讀寫的最小單元就是扇區,不能只讀取或寫部分扇區。這個限制是磁儲存裝置本身物理方面的原因造成的,也成為了我們程式設計時必須遵守的規律。
(2)一個扇區有好多個位元組(一般是512個位元組)。早期的磁碟扇區是512位元組,實際上後來的磁碟扇區可以做的比較大(譬如1024位元組,譬如2048位元組,譬如4096位元組),但是因為原來最早是512位元組,很多的軟體(包括作業系統和檔案系統)已經默認了512這個數字,因此後來的硬體雖然物理上可能支援更大的扇區,但是實際上一般還是相容512位元組扇區這種操作方法。
(3)一個扇區可以看成是一個塊block(塊的概念就是:不是一個位元組,是多個位元組組成一個共同的操作單元塊),所以就把這一類的裝置稱為塊裝置。常見的塊裝置有:磁儲存裝置硬碟、軟盤、DVD和Flash裝置(U盤、SSD、SD卡、NandFlash、Norflash、eMMC、iNand)
(4)linux裡有個mtd驅動,就是用來管理這類塊裝置的。
(5)磁碟和Flash以塊為單位來讀寫,就決定了我們啟動時device copy function只能以整塊為單位來讀取SD卡。

1.10.5.4、用函式指標方式呼叫device copy function
(1)第一種方法:巨集定義方式來呼叫。好處是簡單方便,壞處是編譯器不能幫我們做引數的靜態型別檢查。
(2)第二種方法:用函式指標方式來呼叫。

1.10.6.S5PV210的SD卡啟動實戰1
1.10.6.1、任務:大於16KB的bin檔案使用SD卡啟動
(1)總體思路:將我們的程式碼分為2部分:第一部分BL1小於等於16KB,第二部分為任意大小,iROM程式碼執行完成後從SD卡啟動會自動讀取BL1到SRAM中執行;BL1執行時負責初始化DDR,然後手動將BL2從SD卡copy到DDR中正確位置,然後BL1遠跳轉到BL2中執行BL2.
(2)細節1:程式怎麼安排?程式整個分為2個資料夾BL1和BL2,各自管理各自的專案。
(3)細節2:BL1中要完成:關看門狗、設定棧、開iCache、初始化DDR、從SD卡複製BL2到DDR中特定位置,跳轉執行BL2.
(4)細節3:BL1在SD卡中必須從Block1開始(Block0不能用,這個是三星官方規定的),長度為16KB內,我們就定為16KB(也就是32個block);BL1理論上可以從33扇區開始,但是實際上為了安全都會留一些空扇區作為隔離,譬如可以從45扇區開始,長度由自己定(實際根據自己的BL2大小來分配長度,我們實驗時BL2非常小,因此我們定義BL2長度為16KB,也就是32扇區)。
(5)細節4:DDR初始化好之後,整個DDR都可以使用了,這時在其中選擇一段長度足夠BL2的DDR空間即可。我們選0x23E00000(因為我們BL1中只初始化了DDR1,地址空間範圍是0x20000000~0x2FFFFFFF)。

1.10.6.2、程式碼劃分為2部分(BL1和BL2)

1.10.6.3、BL1中的重定位

1.10.6.4、BL2遠跳轉
(1)因為我們BL1和BL2其實是2個獨立的程式,連結時也是獨立分開連結的,所以不能像以前一樣使用ldr pc, =main這種方式來通過連結地址實現元跳轉到BL2.
(2)我們的解決方案是使用地址進行強制跳轉。因為我們知道BL2在記憶體地址0x23E00000處,所以直接去執行這個地址即可。

1.10.7.S5PV210的SD卡啟動實戰2
1.10.7.1、燒錄啟動實驗
1.10.7.2、程式碼分為2部分啟動(上一節講的)的缺陷
(1)程式碼分為2部分,這種技術叫分散載入。這種分散載入的方法可以解決問題,但是比較麻煩。
(2)分散載入的缺陷:第一,程式碼完全分2部分,完全獨立,程式碼編寫和組織上麻煩;第二,無法讓工程專案相容SD卡啟動和Nand啟動、NorFlash啟動等各種啟動方式。
1.10.7.3、uboot中的做法
(1)第二種思路:程式程式碼仍然包括BL1和BL2兩部分,但是組織形式上不分為2部分而是作為一個整體來組織。它的實現方式是:iROM啟動然後從SD卡的扇區1開始讀取16KB的BL1然後去執行BL1,BL1負責初始化DDR,然後從SD卡中讀取整個程式(BL1+BL2)到DDR中,然後從DDR中執行(利用ldr pc, =main這種方式以遠跳轉從SRAM中執行的BL1跳轉到DDR中執行的BL2)。

1.10.7.4、再來分析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中的這種啟動方式比上節講的分散載入的好處在於:能夠相容各種啟動方式。

1.10.8.解決X210開發板的軟開關按鍵問題
1.10.8.1、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.10.8.2、為什麼要軟啟動
(1)一般的電路設計都是用撥碼開關來做電源開關的(打到一側則接通,打到另一側則關閉)。這種方式的優點是設計簡單,缺點是電路太簡單,整個主機板要麼有電要麼沒電無法做休眠模式、低功耗模式等。
(2)軟啟動電路是比較接近於實際產品的,其他開發板的硬開關其實是簡化版的,和實際產品還有差異。

1.10.8.3、開發板供電置鎖原理和分析
(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.10.8.4、寫程式碼+實驗驗證
(1)要想讓開發板和普通的開發板一樣,一按下按鍵程式執行後即可鬆手不會斷電,則只要在程式的開頭部分新增程式碼去置鎖開關板即可。
(2)置鎖程式碼的方法是:給PS_HOLD_CONTROL暫存器的bit0、8、9均寫入1即可。
(3)注意:此時開發板已經置鎖,POWER按鍵已經失效,關機時需要按下復位按鍵。