⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdctrl.inc

📁 Sunplus 8202S source code.
💻 INC
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -