arm裸机块设备
RAM 內存
ROM 外存
NorFlash(可總線式訪問)
NandFlash(塊設備) SLC 可靠性高,缺點是容量做不大
MLC 容量可以做很大很便宜
SD卡與SRAM/DDR/SROM之類的東西的不同:SRAM/DDR/SROM之類的存儲芯片是總線式的,只要連接上初始化好之后就可以由SoC直接以地址方式來訪問;但是SD卡不能直接通過接口給地址來訪問,它的訪問需要按照一定的接口協議(時序)來訪問。
SD卡支持兩種讀寫協議:SD協議和SPI協議。
SPI協議特點(低速、接口操作時序簡單、適合單片機)
SD協議特點(高速、接口時序復雜,適合有SDIO接口的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命令····)
命令碼
壞塊檢查
(1)Flash使用之前要先統一擦除(擦除的單位是塊)。Flash類設備擦除后里面全是1,所以擦干凈之后讀出來的值是0xff。
(2)檢查壞塊的思路就是:先塊擦除,然后將整塊讀出來,依次檢測各自節是否為0xff,如果是則表明不是壞塊,如果不是則表明是壞塊。
頁寫
(1)寫之前確保這個頁是被擦除干凈的。如果不是擦除干凈的(而是臟的、用過的)頁,寫進去的值就是錯的,不是你想要的結果。
(2)寫操作(write)在flash的操作中就叫編程(program)
(3)SoC寫Flash時通過命令線、IO線依次發送寫命令、寫頁地址、寫數據等進入NandFlash。
(4)寫的過程:SOC通過Nand控制器和Nand芯片完成順序對接,然后按照時序要求將一頁數據發給Nand芯片內部的接口電路。接口電路先接收收據到自己的緩沖區,然后再集中寫入Nand芯片的存儲區域中。Nand接口電路將一頁數據從緩沖區中寫入Nand存儲系統中需要一定的時間,這段時間Nand芯片不能再響應SOC發過來的其他命令,所以SoC要等待Nnad接口電路忙完。等待方法是SoC不斷讀取狀態寄存器(這個狀態寄存器有2種情況:一種是SoC的Nand控制器自帶的,另一種是SoC通過發命令得到命令響應得到的),然后通過檢查這個狀態寄存器的狀態位就能知道Nand接口電路剛才寫的那一頁數據寫完了沒、寫好了沒。直到SoC收到正確的狀態寄存器響應才能認為剛才要寫的那一頁數據已經ok。(如果SoC收到的狀態一直不對,可以考慮重寫或者認為這一頁所在的塊已經是壞塊,或者整個Nand芯片已經掛掉了)。
(5)正常情況下到了第四步就已經完了。但是因為Nand的讀寫有不靠譜情況,因此我們為了安全會去做ECC校驗。ECC校驗有硬件式校驗和軟件式校驗2種。軟件式校驗可以采用的策略有很多,其中之一(Nand芯片手冊上推薦的方式是):將剛才寫入的1頁數據讀出來,和寫入的內容進行逐一對比。如果讀出的和寫入的完全一樣,說明剛才的寫入過程正確完成了;如果讀出來的和寫入的不完全一樣那就說明剛才的寫入有問題。
(6)硬件式ECC:SoC的Nand控制器可以提供硬件式ECC(這個也是比較普遍的情況)。硬件式ECC就是在Nand的控制器中有個硬件模塊專門做ECC操作。當我們操作Nand芯片時,只要按照SoC的要求按時打開ECC生成開關,則當我們寫入Nand芯片時SoC的Nand控制器的ECC模塊會自動生成ECC數據放在相應的寄存器中,然后我們只需要將這生成的ECC數據寫入Nand芯片的帶外數據區即可;在將來讀取這塊Nand芯片時,同樣要打開硬件ECC開關,然后開始讀,在讀的過程當中硬件ECC會自動計算讀進來的一頁數據的ECC值并將之放到相應的寄存器中。然后我們再讀取帶外數據區中原來寫入時存入的ECC值,和我們剛才讀的時候得到的ECC值進行校驗。校驗通過則說明讀寫正確,校驗不通過則說明不正確(放棄數據或者嘗試修復)。
擦除(erase)操作
(1)擦除時必須給塊對齊的地址。如果給了不對齊的地址,結果是不可知的(有些Nand芯片沒關系,它內部會自動將其對齊,而有些Nand會返回地址錯誤)。
(2)讀寫時給的地址也是一樣,要求是頁對齊地址。如果給了不對齊的,也是有可能對有可能錯。
頁讀
nandflash控制器
nand芯片是通過nand接口電路進行讀寫的,nand接口電路和soc之間通過nand接口時序來通信的,nand接口時序相對復雜,如果要用軟件來編,很難保證時序能滿足,會不穩定,也難寫。所以soc內部集成了一個nand控制器。
框圖分析
通過對SFR特殊寄存器進行讀寫來產生nand接口時序
nand flash interface 接口硬件,將nand芯片相對應的引腳進行連接
ECC生成器。
主要寄存器分析
NFCONF 主要用來配置nand接口
NFCONT 接口控制的控制,主要有接口時序。
NFCMMD 用來發命令的
NFADDR 用來發地址的(一般有4、5個Cycle,每次發一個Cycle,每個Cycle八個位)
NFDATA 用來讀寫數據的。讀出來的一個字節的數據存放在這里。
NFMECCD0
NFMECCD1 產生ECCdata(數據)的(這是主數據區(也就是2K那的)的ECC) 這個ECC存放在帶外數據區。
NFSECCD 產生ECCdata(數據)的(這是次數據區(也就是64 B那的)的ECC)這個ECC存放在哪呢,,也放在帶外數據區。
(因為64B的帶外數據區就是存放這些東西的)
NFSTAT 狀態寄存器,這里邊的值主要來自nand接口電路
沒用到暫時
NFSBLK 存放塊地址的
NFEBLK 可編程的結束塊地址寄存器,
SD/iNand
CMD與ACMD
這兩種都是命令碼,CND是單命令命令,就是單獨發一個CMD即可表示的意思,ACMD是一種擴展,就是需要發兩個CND表示一個意思(就是ACMD),即ACMDz = CMDy +CMDx.
1.11.8.3、卡狀態
(1)SD卡內部的接口控制器類似于一個單片機,這個單片機其實是一個狀態機。所以SD卡任何時候都屬于某一種狀態(空閑狀態、準備好狀態、讀寫狀態、出錯狀態·……都是事先定義好的.在這種狀態下能夠接受的命令是一定的,接受到命令之后執行一定的操作然后根據操作結果會跳轉為其他狀態.如果主機發過來的命令和當前狀態丕符狀態機就不響應.如果收到命令和當前狀態相符就會執行相應操作.執行完之后根據結果跳轉為基他狀態。
《1.10.ARM裸機第十部分-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按鍵已經失效,關機時需要按下復位按鍵。
總結
- 上一篇: Docker部署AI算法教程
- 下一篇: 电脑搜不到wifi?新换的路由器