192 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			192 lines
		
	
	
		
			5.6 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. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | /* os shim includes */ | ||
|  | #include "os_types.h"
 | ||
|  | #include "os_task.h"
 | ||
|  | #include "os_utils.h"
 | ||
|  | 
 | ||
|  | /* common includes */ | ||
|  | #include "iot_io.h"
 | ||
|  | #include "dbg_io.h"
 | ||
|  | #include "iot_config.h"
 | ||
|  | 
 | ||
|  | /* driver includes */ | ||
|  | #include "iot_uart.h"
 | ||
|  | #include "mon_hw.h"
 | ||
|  | #include "ahb_busmon.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define MST_MON_M0  (1 << 0)
 | ||
|  | #define MST_MON_ALL (MST_MON_M0)
 | ||
|  | #define TEST_CASE_MST_MON   (MST_MON_ALL)
 | ||
|  | 
 | ||
|  | #define SLV_MON_IC0 (1 << 0)
 | ||
|  | #define SLV_MON_IC1 (1 << 1)
 | ||
|  | #define SLV_MON_DC  (1 << 2)
 | ||
|  | #define SLV_MON_RAM3 (1 << 3)
 | ||
|  | #define SLV_MON_RAM4 (1 << 4)
 | ||
|  | #define SLV_MON_ALL (SLV_MON_IC0 | SLV_MON_IC1 \
 | ||
|  |         | SLV_MON_DC | SLV_MON_RAM3 | SLV_MON_RAM4) | ||
|  | #define TEST_CASE_SLV_MON   (SLV_MON_ALL)
 | ||
|  | 
 | ||
|  | #define BUS_MON_ADDR (1 << 0)
 | ||
|  | #define TEST_CASE_BUS_MON   (BUS_MON_ADDR)
 | ||
|  | 
 | ||
|  | extern int platform_init(); | ||
|  | #define REG32(a)    (*((volatile uint32_t *)(a)))
 | ||
|  | typedef void (*jump)(void); | ||
|  | 
 | ||
|  | #define ERR_ADDR    0x000ff700
 | ||
|  | #define ERR_ADDR_READ   0x000ff000
 | ||
