SD卡

注意:本資料來源於朱友鵬老師的課程的視頻,只用於學習使用,如用於其他用途,請聯繫朱老師本人,不然後果自負,不允許轉載!!!

內存:RAM、隨機讀取、掉電丟失

外存:ROM、只讀存取、類似於flash、SD卡 以塊爲單位訪問、掉電不丟失

內存發展的歷史:
(1)磁存儲設備:缺點是讀取速度、可靠性。優點:技術成熟、價格便宜。在嵌入式設備中幾乎無使用。
(2)現在的存儲發展方向是Flash存儲,閃存技術是利用電學原理來存儲1和0,從而製成的存儲設備。所以閃存設備沒有物理運動,讀取速度可以很快,而且無物理消耗。
(3)純粹的Flash:NandFlash、NorFlash
Nandflash、Norflash芯片中最基本的讀寫接口,然後要求外部的Soc來提供讀寫控制器和flash時序,缺點是無壞塊處理。
Nandflash分爲MLC和SLC兩種,SLC技術比較早,可靠性高,缺點是容量做不大。MLC技術比較新,不成熟,可靠性差(容易出錯,校驗爲軟件校驗比較複雜,而且影響讀取速度),後來基於MLC的基礎上出現了iNand。

SD卡、MMC卡、MicroSD、TF卡

內部是Flash,只是多了外部的封裝和接口。有專門的SD卡協議來規定
D卡的讀寫速度、讀寫接口時序、讀寫命令集、卡大小尺寸、引腳個數及定義。

iNand、MoviNand、eSSD

前些年手機、相機等用SD卡/TF卡等拓展內存容量,但是近年來有MLC+硬件校驗的技術=iNand可以把內存容量做的很大。所以就不需要SD卡等設備了。
iNand優勢:
1、有統一的接口標準
2、以芯片的方式發佈
3、內置flash管理模塊,提供了注入壞塊管理等功能。

SD卡有寫保護而TF卡沒有,TF卡可以通過卡套轉成SD卡使用。

SSD固態硬盤

SD卡協議

SD卡由9個針腳與外界來連接,2個地,一個電源,6個信號線。
SD卡與SRAM/DDR/SROM之類的東西的不同:SRAM/DDR/SROM之類的存儲芯片是總線式的,只要連接上初始化好之後就可以由SoC直接以地址方式來訪問;但是SD卡不能直接通過接口給地址來訪問,它的訪問需要按照一定的接口協議(時序)來訪
SD卡可用的協議分爲SPI和SD卡協議。
SPI協議的特點:SPI協議是單片機中廣泛使用的一種協議用來讀取SD卡。缺點是較SD協議速度低。SPI協議就是用來支持單片機方便使用的。
SD卡協議的特點:SD協議專門用來和SD卡通信的。Soc中內置SD控制器用來和SD卡通信的,運行在高速率下,要求Soc主頻不能太低。

通信時通過9針腳以SD協議/SPI向SD卡管理模塊發送命令、時鐘、數據等信息,然後從SD卡返回信息來給Soc來交互。工作時通過時序來完成(時序就是發送xx信息,然後SD卡回xx消息,然後再向SD卡發送xx命令····)

S5PV210的SD卡啓動詳解

SD卡有一些好處:譬如可以在不借用專用燒錄工具(類似Jlink)的情況下對SD卡進行刷機,然後刷機後的SD卡插入卡槽,SoC既可啓動;譬如可以用SD卡啓動進行量產刷機(量產卡)。
SD卡啓動難點:
1、SRAM、DDR都是總線式訪問的,SRAM不需要初始化,DDR需要初始化,NorFlash讀取時可以總線式訪問,所以Norflash啓動非常簡單,可以直接啓動,但是SD/NandFlash不行。
2、以前只有Norflash可以作爲啓動介質,臺式機筆記本的BIOS就是Norflash做的。三星公司爲了推出Nandflash做啓動介質,使用了SteppingStone的技術,就是讓iROM和4KB的SRAM,開機爲Nandflash啓動,則先讀取4KB的Nandflash到SRAM,然後運行。
在210中,由96KB的SRAM,並且有一段iROM作爲BL0,BL0啓動BL1,BL1啓動BL2
詳細過程
1、(大於16KB的情況):iROM代碼執行(BL0),(SD卡已經在iROM中初始化完畢可以直接使用SD卡),判斷OMpin的狀態,如爲SD卡模式,從SD卡中讀取16KB的大小(BL1),BL1到SRAM中執行(關看門狗,開icatch,初始化棧等操作),並且初始化DDR,並且把BL2複製到DDR中(0x23E00000),然後跳轉(跳轉是通過函數指針的方式把0x23E00000當作函數的首地址,再通過link.文件運行0x23E00000地址,和start.S(它中由跳轉main函數))到DDR中去運行程序。
2(小於16kb):直接把程序燒到BL1處即可。

