185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								#include "chip_reg_base.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_bitops.h"
							 | 
						||
| 
								 | 
							
								#include "os_lock.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "ahb_rf.h"
							 | 
						||
| 
								 | 
							
								#include "sram.h"
							 | 
						||
| 
								 | 
							
								#include "ahb.h"
							 | 
						||
| 
								 | 
							
								#include "flash.h"
							 | 
						||
| 
								 | 
							
								#include "sfc.h"
							 | 
						||
| 
								 | 
							
								#include "sec_glb.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM > HW_PLATFORM_SIMU
							 | 
						||
| 
								 | 
							
								#include "dbg_io.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cache_rst() {
							 | 
						||
| 
								 | 
							
								    sec_glb_enable(SEC_GLB_EMC);
							 | 
						||
| 
								 | 
							
								    ahb_cache_disable();
							 | 
						||
| 
								 | 
							
								    flash_init(1);
							 | 
						||
| 
								 | 
							
								    ahb_cache_enable();
							 | 
						||
| 
								 | 
							
								    ahb_cache_reset();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void cache_write_read_all()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int i = 0, j = 0, k = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t wdata[0x40] = {0};
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								    int len = 0x40;
							 | 
						||
| 
								 | 
							
								    int offset = 0;
							 | 
						||
| 
								 | 
							
								    int atom = 0x10;
							 | 
						||
| 
								 | 
							
								    //int atom = 0x4000; // 16KB
							 | 
						||
| 
								 | 
							
								    int times = 0x1FFF;
							 | 
						||
| 
								 | 
							
								    // write cache
							 | 
						||
| 
								 | 
							
								    uint32_t *dcache = (uint32_t *) 0x03000000;
							 | 
						||
| 
								 | 
							
								    uint32_t *rcache = (uint32_t *) 0x03000000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for( j = 0; j < times; j++) {
							 | 
						||
| 
								 | 
							
								        // write cache
							 | 
						||
| 
								 | 
							
								        for ( i = 0; i < len; i++ ) {
							 | 
						||
| 
								 | 
							
								            wdata[i] = i;
							 | 
						||
| 
								 | 
							
								            *(dcache+offset+i) = wdata[i];
							 | 
						||
| 
								 | 
							
								            for(k=0; k< 100; k++);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // read dcache
							 | 
						||
| 
								 | 
							
								        for ( i = 0; i < len; i++ ) {
							 | 
						||
| 
								 | 
							
								            tmp = *(rcache+offset+i);
							 | 
						||
| 
								 | 
							
								            if ( tmp != wdata[i] ) {
							 | 
						||
| 
								 | 
							
								                iot_printf("dcache not equal \r\n");
							 | 
						||
| 
								 | 
							
								                iot_printf(" j : %d, i : %d\r\n", j, i);
							 | 
						||
| 
								 | 
							
								                iot_printf("addr: %08x read: %08x, write: %08x\r\n",
							 | 
						||
| 
								 | 
							
								                    0x13000000+i*4+j, tmp, wdata[i]);
							 | 
						||
| 
								 | 
							
								                return ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            for(k=0; k< 100; k++);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        offset += atom;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cache_write_read()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int i = 0, j = 0, k = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t wdata[0x50][0x10] = {0};
							 | 
						||
| 
								 | 
							
								    int len = 0x10;
							 | 
						||
| 
								 | 
							
								    int offset = 0;
							 | 
						||
| 
								 | 
							
								    int atom = 0x4000; // 16KB
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								    uint32_t ran_pos = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t *dcache = (uint32_t *) 0x13000000;
							 | 
						||
| 
								 | 
							
								    uint32_t *rcache = (uint32_t *) 0x13000000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("write and read loop test\n");
							 | 
						||
| 
								 | 
							
								    for( j = 0; j < 0x50; j++) {
							 | 
						||
| 
								 | 
							
								        // write cache
							 | 
						||
| 
								 | 
							
								        for ( i = 0; i < len; i++ ) {
							 | 
						||
| 
								 | 
							
								            wdata[j][i] = 1;
							 | 
						||
| 
								 | 
							
								            *(dcache+offset+i*4) = wdata[j][i];
							 | 
						||
| 
								 | 
							
								            for(k=0; k< 300; k++);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        for ( i = 0; i < len; i++ ) {
							 | 
						||
| 
								 | 
							
								            tmp = *(rcache+offset+i*4 + ran_pos);
							 | 
						||
| 
								 | 
							
								            if ( tmp != wdata[j][i] ) {
							 | 
						||
| 
								 | 
							
								                iot_printf(" not equal \r\n");
							 | 
						||
| 
								 | 
							
								                iot_printf(" j : %d, i : %d\r\n", j, i);
							 | 
						||
| 
								 | 
							
								                iot_printf("addr: %08x read: %08x, write: %08x\r\n",
							 | 
						||
| 
								 | 
							
								                    0x13000000+i*4+j, tmp, wdata[j][i]);
							 | 
						||
| 
								 | 
							
								                return ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            for(k=0; k< 300; k++);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        offset += atom;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cache_write_read_byte()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t *code = (uint8_t *) 0x13000000;
							 | 
						||
| 
								 | 
							
								    uint8_t *data = (uint8_t *) 0x13020000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint8_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    int i = 0, j = 0;
							 | 
						||
| 
								 | 
							
								    iot_printf("byte write and read test\n");
							 | 
						||
| 
								 | 
							
								    iot_printf("range of 0x13000000 - 0x13060000\n");
							 | 
						||
| 
								 | 
							
								    iot_printf("write code to 5a\r\n");
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < 0x20000; i++) {
							 | 
						||
| 
								 | 
							
								        *(code+i) =  0x5a;
							 | 
						||
| 
								 | 
							
								        for(j = 0; j < 100; j++);
							 | 
						||
| 
								 | 
							
								        if ( i % 0x100 == 0 ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("i: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("write code to a5\r\n");
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < 0x40000; i++) {
							 | 
						||
| 
								 | 
							
								        *(data+i) = 0x11;
							 | 
						||
| 
								 | 
							
								        for(j = 0; j < 100; j++);
							 | 
						||
| 
								 | 
							
								        if ( i % 0x100 == 0 ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("i: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // read
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < 0x20000; i++) {
							 | 
						||
| 
								 | 
							
								        tmp = *(code+i);
							 | 
						||
| 
								 | 
							
								        if ( tmp != 0x5a ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("error: i: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								            return ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ( i % 0x100 == 0 ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("read: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < 0x40000; i++) {
							 | 
						||
| 
								 | 
							
								        tmp = *(data+i);
							 | 
						||
| 
								 | 
							
								        if ( tmp != 0x11 ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("error: i: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								            return ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ( i % 0x100 == 0 ) {
							 | 
						||
| 
								 | 
							
								            iot_printf("read: %08x\r\n", i);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cache_test(){
							 | 
						||
| 
								 | 
							
								    dbg_uart_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* rst sfc */
							 | 
						||
| 
								 | 
							
								    cache_rst();
							 | 
						||
| 
								 | 
							
								    cache_write_read_byte();
							 | 
						||
| 
								 | 
							
								    cache_write_read();
							 | 
						||
| 
								 | 
							
								    cache_write_read_all();
							 | 
						||
| 
								 | 
							
								    iot_printf("end............\n");
							 | 
						||
| 
								 | 
							
								    while(1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __GNUC__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(void) {
							 | 
						||
| 
								 | 
							
								    cache_test();
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif // __GCC__
							 | 
						||
| 
								 | 
							
								
							 |