最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

DDR3简易配置手册

IT圈 admin 24浏览 0评论

2024年3月21日发(作者:委永昌)

DDR简易配置手册(MX)

1,频率

找到相应的config和h文件,如:customerboardconfigsm6_ramos_v1.h

找到宏M6_DDR_CLK,如:#defineM6_DDR_CLK(516)

修改括号中的数值即可,为12的整数倍,范围应在360~768之间。

2,

容量

找到相应的config和h文件,如:customerboardconfigsm6_ramos_v1.h

2.1Foruboot

找到容量相关的宏:

//#defineM6_DDR3_1GB

#defineM6_DDR3_512M

根据你DDR的总容量进行设置。目前的代码这两种配置修改比较简单。注意目前的512M

是对应的128Mbx8bitx4pcs,1GB对应256Mbx8bitx4pcs。

2.2Forkernel

找到容量相关的宏:

CONFIG_EXTRA_ENV_SETTINGS

并找到相关的所有设置“mem=1024m”

Mx的代码全部固定了1024m给内核使用,根据实际容量自行修改。

如果总容量小于等于512MB时,“vmalloc=256m”可以去掉。

3,行列地址

在timming.c中,如:customerboardm6_ramos_v1firmwaretimming.c找到:

#ifdefined(M6_DDR3_1GB)

#defineDDR3_4Gbx16

#elifdefined(M6_DDR3_512M)

#defineDDR3_2Gbx16

如果你使用的都是推荐的配置,如128Mbx8bitx4pcs(512MB)和256Mbx8bitx

4pcs(1GB)。那在之前的头文件中设置好容量就可以了。但在实际情况中有可能遇到特殊的

情况需要修改这部分设置。例如两个256MB位宽8bit的DDR,总容量同样也是512MB,但

行列地址却不是之前对应的那个:

#ifdefDDR3_2Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size2

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

这种情况,我们最好添加一个宏,如:

#ifdefined(M6_DDR3_1GB)

#defineDDR3_4Gbx16

#elifdefined(M6_DDR3_512M)

//#defineDDR3_2Gbx16

#defineDDR3_2Gbx8

并增加相应宏下的行列地址设置,如:

#ifdefDDR3_2Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size2

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#elifdefinedDDR3_4Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size3

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#elifdefinedDDR3_2Gbx8

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size3

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#endif

具体为什么要这么设,请参考代码中的注释和ddr的规格书。

4,位宽

默认代码是32bit的,如果要改为16bit,除了之前提到的容量和行列地址设置,在

timming.c中,如:customerboardm6_ramos_v1firmwaretimming.c找到:

.ddr_ctrl=(0<<24)|//pctl_brst4,

(0xff<<16)|//reorderenforthe8channel.

(1<<15)|//pctl16mode==32bitsdatapins

(0<<14)|//pagepolicy=0.

(1<<13)|//commandreorderenabled.

(0<<12)|//bankmap=0,banksweepbetween4banks.

(1<<11)|//Blocksize.0=32x32bytes.1=64x32bytes.

(0<<10)|//ddrburst0=8burst.1=4burst.

(3<<8)|//ddrtype.2=DDR2SDRAM.3=DDR3SDRAM.

(1<<7)|//ddr16bitsmode.0=32bitsmode.

(1<<6)|//1=8banks.0=4banks.

(0<<4)|//ranksize.0=1rank.1=2rank.

(ddr3_row_size<<2)|

(ddr3_col_size),

将bit7和bit15置1。

在ddr_init_pctl.c中,如:archarmcpuaml_mesonm6firmwareddr_init_pctl.c找到:

writel(readl(P_PUB_DSGCR_ADDR)&0xffffffef,P_PUB_DSGCR_ADDR);

在后边添加代码:

if(timing_reg->ddr_ctrl&(1<<7)){

writel(readl(P_PUB_DX2GCR_ADDR)&0xfffffffe,P_PUB_DX2GCR_ADDR);

writel(readl(P_PUB_DX3GCR_ADDR)&0xfffffffe,P_PUB_DX3GCR_ADDR);

}

在mmc.c中,如:archarmcpuaml_mesonm6firmwarearc_powermmc.c找到:

MMC_Wr(PUB_DSGCR_ADDR,MMC_Rd(PUB_DSGCR_ADDR)&0xffffffef);

在后边添加代码:

if(v_mmc_ddr_ctrl&(1<<7)){

MMC_Wr(PUB_DX2GCR_ADDR,MMC_Rd(PUB_DX2GCR_ADDR)&0xfffffffe);

MMC_Wr(PUB_DX3GCR_ADDR,MMC_Rd(PUB_DX3GCR_ADDR)&0xfffffffe);

}

2024年3月21日发(作者:委永昌)

DDR简易配置手册(MX)

1,频率

