zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
阅读:7807回复:24

【原创】MULTI BIN的wince 5.0,smdk2440下的实现

楼主#
更多 发布于:2007-09-28 13:27
原本早就要发出来了,但是看到king_sundi网友已经发过一个帖子了,所以犹豫了没有发,相对而言,我这个总结更具有实用性,基本上照着这个步骤来就能成功,我给我几个朋友试过了,他们一开始对这个基本不懂都能搞定。
XIP实现总结.
step1:修改config.bib文件.内核子集XIPKERNEL的SIZE根据你自己编译出来的XIPKERNEL.BIN实际大小调整,
XIPKERNEL BASE=8C200000,XIPKERNEL SIZE = 0013F000 内存类型是RAMIMAGE
CHAIN BASE = XIPKERNEL BASE + XIPKERNEL SIZE; CHAIN SIZE = 00001000 内存类型是RESERVED
NK BASE = CHAIN BASE + CHAIN SIZE;NK SIZE根据你平台定制的实际NK.BIN的大小调整, 内存类型是 NANDIMAGE
RAM BASE = NK BASE + NK SIZE; RAM SIZE = 90000000 - RAM BASE, 内存类型是 RAM.
pdwXIPLoc 是一个指定地址的全局变量,用于InitRomChain(),它的地址必须等于CHAIN BASE.
XIPSCHAIN=8C33F000 也必须等于CHAIN BASE.
关于BIB文件中的MEMORY部分的定义可以从帮助文档中找到答案,搜索MEMORY Section
Name        Address        Size        Type
内存区域名字 起始地址     区域空间    内存类型

内存类型的取值分别有FIXUPVAR,NANDIMAGE,RAM,RAMIMAGE,RESERVED.
大家可以特别注意看一下NANDIMAGE的解释
Specifies that RAM should overlap these regions when building an run-time image that uses BINFS.
The overlapping regions are stored in NAND but are fixed up to virtually appear as though they do not overlap.

When the kernel accesses these regions, BINFS responds by intercepting the request. BINFS accesses NAND and returns the proper data to the kernel.

This enables a device with NAND to execute in place out of NAND, freeing up RAM for use by the system.

Romimage generates one binary (.bin) file for each NANDIMAGE entry.

NANDIMAGE sections must be page aligned.


MEMORY
    XIPKERNEL    8C200000  0013F000  RAMIMAGE
    CHAIN    8C33F000  00001000  RESERVED
    NK      8C340000  00D00000  NANDIMAGE
    RAM                 8D040000  02FC0000  RAM
;    RAM                 8C340000  03CC0000  RAM
    pdwXIPLoc    00000000    8C33F000    FIXUPVAR
;   FLASH   92000000  00100000  RESERVED

; Common RAM areas
    AUD_DMA             8c002000  00000800  RESERVED
    SDIO_DMA            8c010000  00010000  RESERVED
    ARGS                8C020800  00000800  RESERVED
    DBGSER_DMA          8c022000  00002000  RESERVED
    SER_DMA             8c024000  00002000  RESERVED
    IR_DMA              8c026000  00002000  RESERVED
;    EDBG                8c030000  00020000  RESERVED
;    CAMERA                    8c050000  000A0000  RESERVED
    DISPLAY             8c100000  00100000  RESERVED    


;
; ROMFLAGS is a bitmask of options for the kernel
;   ROMFLAGS    0x0001      Disallow Paging
;   ROMFLAGS    0x0002      Not all KMode
;   ROMFLAGS    0x0010      Trust Module only
;
CONFIG
    AUTOSIZE=ON
;    ROM_AUTOSIZE=ON
    DLLADDR_AUTOSIZE=ON
    COMPRESSION=ON
    KERNELFIXUPS=ON
    XIPSCHAIN=8C33F000
    PROFILE=OFF

       ROMFLAGS=00


 ROMSTART=8C200000  
 ROMWIDTH=32
 ROMSIZE=00D00000
【注】PB能生成XIP.BIN,这项一定要定义XIPSCHAIN=8C33F000,不然生成不了XIP.BIN的。

step2:
注册表的修改,platform.reg
; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Support BINFS Section
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Add BinFS to partition table
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
    "21"="BINFS"

[HKEY_LOCAL_MACHINE\System\StorageManager\BINFS]
    "Folder"="BINFS"
    "FriendlyName"="Bin FileSystem"
    "Dll"="binfs.dll"
    "Paging"=dword:1
; MountFlags:
; 0x10 specifies that this file system is to be mounted as an external
;      ROM filesystem shadowing the \windows directory
; 0x1 specifies that the mountpoint \BINFS is to be hidden
;
    "MountFlags"=dword:10
    "BootPhase"=dword:0

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]
    "DriverPath"="Drivers\\BuiltIn\\MSFlash"
    ; LoadFlags 0x01 == load synchronously
    "LoadFlags"=dword:1
    "Order"=dword:0
;    "MountFlags"=dword:10
    "BootPhase"=dword:0
    "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MSFlash]
        "Prefix"="DSK"
        "Order"=dword:0
        "Dll"="smflash.dll"        
        "Profile"="MSFlash"
;        "MountFlags"=dword:10
        "FriendlyName"="MSFLASH Driver"
        "BootPhase"=dword:0
        "Flags"=dword:1000

; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]
    "DefaultFileSystem"="BINFS"
    "PartitionDriver"="mspart.dll"
    "AutoMount"=dword:1
    "AutoPart"=dword:1
    "Folder"="NandFlash"
    "Name"="Microsoft Flash Disk"
    "BootPhase"=dword:0
    "Flags"=dword:1000
    "MountAsHidden"=dword:1
    "MountAsRom"=dword:1
;    "MountFlags"=dword:00000004
;    "MountHidden"=dword:00000000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash\FATFS]
    "FriendlyName"="FAT FileSystem"
    "Dll"="fatfsd.dll"
    "Flags"=dword:00280014
    "Paging"=dword:1
    "CacheSize"=dword:0
    "EnableCacheWarm"=dword:0
    "EnableCache"=dword:1
    "MountAsBootable"=dword:1
    "MountAsRom"=dword:1
;    "MountAsRoot"=dword:1
; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION
step3:
    系统选用的文件系统必须是RAM and ROM Filesystem,不能用ROM Only.
step4:
    要知道内核子集XIPKERNEL.BIN必须包含的modules和Files是那些,根据我的实践得出,下面这些文件是必需的:
    "nk.exe",
    "coredll.dll",
    "filesys.exe",
    "fatfsd.dll",
    "diskcache.dll",
    "fatutil.dll",
    "binfs.dll",
    "fsdmgr.dll",
    "mspart.dll",
    "smflash.dll",

    "boot.hv",
其它的可选.
step5:
    使用preromimage.bat和processbib.exe程序,把它们拷贝到你的PLATFORM/SMDK2440/FILES/目录下.

到此改动就算结束了,下面就是开始Build and Sysgen.
生成了XIP.BIN之后烧写到NAND FLASH上,需要你的BOOT支持分区,在烧写的时候自动创建BINFS分区和FAT分区,如果不幸的你用的不是EBOOT的话又不能创建BINFS和FAT分区的话就麻烦大了.
系统起来之后可以看到有个BINFS目录和一个NandFlash目录.
step6:
    最后一步,修改一下ce.bib的
    XIPKERNEL    8C200000  0013F000  RAMIMAGE
    CHAIN    8C33F000  00001000  RESERVED
    NK      8C340000  00D00000  NANDIMAGE
;    RAM                 8D040000  02FC0000  RAM
    RAM                 8C340000  03CC0000  RAM
使RAM的起始地址等于NK的起始地址,这里就是放大了RAM的空间,用命令行方式romimage ce.bib,生成XIPKERNEL.BIN的文件烧到NAND FLASH中去就可以了,有人有问题了发现XIPKERNEL.BIN太小烧不进去,在OEMVerifyMemory()判断里把它判断成了IMAGE_TYPE_RAMIMAGE,所以不写到FLASH了.把这段代码注释掉就好了.
/* comment for fix if the image too small and locate in range,then the image type will change to ram image and cause the image can not write to flash.
    // Is it a ram image?
    else if ((dwStartAddr >= ROM_RAMIMAGE_START) &&
        ((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE)))
    {
 //       RETAILMSG(1, (TEXT("Downloading RAM image\r\n")));
        g_ImageType = IMAGE_TYPE_RAMIMAGE;
        return TRUE;
    }
*/
好了,完成,你的程序内存将会是61774K左右.
有疑问吗?我没有提到InitRomChain()函数,实践证明,你不写这个函数,不在OEMInit()里调用它也没有问题.让人感觉是多此一举.

