您的位置:首页 > 其它

MULTI BIN的wince 5.0,smdk2440下的实现

2009-11-20 02:14 537 查看
MULTI BIN的wince 5.0,smdk2440下的实现(转自驱动程序开发社区)

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左右.

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1915439
[收藏到我的网摘] [发送Trackback] 慕水发表于 2007年12月04日 12:00:00

特别推荐:
想在这里投放广告?点击查看详情



gameloft招聘游戏软件工程师
Gameloft成立于1999年的法国,同年成为该 Gameloft公司是世界领先的手机、游戏软件开发 内存

主机完全DIY,域名免费试用
时代互联100M主机 216元/年 内存

沪上首家外包人才培训中心
特别提供:日语软件标准化免费训练营 文件

IT 游戏 开发人才专业招聘网站
每日上万个IT简历更新,快捷有效的招聘求职

如何通过管理活动内容提高应用程序的安全性
借助活动内容过滤避开Web 2.0应用程序常见攻击



评论

#

zippo2004 发表于2007-12-05 13:00:14 IP: 222.190.118.*

在驱动开发网上看到了您以前的帖子,在做Multi-xip时也遇到了
filesys.exe加载不成功的问题。
我现在也遇到了和你一样的问题,想请教您。

我的平台是CE 5.0+S3C2440

进行了Multi-xip相关设置,并实现了Hive注册表,编译时没有问题,最终生成了XIP.BIN,XIP.nb0等文件。

然后通过DNW软件,采用USB的方式想直接将xip.nb0下载到内存中运行,下载完,启动后串口信息如下:
*****************************************
SN9610 Navigator BootLoader For WinCE 5.0
******************************************

NAND Boot Start
NAND Boot End
Boot time=nTCNT*82uS. nTCNT=0x00b6.
DIVN_UPLL0
MPLLVal [M:4ch,P:1h,S:1h]
CLKDIVN:7h

+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan |
+---------------------------------------------+
FCLK=400.9MHz,DMA mode
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: 1. Power off/on or press the reset button for 1 sec
in order to get a valid USB device

address.
2. For additional menu, Press any key.

UPLLCON Register Value [M:ch,P:1h,S:1h]
USB host is not connected yet.
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:30200000h,TOTAL:31457290]
RECEIVED FILE SIZE:31457290
(948.4KB/S,33.2S)
Now, Checksum calculation
Download O.K.

Windows CE Kernel for ARM (Thumb Enabled) Built on Feb 8

2007 at 23:36:51
ProcessorType=0920 Revision=0
sp_abt=ffff500
#

zippo2004 发表于2007-12-05 13:02:52 IP: 222.190.118.*

sp_irq=ffff2800 sp_undef=ffffc800

OEMAddressTable = 802010e8
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
CPU FCLK 400926792 Hz, HCLK 133642264 Hz, PCLK 66821132 Hz
SN9610 LCD 16BPP Active!
Sp=ffffc7cc
OEMIoControl: Unsupported Code 0x10100b4 - device 0x0101

func 45
OEMIoControl: Unsupported Code 0x101008c - device 0x0101

func 35
FMD::FMD_Init
FMD::FMD_Init - pBSPArgs->nfsblk = 0x0
FMD::FMD_Init - READ_REGISTER_BYTE(pNFSBLK) = 0x0
FMD::FMD_Init IPL .....
FMD::FMD_Init Done
MID = 0xec, DID = 0xf1 4th Cycle : 0x0
dwPrimaryNandDevice : 7(0x7)
astNandSpec[dwPrimaryNandDevice].nSctsPerPg: 4(0x4)
wPRIMARY_REAL_NAND_BLOCKS : 1024(0x400)
NUMBLOCKS : 1024(0x400), SECTORSPERBLOCK = 64(0x40),

BYTESPERSECTOR = 2048(0x800)
FMD_OEMIoControl: unrecognized IOCTL (0x71c24).
Data Abort: Thread=83fc7000 Proc=82226270 'filesys.exe'
AKY=00000003 PC=03f9e324(coredll.dll+0x0002e324)

