1.29.2007

scatter loading script - debug/release

ARM Chip 在embedded system developememt中最麻煩的部份就是reset vetor。
因為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 中作load and run,就和實際boot and run 不一樣:
  • ice 中,dram 已經initialize OK。
  • ice 中,program image 已經load好。並且是在DRAM中。
所以ice load and run 就不需要作4k 中的好多事 (當然,有些重作一次也ok)。

但是也有麻煩的地方,像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 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)
}
}
Start Address = 0x33800000
這樣 c bootstrap library __main( )就會把 vector.o copy到0x00 的地方。

這是用在ADS。

沒有留言: