multi-xip的實(shí)現(xiàn)
來自 http://www.cnblogs.com/yakin/archive/2005/07/20/196572.aspx作者: yakin
multi-xip實(shí)際上很有用,但是現(xiàn)在有一個為難的事情:就是OS起來之后無法寫flash,這個很讓人苦惱。所以這也導(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加一個連接各個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會生成3個bin,nk.bin,app.bin,chain.bin,還有一個xip.bin,是上面三個bin的集合體。我們download是要download xip.bin,這樣就可以實(shí)現(xiàn)multibin。通過調(diào)試發(fā)現(xiàn),InitRomChain就是利用chain.bin來連接各個bin的。
這樣我們也理解了bib文件中這個語句的含義:
pdwXIPLoc 00000000 9DB00000? FIXUPVAR
也就是FIXUPVAR的含義。我們看到在代碼中我們同樣定義了pdwXIPLoc,這樣romimage時,就將9DB00000賦給pdwXIPLoc。這就是FIXUPVAR的作用。正如pTOC也是由romimage賦值一樣。
posted on 2007-01-16 09:29 milkyway 閱讀(2310) 評論(0) 編輯 收藏 引用 所屬分類: wince(別人的文章技巧總結(jié))