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

📄 ex_mem02_sample.c

📁 oki67500系列arm工程例程源代码
💻 C
字号:
/**********************************************************************************/
/*                                                                                */
/*    Copyright (C) 2003 Oki Electric Industry Co., LTD.                          */
/*                                                                                */
/*    System Name    :  ML675001 series                                           */
/*    Module Name    :  Connection with external DRAM                             */
/*    File   Name    :  ext_mem2_sample.c                                         */
/*    Revision       :  01.00                                                     */
/*    Date           :  2003/08/18                                                */
/*                                                                                */
/**********************************************************************************/
#include "ML675001.h"
#include "common.h"
#include "cache.h"

/* CONSTANTS */
#define DRAM_BASE   (0xC0000000)    /* base address of external SDRAM */
#define DRAM_SIZE   (0x800000) /* size of external SDRAM : 8Mbyte */
#define DRAM_TOP    ((void*)(DRAM_BASE+DRAM_SIZE))  /* top address of
                                                       external SDRAM */

/* FUNCTIONS */
void setup_ext_dram(void);
UHWORD read_write_check(void);
UHWORD read_write_check_byte(void);
UHWORD read_write_check_hword(void);
UHWORD read_write_check_word(void);
UHWORD read_check(void);
void dram_command(UWORD command);

const UHWORD LED_PATTERN[16] = {0x3F, 0x06, 0x5B, 0x4F, /* 0, 1, 2, 3, */
                                0x66, 0x6D, 0x7D, 0x27, /* 4, 5, 6, 7, */
                                0x7F, 0x7C, 0x6F, 0x77, /* 8, b, 9, A, */
                                0x39, 0x5E, 0x79, 0x71};/* C, d, E, F  */

/****************************************************************************/
/*  Entry point                                                             */
/*  Function : main                                                         */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   0                                                   */
/****************************************************************************/
int main(void)
{
    UHWORD led_pattern;

    init_cache();  /* Initialize CACHE memory */
    cache_on(CACHE_BANK0);  /* Bank0 : Cache enable */

    /* LED on */
    init_led();    /* output mode */
    led_on(LED_START_PATTERN);

    setup_ext_dram();   /* set up external DRAM */

    /* read/write check */
    if((led_pattern = read_write_check()) != LED_NORMAL_END_PATTERN){
        led_on(led_pattern);
        return 0;
    }

    /* all bank pre-charge */
    dram_command(DCMD_S_PALL);

    /* read check */
    if((led_pattern = read_check()) != LED_NORMAL_END_PATTERN){
        led_on(led_pattern);
    }else{
        led_on(LED_NORMAL_END_PATTERN); /* light led normal end pattern */
    }
    
    return 0;
}

/****************************************************************************/
/*  Setup of external DRAM                                                  */
/*  Function : setup_ext_dram                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void setup_ext_dram(void)
{
    int i;

    /* wait 200us (for HCLK:33MHz) */
    /* DBWC has to be set more than 200us after power was turned on. */
    /* please modify loop counts to suit your system. */
    /* -- HCLK : 60MHz --     */
    /* 2414  = 1328 * (60/33) */
    /* 0x96E =                */
    for(i=0; i<0x96E; i++)
        ;

    /* DRAM refresh cycle control register0,1 (RFSH0@0x7818_0014,RFSH1@0x7818_001C) */
    /* refresh cycle = 64KHz * 1 = 64KHz */
    put_wvalue(RFSH0, RFSH0_SINGLE);  /* magnification = 1 */
    put_wvalue(RFSH1, 0x0202);  /* cycle = 64KHz */

    /* DRAM bus width control register (DBWC@0x7818_0000) */
    put_wvalue(DBWC, DBWC_DBDRAM16);   /* bus width : 16bits */

    /* DRAM parameter control register (DRPC@0x7818_0008) */
    put_wvalue(DRPC, 0x9);

    /* all bank pre-charge */
    put_wvalue(DCMD, DCMD_S_PALL);

    /* CBR * 8 */
    for(i=0; i<8; i++)
        put_wvalue(DCMD, DCMD_S_REF);

    /* DRAM control register (DRMC@0x7818_0004) */
    put_wvalue(DRMC, DRMC_8bit|DRMC_SDRAM   /* AMUX:8bit, ARCH:SDRAM, */
                    |DRMC_2CLK|DRMC_PD_DIS  /* prelat:2clock, PDWN:disable, */
                    |DRMC_CBR_EXE);         /* CBR:execute */

    /* SDRAM mode register (SDMD@0x7818_000C) */
    put_wvalue(SDMD, SDMD_CL2|SDMD_MODEWR); /* CL-2
                                               only when MODEWR bit is written as 1,
                                               mode setup is performed. */

    /* DRAM power down mode control register (PDWC@0x7818_0018) */
    put_wvalue(PDWC, PDWC_16);  /* when 16 or more cycles of idol state continue,
                                   it shifts to power down mode.
                                   but automatic shifting to SDRAM power down mode
                                   is disable */

    return;
}

/****************************************************************************/
/*  Write data to all the ranges of external DRAM and                       */
/*  values of all the ranges of external DRAM is read and compared.         */
/*  Write patterns are '00', '55', 'AA' and 'FF'.                           */
/*  Read/Write sizes are 8bits, 16bits and 32bits.                          */
/*  Function : read_write_check                                             */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   LED pattern                                         */
/*                              0 -> Narmal end.                            */
/*                         others -> Error occurred                         */
/****************************************************************************/
UHWORD read_write_check(void)
{
    UHWORD led_pattern;

    /* BYTE access check */
    if((led_pattern = read_write_check_byte()) != LED_NORMAL_END_PATTERN){
        return led_pattern;
    }
    /* HWORD access check */
    else if((led_pattern = read_write_check_hword()) != LED_NORMAL_END_PATTERN){
        return led_pattern;
    }
    /* WORD access check */
    else if((led_pattern = read_write_check_word()) != LED_NORMAL_END_PATTERN){
        return led_pattern;
    }

    return led_pattern; /* led_pattern == LED_NORMAL_END_PATTERN */
}