附件名称/大小 下载次数 最后更新
processbib.rar (28KB)  287 2007-09-28 13:27

最新喜欢:

zorozoro
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-29 15:50
无私啊。强顶!!!!
http://www.esdevelop.cn
heyong_401
驱动牛犊
驱动牛犊
  • 注册日期2006-03-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望104点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-29 22:47
zhengshijie你好!我有一个问题:
你说把XIPKERNEL.BIN的文件烧到NAND FLASH中去就可以了,那NK.bin不用烧了吗?
还有我以前的eboot是用来烧写NK.bin的,每次启动的时候是将整个NK.bin都搬到ram中去,那现在该如何处理呢?希望您不吝指教
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
地板#
发布于:2007-09-30 00:00
烧的时候改烧XIP.NB0

至于nboot 则把copy的长度直接改为 比你的 XIPKERNEL.BIN略大即可
例如1.5M 或 2M
zzjlovece
驱动牛犊
驱动牛犊
  • 注册日期2006-06-01
  • 最后登录2012-01-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望117点
  • 贡献值0点
  • 好评度84点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-30 09:21
非常感谢,这个可是宝贵的经验啊。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-30 09:48
我想问一下,第六步可不可以省掉呢?
为什么第五步SYSGEN的时候不把RAM的起始地址等于NK的起始地址,
为什么不可直接就用之前已经编译出来个XIP.NK和XIPKERNEL.BIN。还要烧两次的话不是以前升级也不方便了。
http://www.esdevelop.cn
heyong_401
驱动牛犊
驱动牛犊
  • 注册日期2006-03-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望104点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-09-30 09:57
您是说烧xip.nb0,那烧了以后eboot会自动识别出xipkernal的大小并将它copy到ram中去,还是要改我的eboot,让它只拷贝比xipkernal大一点的内容到ram?
wenzai
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2011-03-04
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望424点
  • 贡献值0点
  • 好评度309点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-30 10:43
to zhengshijie
请教一下,你下载时用xip.bin吧?
当上电启动时,需要将OS拷贝到内存中,是整个拷贝还是只是XIPKERNEL.BIN,那么怎么确定XIPKERNEL.BIN实际的长度?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
8楼#
发布于:2007-09-30 11:54
to heyong_401:
  注意当你做XIP的时候,XIP.BIN才是完整的image,而这时候的NK.BIN只是其中的一部分,还有分两步实现,第5,第6步骤看仔细了。当你利用EBOOT烧写,EBOOT启动,它会自动在第六步烧写的时候把块数调整到XIPKERNEL.BIN的空间大小。这样启动的时候只会启动XIPKERNEL.BIN部分。
to wenzai:
 注意第5步,第6步,第5步烧写XIP.BIN,第6步重新烧写XIPKERNEL.BIN部分,这一步来确定XIPKERNEL.BIN的大小,利用EBOOT的BLOCK对齐原则,无需像harktrip提到的指定比你的 XIPKERNEL.BIN略大即可
例如1.5M 或 2M。
to shuiii:
 第六步是有点重复了,如果不要第六步,在第五步直接改ce.bib让RAM和NK的起始地址重叠,这样系统是起不来的,第五步让系统跑起来是基础,在此基础上通过第六步实现节省内存,加速启动。有一种变通的方法,你还是烧写第五步生成XIP.BIN,需要你在oal/init.c中实现一个扩展内存的函数,把NK部分的内存抠出来,只是这样你启动的时候将会拷贝整个XIP.BIN到内存,当然你可以指定BOOT只拷贝XIPKERNEL.BIN稍大的部分到内存应该也是可以的。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-09-30 12:15
再问,zhengshijie大侠 :

我在EBOOT里面给NAND分区,128M,一共1024个BLOCK,每个BLOCK是128K,第一个区分BOOT区,占3个BLOCK,第二个区是BINFS区,占240个BLOCK,第三个是FATFS区,占剩下的空间。
首先。这样分合理吗?
CE是什么时候去读NAND的MBR加载分区的???
有没有什么工具可以读到NAND的MBR?不然怎么确定分区正确了呢?
http://www.esdevelop.cn
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
10楼#
发布于:2007-09-30 12:59
to shuiii:
  你用的是K9F1G08的NAND FLASH,我也用过,前面给BOOT的都是RESERVE块,第一个BLOCK是给NBOOT,第二个BLOCK是给TOC,第三个BLOCK给EBOOT,前面3个BLOCK在烧写完之后都要置成坏块,低格FLASH,下载XIP.BIN烧写,烧写的时候创建了BINFS分区,再创建FAT分区,CE启动后,filesys.exe根据注册表来mount文件系统时会找到MBR块,读出里面的分区信息,来加载。我不知道有没有现成的工具,你可以自己在EBOOT把MBR块的512个字节打印出来分析。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-09-30 15:35
呵,没错,正是K9F1G08。
 不过新问题又来了。
为什么前面3个BLOCK在烧写完之后都要置成坏块呢???
而为了让烧片器能够正常烧写,又要去掉坏块标识。
这样子的话不是不能批量生产了。
  // setup our metadata so filesys won't stomp us
    si.dwReserved1 = 0;
    si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
    si.bBadBlock = 0xFF;
    si.wReserved2 = 0;
http://www.esdevelop.cn
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
12楼#
发布于:2007-09-30 18:02
to shuiii:
看来你对EBOOT的代码没有研究过,问这么多为什么还不如自己老老实实看代码,把你认为有疑问的地方改掉自己实验好了,实践出真知,有些问题因为你看不到CE启动的源码,不知道它是怎么找MBR记录的。
还有你总是以批量生产来提出疑问,每个产家有自己的解决方法,在这里我只能提供实验学习方法,不能做出最终产品的样子。
我不知道你说的烧片器是什么东西,我使用的是简易JTAG,利用SJF2440程序烧写NBOOT,它不管置不置坏块,总能烧写,而且只需要烧写一次,其它的利用NBOOT启动下载烧写EBOOT,利用EBOOT烧写XIP.BIN等,NBOOT具备升级EBOOT的功能,而EBOOT则具备升级CE系统和本身以及NBOOT等,你可以做EBOOT从SD卡升级所有的东西,这样只要把需要升级的相关文件放到SD卡上,每块板子一插SD卡就可以了。
heyong_401
驱动牛犊
驱动牛犊
  • 注册日期2006-03-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望104点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-09-30 19:33
zhengshijie你好!
你说你的nboot能下载升级eboot,是通过USB吗?
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-10-02 23:37
对楼主无私的奉献表示由衷的感谢!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-10-02 23:46
楼主啊,能否问下,你把PB工程里面的裁减以后,都剩下些什么呢。
jyc_1
驱动小牛
驱动小牛
  • 注册日期2003-09-13
  • 最后登录2009-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望110点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-10-08 16:25
顶一下
king_sundi
驱动牛犊
驱动牛犊
  • 注册日期2006-07-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望238点
  • 贡献值1点
  • 好评度54点
  • 原创分0分
  • 专家分5分
17楼#
发布于:2007-10-10 10:28
不错,

个人觉得受人以鱼不如授人以渔。
tianwailk
驱动牛犊
驱动牛犊
  • 注册日期2005-11-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望20点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-10-10 10:30
楼主请问一下,,写进BINFS中的内容是不是应该是BIN格式的。。为啥我下载的是bin文件,但是从目标块读取出来的时候,发现,已变成类似nb0文件了,,bin的一此标记都没有?
sjgkr
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2010-08-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-11-07 16:57
我的 MULTI BIN 内核也成功了,非常感谢楼主!

同时还要请教一下,如果我在 eboot 里把 XIPKERNEL 单独放在一个 BINFS 分区里面,NK 放在另外一个 BINFS 分区,这样 MULTI BIN 应该也能起来吧? 如果我把 NK 的 BINFS 分区挂载成可读写的(印象中 XIPKERNEL 只能挂载成只读的,不知对否?),那么我是不是可以在 WINCE 下直接更新 NK 部分的内容,而不用在 eboot 里更新了?不知道我这种思路对不对?先请大侠帮忙看一下,免得走弯路嘛,呵呵。先谢谢了!
上一页
游客

返回顶部