S5PV210裸机之SD卡
主流的外存設備介紹
內存和外存的區別:
一般是把這種RAM(random access memory,隨機訪問存儲器,特點是任意字節讀寫,掉電丟失)叫內存,把ROM(read only memory,只讀存儲器,類似于Flash SD卡之類的,用來存儲東西,掉電不丟失,不能隨機地址訪問,只能以塊為單位來訪問)叫外存
軟盤、硬盤、光盤、CD、磁帶
(1)存儲原理大部分為磁存儲,缺點是讀寫速度、可靠性等。優點是技術成熟、價格便宜。廣泛使用在桌面電腦中,在嵌入式設備中幾乎無使用。
(2)現代存儲的發展方向是Flash存儲,閃存技術是利用電學原理來存儲1和0,從而制成存儲設備。所以閃存設備沒有物理運動(硬盤中的磁頭),所以讀寫速度可以很快,且無物理損耗。
純粹的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 技術。
SD卡、MMC卡、MicroSD、TF卡?
(1)這些卡其實內部就是Flash存儲顆粒,比直接的 Nand 芯片多了統一的外部封裝和接口。?
(2)卡都有統一的標準,譬如SD卡都是遵照 SD 規范來發布的。這些規范規定了 SD 卡的讀寫速度、讀寫接口時序、讀寫命令集、卡大小尺寸、引腳個數及定義。這樣做的好處就是不同廠家的 SD 卡可以通用。
iNand、MoviNand、eSSD
(1)電子產品如手機、相機等,前些年趨勢是用SD卡/TF卡等擴展存儲容量;但是近年來的趨勢是直接內置大容量Flash芯片而不是外部擴展卡。
(2)外部擴展卡時間長了卡槽可能會接觸不良導致不可靠。
(3)現在主流的發展方向是使用 iNand、MoviNand、eSSD(還有別的一些名字)來做電子產品的存儲芯片。這些東西的本質還是 NandFlash,內部由 Nand 的存儲顆粒構成,再集成了塊設備管理單元,綜合了 SD 卡為代表的各種卡的優勢和原始的 NandFlash 芯片的優勢。
(4)優勢:1、向 SD 卡學習,有統一的接口標準(包括引腳定義、物理封裝、接口時序)。2、向原始的 Nand 學習,以芯片的方式來發布而不是以卡的方式;3、內部內置了 Flash 管理模塊,提供了諸如壞塊管理等功能,讓 Nand 的管理容易了起來。
SSD(固態硬盤)
SD卡的特點和背景知識
SD卡和MMC卡的關系
(1)MMC 標準比 SD 標準早,SD 標準兼容 MMC 標準。
(2)MMC 卡可以被 SD讀卡器讀寫,而 SD卡 不可以被 MMC讀卡器 讀寫。
SD卡和Nand、Nor等Flash芯片差異
(1) SD卡/MMC卡 等卡類有統一的接口標準,而 Nand 芯片沒有統一的標準(各家產品會有差異)
SD卡與MicroSD的區別
(1)體積大小區別而已,傳輸與原理完全相同。
SD卡與TF卡的區別
(1)外觀上,SD卡大而TF卡小;用途上,SD卡用于數碼相機等而TF卡廣泛用于手機、GPS等;
(2)時間上,SD卡1999年推出,TF卡于2004年推出;SD卡由日本松下、東芝與美國SanDisk共同推出,而TF卡由Motorola與SanDisk共同推出。
(3)SD卡有寫保護而TF卡沒有,TF卡可以通過卡套轉成SD卡使用。
SD卡的編程接口
SD卡的物理接口
(1)SD卡由9個針腳與外界進行物理連接,這9個腳中有2個地,1個電源,6個信號線。
SD協議與SPI協議
(1) SD卡與SRAM/DDR/SROM 之類的東西的不同:SRAM/DDR/SROM 之類的存儲芯片是總線式的,只要連接上初始化好之后就可以由 SoC 直接以地址方式來訪問;但是 SD 卡不能直接通過接口給地址來訪問,它的訪問需要按照一定的接口協議(時序)來訪問。
(2) SD 卡雖然只有一種物理接口,但是卻支持兩種讀寫協議:SD 協議和 SPI 協議。
SPI協議特點(低速、接口操作時序簡單、適合單片機)
(1)SPI 協議是單片機中廣泛使用的一種通信協議,并不是為 SD卡 專門發明的。
(2)SPI 協議相對 SD 協議來說速度比較低。
(3)SD 卡支持 SPI 協議,就是為了單片機方便使用。
SD 協議特點(高速、接口時序復雜,適合有 SDIO 接口的 SoC )
(1)SD 協議 是專門用來和 SD卡 通信的。
(2)SD 協議 要求 SoC 中有 SD 控制器,運行在高速率下,要求 SoC 的主頻不能太低。
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命令····)
S5PV210 的 SD卡 啟動詳解
SoC 為何要支持 SD卡 啟動
(1)一個普遍性的原則就是:SoC 支持的啟動方式越多,將來使用時就越方便,用戶的可選擇性就越大,SoC 的適用面就越廣。
(2)SD卡 有一些好處:譬如可以在不借用專用燒錄工具(類似Jlink)的情況下對SD卡 進行刷機,然后刷機后的 SD卡 插入卡槽,SoC 既可啟動;譬如可以用 SD卡 啟動進行量產刷機(量產卡)。像我們 X210 開發板,板子貼片好的時候,內部iNand 是空的,此時直接啟動無啟動;板子出廠前官方刷機時是把事先做好的量產卡插入SD卡卡槽,然后打到 iNand 方式啟動;因為此時 iNand 是空的所以第一啟動失敗,會轉而第二啟動,就從外部 SD2 通道的 SD卡 啟動了。啟動后會執行刷機操作對 iNand 進行刷機,刷機完成后自動重啟(這回重啟時iNand中已經有 image 了,所以可以啟動了)。刷機完成后 SD 量產卡拔掉,燒機 48 小時,無死機即可裝箱待發貨。
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 中這么詳細)。
S5PV210的啟動過程回顧
(1)210 啟動首先執行內部的 iROM(也就是BL0),BL0 會判斷 OMpin 來決定從哪個設備啟動,如果啟動設備是 SD卡,則 BL0 會從 SD卡 讀取前 16KB(不一定是 16,反正 16 是工作的)到 SRAM 中去啟動執行(這部分就是 BL1,這就是steppingstone 技術)
(2)BL1執行之后剩下的就是軟件的事情了,SoC 就不用再去操心了。
SD卡 啟動流程( bin 文件小于 16KB 時和大于 16KB 時)
(1)啟動的第一種情況是整個鏡像大小小于 16KB。這時候相當于我的整個鏡像作為 BL1 被 steppingstone 直接硬件加載執行了而已。
(2)啟動的第二種情況就是整個鏡像大小大于 16KB。(只要大于 16KB,哪怕是17KB,或者是 700MB 都是一樣的)這時候就要把整個鏡像分為 2 部分:第一部分 16KB 大小,第二部分是剩下的大小。然后第一部分作為 BL1 啟動,負責去初始化 DRAM 并且將第二部分加載到 DRAM 中去執行( uboot 就是這樣做的)。
最重要的但是卻隱含未講的東西
(1)問題:iROM 究竟是怎樣讀取 SD卡/NandFlash 的?
(2)三星在 iROM 中事先內置了一些代碼去初始化外部 SD卡/NandFlash,并且內置了讀取各種 SD卡/NandFlash 的代碼在 iROM 中。BL0 執行時就是通過調用這些 device copy function 來讀取外部 SD卡/NandFlash 中的 BL1 的。
SoC支持SD卡啟動的秘密(iROM代碼)
(1)三星系列 SoC 支持 SD卡/NandFlash 啟動,主要是依靠 SteppingStone 技術,具體在 S5PV210 中支持 steppingstone 技術的是內部的 iROM 代碼。
再看 iROM application note:block device copy function
扇區和塊的概念
(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 卡。
用函數指針方式調用 device copy function
(1)第一種方法:宏定義方式來調用。好處是簡單方便,壞處是編譯器不能幫我們做參數的靜態類型檢查。
(2)第二種方法:用函數指針方式來調用。
S5PV210的SD卡啟動實戰
任務:大于 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)。
代碼劃分為 2 部分( BL1和BL2 )
BL1 中的重定位
BL2 遠跳轉
(1)因為我們 BL1 和 BL2 其實是 2 個獨立的程序,鏈接時也是獨立分開鏈接的,所以不能像以前一樣使用 ldr pc, =main 這種方式來通過鏈接地址實現元跳轉到BL2.
(2)我們的解決方案是使用地址進行強制跳轉。因為我們知道 BL2 在內存地址0x23E00000 處,所以直接去執行這個地址即可。
燒錄啟動實驗
代碼分為2部分啟動(上一節講的)的缺陷
(1)代碼分為2部分,這種技術叫分散加載。這種分散加載的方法可以解決問題,但是比較麻煩。
(2)分散加載的缺陷:第一,代碼完全分2部分,完全獨立,代碼編寫和組織上麻煩;第二,無法讓工程項目兼容 SD卡啟動 和 Nand啟動、NorFlash啟動 等各種啟動方式。
uboot中的做法
(1)第二種思路:程序代碼仍然包括 BL1 和 BL2 兩部分,但是組織形式上不分為 2 部分而是作為一個整體來組織。它的實現方式是:iROM 啟動然后從 SD卡 的扇區 1 開始讀取 16K 的 BL1 然后去執行 BL1,BL1 負責初始化 DDR,然后從 SD卡 中讀取整個程序(BL1+BL2)到 DDR 中,然后從 DDR 中執行(利用 ldr pc, =main 這種方式以遠跳轉從 SRAM 中運行的 BL1 跳轉到 DDR 中運行的BL2)。
再來分析 uboot 的 SD卡 啟動細節
(1) uboot 編譯好之后有 200 多KB,超出了 16 KB。uboot 的組織方式就是前面1**重點內容**6KB 為 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 中的這種啟動方式比上節講的分散加載的好處在于:能夠兼容各種啟動方式。
sd_relocate.c
#define SD_START_BLOCK 45 #define SD_BLOCK_CNT 32 #define DDR_START_ADDR 0x23E00000typedef unsigned int bool;// 通道號:0,或者2 // 開始扇區號:45 // 讀取扇區個數:32 // 讀取后放入內存地址:0x23E00000 // with_init:0 typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);// 從SD卡第45扇區開始,復制32個扇區內容到DDR的0x23E00000,然后跳轉到23E00000去執行 void copy_bl2_2_ddr(void) {// 第一步,讀取SD卡扇區到DDR中pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)(*(unsigned int *)0xD0037F98);//pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)0xD0037F98);led2();delay();p1(2, SD_START_BLOCK, SD_BLOCK_CNT, (unsigned int *)DDR_START_ADDR, 0); // 讀取SD卡到DDR中led1();delay();// 第二步,跳轉到DDR中的BL2去執行pBL2Type p2 = (pBL2Type)DDR_START_ADDR;p2();led3();delay(); }start.S
.global _start // 把_start鏈接屬性改為外部,這樣其他文件就可以看見_start了 _start: //run_on_dram: // 長跳轉到led_blink開始第二階段ldr pc, =main // ldr指令實現長跳轉// 匯編最后的這個死循環不能丟b .總結
以上是生活随笔為你收集整理的S5PV210裸机之SD卡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32之SysTick原理
- 下一篇: uboot烧录到SD卡