/****************************************************************************/
/*  Write data to all the ranges of external DRAM and                       */
/*  values of all the ranges of external DRAM is read and compared.         */
/*  Write patterns are '00', '55', 'AA' and 'FF'.                           */
/*  Read/Write size is 8bits.                                               */
/*  Function : read_write_check_byte                                        */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   LED pattern                                         */
/*                              0 -> Narmal end.                            */
/*                         others -> Error occurred                         */
/****************************************************************************/
UHWORD read_write_check_byte(void)
{
    int i;
    UBYTE write_pattern[] = {0x00, 0x55, 0xAA, 0xFF};   /* writing patterns */
    UBYTE *address;  /* read/write address */

    for(i=0; i<4; i++){
        /* write data to all region of external DRAM */
        for(address=(UBYTE*)DRAM_BASE; address<(UBYTE*)DRAM_TOP; address++){
            put_value(address, write_pattern[i]);
        }
        /* check data of all region of external DRAM */
        for(address=(UBYTE*)DRAM_BASE; address<(UBYTE*)DRAM_TOP; address++){
            if(get_value(address) != write_pattern[i]){ /* check data */
                /* error occurred */
                return LED_PATTERN[i];   /* return LED pattern */
            }
        }
    }

    return LED_NORMAL_END_PATTERN;
}

/****************************************************************************/
/*  Write data to all the ranges of external DRAM and                       */
/*  values of all the ranges of external DRAM is read and compared.         */
/*  Write patterns are '0000', '5555', 'AAAA' and 'FFFF'.                   */
/*  Read/Write size is 16bits.                                              */
/*  Function : read_write_check_hword                                       */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   LED pattern                                         */
/*                              0 -> Narmal end.                            */
/*                         others -> Error occurred                         */
/****************************************************************************/
UHWORD read_write_check_hword(void)
{
    int i;
    UHWORD write_pattern[] = {0x0000, 0x5555, 0xAAAA, 0xFFFF};  /* writing patterns */
    UHWORD *address;  /* read/write address */

    for(i=0; i<4; i++){
        /* write data to all region of external DRAM */
        for(address=(UHWORD*)DRAM_BASE; address<(UHWORD*)DRAM_TOP; address++){
            put_hvalue(address, write_pattern[i]);
        }
        /* check data of all region of external DRAM */
        for(address=(UHWORD*)DRAM_BASE; address<(UHWORD*)DRAM_TOP; address++){
            if(get_hvalue(address) != write_pattern[i]){    /* check data */
                /* error occurred */
                return LED_PATTERN[i+4];   /* return LED pattern */
            }
        }
    }

    return LED_NORMAL_END_PATTERN;
}

/****************************************************************************/
/*  Write data to all the ranges of external DRAM and                       */
/*  values of all the ranges of external DRAM is read and compared.         */
/*  Write patterns are '00000000', '55555555', 'AAAAAAAA' and 'FFFFFFFF'.   */
/*  Read/Write size is 32bits.                                              */
/*  Function : read_write_check_word                                        */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   LED pattern                                         */
/*                              0 -> Narmal end.                            */
/*                         others -> Error occurred                         */
/****************************************************************************/
UHWORD read_write_check_word(void)
{
    int i;
    UWORD write_pattern[] = {0x00000000, 0xFFFFFFFF, 
                             0x55555555, 0xAAAAAAAA};   /* writing patterns */
    UWORD *address;  /* read/write address */

    for(i=0; i<4; i++){
        /* write data to all region of external DRAM */
        for(address=(UWORD*)DRAM_BASE; address<(UWORD*)DRAM_TOP; address++){
            put_wvalue(address, write_pattern[i]);
        }
        /* check data of all region of external DRAM */
        for(address=(UWORD*)DRAM_BASE; address<(UWORD*)DRAM_TOP; address++){
            if(get_wvalue(address) != write_pattern[i]){    /* check data */
                /* error occurred */
                return LED_PATTERN[i+8];   /* return LED pattern */
            }
        }
    }

    return LED_NORMAL_END_PATTERN;
}

/****************************************************************************/
/*  Values of all the ranges of external DRAM is read and checked .         */
/*  Check pattern is 'AAAAAAAA'                                             */
/*  Write size is 32bits.                                                   */
/*  Function : read_check                                                   */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   LED pattern                                         */
/*                              0 -> Narmal end.                            */
/*                           0x8F -> Error occurred                         */
/****************************************************************************/
UHWORD read_check(void)
{
    UWORD check_pattern = 0xAAAAAAAA;
    UWORD *address; /* read address */

    /* check data of all region of external DRAM */
    for(address=(UWORD*)DRAM_BASE; address<(UWORD*)DRAM_TOP; address++){
        if(get_wvalue(address) != check_pattern){   /* check data */
            /* error occurred */
            return LED_PATTERN[0xC];   /* return LED pattern */
        }
    }

    return LED_NORMAL_END_PATTERN;
}

/****************************************************************************/
/*  DRAM command is issued                                                  */
/*  Function : dram_command                                                 */
/*      Parameters                                                          */
/*          Input   :   Type of command                                     */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void dram_command(UWORD command)
{
    put_wvalue(DCMD, command);  /* DRAM command is issued. */

    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -