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);
}