nboot通過串口下載並運行eboot.nb0

 1.       stepldr/main.c下面的mian函數調用Uart_Init()對串口的初始化

我們使用UART1來作爲debug口。

 

2.       實現nboot通過串口下載並運行eboot.nb0的函數體

 

我們接下來分析其實現

2.1   Uart_Getch()函數

這個函數主要是在nboot啓動的時候,判斷是否有來之我們對鍵盤的操作,假如我們在等待的時間之內按下空格鍵,那麼這時候nboot就處於等待用戶通過DNW.exe下載並運行eboot.nb0的狀態,假如我們在等待的時間內沒有按鍵空格鍵,那麼nboot會接下去運行eboot,繼而由eboot來加載NK

 

上圖的第119行表示UART1RX buffer register是否接受到數據,如果有數據,就接下來執行第124行,也即讀取接收到的數據

#define RdURXH1()   (*(volatile unsigned char *)0x50004024)

當然,我們按下鍵盤的空格鍵,這時候DNW.exe會接受到這個信息,然後DNW.exe會通過我們WINCE設備與PC實際的串口線來發送到UART1RX buffer register

當我們按下鍵盤的空格鍵,nboot就處於等待我們下載eboot.nb0的狀態,通過DNW.exe的“serial port -> transmit”來發送eboot.nb0,那麼nboot是如何接受並運行eboot.nb0呢?接下來,我們來看看ComLoad()的函數體

2.2 ComLoad()

 

 

其中#define LOAD_ADDRESS_PHYSICAL   0x30038000

上圖的第87是把串口發送過來的數據保存到SDRAM中以0x0x30037FFC爲起始的內存中,而地址0x30037FFC0x30037FFF用於記錄eboot.nb0的文件大小,從0x30038000地址開始記錄eboot.nb0的數據,這也是ebootSDRAM中的起始地址。

 

90行到第93行是記錄下eboot.nb0文件的大小,用4個字節來記錄,爲什麼是4個字節?而且爲什麼是前面4個字節呢?這應該是由微軟WINCE6.0編譯生成eboot.nb0時,由其編譯生成工具決定的。

 

99行,爲什麼DownloadFileSize=fileSize-6呢?因爲有4個字節是用於記錄eboot.nb0的大小,那麼另外2個字節應該是用於記錄eboot.nb0的校驗碼。

 

DNW.exe通過UART1eboot.nb0下載到以0x30038000爲起始的內存中後,接下來做什麼呢?接着看ComLoad()的函數體的後面部分

 

從第102行到105行可以看出來,eboot.nb0的後兩個字節是用於記錄本身數據的校驗碼的。這幾行代碼也就是用來計算eboot.nb0的數據的校驗碼。

 

107和第108這兩行讀取了eboot.nb0中記錄的校驗碼。

110行用於比較現在計算出來的校驗碼是否和保存在eboot.nb0中的校驗碼一樣,如果不一樣,那麼nboot就會退出運行,從而eboot.nb0的代碼就得不到運行,這樣的現象我也遇到過(但很少出現),但如果重新來下載eboot.nb0就沒有了,不知是否是因爲DNW.exe本身有bug?如果校驗碼一直,那麼接下來就在SDRAM中運行eboot.nb0

 

181行,就是eboot.nb0SDRAM中開始運行了,也即從Src/Bootloader/Eboot/starup.s下面的StartUp函數開始運行,見下圖

 

接着就從ResetHandler處開始運行。

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