各位专家好
我们在一家公司做毕设,主板是公司自己设计的,使用的是AM3505的处理器,搭载一片32M SDRAM, 型号是IS43DR16160A-5BBLI,我们自己写了初始化该内存的代码,但是好像不能工作,调试的时候代码不能下载到内存中, 实在是找不出哪里有问题了,以下是我的内存初始化代码,求各位专家指正。附件里有内存的datasheet
# Configure EMIF to Access Micron DDR2
#Step1: Setup DDR PHY control registers
0x6D0000E4 = 0x04 #DDR_PHY_CTRL_1
0x6D0000E8 = 0x04 #DDR_PHY_CTRL_1_SHDW
0x6D0000EC = 0x0 # DDR_PHY_CTRL_2
# Step2: Reset the PHY (using IODFT_TLGC) and wait till complete
0x6D000060 = 0x2411 #IODFT_TLGC
sleep 20
#Step3: Configure EMIF
#3.1 Setup timing registers (SDRAM_TIM_xxx)
0x6D000018 = 0x04447289 #SDRAM_TIM_1
0x6D00001C = 0x04447289 #SDRAM_TIM_1_SHDW
0x6D000020 = 0x141031CA #SDRAM_TIM_2
0x6D000024 = 0x141031CA #SDRAM_TIM_2_SHDW
0x6D000028 = 0xE7 #SDRAM_TIM_3
0x6D00002C = 0xE7 #SDRAM_TIM_3_SHDW
#3.2 Setup Power control reg (PWR_MGMT_CTRL)
0x6D000038 = 0x80000000 #PWR_MGMT_CTRL
0x6D00003C = 0x80000000 #PWR_MGMT_CTRL_SHDW
#3.3 Setup refresh rate (SDRAM_REF_CTRL)
0x6D000010 = 0x618 #SDRAM_REF_CTRL
0x6D000014 = 0x618 #SDRAM_REF_CTRL_SHDW
3.4 Setup SDRAM configuration register (SDRAM_CONFIG)
0x6D000008 = 0x40804C21 #SDRAM_CONFIG
内存的电路图如下:
Yaoming Qin:
你参考 processors.wiki.ti.com/index.php, 在对照着AM35x的technical reference manual看看,多调试下。另外,系统起不来不一定是ddr的原因。
Fangbo Xu:
回复 Yaoming Qin:
这些SDRAM的配置是我们根据这个TI的wiki(processors.wiki.ti.com/…/Setting_up_AM35x_SDRC_registers )写的,我们之前用eclipse在craneboard上调试成功过, 使用的是相同的代码,配置文件只有SDRAM的初始化不一样。您认为除了SDRAM,还有哪些因素可能导致数据不能下载到SDRAM中去呢?
以下是Jtag的配置代码:
target remote localhost:2331
# Set JTAG speed to 30 kHz
monitor speed 30
# Set GDBServer to little endian
monitor endian little
# Reset the chip to get to a known state.
monitor reset
# Disable watchdog
# enable Interface clock
monitor writeu32 0x48004C10 = 0x20
# enable functional clock
monitor writeu32 0x48004C00 = 0x20
monitor sleep 10
# Disable 32Khz watchdog timer
monitor writeu32 0x48314048 = 0x0000AAAA
monitor sleep 10
# Disable 32Khz watchdog timer
monitor writeu32 0x48314048 = 0x00005555
#Select 26MHz clock (PRM_CLKSEL_REG)
monitor writeu32 0x48306D40 = 0x03
# Set JTAG speed to 1000 kHz
monitor speed 1000
#Setup_ClockConfig_IIA
# Put DPLL into bypass
monitor writeu32 0x48004D00 = 0x00110011
monitor sleep 10
# Configure clock ratios for all L3, L4 targets
monitor writeu32 0x48004A40 = 0x032A
# /*Configure M, N and FreqSel values*/
# setDpllConfigValues(CORE_DPLL, CORE_CFG2A, *PRM_CLKSEL_REG);
# DPLL_MULT_VALUE = 332;
# DPLL_DIV_VALUE = 25;
# DPLL_FREQ_SEL_VALUE = 0x3;
# nM2Div = 1;
# lockCoreDpll(nM2Div /*in_M2Div*/);
#*CM_CLKSEL1_PLL_REG = ((in_M2Div << 27) | (DPLL_MULT_VALUE << 16) | (DPLL_DIV_VALUE << 8) | (0 << 5) | (0 << 3));
monitor writeu32 0x48004D40 = 0x094C1900
monitor writeu32 0x48004D44 = 0x00006019
monitor writeu32 0x48004D48 = 0x00000002
monitor writeu32 0x48004D00 = 0x00370037
monitor sleep 100
#Setup_MPUConfig_OPP3
# Put DPLL into bypass
# CM_CLKEN_PLL_MPU_REG
monitor writeu32 0x48004904 = 0x0015
monitor sleep 10
#/*Configure M, N and FreqSel values*/
#setDpllConfigValues(MPU_DPLL, MPU_OPP3, *PRM_CLKSEL_REG);
# DPLL_MULT_VALUE = 250;
# DPLL_DIV_VALUE = 12;
# DPLL_FREQ_SEL_VALUE = 0x7;
# nM2Div = 1;
#lockMpuDpll(nM2Div /*in_M2Div*/);
#CM_CLKSEL2_PLL_MPU_REG
monitor writeu32 0x48004944 = 0x01
#CM_CLKSEL1_PLL_MPU_REG = ((2 << 19) | (DPLL_MULT_VALUE << 8) | (DPLL_DIV_VALUE << 0));
monitor writeu32 0x48004940 = 0x0010FA0C
# CM_CLKEN_PLL_MPU_REG
monitor writeu32 0x48004904 = 0x0077
monitor sleep 100
#Configure Micron DDR2
# Changing muxmode for cke0 & cke1
monitor writeu32 0x48002264 = 0x00
# Configure EMIF to Access Micron DDR2
#Step1: Setup DDR PHY control registers
monitor writeu32 0x6D0000E4 = 0x04
monitor writeu32 0x6D0000E8 = 0x04
monitor writeu32 0x6D0000EC = 0x0
# Step2: Reset the PHY (using IODFT_TLGC) and wait till complete
monitor writeu32 0x6D000060 = 0x2411
monitor sleep 10
#Step3: Configure EMIF
#3.1 Setup timing registers (SDRAM_TIM_xxx)
monitor writeu32 0x6D000018 = 0x04447289
monitor writeu32 0x6D00001C = 0x04447289
monitor writeu32 0x6D000020 = 0x141031CA
monitor writeu32 0x6D000024 = 0x141031CA
monitor writeu32 0x6D000028 = 0xE7
monitor writeu32 0x6D00002C = 0xE7
#3.2 Setup Power control reg (PWR_MGMT_CTRL)
monitor writeu32 0x6D000038 = 0x80000000
monitor writeu32 0x6D00003C = 0x80000000
#3.3 Setup refresh rate (SDRAM_REF_CTRL)
monitor writeu32 0x6D000010 = 0x618
monitor writeu32 0x6D000014 = 0x618
#3.4 Setup SDRAM configuration register (SDRAM_CONFIG)
monitor writeu32 0x6D000008 = 0x40804C21
Yaoming Qin:
回复 Fangbo Xu:
你现在确定片子起来了么? 你当前板子是个什么状态,你打算怎么干?
Fangbo Xu:
回复 Yaoming Qin:
我先声明我想干什么:
我现在使用的是公司自己设计的主板,搭载AM3505处理器,内存大小型号已经在上面提到了。 我们的任务是负责把自己开发的内核和linux内核移植到这块板子上去。分两阶段进行,
第一阶段:移植自己的内核
第二阶段:移植linux内核
交叉编译环境我们使用的是windows7+eclipse+yagarto+Jlink
第一阶第一步,我们在craneboard上调试自己的内核,GDB初始化AM3505内存寄存器的那些值都是从TI提供的x-loader中淘出来的,调试是成功的,我们通过Jtag把我们的内核下载到SDRAM中并跑起来了。
第一阶段第二部: 在我们自己的板子上尝试(内存芯片的型号和craneboard不一样),我们根据TI wiki(processors.wiki.ti.com/…/Setting_up_AM35x_SDRC_registers )写了AM3505内存寄存器的初始化代码,jtag的配置和craneboard的配置一样,调试的时候没有数据下载到sdram中。我想应该是内存初始化出问题了。
另外请教一个问题,TI在写X-loader的时候使用什么工具来debug的。
我们现阶段使用的交叉编译环境(windows7+eclipse+yagarto+Jlink)编译不了X-loader, 需要改动的地方太多了, 更别说调试了,我想请教一下,通过Jlink有没有可能在linux下debug x-loader? 如果可以,您能不能把相关文档发给我们?先感谢了。
Fangbo Xu:
回复 Fangbo Xu:
我把详细的文档列在一下网址了,供大家参考
sites.google.com/…/2012-04-15
Jian Feng1:
回复 Fangbo Xu:
你好 我也是用的ISSI的DDR2 现在也是DDR2有问题,能跟你交流一下吗
Fangbo Xu:
回复 Jian Feng1:
没问题,发邮件到我的邮箱xufangbox@gmail.com
Fangbo Xu:
回复 Jian Feng1:
没问题,发邮件到我的邮箱xufangbox@gmail.com