找到相应的config和h文件,如:customerboardconfigsm6_ramos_v1.h

找到宏M6_DDR_CLK,如:#defineM6_DDR_CLK(516)

修改括号中的数值即可,为12的整数倍,范围应在360~768之间。

2,

容量

找到相应的config和h文件,如:customerboardconfigsm6_ramos_v1.h

2.1Foruboot

找到容量相关的宏:

//#defineM6_DDR3_1GB

#defineM6_DDR3_512M

根据你DDR的总容量进行设置。目前的代码这两种配置修改比较简单。注意目前的512M

是对应的128Mbx8bitx4pcs,1GB对应256Mbx8bitx4pcs。

2.2Forkernel

找到容量相关的宏:

CONFIG_EXTRA_ENV_SETTINGS

并找到相关的所有设置“mem=1024m”

Mx的代码全部固定了1024m给内核使用,根据实际容量自行修改。

如果总容量小于等于512MB时,“vmalloc=256m”可以去掉。

3,行列地址

在timming.c中,如:customerboardm6_ramos_v1firmwaretimming.c找到:

#ifdefined(M6_DDR3_1GB)

#defineDDR3_4Gbx16

#elifdefined(M6_DDR3_512M)

#defineDDR3_2Gbx16

如果你使用的都是推荐的配置,如128Mbx8bitx4pcs(512MB)和256Mbx8bitx

4pcs(1GB)。那在之前的头文件中设置好容量就可以了。但在实际情况中有可能遇到特殊的

情况需要修改这部分设置。例如两个256MB位宽8bit的DDR,总容量同样也是512MB,但

行列地址却不是之前对应的那个:

#ifdefDDR3_2Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size2

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

这种情况,我们最好添加一个宏,如:

#ifdefined(M6_DDR3_1GB)

#defineDDR3_4Gbx16

#elifdefined(M6_DDR3_512M)

//#defineDDR3_2Gbx16

#defineDDR3_2Gbx8

并增加相应宏下的行列地址设置,如:

#ifdefDDR3_2Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size2

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#elifdefinedDDR3_4Gbx16

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size3

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#elifdefinedDDR3_2Gbx8

//row_size00:A0~A15.01:A0~A12,10:A0~A13,11:A0~A14.

#defineddr3_row_size3

//colsize00:A0~A7,01:A0~A8,10:A0~A9.11,A0~A9,A11.

#defineddr3_col_size2

#endif

具体为什么要这么设,请参考代码中的注释和ddr的规格书。

4,位宽

默认代码是32bit的,如果要改为16bit,除了之前提到的容量和行列地址设置,在

timming.c中,如:customerboardm6_ramos_v1firmwaretimming.c找到:

.ddr_ctrl=(0<<24)|//pctl_brst4,

(0xff<<16)|//reorderenforthe8channel.

(1<<15)|//pctl16mode==32bitsdatapins

(0<<14)|//pagepolicy=0.

(1<<13)|//commandreorderenabled.

(0<<12)|//bankmap=0,banksweepbetween4banks.

(1<<11)|//Blocksize.0=32x32bytes.1=64x32bytes.

(0<<10)|//ddrburst0=8burst.1=4burst.

(3<<8)|//ddrtype.2=DDR2SDRAM.3=DDR3SDRAM.

(1<<7)|//ddr16bitsmode.0=32bitsmode.

(1<<6)|//1=8banks.0=4banks.

(0<<4)|//ranksize.0=1rank.1=2rank.

(ddr3_row_size<<2)|

(ddr3_col_size),

将bit7和bit15置1。

在ddr_init_pctl.c中,如:archarmcpuaml_mesonm6firmwareddr_init_pctl.c找到:

writel(readl(P_PUB_DSGCR_ADDR)&0xffffffef,P_PUB_DSGCR_ADDR);

在后边添加代码:

if(timing_reg->ddr_ctrl&(1<<7)){

writel(readl(P_PUB_DX2GCR_ADDR)&0xfffffffe,P_PUB_DX2GCR_ADDR);

writel(readl(P_PUB_DX3GCR_ADDR)&0xfffffffe,P_PUB_DX3GCR_ADDR);

}

在mmc.c中,如:archarmcpuaml_mesonm6firmwarearc_powermmc.c找到:

MMC_Wr(PUB_DSGCR_ADDR,MMC_Rd(PUB_DSGCR_ADDR)&0xffffffef);

在后边添加代码:

if(v_mmc_ddr_ctrl&(1<<7)){

MMC_Wr(PUB_DX2GCR_ADDR,MMC_Rd(PUB_DX2GCR_ADDR)&0xfffffffe);

MMC_Wr(PUB_DX3GCR_ADDR,MMC_Rd(PUB_DX3GCR_ADDR)&0xfffffffe);

}

发布评论

评论列表 (0)

  1. 暂无评论