來自
http://www.cnblogs.com/yakin/archive/2005/07/20/196572.aspx作者: yakin
multi-xip實(shí)際上很有用,但是現(xiàn)在有一個(gè)為難的事情:就是OS起來之后無法寫flash,這個(gè)很讓人苦惱。所以這也導(dǎo)致升級程序無法設(shè)置標(biāo)志位。只能用GPIO口。
Multi-xip的實(shí)現(xiàn):
1) Bib文件的修改:
?? MEMORY
??? RSVD???? 80000000? 000FF000? RESERVED
??? ARGS???? 800FF000? 00001000? RESERVED
??? NK?????? 9C600000? 01000000?? RAMIMAGE
??? APP????? 9D600000? 00500000?? RAMIMAGE
??? CHAIN??? 9DB00000? 00002000?? RESERVED
??? RAM????? 80100000? 01F00000? RAM
??? pdwXIPLoc 00000000 9DB00000? FIXUPVAR
CONFIG
??? AUTOSIZE=ON
??? ROM_AUTOSIZE=OFF
??? RAM_AUTOSIZE=OFF
??? DLLADDR_AUTOSIZE=ON
??? XIPSCHAIN=9DB00000
??? ROMSTART=9C600000
??? ROMWIDTH=32
??? ROMSIZE=01600000
??? KERNELFIXUPS=ON
2) 在OEMInit加一個(gè)連接各個(gè)bin的函數(shù):
void InitRomChain()
{
?// Added for MultiXIP stuff
?static? ROMChain_t s_pNextRom[MAX_ROM] = {0};
?DWORD? dwRomCount = 0;
??? DWORD?????? dwChainCount = 0;
??? DWORD *???? pdwCurXIP;
??? DWORD?????? dwNumXIPs;
??? PXIPCHAIN_ENTRY pChainEntry = NULL;
??? if(pdwXIPLoc == NOT_FIXEDUP){
??????? return;? // no chain or not fixed up properly
??? }
??? // set the top bit to mark it as a virtual address
??? pdwCurXIP = (DWORD*)(((DWORD)pdwXIPLoc) | 0x80000000);
??? // first DWORD is number of XIPs
??? dwNumXIPs = (*pdwCurXIP);
?? if(dwNumXIPs > MAX_ROM){
????? OALMSG(TRUE, (L"ERROR: Number of XIPs exceeds MAX\r\n"));
????? //lpWriteDebugStringFunc(TEXT("ERROR: Number of XIPs exceeds MAX\n"));
????? return;
??? }
??? pChainEntry = (PXIPCHAIN_ENTRY)(pdwCurXIP + 1);
??? while(dwChainCount < dwNumXIPs)
??? {
??????? if ((pChainEntry->usFlags & ROMXIP_OK_TO_LOAD) &&? // flags indicates valid XIP
??????????? *(LPDWORD)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
??????? {
??????????? s_pNextRom[dwRomCount].pTOC = *(ROMHDR **)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET + 4);
??????????? s_pNextRom[dwRomCount].pNext = NULL;
??????????? if (dwRomCount != 0)
??????????? {
??????????????? s_pNextRom[dwRomCount-1].pNext = &s_pNextRom[dwRomCount];
??????????? }
??????????? else
??????????? {
??????????????? OEMRomChain = s_pNextRom;
??????????? }
??????????? dwRomCount++;
??????? }
??????? else
??????? {
??????????? OALMSG(TRUE, (L"Invalid XIP found\r\n"));
??????????? //lpWriteDebugStringFunc( _T("Invalid XIP found\n") );
??????? }
??????? ++pChainEntry;
? dwChainCount++;
?}
}
? 這是從CEPC中拷貝過來的。
通過上面的設(shè)置,romimage會(huì)生成3個(gè)bin,nk.bin,app.bin,chain.bin,還有一個(gè)xip.bin,是上面三個(gè)bin的集合體。我們download是要download xip.bin,這樣就可以實(shí)現(xiàn)multibin。通過調(diào)試發(fā)現(xiàn),InitRomChain就是利用chain.bin來連接各個(gè)bin的。
這樣我們也理解了bib文件中這個(gè)語句的含義:
pdwXIPLoc 00000000 9DB00000? FIXUPVAR
也就是FIXUPVAR的含義。我們看到在代碼中我們同樣定義了pdwXIPLoc,這樣romimage時(shí),就將9DB00000賦給pdwXIPLoc。這就是FIXUPVAR的作用。正如pTOC也是由romimage賦值一樣。