|  | static void test_mon_master(uint8_t id, uint8_t rw, uint32_t addr) | ||
|  | { | ||
|  |     uint32_t tmp; | ||
|  |     iot_printf("[M%d %s] test write 0x%08x\n", id, (rw)?"WRITE":"READ", addr); | ||
|  |     tmp = ahb_mon_get_mst_rw(); | ||
|  |     iot_printf("[M%d %s] get RW flag: %d\n", id, (rw)?"WRITE":"READ", tmp); | ||
|  |     if (tmp != rw) { | ||
|  |         iot_printf("[M%d %s] get RW flag failed\n", id, (rw)?"WRITE":"READ"); | ||
|  |     } else { | ||
|  |         uint32_t err_addr = 0; | ||
|  |         err_addr = ahb_mon_get_mst_addr(id); | ||
|  |         iot_printf("[M%d %s] get error addr : 0x%08x\n", | ||
|  |                 id, (rw)?"WRITE":"READ", err_addr); | ||
|  |         if (err_addr != addr) { | ||
|  |             iot_printf("[M%d %s] failed\n", id, (rw)?"WRITE":"READ"); | ||
|  |         } else { | ||
|  |             iot_printf("[M%d %s] successful\n", id, (rw)?"WRITE":"READ"); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | static void test_mst_reg_dump() | ||
|  | { | ||
|  |     iot_printf("f0: 0x%08x 0x%08x 0x%08x\n", | ||
|  |         REG32(0x500000f4), REG32(0x500000f8), REG32(0x500000fc)); | ||
|  | } | ||
|  | 
 | ||
|  | void master_monitor_test() { | ||
|  | 
 | ||
|  |     // test case
 | ||
|  |     volatile uint32_t *reg = (volatile uint32_t *) ERR_ADDR; | ||
|  | 
 | ||
|  | #if (TEST_CASE_MST_MON & MST_MON_M0)
 | ||
|  |     ahb_mon_mst_clr(); | ||
|  |     *reg = 0xaabbccdd; | ||
|  |     for(volatile uint32_t i = 0; i < 1000; i++); | ||
|  |     test_mon_master(0, 1, ERR_ADDR); | ||
|  | 
 | ||
|  |     ahb_mon_mst_clr(); | ||
|  |     reg = (volatile uint32_t *)ERR_ADDR_READ; | ||
|  |     iot_printf("reg: 0x%08x\n", *reg); | ||
|  |     for(volatile uint32_t i = 0; i < 1000; i++); | ||
|  |     test_mon_master(0, 0, ERR_ADDR_READ); | ||
|  | 
 | ||
|  |     test_mst_reg_dump(); | ||
|  |     ahb_mon_mst_clr(); | ||
|  |     test_mst_reg_dump(); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | #define SLV_ERR_ADDR 0x0fff8300
 | ||
|  | static void test_mon_slave(uint8_t id, uint8_t rw, uint32_t addr) | ||
|  | { | ||
|  |     uint32_t tmp; | ||
|  |     iot_printf("[S%d %s] test write 0x%08x\n", id, (rw)?"WRITE":"READ", addr); | ||
|  |     tmp = ahb_mon_get_slv_rw(); | ||
|  |     iot_printf("[S%d %s] get RW flag: %d\n", id, (rw)?"WRITE":"READ", tmp); | ||
|  |     if (tmp != rw) { | ||
|  |         iot_printf("[S%d %s] get RW flag failed\n", id, (rw)?"WRITE":"READ"); | ||
|  |     } else { | ||
|  |         uint32_t err_addr = 0; | ||
|  |         err_addr = ahb_mon_get_slv_addr(id); | ||
|  |         iot_printf("[S%d %s] get error addr : 0x%08x\n", | ||
|  |                 id, (rw)?"WRITE":"READ", err_addr); | ||
|  |         if (err_addr != addr) { | ||
|  |             iot_printf("[S%d %s] failed\n", id, (rw)?"WRITE":"READ"); | ||
|  |         } else { | ||
|  |             iot_printf("[S%d %s] successful\n", id, (rw)?"WRITE":"READ"); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | void slave_monitor_test() | ||
|  | { | ||
|  | 
 | ||
|  |     // test case
 | ||
|  |     volatile uint32_t *reg = (volatile uint32_t *) SLV_ERR_ADDR; | ||
|  | 
 | ||
|  | #if (TEST_CASE_SLV_MON & SLV_MON_IC0)
 | ||
|  |     ahb_mon_slv_ram3_ena(0x0fff8000, 0x0fff9000, 0x0fff8400, 0x0fff8c00); | ||
|  |     *reg = 0xaabbccdd; | ||
|  |     for(volatile uint32_t i = 0; i < 1000; i++); | ||
|  |     iot_printf("slv addr: 0x%08x\n", *reg); | ||
|  |     test_mon_slave(0, 1, SLV_ERR_ADDR); | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | #define BUS_ERR_IN_ADDR     0x0ffffa00
 | ||
|  | #define BUS_MON_LADDR       0x0ffff800
 | ||
|  | #define BUS_MON_HADDR       0x0ffffc00
 | ||
|  | static void test_bus_mon(uint8_t id, uint32_t addr) | ||
|  | { | ||
|  |     iot_printf("[B%d] test write 0x%08x\n", id, addr); | ||
|  | 
 | ||
|  |     uint32_t err_addr = 0; | ||
|  |     err_addr = ahb_busmon_cap_addr(id); | ||
|  |     iot_printf("[B%d] get error addr : 0x%08x\n", id, err_addr); | ||
|  |     if (err_addr != addr) { | ||
|  |         iot_printf("[B%d] failed\n", id); | ||
|  |     } else { | ||
|  |         iot_printf("[B%d] successful\n", id); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void ahb_bus_monitor_test() | ||
|  | { | ||
|  | #if (TEST_CASE_BUS_MON == BUS_MON_ADDR)
 | ||
|  |     do { | ||
|  |         // ahb bus monitor config
 | ||
|  |         ahb_busmon_addr_t addr = {BUS_MON_LADDR, BUS_MON_HADDR, 0}; | ||
|  |         ahb_busmon_cfg(0, AHB_BUSMON_OP_RW, &addr); | ||
|  |         ahb_busmon_int_clr(0); | ||
|  |         volatile uint32_t *reg = (volatile uint32_t *) (BUS_ERR_IN_ADDR); | ||
|  |         *reg = 0xaabbccdd; | ||
|  |         test_bus_mon(0, BUS_ERR_IN_ADDR); | ||
|  |     } while(0); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | int main(void) | ||
|  | { | ||
|  |     //platform_init();
 | ||
|  |     dbg_uart_init(); | ||
|  | 
 | ||
|  |     iot_printf("start to monitor test\n"); | ||
|  | 
 | ||
|  |     do { | ||
|  |         master_monitor_test(); | ||
|  |         //slave_monitor_test();   // not ready
 | ||
|  |         ahb_bus_monitor_test(); | ||
|  | 
 | ||
|  |     } while(0); | ||
|  | 
 | ||
|  |     iot_printf("end of monitor test\n"); | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 |