RA=03f9e2fc(coredll.dll+0x0002e2fc) BVA=04000000

FSR=00000007
OEMIoControl: Unsupported Code 0x101008c - device 0x0101

func 35
OEMIoControl: Unsupported Code 0x10100c4 - device 0x0101

func 49
Data Abort: Thread=83fc7000 Proc=82226270 'filesys.exe'
AKY=00000003 PC=03f9e324(coredll.dll+0x0002e324)

RA=03f9e2fc(coredll.dll+0x0002e2fc) B
#

zippo2004 发表于2007-12-05 13:03:38 IP: 222.190.118.*

BVA=04000000

FSR=00000007
Data Abort: Thread=83fc7000 Proc=82226270 'filesys.exe'
AKY=00000003 PC=802ae678(NK.EXE+0x000ae678) RA=802ae664

(NK.EXE+0x000ae664) BVA=03f01a30 FSR=00000007
Data Abort: Thread=83fc7000 Proc=82226270 'filesys.exe'
AKY=00000003 PC=802ae678(NK.EXE+0x000ae678) RA=802ae664

(NK.EXE+0x000ae664) BVA=03f01b30 FSR=00000007
#

zippo2004 发表于2007-12-05 13:07:29 IP: 222.190.118.*

不好意思啊,分了几次才把打印信息发完。

现在问题就是,那个logo图片显示后,就进行不下去了,挂在filesys.exe这边。

另外,因为没有eboot,我的NANDFLASH没有分成binfs和fatfs两个区,不知道这个有没有影响呢?

我想我只是通过USB下载XIP.nb0到SDRAM中运行,应该和Nand上的分区没什么关系吧?

请大哥指点,多谢!
# <img src="http://webim.csdn.net/UserOnlineFace/Theme1/shuiii.ashx" tipjson="{"Method":"initBlogElf","UserName":"shuiii","Content":"<div id=/"blog_csdn_Showme/" class=/"ittoolbox_csdnl/"><table border=/"0/" cellpadding=/"3/" cellspacing=/"0/"><tbody><tr><td colspan=/"2/" class=/"postTitle/"><span id=/"smAuthor/">shuiii<img src=/"http://counter.csdn.net/pv.aspx?id=225/" alt=/"/" style=/"display: none;/" /></span>的个人信息</td></tr><tr><td align=/"center/" width=/"120 px/"><img id=/"smPic/" alt=/"/" class=/"person/" src=/"http://profile.csdn.net/shuiii/picture/1.jpg/" /><br /><a id=/"smLinktoMyhome/" href=/"http://blog.csdn.net/shuiii/">我的博客</a> | <a id=/"smLinktoHiCsdnHome/" href=/"http://hi.csdn.net/shuiii/profile/">我的空间</a></td><td class=/"postList/" ><ul id=/"smContentList/"><li><a href=/"http://blog.csdn.net/shuiii/archive/2007/12/04/1915439.aspx/"><span>MULTI BIN的wince 5.0,smdk2440下的实现</span></a></li><li><a href=/"http://blog.csdn.net/shuiii/archive/2007/12/04/1915122.aspx/"><span>| WinCE驱动开发问题精华集锦</span></a></li><li><a href=/"http://blog.csdn.net/shuiii/archive/2007/12/03/1913969.aspx/"><span>Windows CE .NET的实时性</span></a></li></ul><div class=/"submitArea/"><hr style=/"color: #ff6600; height: 1px/" /><a href=/"http://webim.csdn.net/AddFriends/shuiii.ashx/" target=/"_blank/">添加好友</a> | <a href=/"http://webim.csdn.net/Messages/shuiii.ashx/" target=/"_blank/">发消息</a></div></td></tr></tbody></table></div>"}" alt="" /> shuiii 发表于2007-12-06 16:26:15 IP: 218.18.140.*

我之前就说了。主要是要分区分好,一定要在EBOOT里面把binfs和fatfs分出来。我之前跑不起来就是因为这个了。
| 下一篇: | WinCE驱动开发问题精华集锦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: