bsp/mpc5200: Change SDRAM initialization

Change SDRAM initialization according to application note AN3221.
This commit is contained in:
Sebastian Huber
2013-04-19 14:17:09 +02:00
parent d4a4811450
commit 7a44d06c82

View File

@@ -146,9 +146,9 @@
.set ADREN_CS1_EN, (1 << (31 - 14)) .set ADREN_CS1_EN, (1 << (31 - 14))
.set ADREN_WSE, (1 << (31 - 31)) .set ADREN_WSE, (1 << (31 - 31))
.set CTRL_PRECHARGE, (1<<1) .set CTRL_PRECHARGE_ALL, (1 << (31 - 30))
.set CTRL_REFRESH, (1<<2) .set CTRL_REFRESH, (1 << (31 - 29))
.set CTRL_BA1, (1<<31) .set CTRL_MODE_EN, (1 << (31 - 0))
.set CSCONF_CE, (1<<12) .set CSCONF_CE, (1<<12)
@@ -496,6 +496,8 @@ twiddle:
#if defined(NEED_LOW_LEVEL_INIT) #if defined(NEED_LOW_LEVEL_INIT)
SDRAM_init: SDRAM_init:
mflr r12
#if defined(MPC5200_BOARD_BRS5L) #if defined(MPC5200_BOARD_BRS5L)
/* set GPIO_WKUP7 pin low for 66MHz buffering */ /* set GPIO_WKUP7 pin low for 66MHz buffering */
/* or high for 133MHz registered buffering */ /* or high for 133MHz registered buffering */
@@ -526,65 +528,116 @@ SDRAM_init:
#define SDELAY_VAL 0x00000004 #define SDELAY_VAL 0x00000004
/*
* Single Read2Read/Write delay=0xC, Single Write2Read/Prec. delay=0x4
* Read CAS latency=0x2, Active2Read delay=0x2, Prec.2active delay=0x2
*/
#define CFG1_VAL 0xC4222600
/* Refr.2No-Read delay=0x06, Write latency=0x0 */
/* Burst2Read Prec.delay=0x8, Burst Write delay=0x8 */
/* Burst Read2Write delay=0xB, Burst length=0x7, Read Tap=0x4 */
#define CFG2_VAL 0xCCC70004
#if defined(MPC5200_BOARD_BRS5L)
/* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */
/* Refresh counter=0xFFFF */
#define CTRL_VAL 0xD1470000
#else
/* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */
/* Refresh counter=0xFFFF */
#define CTRL_VAL 0xD04F0000
#endif
/* Op.Mode=0x0, Read CAS latency=0x2, Burst length=0x3, Write strobe puls */
#define MODE_VAL 0x008D0000
/* SDRAM initialization according to application note AN3221 */
/* SDRAM controller setup */
LWI r3, SDELAY_VAL LWI r3, SDELAY_VAL
stw r3, SDELAY(r31) stw r3, SDELAY(r31)
LWI r30, 0xC4222600 /* Single Read2Read/Write delay=0xC, Single Write2Read/Prec. delay=0x4 */ LWI r3, CFG1_VAL
stw r30, CFG1(r31) /* Read CAS latency=0x2, Active2Read delay=0x2, Prec.2active delay=0x2 */ stw r3, CFG1(r31)
/* Refr.2No-Read delay=0x06, Write latency=0x0 */
LWI r30, 0xCCC70004 /* Burst2Read Prec.delay=0x8, Burst Write delay=0x8 */ LWI r3, CFG2_VAL
stw r30, CFG2(r31) /* Burst Read2Write delay=0xB, Burst length=0x7, Read Tap=0x4 */ stw r3, CFG2(r31)
#ifdef MPC5200_BOARD_BRS5L LWI r11, CTRL_VAL
LWI r30, 0xD1470000 /* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */ stw r11, CTRL(r31)
stw r30, CTRL(r31) /* Refresh counter=0xFFFF */ lwz r3, CTRL(r31)
/* Perform a PRECHARGE ALL command */
ori r3, r11, CTRL_PRECHARGE_ALL
stw r3, CTRL(r31)
lwz r3, CTRL(r31)
#else /* Wait at least tRP time */
LWI r30, 0xD04F0000 /* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */ li r3, 15
stw r30, CTRL(r31) /* Refresh counter=0xFFFF */ bl ndelay
#if defined(EMODE_VAL)
/* Write EMODE register */
LWI r3, EMODE_VAL
stw r3, MOD(r31)
/* Wait at least tMRD time */
li r3, 10
bl ndelay
#endif #endif
lwz r30, CTRL(r31)
/* Write MODE register */
LWI r3, MODE_VAL
stw r3, MOD(r31)
SETBITS r30, r29, CTRL_PRECHARGE /* send two times precharge */ /* Wait at least tMRD time */
stw r30, CTRL(r31) li r3, 10
bl ndelay
/* Perform a PRECHARGE ALL command */
ori r3, r11, CTRL_PRECHARGE_ALL
stw r3, CTRL(r31)
lwz r3, CTRL(r31)
stw r30, CTRL(r31) /* Wait at least tRP time */
li r3, 15
bl ndelay
/* Perform an AUTO REFRESH */
ori r3, r11, CTRL_REFRESH
stw r3, CTRL(r31)
lwz r3, CTRL(r31)
/* Wait at least tRFC time */
li r3, 70
bl ndelay
lwz r30, CTRL(r31) /* Perform an AUTO REFRESH */
ori r3, r11, CTRL_REFRESH
stw r3, CTRL(r31)
lwz r3, CTRL(r31)
/* Wait at least tRFC time */
li r3, 70
bl ndelay
SETBITS r30, r29, CTRL_REFRESH /* send two times refresh */ #if defined(SECOND_MODE_VAL)
stw r30, CTRL(r31) /* Write MODE register */
LWI r3, SECOND_MODE_VAL
stw r3, MOD(r31)
stw r30, CTRL(r31) #endif
LWI r30, 0x008D0000 /* Op.Mode=0x0, Read CAS latency=0x2, Burst length=0x3, Write strobe puls */
stw r30, MOD(r31)
lwz r30, CTRL(r31) /* Clock enabled, Auto refresh enabled, Mem. data drv. Refresh counter=0xFFFF */
CLRBITS r30, r29, CTRL_BA1
stw r30, CTRL(r31)
/* Disable MODE register access */
lis r4, CTRL_MODE_EN@h
andc r3, r11, r4
stw r3, CTRL(r31)
lwz r3, CTRL(r31)
mtlr r12
blr blr
copy_image: copy_image:
mr r27, r28 mr r27, r28
srwi r28, r28, 2 srwi r28, r28, 2
@@ -901,3 +954,20 @@ XLB_init:
stw r30, ARBDATTO(r31) /* Set ARBDATTO */ stw r30, ARBDATTO(r31) /* Set ARBDATTO */
blr blr
ndelay:
/*
* The maximum core frequency is 396MHz.
* We have (396MHz * 1024) / 10**9 == 405.
*/
mulli r3, r3, 405
srwi. r3, r3, 10
beqlr
mtctr r3
ndelay_loop:
bdnz ndelay_loop
blr