251 lines
6.6 KiB
C
251 lines
6.6 KiB
C
|
#include "iot_bitops.h"
|
|||
|
#include "dtest_printf.h"
|
|||
|
#include "cpu.h"
|
|||
|
#include "ahb.h"
|
|||
|
|
|||
|
#if HW_PLATFORM > HW_PLATFORM_SIMU
|
|||
|
#include "dbg_io.h"
|
|||
|
#endif
|
|||
|
|
|||
|
#include "chip_reg_base.h"
|
|||
|
#include "ahb_rf_s.h"
|
|||
|
|
|||
|
#include "uart.h"
|
|||
|
#include "strformat.h"
|
|||
|
#include "uart_e.h"
|
|||
|
|
|||
|
#include "mailbox.h"
|
|||
|
#include "mailbox_hw.h"
|
|||
|
#include "iot_irq.h"
|
|||
|
|
|||
|
#include "dev_spinlock.h"
|
|||
|
#include "watchdog.h"
|
|||
|
extern struct uart_ctrl uart_e_ctrl;
|
|||
|
#define my_g_uart_ctrl uart_e_ctrl
|
|||
|
#define TEST_NUMS 32
|
|||
|
#define BUF_LEN 500
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
TEST_MODE_CPURST = 0,
|
|||
|
TEST_MODE_FULLRST,
|
|||
|
}TEST_MODE;
|
|||
|
|
|||
|
static char g_buf[BUF_LEN];
|
|||
|
uint32_t g_spinlock, g_cpu;
|
|||
|
static volatile ahb_lite_reg_t *ahb_base =
|
|||
|
(volatile ahb_lite_reg_t *)AHB_REG_LITE_BASEADDR;
|
|||
|
|
|||
|
extern struct uart_ctrl uart_e_ctrl;
|
|||
|
#define my_g_uart_ctrl uart_e_ctrl
|
|||
|
extern iot_wdg_info g_wdg_info[3];
|
|||
|
extern iot_wdg_info g_wdg_timeout;
|
|||
|
extern int g_feed_dog[3];
|
|||
|
|
|||
|
void register_print_by_addr(uint32_t addr, int num);
|
|||
|
void core_working_loop(UART_PORT port, int pin_num, char *buf, int buf_len);
|
|||
|
void core_wdg_test_loop(UART_PORT port, int pin_num, char *buf, int buf_len, TEST_MODE mode);
|
|||
|
void delay_sometime(uint32_t t)
|
|||
|
{
|
|||
|
uint32_t loop, i;
|
|||
|
for(i = 0; i < t; i++) {
|
|||
|
loop = 0;
|
|||
|
while(loop++ < 1000000) __asm volatile ("nop\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
!!!!!!!!!!!
|
|||
|
特别注意,需要屏蔽startup_init.c的 pre_init函数部分代码
|
|||
|
|
|||
|
if (cpu == 0) {
|
|||
|
//wdg_deinit(1);
|
|||
|
//wdg_deinit(2);
|
|||
|
}
|
|||
|
|
|||
|
*/
|
|||
|
void wdg_test(UART_PORT port, int pin_num)
|
|||
|
{
|
|||
|
|
|||
|
g_cpu = cpu_get_mhartid();
|
|||
|
|
|||
|
/*int init*/
|
|||
|
iot_interrupt_init(g_cpu);
|
|||
|
|
|||
|
//core_working_loop(UART_PORT port, int pin_num, char *buf, int buf_len);
|
|||
|
//core_wdg_test_loop(UART_PORT port, int pin_num, char *buf, int buf_len, TEST_MODE mode);
|
|||
|
|
|||
|
if (0 == g_cpu) {
|
|||
|
core_wdg_test_loop( port, pin_num, g_buf, sizeof(g_buf), TEST_MODE_CPURST);
|
|||
|
//core_working_loop( port, pin_num, g_buf, sizeof(g_buf));
|
|||
|
} else if (1 == g_cpu) {
|
|||
|
core_wdg_test_loop( port, pin_num, g_buf, sizeof(g_buf), TEST_MODE_CPURST);
|
|||
|
//core_working_loop( port, pin_num, g_buf, sizeof(g_buf));
|
|||
|
} else {
|
|||
|
core_wdg_test_loop( port, pin_num, g_buf, sizeof(g_buf), TEST_MODE_CPURST);
|
|||
|
//core_working_loop( port, pin_num, g_buf, sizeof(g_buf));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
while(1) {
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void core_print_regs(UART_PORT port, char *buf, int len, uint32_t cur_cpu) {
|
|||
|
|
|||
|
uint32_t pc;
|
|||
|
uint32_t rst_flag;
|
|||
|
int str_len;
|
|||
|
uint32_t *reg = (uint32_t *)WDG0_REG_BASEADDR ;
|
|||
|
|
|||
|
switch(cur_cpu) {
|
|||
|
case 0:
|
|||
|
pc = ahb_base->cpu0_start_pc.w;
|
|||
|
reg = (uint32_t *)WDG0_REG_BASEADDR ;
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
pc = ahb_base->cpu1_start_pc.w;
|
|||
|
reg = (uint32_t *)WDG1_REG_BASEADDR ;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
pc = ahb_base->cpu2_start_pc.w;
|
|||
|
reg = (uint32_t *)WDG2_REG_BASEADDR ;
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
rst_flag = *( (uint32_t *)(0x40000000 + 0x008C) );
|
|||
|
|
|||
|
str_len = iot_snprintf(buf, len, "cpu:%d,ctl0:%08x,ctl1:%08x,cnt:%08x,\
|
|||
|
cmp:%08x,cnts:%08x,cmps:%08x,width:%08x,pc=%08x,rst_flag=%08x\r\n",
|
|||
|
cur_cpu, *(reg + 1),*(reg + 2), *(reg + 4), *(reg + 5), *(reg+6), *(reg+7),
|
|||
|
*(reg+8), pc , rst_flag);
|
|||
|
|
|||
|
my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
port:输出日志的串口编号
|
|||
|
pin_num:对应串口的txd引脚编号
|
|||
|
buf:输出日志时用的缓存地址
|
|||
|
buf_len:缓存大小
|
|||
|
mode :测试cpurst还是fullrst
|
|||
|
*/
|
|||
|
void core_wdg_test_loop(UART_PORT port, int pin_num, char *buf, int buf_len,
|
|||
|
TEST_MODE mode) {
|
|||
|
uint32_t cnt = 0;
|
|||
|
uint32_t cur_cpu = cpu_get_mhartid();
|
|||
|
|
|||
|
// UART0 init
|
|||
|
my_g_uart_ctrl.init(port);
|
|||
|
my_g_uart_ctrl.config(port, 115200, UART_DATA_8_BITS, UART_STOP_BITS_1,
|
|||
|
UART_PARITY_DISABLE);
|
|||
|
iot_uart_set_pin(port, 0xff, pin_num);
|
|||
|
|
|||
|
//my_g_uart_ctrl.puts(port, (uint8_t*)"00000\r\n", 7);
|
|||
|
|
|||
|
int str_len ;
|
|||
|
|
|||
|
// print start
|
|||
|
str_len = iot_snprintf(buf, buf_len, "CPU %d : Start 0000!!!\r\n", cur_cpu);
|
|||
|
my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
|
|||
|
delay_sometime(1);
|
|||
|
|
|||
|
//wdg init
|
|||
|
//core_print_regs(port, buf, buf_len, cur_cpu);
|
|||
|
|
|||
|
//str_len = iot_snprintf(buf, buf_len, "CPU %d : Start 111!!!\r\n", cur_cpu);
|
|||
|
//my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
|
|||
|
wdg_deinit(cur_cpu);
|
|||
|
wdg_init(cur_cpu);
|
|||
|
|
|||
|
if (TEST_MODE_CPURST == mode) {
|
|||
|
wdg_set_cmp(cur_cpu, 32768);//SET_WDG_INTC_CMP);
|
|||
|
wdg_set_timeout_cmp(cur_cpu, 1500);//SET_WDG_TIMEOUT_CMP);
|
|||
|
wdg_set_cpurst_cmp(cur_cpu, 29);//SET_WDG_CPURST_CMP );
|
|||
|
wdg_set_fullrst_cmp(cur_cpu, 1000);//SET_WDG_FULLRST_CMP);
|
|||
|
} else if (TEST_MODE_FULLRST == mode) {
|
|||
|
wdg_set_cmp(cur_cpu, 32768);//SET_WDG_INTC_CMP);
|
|||
|
wdg_set_timeout_cmp(cur_cpu, 15);//SET_WDG_TIMEOUT_CMP);
|
|||
|
wdg_set_cpurst_cmp(cur_cpu, 10);//SET_WDG_CPURST_CMP );
|
|||
|
wdg_set_fullrst_cmp(cur_cpu, 5);//SET_WDG_FULLRST_CMP);
|
|||
|
} else {
|
|||
|
|
|||
|
}
|
|||
|
int times = 0;
|
|||
|
(void)times;
|
|||
|
while(1) {
|
|||
|
//delay_sometime(1);
|
|||
|
//core_print_regs(port, buf, buf_len, cur_cpu);
|
|||
|
#if 0
|
|||
|
if (cur_cpu == 1 || cur_cpu == 2) {
|
|||
|
delay_sometime(1);
|
|||
|
str_len = iot_snprintf(buf, buf_len,
|
|||
|
"core=%d , %d\r\n", cur_cpu, times ++);
|
|||
|
|
|||
|
my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
if (g_feed_dog[cur_cpu] == 1 && cnt < 5) {
|
|||
|
|
|||
|
str_len = iot_snprintf(buf, buf_len,
|
|||
|
"cnt %d, feed dog cpu%d\r\n", cnt, cur_cpu);
|
|||
|
|
|||
|
my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
|
|||
|
wdg_feed_dog(cur_cpu);
|
|||
|
|
|||
|
iot_interrupt_unmask(g_wdg_info[cur_cpu].handle);
|
|||
|
g_feed_dog[cur_cpu] = 0;
|
|||
|
cnt++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void core_working_loop(UART_PORT port, int pin_num, char *buf, int buf_len) {
|
|||
|
|
|||
|
uint32_t cur_cpu = cpu_get_mhartid();
|
|||
|
|
|||
|
// UART init
|
|||
|
my_g_uart_ctrl.init(port);
|
|||
|
my_g_uart_ctrl.config(port, 115200, UART_DATA_8_BITS, UART_STOP_BITS_1,
|
|||
|
UART_PARITY_DISABLE);
|
|||
|
|
|||
|
iot_uart_set_pin(port, 0xff, pin_num);
|
|||
|
|
|||
|
int str_len ;
|
|||
|
int inc = 0;
|
|||
|
|
|||
|
while(1) {
|
|||
|
str_len = iot_snprintf(buf, buf_len, "CPU %d : %d\r\n", cur_cpu, inc);
|
|||
|
my_g_uart_ctrl.puts(port, (uint8_t*)buf, str_len);
|
|||
|
inc ++;
|
|||
|
if(inc > 10000)
|
|||
|
inc = 0;
|
|||
|
delay_sometime(1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void register_print_by_addr(uint32_t addr, int num)
|
|||
|
{
|
|||
|
volatile uint32_t *p_addr = (volatile uint32_t *)addr;
|
|||
|
|
|||
|
iot_printf("base=%08x:", addr);
|
|||
|
for(int i = 0; i < num; i++) {
|
|||
|
iot_printf("[%02x]=%04x_%04x,",
|
|||
|
(uint32_t)p_addr & 0xff, (*p_addr) >> 16, (*p_addr) & 0xffff );
|
|||
|
p_addr ++;
|
|||
|
}
|
|||
|
iot_printf("\r\n");
|
|||
|
}
|
|||
|
|
|||
|
|