📄 ex_mem02_sample.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 + -