arm wince ep93xx啟動初始化

2021-04-13 01:37:15 字數 2657 閱讀 2731

ep9301的bootrom(1)

2.1     bootrom概述      

為方便使用者除錯和進行系統開發,ep93xx的arm微處理器內部都設計了rom,存放了用於系統啟動的最簡單的初始化**,當系統上電時,可以選擇從片 內的rom開始執行程式,我們稱之為bootrom,由於受rom容量的限制,這部分程式一般都比較小,僅能完成一些基本的功能,如初始化乙個序列口,可 以和pc機進行簡單的序列通訊,將pc上的程式接受下來,存放在系統晶元內部的ram中,然後跳轉到那裡執行等。

ep9301的bootrom支援從序列口接收程式並執行、從系統的flash(或rom)啟動執行、或從系統的spi儲存器讀取**並執行,但這種方式用得相對較少。

ep9301片內整合了16kb的rom,分成3個部分,前8kb的內容為系統的啟動**,接下來的4kb為第一保護**塊,最後4kb為第二保護** 塊。當系統以非保護方式啟動時,可以訪問到前8kb的**,而當系統以保護方式啟動時,後面兩個保護**塊之一是可訪問的。

ep93xx的這種安全機制對需要加密的系統設計非常有用,它可以使每個系統執行的軟體都是唯一的,甚至可以禁止通過jtag對系統進行偵測並禁止系統從外部儲存器啟動,完全防止對系統軟體的抄襲和仿製。

在ep9301內,系統的bootrom基位址固定為 0x8009_0000,當使能bootrom時(在大多數情況下),啟動**被拷貝到0x0位址被執行。

bootrom中的**完成必要的初始化工作以後,決定系統的哪乙個片外儲存器中的**首先執行,通常,它支援以下幾種方式:

1、uart1方式:通過uart1接收從主機傳來的**放到片內緩衝區(sram)並執行;

2、spi序列rom方式:從系統的spi介面的序列rom讀取**拷貝到片內緩衝區(sram)並執行;

3、flash方式:執行flash中的**。

bootrom**禁用arm920t的mmu,所有的儲存器訪問均為實際的實體地址。無論從**獲取的**,均需要有乙個字首標識字串(headerid):crus或surc,否則**就不能執行,看來cirrus logic希望我們隨時都要想起它。

2.2     bootrom的啟動流程

rootrom按如下固定的啟動流程執行:

1、  儲存器重對映;

2、  將用於指示系統執行狀態的紅、綠發光二極體置為如下狀態:紅燈亮,綠燈熄;

3、  禁用看門狗(watchdog);

4、  讀取由跳線設定的啟動狀態;

5、  由外部時鐘建立系統時鐘並執行;

6、  根據啟動狀態設定的儲存器寬度,進行如下操作

a、 以最基本的方式對sdram和flash儲存器介面進行初始化操作,以保持最好的相容性;

b、 以同樣的方式初始化sram介面;

c、 進行最基本的儲存器測試;

7、  根據系統配置暫存器(syscfg,0x8093_009c)的sboot位,決定是否開始序列啟動,如果為序列啟動,則進行如下操作:

a、 以9600的波特率、8個資料位、1個停止位、無校驗的方式初始化uart1;

b、 輸出乙個字元『<』;

c、 從uart1接收2048(2kb)位元組的資料並儲存到片內啟動緩衝區中(就是乙太網的mac緩衝區);

d、輸出乙個字元『>』,表示已成功接收到2048位元組的資料;

e、 點亮綠燈;

f、 跳轉到片內啟動緩衝區的程式執行;

8、  如果不為序列啟動,就嘗試讀取spi序列rom,並進行如下操作:

a、 檢測序列rom的前4個位元組是否為「crus」或「surc」的ascii碼,校驗標識字串;

b、 讀取其後2048(2kb)位元組的資料並儲存到片內啟動緩衝區中;

c、 點亮綠燈;

d、跳轉到片內啟動緩衝區的程式執行;

9、  如果不能從序列rom啟動,就嘗試從系統的flash(flash的基位址+0x0000處)讀取標識字串「crus」或「surc」的ascii碼並進行校驗,每個flash儲存區都會被讀取,然後進行如下操作:

a、 點亮綠燈;

b、 程式跳轉到flash基位址加4位元組的位置;

10、 如果校驗錯誤,則嘗試從系統的flash(flash的基位址+0x1000處)讀取標識字串「crus」或「surc」的ascii碼並進行校驗,每個flash儲存區都會被讀取,然後進行如下操作:

a、 點亮綠燈;

b、 程式跳轉到flash的起始位址;

11、 如果校驗錯誤,則嘗試從系統的0xc000_0000和0xf000_0000處讀取標識字串「crus」或「surc」的ascii碼並進行校驗,這是試圖從sdram或同步flash啟動,然後進行如下操作:

a、 點亮綠燈;

b、 程式跳轉到0xc000_0004或0xf000_0004處;

12、如果校驗錯誤,則嘗試從系統的0xc000_1000和0xf000_1000處讀取標識字串「crus」或「surc」的ascii碼並進行校驗,這也是試圖從sdram或同步flash啟動,然後進行如下操作

a、 點亮綠燈;

b、 程式跳轉到0xc000_0000或0xf000_0000處;

13、若以上步驟都未能正常啟動系統,則將未初始化的異常向量拷貝到0x0位址的sdram,同時綠燈閃爍。

可見,ep9301的bootrom**考慮得還比較全面,將所有可以啟動系統的方法都考慮到了,只不過顯得略微有些複雜。

bootrom的啟動流程可以參考ep9301使用者手冊p62的figure 3-1。 

9 3命名空間

在c 中,名稱可以是變數 函式 結構 列舉 類以及類和結構的成員。為了避免衝突,c 標準提供了命名空間的標準工具。宣告區域 declaration region 和潛在作用區域 potential region 例如 在函式中宣告變數,那麼在函式中宣告的地方就是,宣告區域,這個變數的potentia...

93 隱藏口令

93 隱藏口令 問題描述 有時候程式設計師有很奇怪的方法來隱藏他們的口令。billy hacker geits會選擇乙個字串s 由l個小寫字母組成,5 l 100,000 然後他把s順時針繞成乙個圈。如字串cbadfa,繞成乙個圈後,我們認為字串首尾相連。每次取其中乙個字母作為起始字母,並順時針依次...

模擬測試93

t1 將序列求字首和,題意轉化為對於位置 i 和 j 滿足 i 典型的三維偏需,可以cdq做。更好的做法是按一維排序,然後用數狀陣列維護。時間複雜度 o nlogn t2 每次可以選擇乙個根,將左右子樹接上,可以區間dp。dp i j min limit r dp i k 1 dp k 1 j su...