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

📄 sdram.c

📁 TI公司TMS320VC5509的外设驱动程序
💻 C
字号:
/*
 *  Copyright (C) 2001, Spectrum Digital, Inc.  All Rights Reserved.
 */
 
#define SDRAM8_DPAT   0xffffffff

unsigned long data_pattern_table[] = { 0x00000000, 0xffffffff, 0xaaaaaaaa, 0x55555555 };

/*
   This memory test does the following:
     1. check the range, error 1
     2. fill range with all 0's
     3. verfiy the fill, error 2
     4. fill range with all 0xffff's
     5. verfiy the fill, error 3
     6. fill range with all 0xaaaa's
     7. verfiy the fill, error 4
     8. fill range with all 05555's
     9. verfiy the fill, error 5
*/

unsigned long SDRAM_FillTest(unsigned long begin_add,
                        unsigned long end_add,
                        unsigned long bit_pattern)
{
    volatile unsigned long *save_ptr;
    volatile unsigned long loop_cnt;
    volatile unsigned long loop_save;
    volatile unsigned long *addr_ptr;
    volatile unsigned long read_back;
    volatile unsigned long save_add, addr;  

    /* save the start addr */
    save_add = begin_add;
    addr = begin_add;

    loop_cnt = ((end_add - begin_add) >> 1) - 1;
    loop_save = loop_cnt;

    /* Write the pattern */
    do
    {
        addr_ptr = (unsigned long *)addr;
        *addr_ptr = bit_pattern;	  /* fill with pattern */
        addr += 2;
    } while( loop_cnt-- );


    addr = save_add;		     /* get start again */
    loop_cnt = loop_save;

    do
    {
        addr_ptr = (unsigned long *)addr;
        read_back = *addr_ptr;
        bit_pattern &=  SDRAM8_DPAT;
        read_back   &= SDRAM8_DPAT;     
        if ( read_back!= bit_pattern)      /* verify pattern */
        {
            read_back = read_back;
            return( read_back );    /* show error */
        }
        addr += 2;
    } while( loop_cnt--);

    return((unsigned long)0);             /* show no error */
}


unsigned long SDRAM_AddrTest(unsigned long begin_add, unsigned long stop_add)
{
    volatile unsigned long save_ptr;
    volatile unsigned long loop_cnt;
    volatile unsigned long loop_save;
    volatile unsigned long *paddr;
    volatile unsigned long read_back;
    volatile unsigned long save_add, addr;

    loop_cnt = (((stop_add) - (begin_add)) >> 1) - 1;
    loop_save= loop_cnt;
    addr = begin_add;

    save_add = begin_add;
    do
    {
        paddr = (unsigned long *)addr;
        *paddr = addr;  /* fill with address */
        addr += 2;
    } while( loop_cnt-- );

    addr  = save_add;		     /* get start again */
    loop_cnt= loop_save;

    do
    {
        paddr = (unsigned long *)addr;
        read_back = *paddr;
        read_back &= SDRAM8_DPAT;   
        if ( read_back != ( (addr) & SDRAM8_DPAT) ) /* verify data */
        {
            read_back = read_back;
            return( (unsigned long )addr );	 /* show error */
        }
        addr += 2;
    } while( loop_cnt-- );
  
    addr = save_add;		  /* get start again */
    loop_cnt= loop_save;

    do
    {
        paddr = (unsigned long *)addr;
        *paddr = ~addr;  /* fill with inverted address */
        addr += 2;
    } while( loop_cnt-- );

    addr = save_add; /* get start again */
    loop_cnt = loop_save;

    do
    {
        paddr = (unsigned long *)addr;
        read_back = *paddr;
        read_back &= SDRAM8_DPAT ;  
        if ( read_back != (~addr & SDRAM8_DPAT) ) /* verify data */
        {
            return( (unsigned long )addr);	/* show error */
        }
        addr += 2;
    } while( loop_cnt-- );
  
    return((unsigned long)0);              /* show no error */
}

unsigned short SDRAM_Test()
{
    unsigned long mem_error, start_add, end_add, j;
    
    // Set up test range
    start_add = 0x40000;
    end_add = 0x200000;

    // Test the address range
    mem_error = SDRAM_AddrTest(start_add, end_add);
    if (mem_error)
        return /*mem_error*/1;	 /* show error */

    // Fill with values from pattern table
    for (j = 0; j < (sizeof(data_pattern_table)/sizeof(unsigned long)); j++)
    {
        mem_error = SDRAM_FillTest(start_add, end_add, data_pattern_table[j]);
	    if (mem_error)
	        return /*mem_error*/1;   /* show error */
    }

    return 0;
}

⌨️ 快捷键说明

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