我的系统需要用到2片mDDR的RAM,型号为K4X1G323PD,32Mx32 Mobile DDR SDRAM。
看DATASHEET,6410的RAM控制器可以控制2片RAM,CHIP0物理地址为0X50000000,CHIP1物理地址为0X60000000.
两片RAM的容量为0X08000000.在物理上地址不连续。
在网上找到修改RAM容量和内存扩展的一些资料,做了下参考
http://blog.csdn.net/zhandoushi1982/archive/2009/11/09/4789009.aspx
http://blog.21ic.com/user1/801/archives/2010/66583.html
http://blog.csdn.net/gooogleman/archive/2009/03/19/4004153.aspx
经过两天的努力,终于找到了解决的方法。
难点有两个:1.RAM控制器初始化的配置
2.由于我用的RAM地址不连续,需要内存扩展
附上解决的详细方法:
1.D:/WINCE600/PLATFORM/SMDK6410/SRC/INC/MemParam_mDDR.inc
此文件配置RAM初始化的参数
添加CHIP1的选择
USE_DMC1_CHIP0 SETL {TRUE}
[ BSP_RAM_1GX2
USE_DMC1_CHIP1 SETL {TRUE}
|
USE_DMC1_CHIP1 SETL {FALSE}
]
配置RAM的一些基本参数。2chip,row,col,type都得对一下
[ BSP_RAM_1GX2
DMC1_MEM_CFG EQU ((1<<21)+(0<<18)+(2<<15)+(0<<14)+(0<<13)+(0<<7)+(0<<6)+(2<<3)+(2<<0)) ; colum A0~A9
|
DMC1_MEM_CFG EQU ((1<<30)+(0<<21)+(0<<18)+(2<<15)+(0<<14)+(0<<13)+(0<<7)+(0<<6)+(2<<3)+(2<<0)) ; colum A0~A9
]
配置地址。DATASHEET上说的非常不详细,调试了很久才得出正确结论。
0X50表示CHIP0对应物理地址为0x50000000,0x60表示CHIP1对应物理地址为0X60000000
CHIP0的地址段位0X50000000-0X57FFFFFF,所以为0XF8
CHIP1的地址段为0X60000000-0X67FFFFFF,所以也为0XF8
DMC1_CHIP0_CFG EQU ((1<<16)+(0x50<<8)+(0xF8<<0)) ; BRC (Linear Address Mapping), OnDRAM can't Use RBC (A Port Only for Modem!!!)
[ BSP_RAM_1GX2
DMC1_CHIP1_CFG EQU ((1<<16)+(0x60<<8)+(0xF8<<0)) ; BRC (Linear Address Mapping), OnDRAM can't Use RBC (A Port Only for Modem!!!)
]
2.D:/WINCE600/PLATFORM/SMDK6410/SRC/OAL/OALLIB/init.c
此文件添加以下内容
#ifdef BSP_RAM_1GX2
BOOL OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{
*pMemoryStart = 0x88000000;
*pMemoryLength = 0x08000000;//128M
OALMSG(OAL_FUNC, (TEXT("OEMGetExtensionDRAM/n/r")));
return TRUE;
}
#endif
3.D:/WINCE600/PLATFORM/SMDK6410/SRC/INC/oemaddrtab_cfg.inc
将最前面的定义修改为
[ BSP_RAM_1GX2
DCD 0x80000000, 0x50000000, 128 ; 128 MB DRAM
DCD 0x88000000, 0x60000000, 128 ; 128 MB DRAM
|
DCD 0x80000000, 0x50000000, 128 ; 128 MB DRAM
]
4.修改config.bib文件
IF BSP_RAM_1GX2
CMM 8E500000 00300000 RESERVED
DISPLAY 8E800000 00C00000 RESERVED
MFC_JPEG 8F400000 00C00000 RESERVED
ELSE
CMM 86500000 00300000 RESERVED
DISPLAY 86800000 00C00000 RESERVED
MFC_JPEG 87400000 00C00000 RESERVED
ENDIF BSP_RAM_1GX2
注意!!一定不要修改
#define RAMLEN 09500000 ; 141MB (Will be auto-sized from the end of NK)
系统会起不来。
5.D:/WINCE600/PLATFORM/SMDK6410/SRC/INC/image_cfg.h
#ifdef BSP_RAM_1GX2
#define IMAGE_CMM_BUFFER_OFFSET (0x0E500000)
#else
#define IMAGE_CMM_BUFFER_OFFSET (0x06500000)
#endif
#ifdef BSP_RAM_1GX2
#define IMAGE_FRAMEBUFFER_OFFSET (0x0E800000)
#else
#define IMAGE_FRAMEBUFFER_OFFSET (0x06800000)
#endif
#ifdef BSP_RAM_1GX2
#define IMAGE_MFC_BUFFER_OFFSET (0x0F400000)
#else
#define IMAGE_MFC_BUFFER_OFFSET (0x07400000)
#endif
6.D:/WINCE600/PLATFORM/SMDK6410/SMDK6410.bat
添加set BSP_RAM_1GX2=1
7.在几个相关的sources文件里添加定义
D:/WINCE600/PLATFORM/SMDK6410/SRC/BOOTLOADER/EBOOT/sources
D:/WINCE600/PLATFORM/SMDK6410/SRC/BOOTLOADER/STEPLDR/sources
D:/WINCE600/PLATFORM/SMDK6410/SRC/OAL/OALLIB/sources
!if "$(BSP_RAM_1GX2)" == "1"
CDEFINES=$(CDEFINES) -DBSP_RAM_1GX2
ADEFINES=$(ADEFINES) -pd "BSP_RAM_1GX2 SETL {TRUE}"
!else
ADEFINES=$(ADEFINES) -pd "BSP_RAM_1GX2 SETL {FALSE}"
!endif
修改完后,直接Rebuild Current BSP就OK了。注意先更新STEPLDR,再更新NK。