yakin

有了舞台就好好表演,没有舞台就静静地做观众

统计

常用链接

留言簿

阅读排行榜

评论排行榜

multi-xip的实现

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 2005-07-20 13:53 yakin 阅读(2189) 评论(3)  编辑 收藏 网摘 所属分类: XScale + CE

评论

#1楼 2006-02-06 11:17 Walzer      

贴代码用那个"插入代码"啊,晕 @_@

现在问题是multibin之后,没能成功实现对指定的单个BIN进行升级。如果能够只对app.bin正确升级,那么一切工作都是值得的。但实际上这样做以后会有问题。
另外multibin的那个js脚本里,如果改成默认分配到APPS区里会更好些,现在默认到NK区,搞得每次加入新文件都得去改xip.cfg,这很不合算。从全局来看,在开发后期NK区和DRIVER区是文件相对固定,APPS才是变化最大的。

升级程序得到标志位,后来我们改进了工艺用USB OTG PIN来判断,免得每次升级都要拆机箱后盖。实际上除了通过判断管脚的高低电平外,也可以像BOOTLOADER里面的IP ADDRESS一样,固定到FLASH的某个地址上面,启动时我们到固定FLASH地址上判断那个FLAG。然后想个方法让系统跑起来后应用层可以改到这个地址就OK了(这似乎有些难度)。
  回复  引用  查看    

#2楼 2006-08-18 11:33 微笑刺客[未注册用户]

什么是MultiXIP?请给解释一下啊!!
谢谢!!
  回复  引用    

#3楼 2007-06-02 12:17 zsz[未注册用户]

可不可以实现:nk.bin放在cf card里,app.bin放在nor flash里,系统从cf card启动,app.bin就在nor flash里XIP?
谢谢!
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 196572




相关文章:

相关链接: