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