multi-xip的實現
來自 http://www.cnblogs.com/yakin/archive/2005/07/20/196572.aspx作者: yakin
multi-xip實際上很有用,但是現在有一個為難的事情:就是OS起來之后無法寫flash,這個很讓人苦惱。所以這也導致升級程序無法設置標志位。只能用GPIO口。
Multi-xip的實現:
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的函數:
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中拷貝過來的。
通過上面的設置,romimage會生成3個bin,nk.bin,app.bin,chain.bin,還有一個xip.bin,是上面三個bin的集合體。我們download是要download xip.bin,這樣就可以實現multibin。通過調試發現,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 閱讀(2294) 評論(0) 編輯 收藏 引用 所屬分類: wince(別人的文章技巧總結)