nboot通过DNW下载并运行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行表示UART1的RX buffer register是否接受到數據,如果有數據,就接下來執行第124行,也即讀取接收到的數據
#define RdURXH1()?? (*(volatile unsigned char *)0x50004024)
當然,我們按下鍵盤的空格鍵,這時候DNW.exe會接受到這個信息,然后DNW.exe會通過我們WINCE設備與PC實際的串口線來發送到UART1的RX 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為起始的內存中,而地址0x30037FFC到0x30037FFF用于記錄eboot.nb0的文件大小,從0x30038000地址開始記錄eboot.nb0的數據,這也是eboot在SDRAM中的起始地址。
?
第90行到第93行是記錄下eboot.nb0文件的大小,用4個字節來記錄,為什么是4個字節?而且為什么是前面4個字節呢?這應該是由微軟WINCE6.0編譯生成eboot.nb0時,由其編譯生成工具決定的。
?
第99行,為什么DownloadFileSize=fileSize-6呢?因為有4個字節是用于記錄eboot.nb0的大小,那么另外2個字節應該是用于記錄eboot.nb0的校驗碼。
?
當DNW.exe通過UART1把eboot.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.nb0在SDRAM中開始運行了,也即從Src/Bootloader/Eboot/starup.s下面的StartUp函數開始運行,見下圖
?
接著就從ResetHandler處開始運行。
總結
以上是生活随笔為你收集整理的nboot通过DNW下载并运行eboot.nb0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0 + S3C2443的启
- 下一篇: 在WINCE5.0开始菜单中添加应用程序