WINCE6.0 + S3C2443的启动过程---nboot篇
WINCE6.0?+?S3C2443的啟動過程---nboot篇
?
我們啟動WINCE6.0的方式是:nboot+eboot+NK。那么是如何啟動WINCE6.0系統映像的呢?首先是nboot把eboot拷貝到SDRAM中執行的地址處運行,接著eboot把NK.bin拷貝到SDRAM指定的地址處運行。
?
首先,我們需要通過JTAG把我們nboot文件編譯生成的stpldr.nb0文件燒錄到nandflash的第0個block中。那么系統復位或者上電啟動的動作產生之后,是如何從nboot開始執行的呢?我們先看S3C2443的datasheet中nandflash控制器的相關部分:
?
?
?
當系統上電啟動或者復位后,nand?flash控制器會自動把nandflash第0個block中的前4KB的啟動代碼(也即nboot的代碼)拷貝到S3C2443配備的名為“stepping?stone”的SRAM中,然后在stepping?stone啟動代碼就自動運行了,也就是nboot在這時候就開始運行了,那么入口點是哪里呢?從/Src/Bootloader/Stepldr/sources的如下內容
TARGETNAME=stepldr
TARGETTYPE=PROGRAM
RELEASETYPE=PLATFORM
EXEENTRY=StartUp
NOMIPS16CODE=1
可以看出nboot的入口函數是StartUp。
?
1.StartUp函數
這個函數就在/Src/Bootloader/Stepldr/startup.s中定義,如下所示:
也即nboot從StartUp開始執行,接著就直接跳轉到ResetHandler執行了,這個函數主要是做了下面一些工作
⑴設置GPIO,關閉watchdog,關閉所有的中斷。
⑵設置系統時鐘,關于系統時鐘的詳細設置,我打算另外再寫一篇來介紹。
⑶初始化內存控制器。
⑷通過寄存器RSTSTAT的值來判斷當前的動作是正常的啟動還是從睡眠中喚醒,如果是從睡眠中喚醒,就直接跳轉到NK在SDRAM的開始地址處0x30200000(也即NK.bin在SDRAM中的存放地址處,也即0x80200000),然后會從NK.bin的start?address處(假如是0x80205394),這個地址就是NK.exe,也即是Oal.exe的開始地址處,也就是從/Src/Oal/Oallib/startup.s下面的函數StartUp開始執行,而0x80205394?-?0x80200000?=0x5394這個偏移值應該是NK.bin打包各個文件之后NK.exe在NK.bin中的偏移值;如果是正常的啟動,將會跳轉到nboot的main(),其中關于睡眠和喚醒,可見我的另一篇博客:http://cky0612.blog.163.com/blog/static/27478916201051793355837/
?
2.main()
Main函數實現了下面的內容:
⑴通過Uart_Init()函數來初始化串口,編譯debug。
⑵通過NF_Init()函數來初始化nand?flash控制器。
⑶通過ReadFlashID()來讀取當前nand?flash的ID,
其中0xEC是maker?code(廠家識別代碼),0xA0是device?code(設備代碼),這些值是在/Src/Common/Smartmedia/fmd/cfnand.h中的如下數組定義的:
上圖我只是截了這個數組的一小部分,后面的nandflash驅動中會用到這個數組用于判斷當前系統使用的nandflash是否在這個表中。
⑷從nandflash的第2個block中把eboot的映像文件讀取到SDRAM中指定的地址處(0x30038000),這個地址有eboot/boot.bib來指定,實現部分如下:
⑸從nandflash中讀取eboot到SDRAM之后,接著就在指定的地址處執行,也即eboot的起始地址處執行eboot,如下所示:
其中LOAD_ADDRESS_PHYSICAL=0x30038000,從此nboot的工作就完成,轉而開始eboot的執行了。
?
總結
以上是生活随笔為你收集整理的WINCE6.0 + S3C2443的启动过程---nboot篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S3C2443时钟管理
- 下一篇: nboot通过DNW下载并运行eboot