📄 sdctrl.inc
字号:
//
// FILE
// sdctrl.inc
//
// DESCRIPTION
// SDRAM related
//
#include "regdef.h"
#include "gpio.h"
#include "config.h"
#include "regmapa.h"
#include "user_init.h"
//#define PROBE_SDRAM
/*
** SDRAM interface setup
*/
#include "sdctrl.h"
//#define SPCA728_720_TIMING
#ifdef SDRAM_BUS_32BITS
#define SDRAM_USE_K4S161622
#else
#define SDRAM_USE_K4S641632
#endif
//#define SDRAM_USE_720
//#define SDRAM_USE_MAX
// 16MB
#ifdef SDRAM_USE_K4S161622 // K4S161622D-TC/L60 CL=3
#define nRAS 7 // tRAS
#define nRC 10 // tRC
#define nMRD 2 //
#define nRFC 10 // use tRC
#define nRCD 3 // tRCD
#define nRP 3 // tRP
#define nRRD 2 // tRRD
#define nWR 2 // tRDL
#define nCL 3 // CAS latency
#endif
// SLOWER
#ifdef SDRAM_USE_SLOWER // slower
#define nRAS 8 // tRAS
#define nRC 11 // tRC
#define nMRD 2 //
#define nRFC 11 // (tRC)
#define nRCD 4 // tRCD
#define nRP 3 // tRP
#define nRRD 2 // tRRD
#define nWR 2 // tRDL
#define nCL 3 // CAS latency
#endif
#ifdef SDRAM_USE_K4S641632 // K4S641632F-75 CL=3
#define FSYS 1215 // in 0.1MHz
#define TRAS 450 // in 0.1ns scale
#define TRCD 200 // in 0.1ns scale
#define TRC 650 // in 0.1ns scale
#define TRP 200 // in 0.1ns scale
#define TCYC (100000/FSYS) // in 0.1ns
// cal
#define nRASv (TRAS+TCYC-1)/TCYC
#define nRCDv (TRCD+TCYC-1)/TCYC
#define nRCv (TRC+TCYC-1)/TCYC
#define nRPv (TRP+TCYC-1)/TCYC
// setup
#define nRAS nRASv
#define nRC nRCv
#define nMRD 2
#define nRFC nRC
#define nRCD nRCDv // 2 2
#define nRP nRPv // 2 2
#define nRRD 2 // 1 2
#define nWR 2 // 2 2
#define nCL 3 // 2 3
#endif
// spca720 style
#ifdef SDRAM_USE_720
// this table is in unit of cycle, actual writing value will be (n-1)
// // 720 DEF
#define nRAS 4 // 4 5
#define nRC 5 // 5 7
#define nMRD 2 // 2 2
#define nRFC 5 // 5 7
#define nRCD 2 // 2 2
#define nRP 2 // 2 2
#define nRRD 1 // 1 2
#define nWR 2 // 2 2
#define nCL 2 // 2 3
#endif
// around 148
#if 0
// this table is in unit of cycle, actual writing value will be (n-1)
// // 720 DEF
#define nRAS 7 // 4 5
#define nRC 8 // 5 7
#define nMRD 2 // 2 2
#define nRFC 8 // 5 7
#define nRCD 2 // 2 2
#define nRP 2 // 2 2
#define nRRD 2 // 1 2
#define nWR 2 // 2 2
#define nCL 3 // 2 3
#endif
// maximum
#ifdef SDRAM_USE_MAX
// this table is in unit of cycle, actual writing value will be (n-1)
// // 720 DEF MAX
#define nRAS 8 // 4 5 8
#define nRC 9 // 5 7 10
#define nMRD 2 // 2 2 2
#define nRFC 9 // 5 7 10
#define nRCD 4 // 2 2 4
#define nRP 2 // 2 2 2
#define nRRD 2 // 1 2 2
#define nWR 2 // 2 2 2
#define nCL 3 // 2 3 3
#endif
// check SDRAM timing limit
#if nRAS>8
#error SDRAM timing nRAS<=8
#endif
#if nRCD>4
#error SDRAM timing nRCD<=4
#endif
// CFG0 (default 0x023c)
#define SDCTRL_CFG0_VAL_0 SDCTRL_CFG0_RAS(nRAS) \
| SDCTRL_CFG0_RC(nRC) \
| SDCTRL_CFG0_MRD(nMRD)
#define SDCTRL_CFG0_VAL_SET SDCTRL_CFG0_VAL_0
// CFG1 (default 0x59A7)
#define SDCTRL_CFG1_VAL_0 SDCTRL_CFG1_RFC(nRFC) \
| SDCTRL_CFG1_RCD(nRCD) \
| SDCTRL_CFG1_RP(nRP) \
| SDCTRL_CFG1_RRD(nRRD) \
| SDCTRL_CFG1_WR(nWR)
#define SDCTRL_CFG1_VAL_1 SDCTRL_CFG1_CL(nCL)
#define SDCTRL_CFG1_VAL_SET SDCTRL_CFG1_VAL_0 | SDCTRL_CFG1_VAL_1
// CFG2 (default 0x0037)
#define SDCTRL_CFG2_VAL_0 SDCTRL_CFG2_BL_8 \
| SDCTRL_CFG2_BT_SEQUENTIAL \
| SDCTRL_CFG2_OP_NORMAL \
| SDCTRL_CFG2_BE_PROGRAMMED
#if (nCL==2)
#define SDCTRL_CFG2_VAL_1 SDCTRL_CFG2_CL_2
#else
#define SDCTRL_CFG2_VAL_1 SDCTRL_CFG2_CL_3
#endif
#define SDCTRL_CFG2_VAL_SET SDCTRL_CFG2_VAL_0 | SDCTRL_CFG2_VAL_1
// CFG3
#define SDCTRL_CFG3_VAL_0 (SDCTRL_CFG3_CKE_EN | SDCTRL_CFG3_PRERAS_EN | SDCTRL_CFG3_BURST_8)
#ifdef SDRAM_BUS_32BITS
#define SDCTRL_CFG3_VAL_1 SDCTRL_CFG3_INF_32B
#else
#define SDCTRL_CFG3_VAL_1 SDCTRL_CFG3_INF_16B
#endif
#define SDCTRL_CFG3_VAL_DEF (SDCTRL_CFG3_VAL_0 | SDCTRL_CFG3_VAL_1) // when using probing
#ifdef SDRAM_1PCS
#define SDCTRL_CFG3_VAL_2 (SDCTRL_CFG3_1PS)
#else
#define SDCTRL_CFG3_VAL_2 (SDCTRL_CFG3_2PS)
#endif
#define SDCTRL_CFG3_VAL_SET (SDCTRL_CFG3_VAL_0 | SDCTRL_CFG3_VAL_1 | SDCTRL_CFG3_VAL_2)
// CFG4
#define SDCTRL_CFG4_VAL_16M (SDCTRL_CFG4_CW(7) | SDCTRL_CFG4_RW(10) | SDCTRL_CFG4_PALL(10) | SDCTRL_CFG4_BANK4(0))
#define SDCTRL_CFG4_VAL_64M (SDCTRL_CFG4_CW(7) | SDCTRL_CFG4_RW(11) | SDCTRL_CFG4_PALL(10) | SDCTRL_CFG4_BANK4(1))
#define SDCTRL_CFG4_VAL_128M (SDCTRL_CFG4_CW(8) | SDCTRL_CFG4_RW(12) | SDCTRL_CFG4_PALL(10) | SDCTRL_CFG4_BANK4(1))
#define SDCTRL_CFG4_VAL_256M (SDCTRL_CFG4_CW(8) | SDCTRL_CFG4_RW(12) | SDCTRL_CFG4_PALL(10) | SDCTRL_CFG4_BANK4(1))
#define SDCTRL_CFG4_VAL_SET SDCTRL_CFG4_VAL_16M
// SREF
#define SDCTRL_SREF_VAL_SET SDCTRL_SREF_SEL(1) // 63 cycle
// AREF
#define SDCTRL_AREF1_VAL_SET (SDCTRL_AREF1_ENABLE \
| SDCTRL_AREF1_AUTOREF \
| SDCTRL_AREF1_REFCNT(4) \
| SDCTRL_AREF1_SEL(AREF1_SEL(SDCLK,4)) )
//
// override previous definition CFG0/1/2 for 720 mode configuration
//
#ifdef SPCA728_720_TIMING
#undef SDCTRL_CFG0_VAL_SET
#undef SDCTRL_CFG1_VAL_SET
#undef SDCTRL_CFG2_VAL_SET
#define SDCTRL_CFG0_VAL_SET SDCTRL_CFG0_VAL_720
#define SDCTRL_CFG1_VAL_SET SDCTRL_CFG1_VAL_720
#define SDCTRL_CFG2_VAL_SET SDCTRL_CFG2_VAL_720
#endif
.text
.global set_sdram_timing
.global set_sdram_timing_low
.global setup_sdctrl
.global setup_sdctrl_sref
.text
//
// FUNCTION
// setup_sdctrl()
//
// Setup SDRAM controller
//
.ent setup_sdctrl
setup_sdctrl:
#ifdef FIX_SDRAM_BOOTING_PROBLEM
li t0, 0
sw t0, RF_SDC_REQ_T_RESET(s6)
WAIT(0x400)
#endif
// configure sdram timing
li t0, SDCTRL_CFG0_VAL_SET
li t1, SDCTRL_CFG1_VAL_SET
li t2, SDCTRL_CFG2_VAL_SET
sw t0, RF_SDCTRL_CFG0(s6)
sw t1, RF_SDCTRL_CFG1(s6)
sw t2, RF_SDCTRL_CFG2(s6)
li t1, SDCTRL_SREF_VAL_SET
sw t1, RF_SDCTRL_SREF_CFG(s6)
li t1, SDCTRL_AREF1_VAL_SET
sw t1, RF_SDCTRL_AREF1_CFG(s6)
// CFG3: configure sdram interface
li t3, SDCTRL_CFG3_VAL_SET
sw t3, RF_SDCTRL_CFG3(s6)
// write sdram mrs
WRITESTAMP(STAMP_SDRAM_MRS)
li t1, 1
sw t1, RF_SDCTRL_MRS(s6) // write MRS
// wait MRS
WAIT(0x4000)
// return
jr ra
.end setup_sdctrl
//
// FUNCTION
// setup_sdctrl_sref()
//
.ent setup_sdctrl_sref
setup_sdctrl_sref:
li t1, SDCTRL_SREF_SEL(100)
sw t1, RF_SDCTRL_SREF_CFG(s6)
li t1, SDCTRL_AREF1_ENABLE|SDCTRL_AREF1_SELFREF|SDCTRL_AREF1_REFCNT(4)|SDCTRL_AREF1_SEL(200)
sw t1, RF_SDCTRL_AREF1_CFG(s6)
jr ra
.end setup_sdctrl_sref
//
// FUNCTION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -