SMP865X Windows CE 6.docx
《SMP865X Windows CE 6.docx》由会员分享,可在线阅读,更多相关《SMP865X Windows CE 6.docx(23页珍藏版)》请在冰豆网上搜索。
![SMP865X Windows CE 6.docx](https://file1.bdocx.com/fileroot1/2023-5/20/d5d1960b-73ba-408c-88b6-6737ef725e37/d5d1960b-73ba-408c-88b6-6737ef725e371.gif)
SMP865XWindowsCE6
SMP865XWindowsCE6.0内存概述默认分类
以下的信息仅限于SMP8654和SigmaDesigns在WindowsCE6.0下提供的标准BSP。
这个文档将详细说明标准BSP中的高级设计。
概述
SNP8654BSP是基于MIPSII和MIPSII_FP平台上的,除了基础的内核接口外,对于内建的网卡、遥控接收、UART、NAND闪存,SATA和USB设备都提供了驱动和源码
启动过程
当SMP8654加电启动后,第一片被执行的代码是内欠在芯片中的ROM代码。
这个ROM代码引导和启动XOS2。
XOS2接着确认XOS2sxenv2中X.XMB的存在(提示,这个XOS2sxenv2是芯片内部串行闪存中的一个xenv2块,而与设置在NAND闪存中的xenv2块无关,应该被称为zxenv)。
XOS2接着证实和引导x.xmb中的内容。
XMBOOT(x.xmb中的内容)接着引导ZBOOT(设置在NAND闪存中的第一页中)。
ZBOOT接着完成内存的设置后启动YAMON。
YAMON可以引导CEbootloader。
CEbooloader启动CE内核。
如果必要的话整个启动过程是可以被修改的。
X.XMB启动ZBOOT。
它是在启动过程中ZBOOT引导下一个阶段的步骤。
基本上只要你一改变启动过程中的一个步骤,它都会全然地影响到执行者所依据到启动过程中存在的何种状态。
当前开发阶段的启动过程如下:
1.ROM //芯片上电后,芯片内部被执行的第一片代码
2.XOS2 //用于确认和引导内部串行闪存中的X.XMB
3.X.XMB/STAGE0 //即XMBBOOT
4.ZBOOT/STAGE1 //NAND闪存中的第一页,完成内存设置,启动YAMON
5.YMAON/STAGE2
6.CEBOOTLOADER
7.CEKERNEL
尽管从STAGE0开始改变启动步骤是可能的,典型的用户还是从STAGE1开始改变。
NAND闪存布局
NAND闪存的前4个物理块(每个块128Kbit)是保留用来存储ZENV2块和STAGE1引导程序的。
每一个块都可以含有不同的ZXENV块和STAGE1引导程序,但通常他们只是起备份作用。
XMBOOT将从blcok0开始尝试,如果出错了,它将从1到3逐个尝试。
每个块的布局如下:
[0x00000000–0x00003FFF]ZXENV2block(16K)
[0x00004000–0x0001FFFF]STAGE1loader–“CPUcertificate”signedxloadbinary(112K)*
*xloadbianary的起始地址在ZXENV2块中指定
第一个物理块的布局实强制性的。
在前四个物理块后面,物理块的状态是按逻辑排列的。
SigmaDesigns公司实行一个逻辑块系统来管理物理块的状态。
这个物理块到逻辑块的管理系统监管NAND闪存的具体问题,诸如坏块管理和磨损。
在逻辑NAND闪存分布图中,首个512K字节的地址是保留给WindowsCE的。
[0x00000000] CEBootloader
[0x0007F000] CEBootloaderSettings
[0x00080000] YAMON*
[0x000C0000]Linuxkernel**
[0x00800000] IMaterial(IOS,ITASKS)**
[0x01800000] XMaterial(UCODES,XTASKS)**
[0x02000000] CEKernel(NK.BIN)**
[0x04000000] 由CE驱动NAND865X.dll使用,生成NAND存储器
*ZBOOT要求这个镜像必须是ROMFS容器,包含一个使用依据CPU证书标示xload镜像的zbf头的文件。
要生成这个文件,你需要以下make_xload,genzbf和genromfs工具。
ZBOOT在明确设置时显示这个镜像为“z.bootX”,X可以是0-7的任一数字,0有最高的启动优先权。
**只是保留的地址,可能并没有被使用
这个逻辑NAND闪存并不是强制性的,它只在参考板中使用。
它可以根据你系统的需求和资源改变。
例如,你改变了启动过程,你可以按照你的需求来改变这个分布图。
SimgaDesigns参考平台使用了上面的这个分布图。
内存分布图
SMP8654的物理内存(GBUS)分布图:
[0x00000000–0x00010000]REMAP1寄存器的目录
[0x00010000–0x04000000]SMP8654内部寄存器
[0x04000000–0x08000000]REMAP2寄存器的目录
[0x08000000–0x0C000000]REMAP3寄存器的目录
[0x0C000000–0x10000000]REMAP4寄存器的目录
[0x10000000–0x14000000]REMAP5寄存器的目录
[0x14000000–0x18000000]REMAP6寄存器的目录
[0x18000000–0x1C000000]REMAP7寄存器的目录*
[0x1C000000–0x20000000]硬件连接线转换gbus地址
[0x8C000000–0x90000000]**
[0x20000000–0x40000000]空置
[0x40000000–0x50000000]外围Bus接口
[0x50000000–0x58000000]PCIhost配置空间
[0x58000000–0x60000000]PCIhostIO空间
[0x60000000–0x80000000]PCIhost内存空间
[0x80000000–0xC0000000]DRAM0
[0xC0000000–0xFFFFFFFF]DRAM1
*REMAP7由KITLPCI设备使用
**[0x1FC00000–0x1FC10000] REMAP0寄存器的目录
提示,由于DRAM在gbus中制定的地址是0x80000000和0xC0000000,它们不能直接通过KSEG0和KSEG1访问。
SMP8654特有的REMAP寄存器必须被用来通过KSEG0和KSEG1进行DRAM寻址访问。
REMAP寄存器
REMAP寄存器允许CPU可以通过KSEG0和KSEG1访问大于等于0x20000000的gbus地址。
例如,如果你将REMAP2寄存器设置为0x80000000,那么你就可以使用虚拟地址0x84000000(绑定)和0x94000000(非绑定)来访问DRAM0的首个64MB的地址。
如果你将REMP2设置为0xC0000000,那么你就可以使用虚拟地址0x84000000(缓存)和0x94000000(非缓存)来访问DRAM1的首个64MB的地址。
一个使用256MBDRAM0和256MBDRAM1系统的设置释示范:
REMAP2=0xC0000000
REMAP3=0xC4000000
REMAP4=0xC8000000
REMAP5=0x80000000
REMAP6=0x84000000
REMAP4=0x88000000
这样设置,我们可以通过KSEG0或KSEG1访问DRAM1中的首个192MB地址,和DRAM0中的首个192MB地址。
可以使用MMU访问DRAM其余的地址。
由于这个设置中把[0x1C000000-0x20000000]地址映射为[0x8C000000-0x90000000],你可以使用KSEG0和KSEG1访问DRAM0的192MB-256MB范围的地址。
一个使用64MBDRAM0和64MBDRAM1系统的设置释示范:
REMAP2=0xC0000000
REMAP3=0x80000000
REMAP4=0x00000000
REMAP5=0x00000000
REMAP6=0x00000000
REMAP4=0x00000000
这样设置,我们可以通过KSEG0或KSEG1访问DRAM1中的首个64MB地址,和DRAM0中的首个64MB地址。
例如,在、如果是在内核模式中,从DRAM0中读取第一个DWORD可以被写成:
DWORD*pdw_uncached=(DWORD*)(0x08000000|0xA0000000);
DWORD*pdw_cached=(DWORD*)(0x08000000|0x80000000);
CE启动引导程序
CE启动引导程序必须使用小于64MB的内存,在SigmaDesigns默认的实施设置中它被引导至0x90410000的虚拟地址中(查看boot.bib)。
这个地址位于REMAP寄存器5的范围中。
因此,REMAP5必须在CE启动引导程序被引导到这个地址以前设置。
CE启动引导程序在startup.s中设置REMAP寄存器。
WindowsCE(256MB/256MB设置)的REMAP寄存器通常为:
remap0[1fc00000–1fc100000]由一般的gbus访问使用
remap1[00000000–00010000]0xc0100000内核异常向量+启动引导程序变量
remap2[04000000–08000000]0xc000000--0xc4000000
remap3[08000000–0c000000]0xc400000--0xc8000000
remap4[0c000000–10000000]0xc800000--0xcc000000
remap5[10000000–14000000]0x8000000--0x84000000
remap6[14000000–18000000]0x8400000--0x88000000
remap7[18000000–1c000000]由KITLPCI设备使用
remap8[04000000–08000000]0x8c00000--0x90000000
提示以上的这些信息是参考BSP中CE启动引导程序例程中所特有的。
0x90410000不是一个强制性的地址,之所以在CE启动引导程序例程中使用这个值,是因为这个地址空间是空闲的并且没有和YAMON冲突。
CE启动引导程序也使用一小块的NAND闪存来存储一些信息。
这个地址的逻辑偏移量定义在image_cfg.h中。
查看以下定义:
#defineIMAGE_FALSH_BOOT_CONFIG//存储设置信息的NAND闪存逻辑偏移量地址
#defineIMAGE_FALSH_BOOT_CONFIG_SIZE//上面设置信息区域的字节长度
CE内核
为了优化内存的带宽,使用DRAM1来引导内核是个好方法(视频解码器可以默认使用DRAM0)。
在上面的所有例子中,REMAP2寄存器都被设置到DRAM1的地址中,这是因为这么做可以使得内核的起始地址可以在0x84000000-0x83FFFFFF范围中。
如果内核(nk+ram)大于64MB小于128MB,那么REMAP3寄存器也可以包括DRAM1的地址(例如0xC4000000),等等。
在SigmaDesigns提供的BSP中,CE内核的起始于虚拟地址0x84110000。
CE内存使用方法
在参考WindowsCEBSP中内存的使用方法如下:
DRAM0布局:
[0x80000000–0x80100000]SMP8654以太网KITLDMA内存(1M)
[0x80100000–uzdata ]空闲
[uzdata -zdata ] 图片缓存/音频解码帧
[zdata -dsp ] 压缩的比特流
[dsp -xpu ]微码层
[xpu -DRAMEND] XPU区域
uzdata=0x80000000+lrrw.0.uzdata_offset
zdata=0x80000000+lrrw.0.zdata_offset
dsp=0x8000000+lrrw.0.dsp_offset
xpu=0x8000000+lrrw.0.xpu_offset
DRAM1布局:
[0xC0000000–0xC0100000]预留使用(1M)
[0xC0100000–0xC0110000]故障处理程序+启动引导程序变量(64K)
[0xC0110000–uzdata ]NK+RAM
[uzdata -zdata ] 图片缓存/音频解码帧
[zdata -dsp ] 压缩的比特流
[dsp -xpu ]微码层
[xpu -DRAMEND] XPU区域
uzdata=0xC0000000+lrrw.1.uzdata_offset
zdata=0xC0000000+lrrw.1.zdata_offset
dsp=0xC000000+lrrw.1.dsp_offset
xpu=0xC000000+lrrw.1.xpu_offset
内存必须同时被分配给:
1.XOS(lrrw.xos_public_ga,lrrw.xos_public_size)
2.CPU/XPU/IPU通信(lrrw.channel_index_ga,lrrw_channel_index_size)
3.IRQ句柄共享内存(lrrw.ih_api_ga)
4.IOS(lrrw.ios_ga.lrrw.size)
内存保留的这些单位都定义在lrrw.*关键码中。
同过CE启动引导程序你可以由选择“[8]xenv2BlockOption->[2]Dumpxenv2_rw”命令来显示这些关键码。
这些关键码都在stage1启动过程中创建。
关于IOS内核的内存需要一个特别的提示。
在默认的zboot执行过程中,zboot先使用zexenv变量”z.ios_mm”和”z.ios_sizez.ios_size”来分配内存,然后把分配好的gbus地址写到”lrrw.ios_ga”中,分配的大小写到”lrrw.ios_size”中。
IOS这时必须被加载到当前缓存的最后512K中。
更改内存设置
SMP8654有两个32位的内存控制器。
每个控制其可以最大控制512MB。
本部分将说明SigmaDesigns提供的参考BSP将如何被修改为不同的内存设置。
在XOS和ZBOOT的内存分配初始化后,lrrw.*xenv变量被建立了。
这些lrrw.*变量关联的内存分布如下:
lrrw.0.uzdata_offset 0x0fa34000DRAM0预留给图片缓存的偏移地址 *
lrrw.0.zdata_offset 0x0fa40000DRAM0预留给bit流的偏移地址 *
lrrw.0.dsp_offset 0x0fa44000DRAM0预留给微码的偏移地址
lrrw.0.xpu_offset 0x0fc00000DRAM0预留给XOS的偏移地址
lrrw.1.uzdata_offset 0x0fd60000DRAM1预留给图片缓存的偏移地址 *
lrrw.1.zdata_offset 0x0fd74000DRAM1预留给bit流的偏移地址 *
lrrw.1.dsp_offset 0x0fd7c000DRAM1预留给微码的偏移地址
lrrw.1.xpu_offset 0x0fe00000DRAM1预留给XOS的偏移地址
lrrw.xos_public_ga 0xcfd20000给XPU/CPU通信预留的内存地址 **
lrrw.xos_public_size0x00020000上面内存的大小
lrrw.channel_index_ga0xcfd1fcd4内存地址的通道号,由处理机间通信使用
lrrw.channel_index_size0x00000320上面内存的大小
lrrw.ih_api_ga 0xcfd0fcc8为IRQ句柄预留的内存地址,64K字节
lrrw.ios_ga 0x8f000000给IOS预留的内存地址
lrrw.ios_size 0x006acfc1上面内存的大小
*非强制性的,只当你希望这些缓存保留时才需要。
**非强制性的
一旦这些内存分配被建立和预留后,除了他们预期的功能外不再使用这些区域是极其重要的。
需要修改的文件
Config.bib你必须修改config.bib文件以致内核知道那些内存是可用的。
你必须确认在lrrw.*变量中的内存不和在这个文件中定义的内存冲突。
EXCEPT_OS8000000000001000RESERVED;4KBOS故障处理(remap之后)
ARGS 8000100000001000RESERVED;4KB从启动引导程序到系统的信息(remap之后)
FUTURE 8400000000100000RESERVED;1MBKITLDMA缓存(或者可用,取决于REMAP2)
ARGS 8410000000010000RESERVED;64KB故障处理和变量
NK 84110000 02000000RESERVED;32MBNK.bin镜像
RAM 86110000 05EF0000RAM ;95MBCE应用
所有在config.bib中的内存都指定使用KSEG0地址空间。
这样,内核可以看到的内存就是从0x84110000-0x8C000000。
关于config.bib更多的信息请参看MSDN文档。
image_cfg.himage_cfg.h文件包含了一些在分配内存之前特别使用的定义。
需要被修改的重要#define包括:
#defineIMAGE_BOOT_EXCEPTION_BASE 0xC0100000
这是异常向量的gbus地址。
如果你希望他们在DRAM1中那典型值为0xC0100000,或者你希望他们在DRAM0中那典型值为0x80100000。
#defineIMAGE_ETH_DMA_PA_START 0x10000000
这是KITL设备使用的DMA缓存的gbus地址。
ES1和ES2芯片需要这个内存被指定使用一个遗留的地址。
如果你希望他们在DRAM0中那典型值为0x80000000(=0x10000000),或者你希望他们在DRAM1中那典型值为0xC0000000。
startup.s在bootloader工程中的startup.s文件可能需要修改。
这个startup.s文件设置remap寄存器2-7。
内核将不再重新定义这些寄存器。
内存设置示例
比如,如果你总共只有64MB内存可用,并且它全部在DRAM0上,同时设定lrrw.*使用64MB内存的最后4MB,这个设置如下:
config.bib
EXCEPT_OS8000000000001000RESERVED;4KBOS故障处理(remap之后)
ARGS 8000100000001000RESERVED;4KB从启动引导程序到系统的信息(remap之后)
FUTURE 8400000000100000RESERVED;1MBKITLDMA缓存
ARGS 8410000000010000RESERVED;64KB故障处理和变量
NK 84110000 01000000RESERVED;16MBNK.bin镜像
RAM 85110000 02AF0000RAM ;~43MBCE应用
LRRW 87C0000000400000RESERVED;4MBlrrw.*
image_cfg.h
#defineIMAGE_ETH_DMA_PA_START 0x10000000
#defineIMAGE_BOOT_EXCEPTION_BASE 0x80100000
startup.s
//-------------------------------------------------------------------------------------------
//InitCPUMappingRegisters(DRAMconfiguration:
64/0)
//-------------------------------------------------------------------------------------------
//CPU_remap(0x6f000)=IMAGE_BOOT_EXCEPTION_BASE:
remapto0x1fc00000
li k0,KSEG1_BASE|REG_BASE_cpu_block|CPU_remap
li k1,0
sw k1,(k0)
//CPU_remap1(0x6f004)=IMAGE_BOOT_EXCEPTION_BASE:
remapto0x00000000
li k0,KSEG1_BASE|REG_BASE_cpu_block|CPU_remap1
li k1,IMAGE_BOOT_EXCEPTION_BASE
sw k1,(k0)
//CPU_remap2(0x6f008)=DRAM1+0:
remapto0x04000000
li k0,KSEG1_BASE|REG_BASE_cpu_block|CPU_remap2
li k1,0x80000000
sw k1,(k0)
//programallotherre-mapregistersto0
词汇表
XPU-SMP8654内的安全处理器
XOS2-在XPU上运行的专有操作系统
X.XMB-位于SMP8654内部串行闪存中的一个二进制关键码值
KSEG0-绑定内核的虚拟地址,从[0x80000000–0x9FFFFFFF],它直接指向物理地址[0x00000000–0x1FFFFFFF]
KSEG1-非绑定内核的虚拟地址,从[0xA0000000–0xBFFFFFFF],它直接指向物理地址[0x00000000–0x1FFFFFFF]
SMP865X内存概述
如果你希望她们在DRAM0中那典型值为0x80000000(=0x10000000),或者你希望她们在DRAM1中那典型值为0xC0000000
XOS