1. DDR2由512MB改为256MB的硬件修改
DDR2采用的是EDE1116AEBG,它的存储单元组织是8Mwords × 16 bits × 8 banks (EDE1116AEBG),它的方框图如下:
图1
8banks指一片EDE1116AEBG有8个bank,每个bank有8M(8192)个存储单元(这里为word),每个存储单元有16 bits,所以这里的1 word=16 bits=2Bytes。
EDE1116AEBG地址引脚表如下图:
图2
由此可知需要CPU引出13个地址线用于选择行地址和列地址(分时复用)。
EVK采用4片EDE1116AEBG,原理图如下:
图3
因为每片EDE1116AEBG都有8个bank,所以需要3个bank选择引脚,这里是DRAM_SDBA[2:0],IMX515最多也只有3个bank选择引脚。
Bank-1Lower_Half和Bank-1Upper_Half标识的这两片DDR2和CPU的连接引脚差别,在于Lower和Upper的DQ[15:0]连接的分别是内存接口DRAM_D[31:16](数据引脚高地址)和DRAM_D[15:0](数据引脚低地址)。
Bank-1和Bank-2主要是分别通过不同的DRAM_CS0和DRAM_CS1片选信号来选中,相应地Bank-1和Bank-2也需要不同的时钟信号DRAM_SDCLK0和DRAM_SDCLK1,这样CPU就可以识别到512MB的DDR2。我们的平台因为值支持256MB,且用的也是EDE1116AEBG,所以原理图上只保留了图3的左边。
2. DDR2有512MB改为256MB的软件修改
对于IMX51+WINCE6.0平台,EVK已经做了大小为128、256和512MB的兼容,如果需要分别支持这几种大小,只需要在系统工程文件中定义环境变量IMGRAM128=1、IMGRAM256=1和不定义这两个环境变量。
那不同DDR2大小,需要的设置有哪些不同?查找整个BSP包,相关的文件有SRC\INC下的image_cfg.h、image_cfg.inc和oemaddrtable_cfg.inc文件,FILES\config.bib和\sources.cmn。
⑴sources.cmn文件相关内容
!IF "$(IMGRAM256)" !=""
CDEFINES=$(CDEFINES) -DIMGRAM256
ADEFINES=$(ADEFINES) -pd "IMGRAM256SETL {TRUE}"
!ELSE
!IF "$(IMGRAM128)" !=""
CDEFINES=$(CDEFINES) -DIMGRAM128
ADEFINES=$(ADEFINES) -pd "IMGRAM128SETL {TRUE}"
!ELSE
CDEFINES=$(CDEFINES) -DIMGRAM512
ADEFINES=$(ADEFINES) -pd "IMGRAM512SETL {TRUE}"
!ENDIF
!ENDIF
表示如果系统工程文件定义了环境变量IMGRAM256且不为0,那么就定义IMGRAM256供BSP使用,且设置IMGRAM256=TRUE,其他类似。
此文件中尽量将驱动中用到的宏,放到\sources.cmn里面来定义,这样有一个好处,就是宏定义直观,方便查看,修改快捷
⑵oemaddrtable_cfg.inc文件
g_oalAddressTable
IF :DEF: IMGRAM256
DCD 0x80000000, CSP_BASE_MEM_PA_CSD0, 256 ; RAM image mapping
ELSE
IF :DEF: IMGRAM128
DCD 0x80000000, CSP_BASE_MEM_PA_CSD0, 128 ; RAM image mapping
ELSE
DCD 0x80000000, CSP_BASE_MEM_PA_CSD0, 256 ; RAM image mapping
DCD 0x90000000, CSP_BASE_MEM_PA_CSD1, 192 ; Remaining 64M are reserved for IPU
ENDIF
对于128和256MB的支持,差别只在于大小;512MB是在256MB的增加:
DCD 0x90000000, CSP_BASE_MEM_PA_CSD1,192
CSP_BASE_MEM_PA_CSD0=0x90000000,CSP_BASE_MEM_PA_CSD1=0xA0000000,为什么是这两个值,这有CPU的内存映射决定的,如下图:
图4
由图4可知,IMX515最大也只支持512MB的DDR2,这恰好也是WINCE6.0支持的最大值。
⑶config.bib文件
; Obsolete region, free them for moreProgram Memory
; VPU 87700000 00080000 RESERVED
; IPU 87780000 00880000 RESERVED
为了释放更多的编程内存,把为IPU(图像处理单元)和VPU(视频处理单元)预留的内存释放掉。
#if "$(IMGRAM256)" =="1"
FEC 8FFFC000 00004000 RESERVED
#else
#if "$(IMGRAM128)" =="1"
FEC 87FFC000 00004000 RESERVED
#else
FEC 9BFFC000 00004000 RESERVED
#endif
#endif
为FEC(Fast Ethernet Controller)预留16KB的内存。
图5
; --------------------------- RAM image(Windows CE) -------------------
; Start Addr End Addr Mem Type Region Name Size
; 0x80000000 0x801FFFFF SDRAM reserved 2 MB
; 0x80200000 0x85FFFFFF SDRAM NK 94 MB
; 0x86000000 0x9BFFBFFF SDRAM RAM 352 MB - 16KB
; 0x9BFFC000 0x9BFFFFFF SDRAM reserved 16 KB
; ----------------------------------------------------------------------
#if "$(IMGRAM256)" =="1"
IF IMGSMALLNK !
#define RAM_SIZE 09FFC000
ENDIF
IF IMGSMALLNK
#define RAM_SIZE 0CEFC000
ENDIF
#else
#if "$(IMGRAM128)" =="1"
IF IMGSMALLNK !
#define RAM_SIZE 01FFC000
ENDIF
IF IMGSMALLNK
#define RAM_SIZE 04EFC000
ENDIF
#else
IF IMGSMALLNK !
#define RAM_SIZE 15FFC000
ENDIF
IF IMGSMALLNK
#define RAM_SIZE 18EFC000
ENDIF
#endif
#endif
ENDIF
⑷image_cfg.h
// FEC DMA buffer
#ifdef IMGRAM256
#define IMAGE_SHARE_FEC_RAM_OFFSET (0xFFFC000)
#else
#ifdef IMGRAM128
#define IMAGE_SHARE_FEC_RAM_OFFSET (0x7FFC000)
#else
#define IMAGE_SHARE_FEC_RAM_OFFSET (0x1BFFC000)
#endif
#endif
#define IMAGE_SHARE_FEC_RAM_PA_START (CSP_BASE_MEM_PA_CSD0+IMAGE_SHARE_FEC_RAM_OFFSET)
#define IMAGE_SHARE_FEC_RAM_SIZE (16*1024)
根据condig.bib的配置来定义,在内存中预留16KB用于FEC的DMAbuffer
//Reserved video memory 64M
#ifdef IMGRAM256
#else
#ifdef IMGRAM128
#else
#define IMAGE_WINCE_VIDEO_RAM_OFFSET (0x1C000000)//64MB
#define IMAGE_WINCE_VIDEO_RAM_PA_START (CSP_BASE_MEM_PA_CSD0+IMAGE_WINCE_VIDEO_RAM_OFFSET)
#define IMAGE_WINCE_VIDEO_RAM_SIZE (64*1024*1024)
#endif
#endif
这里从512MB 的DDR2预留64MB用于视频内存。
⑸image_cfg.inc
;; FEC DMA buffer
IF :DEF: IMGRAM256
IMAGE_SHARE_FEC_RAM_OFFSET EQU (0xFFFC000)
ELSE
IF :DEF: IMGRAM128
IMAGE_SHARE_FEC_RAM_OFFSET EQU (0x7FFC000)
ELSE
IMAGE_SHARE_FEC_RAM_OFFSET EQU (0x1BFFC000)
ENDIF
ENDIF
IMAGE_SHARE_FEC_RAM_PA_START EQU (CSP_BASE_MEM_PA_CSD0+IMAGE_SHARE_FEC_RAM_OFFSET)
IMAGE_SHARE_FEC_RAM_SIZE EQU (16*1024)
;Reserved video memory 64M
IF :DEF: IMGRAM256
ELSE
IF :DEF: IMGRAM128
ELSE
IMAGE_WINCE_VIDEO_RAM_OFFSET EQU (0x1C000000)
IMAGE_WINCE_VIDEO_RAM_PA_START EQU (CSP_BASE_MEM_PA_CSD0+IMAGE_WINCE_VIDEO_RAM_OFFSET)
IMAGE_WINCE_VIDEO_RAM_SIZE EQU (64*1024*1024)
ENDIF
ENDIF
之前用过三星的2440、2443、2451和6410,内存方面的修改涉及文件更多,飞思卡尔这方面做的比较规范,通过定义不同的环境变量既可以实现。