我使用的是AM3359的板子,移植好uboot,运行起来停在—Hit any key to stop autoboot: 1—这个地方
串口输入没有反应,也不能自动加载uboot运行下去
Yaoming Qin:
请问您是自己做的板子么?内存部分移植过么
ethan han:
回复 Yaoming Qin:
AM3359 的板子 DDR3的内存 ,内存你部分自己修改了一部分 ,但不知道是不是完全对的 主要修改了\arch\arm\include\asm\arch-ti81xx 里的ddr_defs.h 里寄存器
#define EMIF_READ_LATENCY 0x06 //RD = (CL + 2) -1#define EMIF_TIM1 0x0888C4A4#define EMIF_TIM2 0x3C427FE3#define EMIF_TIM3 0x510F83FF#define EMIF_SDCFG 0x61C04B32#define EMIF_SDREF 0x0000093B#define DDR2_DLL_LOCK_DIFF 0x0#define DDR2_RD_DQS 0x12#define DDR2_PHY_FIFO_WE 0x80
Yaoming Qin:
回复 ethan han:
DDR3 需要做softwware leveling, 具体请参考 http://processors.wiki.ti.com/index.php/AM335x_EMIF_Configuration_tips http://processors.wiki.ti.com/index.php/AM335x_DDR_PHY_register_configuration_for_DDR3_using_Software_Leveling
ethan han:
回复 Yaoming Qin:
谢谢了
能不能给具体解释一下啊 我之前用GEL 文件测试过DDR3 , CCS测试是通过 ,上面寄存器的值也是和gel文件一致的 ,我对比过自己的硬件设计 ,也是对的
请具体说明一下吧 另外能留个联系方式吗 以后直接和你咨询下
Gary Wu:
回复 ethan han:
关于DDR3的leveling,也可参考如下链接http://www.deyisupport.com/question_answer/f/25/t/17684.aspx
ethan han:
回复 Gary Wu:
根据TI的文档 ,已经做了software leveling,
也得出了寄存器的值
***************************************************************
[CortxA8] DATA_PHY_RD_DQS_SLAVE_RATIO 0x072 | 0x004 | 0x03b | 0x06e
[CortxA8] DATA_PHY_FIFO_WE_SLAVE_RATIO 0x14b | 0x000 | 0x0a5 | 0x14b
[CortxA8] DATA_PHY_WR_DQS_SLAVE_RATIO 0x072 | 0x002 | 0x03a | 0x070
[CortxA8] DATA_PHY_WR_DATA_SLAVE_RATIO 0x0ae | 0x03e | 0x076 | 0x070
[CortxA8] ***************************************************************
[CortxA8] rd_dqs_range = 0
[CortxA8] fifo_we_range = 0
[CortxA8] wr_dqs_range = 2
[CortxA8] wr_data_range = 2
[CortxA8]
[CortxA8] Optimal values have been found!!
[CortxA8]
[CortxA8] ***************************************************************
[CortxA8] The Slave Ratio Search Program Values are…
[CortxA8] ***************************************************************
[CortxA8] PARAMETER MAX | MIN | OPTIMUM | RANGE
[CortxA8] ***************************************************************
[CortxA8] DATA_PHY_RD_DQS_SLAVE_RATIO 0x072 | 0x004 | 0x03b | 0x06e
[CortxA8] DATA_PHY_FIFO_WE_SLAVE_RATIO 0x14b | 0x000 | 0x0a5 | 0x14b
[CortxA8] DATA_PHY_WR_DQS_SLAVE_RATIO 0x072 | 0x002 | 0x03a | 0x070
[CortxA8] DATA_PHY_WR_DATA_SLAVE_RATIO 0x0ae | 0x03e | 0x076 | 0x070
[CortxA8] ***************************************************************
[CortxA8]
[CortxA8] ===== END OF TEST =====
修改以后的寄存器如下
#define EMIF_READ_LATENCY 0x06 //RD = (CL + 2) -1
#define EMIF_TIM1 0x0888A39B
#define EMIF_TIM2 0x3C427FDA
#define EMIF_TIM3 0x501F830F
#define EMIF_SDCFG 0x61C04AB2
#define EMIF_SDREF 0x0000093B
#define DDR2_DLL_LOCK_DIFF 0x4
#define DDR2_RD_DQS 0x3B
#define DDR2_PHY_FIFO_WE 0xA5
还是运行不下去啊,,, 还有哪些文件需要修改吗
Yaoming Qin:
回复 ethan han:
1. 查下VTT供电和VREF供电的layout
2. 请问您选用的一片ddr还是两片ddr
3. 麻烦把ratio speed的那个excel发上来看看
谢谢!
ethan han:
回复 Yaoming Qin:
查看了一下 DDR3的1.5V VTT 电源都在正常范围内 纹波也很小 DDR3我使用的是1片: 16bit ,256Mbytes
附件是我从ti的网站上下载的文件 ,
谢谢
Yaoming Qin:
回复 ethan han:
你能把根据你的板子设置的excel文件上传么
ethan han:
回复 Yaoming Qin:
附件是 计算寄存器值的 excel
另外,请教一下啊:board/ti/evm.c的文件中,配置DDR3的部分,是这部分函数吧
static void config_am335x_ddr3(void){ enable_ddr3_clocks();
config_vtp();
phy_config_cmd(); phy_config_data();
/* set IO control registers */ writel(DDR3_IOCTRL_VALUE, DDR_CMD0_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_CMD1_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_CMD2_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_DATA0_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_DATA1_IOCTRL);
/* IOs set for DDR3 */ writel(readl(DDR_IO_CTRL) & MDDR_SEL_DDR2, DDR_IO_CTRL); /* CKE controlled by EMIF/DDR_PHY */ writel(readl(DDR_CKE_CTRL) | CKE_NORMAL_OP, DDR_CKE_CTRL);
config_emif_ddr3();
调用的是
enable_ddr3_clocks();
config_vtp();
phy_config_cmd(); phy_config_data();
config_emif_ddr3(); 这5个子函数
Static void Data_Macro_Config_ddr2(int dataMacroNum)这个函数是设置DDR2使用的吧,
可怎么看DDR3配置的补丁文件里,提到还是要修改这个函数的
#define CFG_REG 0x10@@ -155,39 +161,121 @@ void dram_init_banksize (void) #ifdef CONFIG_SPL_BUILD static void Data_Macro_Config_ddr2(int dataMacroNum) {- u32 BaseAddrOffset = 0x00;;– if (dataMacroNum == 1)- BaseAddrOffset = 0xA4;– writel(((DDR2_RD_DQS<<30)|(DDR2_RD_DQS<<20)- |(DDR2_RD_DQS<<10)|(DDR2_RD_DQS<<0)),- (DATA0_RD_DQS_SLAVE_RATIO_0 + BaseAddrOffset));- writel(DDR2_RD_DQS>>2, (DATA0_RD_DQS_SLAVE_RATIO_1 + BaseAddrOffset));- writel(((DDR2_WR_DQS<<30)|(DDR2_WR_DQS<<20)- |(DDR2_WR_DQS<<10)|(DDR2_WR_DQS<<0)),- (DATA0_WR_DQS_SLAVE_RATIO_0 + BaseAddrOffset));- writel(DDR2_WR_DQS>>2, (DATA0_WR_DQS_SLAVE_RATIO_1 + BaseAddrOffset));- writel(((DDR2_PHY_WRLVL<<30)|(DDR2_PHY_WRLVL<<20)- |(DDR2_PHY_WRLVL<<10)|(DDR2_PHY_WRLVL<<0)),- (DATA0_WRLVL_INIT_RATIO_0 + BaseAddrOffset));- writel(DDR2_PHY_WRLVL>>2, (DATA0_WRLVL_INIT_RATIO_1 + BaseAddrOffset));- writel(((DDR2_PHY_GATELVL<<30)|(DDR2_PHY_GATELVL<<20)- |(DDR2_PHY_GATELVL<<10)|(DDR2_PHY_GATELVL<<0)),- (DATA0_GATELVL_INIT_RATIO_0 + BaseAddrOffset));- writel(DDR2_PHY_GATELVL>>2, (DATA0_GATELVL_INIT_RATIO_1 + BaseAddrOffset));- writel(((DDR2_PHY_FIFO_WE<<30)|(DDR2_PHY_FIFO_WE<<20)- |(DDR2_PHY_FIFO_WE<<10)|(DDR2_PHY_FIFO_WE<<0)),- (DATA0_FIFO_WE_SLAVE_RATIO_0 + BaseAddrOffset));- writel(DDR2_PHY_FIFO_WE>>2,- (DATA0_FIFO_WE_SLAVE_RATIO_1 + BaseAddrOffset));- writel(((DDR2_PHY_WR_DATA<<30)|(DDR2_PHY_WR_DATA<<20)- |(DDR2_PHY_WR_DATA<<10)|(DDR2_PHY_WR_DATA<<0)),- (DATA0_WR_DATA_SLAVE_RATIO_0 + BaseAddrOffset));- writel(DDR2_PHY_WR_DATA>>2,- (DATA0_WR_DATA_SLAVE_RATIO_1 + BaseAddrOffset));- writel(DDR2_PHY_DLL_LOCK_DIFF,- (DATA0_DLL_LOCK_DIFF_0 + BaseAddrOffset));+ u32 BaseAddrOffset = 0x00;;++ if (dataMacroNum == 1)+ BaseAddrOffset = 0xA4;++ writel(((DDR2_RD_DQS<<30)|(DDR2_RD_DQS<<20)+ |(DDR2_RD_DQS<<10)|(DDR2_RD_DQS<<0)),+ (DATA0_RD_DQS_SLAVE_RATIO_0 + BaseAddrOffset));+ writel(DDR2_RD_DQS>>2, (DATA0_RD_DQS_SLAVE_RATIO_1 + BaseAddrOffset));+ writel(((DDR2_WR_DQS<<30)|(DDR2_WR_DQS<<20)+ |(DDR2_WR_DQS<<10)|(DDR2_WR_DQS<<0)),+ (DATA0_WR_DQS_SLAVE_RATIO_0 + BaseAddrOffset));+ writel(DDR2_WR_DQS>>2, (DATA0_WR_DQS_SLAVE_RATIO_1 + BaseAddrOffset));+ writel(((DDR2_PHY_WRLVL<<30)|(DDR2_PHY_WRLVL<<20)+ |(DDR2_PHY_WRLVL<<10)|(DDR2_PHY_WRLVL<<0)),+ (DATA0_WRLVL_INIT_RATIO_0 + BaseAddrOffset));+ writel(DDR2_PHY_WRLVL>>2, (DATA0_WRLVL_INIT_RATIO_1 + BaseAddrOffset));+ writel(((DDR2_PHY_GATELVL<<30)|(DDR2_PHY_GATELVL<<20)+ |(DDR2_PHY_GATELVL<<10)|(DDR2_PHY_GATELVL<<0)),+ (DATA0_GATELVL_INIT_RATIO_0 + BaseAddrOffset));+ writel(DDR2_PHY_GATELVL>>2,+ (DATA0_GATELVL_INIT_RATIO_1 + BaseAddrOffset));+ writel(((DDR2_PHY_FIFO_WE<<30)|(DDR2_PHY_FIFO_WE<<20)+ |(DDR2_PHY_FIFO_WE<<10)|(DDR2_PHY_FIFO_WE<<0)),+ (DATA0_FIFO_WE_SLAVE_RATIO_0 + BaseAddrOffset));+ writel(DDR2_PHY_FIFO_WE>>2,+ (DATA0_FIFO_WE_SLAVE_RATIO_1 + BaseAddrOffset));+ writel(((DDR2_PHY_WR_DATA<<30)|(DDR2_PHY_WR_DATA<<20)+ |(DDR2_PHY_WR_DATA<<10)|(DDR2_PHY_WR_DATA<<0)),+ (DATA0_WR_DATA_SLAVE_RATIO_0 + BaseAddrOffset));+ writel(DDR2_PHY_WR_DATA>>2,+ (DATA0_WR_DATA_SLAVE_RATIO_1 + BaseAddrOffset));+ writel(DDR2_PHY_DLL_LOCK_DIFF,+ (DATA0_DLL_LOCK_DIFF_0 + BaseAddrOffset));+}