因為reset vector 和其他的vector 在一起。
對一般cpu,boot 區一定要是ROM,也就是說,要有code。對ARM來說.. vector table在ROM里。
也就代表vector table是不能修改的,這樣不能符合設計需求。
所以每一家ARM chip vendor都會有自己的一套"抽換 boot 區"的方法。
以前,比較古老的時候,好像都是用"remap",也就是說,boot 區有一段區域,可以由program 決定address ROM 或是 RAM。
當時,coding startup code就要作"remap":將 源boot ROM vector table (region) copy到RAM中,然後enable remap,讓起始區域改為addressing RAM chip。
有些其他的chiop vendor就不用remap,改用hardware loader 。
chip 內涵一塊SRAM,剛好是在起始位址區,然後hardware loader在chip boot時會自動將external ROM, FLASH的一個區塊copy進SRAM中,再由0x00開始值行。
S3C2440 用的是第二種,而且內部的SRAM只有4k。
4k中要做好的事:
- 將chip configure 好
- 將DRAM configur 好
- 如果storage 是non-linear : 如NANDFLASH,或是壓縮過,就要將storage 中的program image解開到DRAM中
- jmp to __main ( )
- ice 中,dram 已經initialize OK。
- ice 中,program image 已經load好。並且是在DRAM中。
但是也有麻煩的地方,像reset vector region。
實際 boot時,reset vector region 是由hardware loader 負責。所以起始address是0x00。
ice load and run時,reset vector 要由program (bootstrap : __main( ) )負責,而且,起始是在DRAM 中 (不是internal ram)。
所以release和 ice (debug) 必須要有不同的loading script。
以使用NAND Flash為例:
在releaes 版,要準備一塊region,4k region,locate在0x00中。
program image在NAND FLASH中,因為NAND Flash 不是linear accessible,要寫code作load,所以program address 不重要。可以跟4k region 在相同的位址:
FLASH 0x0000囉唆這麼多..
{
_4kreg 0x0
{
vectors.o (Vect, +First)
直接寫出scatter loading script . for debug (ice load and run).
entry point in DRAM,image in DRAM。 copy vector by __main :
FLASH 0x33800000Start Address = 0x33800000
{
DRAM 0x33800000
{
init.o (Init, +First)
* (+RO, +RW, +ZI)
}
HEAP +0 UNINIT
{
heap.o (+ZI)
}
STACKS +0x100000 UNINIT
{
stack.o (+ZI)
}
INT_SRAM 0x00
{
vector.o (Vect, +First)
}
}
這樣 c bootstrap library __main( )就會把 vector.o copy到0x00 的地方。
這是用在ADS。
沒有留言:
張貼留言