細節:

1、BL1在SD卡中必須從Block1開始(Block0不能用,這個是三星官方規定的),長度爲16KB內,我們就定爲16KB(也就是32個block);BL1理論上可以從33扇區開始,但是實際上爲了安全都會留一些空扇區作爲隔離,譬如可以從45扇區開始,長度由自己定(實際根據自己的BL2大小來分配長度,我們實驗時BL2非常小,因此我們定義BL2長度爲16KB,也就是32扇區)。
2、BL2遠跳轉
(1)因爲我們BL1和BL2其實是2個獨立的程序,鏈接的時候我們也是獨立分開鏈接的,所以不能使用ldr pc, =main這種方式來通過鏈接地址實現遠跳轉到BL2,我們是使用地址強制轉換跳轉,因爲我們知道BL2的內存地址是0x23E00000所以直接去執行這個地址即可。
iROM中內置了讀取各種SD卡/NandFlash的代碼,在iROM的手冊中iROM application note:block device copy function開一看到。

缺陷:

代碼分成2個部分,這種技術叫分散加載,這種分散加載的方法可以解決問題,但是比較麻煩,這種分散加載的缺點是
1、代碼完全分成2部分,完全獨立,代碼編寫和組織上麻煩
2、無法讓工程項目兼容SD卡啓動,Nand啓動,Norflash啓動等各種方法。

Uboot的做法

程序依然分成BL1和BL2兩部分,但是組織形式上部分2部分而是作爲一個整體來組織的,他的實現方式是:iROM啓動然後從SD卡的扇區1開始讀取16KB的BL1,然後去SRAM中執行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卡的時候,先截取前16KB燒錄到SD卡的block1~bolck32,然後在將整個uboot燒錄到SD卡的某個扇區中(譬如49扇區)

SD啓動

3、實際uboot從SD卡啓動的時候是這樣的:iROM啓動,根據iMpin判斷出啓動設備的啓動方式,SD卡啓動,然後從SD卡的block1開始讀取16KB到SRAM中,開始運行初始化DDR,從SD卡的49扇區開始複製整個uboot到DDR中指定位置(0x23E00000),然後BL1繼續執行直到 ldr pc, =main時BL1跳轉到DDR上的BL2中接着執行uboot的第二階段。
總結:uboot中的這種啓動方式比上節講的分散加載的好處在於:能夠兼容各種啓動方式。

uboot的疑問

1、uboot從DDR中執行ldr pc, =main如何實現從SRAM中的BL1跳轉到DDR中的BL2,(不是BL1和BL2 一起被複制到DDR中的嗎?是如何知道DDR中BL2的地址的?)
2、L1執行時負責初始化DDR,並且從SD卡的49扇區開始複製整個uboot到DDR中指定位置(0x23E00000)去備用;然後BL1繼續執行直到ldr pc, =main時BL1跳轉到DDR上的BL2中接着執行uboot的第二階段。
這裏的執行BL1執行ldr pc, =main時這裏是通過什麼方式跳轉的?main函數的結構又是如何寫的?

扇區和塊的概念

1、早期的扇區是軟盤這類磁存儲設備,這種設備的存儲單元都是不是以字節爲單位,是以扇區爲單位的,比如想讀取一個字節,就必須讀取一個扇區。
2、一個扇區=512Byte,後來也有其他的,如1024字節、2048字節但是由於之前做操作系統和文件系統是用的是512字節,爲了兼容,現在都是512字節的。
3、SD卡中一個扇區=一個塊
4、linux裏有個mtd驅動,就是用來管理這類塊設備的。
5、磁盤和Flash以塊爲單位來讀寫,就決定了我們啓動時device copy function只能以整塊爲單位來讀取SD卡。

用函數指針方式用device copy function
1、第一種方法:用宏定義來調用,好處是簡單方便,壞處是編譯器不能幫我們參數的靜態類型檢查
2、第二種方法:用函數指針方式來調用

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

看原理圖可知:EINT0這個引腳GPIO和作爲電源鎖。
只要把是這個引腳設爲輸出、高電平、PWR_Lock模式就可以實現軟鎖定電源的問題。
代碼:只要將start.S將以上3位置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)一般的電路設計都是用撥碼開關來做電源開關的(打到一側則接通,打到另一側則關閉)。這種方式的優點是設計簡單,缺點是電路太簡單,整個主板要麼有電要麼沒電無法做休眠模式、低功耗模式等。
(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按鍵已經失效,關機時需要按下復位按鍵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章