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;
|
|
}
|
|
|