Files
kunlun/dtest/bee_diag_test/bee_diag_test.c
2024-09-28 14:24:04 +08:00

553 lines
9.2 KiB
C

#include "os_types.h"
#include "os_task.h"
#include "os_mem.h"
#include "dbg_io.h"
#include "iot_diag.h"
#include "iot_io.h"
//#include <stdlib.h>
#include "iot_system_api.h"
#include "iot_config.h"
//#include "iot_gptmr.h"
#include "iot_system.h"
//#include "os_mem.h"
//#include "cpu.h"
//#include "os_task.h"
#include "platform.h"
#include "encoding.h"
//#include "sec_glb.h"
//#include "ahb.h"
//#include "intc.h"
#include "bits.h"
#include "os_utils.h"
#include "iot_rtc.h"
#if 0
#include "encoding.h"
#include "bits.h"
#ifdef __riscv_hard_float
# define SOFT_FLOAT_CONTEXT_SIZE 0
#else
# define SOFT_FLOAT_CONTEXT_SIZE (8 * 32)
#endif
#define HLS_SIZE 64
#define INTEGER_CONTEXT_SIZE (32 * REGBYTES)//REGBYTES
#define MACHINE_STACK_TOP() ({ \
register uintptr_t sp asm ("sp"); \
(void*)((sp + RISCV_PGSIZE) & -RISCV_PGSIZE); })
#define MENTRY_FRAME_SIZE (INTEGER_CONTEXT_SIZE + SOFT_FLOAT_CONTEXT_SIZE \
+ HLS_SIZE)
void IRAM_ATTR enter_user_mode(void (*fn)(uintptr_t), uintptr_t stack)
{
uintptr_t mstatus = read_csr(mstatus);
mstatus = INSERT_FIELD(mstatus, MSTATUS_MPP, PRV_U);
mstatus = INSERT_FIELD(mstatus, MSTATUS_MPIE, 0);
write_csr(mstatus, mstatus);
write_csr(mscratch, MACHINE_STACK_TOP() - MENTRY_FRAME_SIZE);
write_csr(mepc, fn);
asm volatile ("mv a0, %0; mv sp, %0; mret" : : "r" (stack));
__builtin_unreachable();
}
void IRAM_ATTR app()
{
while(1)
{};
}
#endif
#if 0
#define write_csr(reg, val) ({ \
if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \
asm volatile ("csrw " #reg ", %0" :: "i"(val)); \
else \
asm volatile ("csrw " #reg ", %0" :: "r"(val)); })
#ifdef __riscv_hard_float
# define SOFT_FLOAT_CONTEXT_SIZE 0
#else
# define SOFT_FLOAT_CONTEXT_SIZE (8 * 32)
#endif
#define HLS_SIZE 64
#define INTEGER_CONTEXT_SIZE (32 * REGBYTES)//REGBYTES
#define MACHINE_STACK_TOP() ({ \
register uintptr_t sp asm ("sp"); \
(void*)((sp + RISCV_PGSIZE) & -RISCV_PGSIZE); })
#define MENTRY_FRAME_SIZE (INTEGER_CONTEXT_SIZE + SOFT_FLOAT_CONTEXT_SIZE \
+ HLS_SIZE)
#define SYS_write 64
#define SYS_exit 93
#define SYS_timer 1234
/* Fires a syscall */
long syscall(long num, long arg0, long arg1, long arg2)
{
register long a7 asm("a7") = num;
register long a0 asm("a0") = arg0;
register long a1 asm("a1") = arg1;
register long a2 asm("a2") = arg2;
asm volatile ("ecall":"+r"(a0) : "r"(a1), "r"(a2), "r"(a7));
return a0;
}
void enter_user_mode(void (*fn)(uintptr_t), uintptr_t stack)
{
uintptr_t mstatus = read_csr(mstatus);
// uintptr_t pmpcfg0 = read_csr(pmpcfg0);
// uintptr_t pmpaddr0 = read_csr(pmpaddr0);
// uintptr_t pmpaddr1 = read_csr(pmpaddr1);
// pmpcfg0 = INSERT_FIELD(pmpcfg0, 0xff00, 0xf);
mstatus = INSERT_FIELD(mstatus, MSTATUS_MPP, PRV_U);
mstatus = INSERT_FIELD(mstatus, MSTATUS_MPIE, 0);
write_csr(mstatus, mstatus);
write_csr(pmpcfg0, 0x1f0f00); //0x8f00
write_csr(pmpaddr0, 0x3ff6400);//0x3fff800
write_csr(pmpaddr1, 0x3ffffff);//0x3fff401
write_csr(pmpaddr2, 0x440000ff);//0x3fff401
write_csr(mscratch, MACHINE_STACK_TOP() - MENTRY_FRAME_SIZE);
write_csr(mepc, fn);
asm volatile ("mv a0, %0; mv sp, %0; mret" : : "r" (stack));
__builtin_unreachable();
}
size_t iott_strlen( const char *s )
{
uint32_t r = 0;
while( *s++ ) r++;
return r;
}
/* Prints a string with a syscall */
static void printstr(const char* s)
{
syscall(SYS_write, 1, (long) s, iott_strlen(s));
}
void app()//IRAM_ATTR
{
unsigned int i=0, j=0;
while(1)
{
if (i%1000==0)
printstr("hello world!!!!.\n");
if (j%2000==0)
printstr("hello ZZZZZZYYYYZZZZZZYYYYYYY!!!!.\n");
if (i == 6666666)
{
printstr("read IIs base addr!.\n");
j = ((volatile uint32_t)*((volatile uint32_t*)(0x44000000)));
}
i++;
j++;
};
}
void boot_loader() // IRAM_ATTR
{
// extern char trap_entry;
// write_csr(utvec, &trap_entry);
// write_csr(uscratch, 0);
// write_csr(uie, 0);
enter_user_mode(app, (uintptr_t)0x0fffd000);// 0x0ffe8800
}
void user_task_1(){
while(1)
{
printstr("user_task_1....\n");
os_delay(400);
printstr("user_task_1...ffffffffff.\n");
//iot_printf("starting...\n");
}
for(;;) {
//boot_loader();
printstr("user_task_1....\n");
os_delay(4000);
}
}
void user_task_2(){
//unsigned int j=0;
while(1)
{
printstr("user_task_2....\n");
os_delay(100);
//j = ((volatile uint32_t)*((volatile uint32_t*)(0x44000000)));
//if (j!=0)
//{
printstr("user_task_2...hahahahahaha!!!\n");
//}
//iot_printf("starting...\n");
}
for(;;) {
//boot_loader();
printstr("user_task_1....\n");
os_delay(4000);
}
}
void user_task_3(){
while(1)
{
printstr("user_task_3....\n");
os_delay(10);
printstr("user_task_3...ttttttt.\n");
//iot_printf("starting...\n");
}
for(;;) {
//boot_loader();
printstr("user_task_1....\n");
os_delay(4000);
}
}
int32_t iot__task_start()
{
//start the tasks;
os_start_kernel();
return 0;
}
int32_t iot__module_start(void)
{
int32_t res = 0;
res = iot__task_start();
return res;
}
static int32_t iot__platform_init()
{
/*platform intialization*/
platform_init();
//resource initializations;
// system_clock_init();
// system_uart_init();
dbg_uart_init();
// dbg_uart_stage1_init();
// iot_led_init();
return 0;
}
int32_t iot__task_init()
{
os_task_h handle;
handle = os_create_task(user_task_1, NULL, 9);
//create the tasks;
if(handle != NULL) {
iot_printf("task 1 init successfully...\n");
}
handle = os_create_task(user_task_2, NULL, 9);
//create the tasks;
if(handle != NULL) {
iot_printf("task 2 init successfully...\n");
}
handle = os_create_task(user_task_3, NULL, 9);
//create the tasks;
if(handle != NULL) {
iot_printf("task 3 init successfully...\n");
}
return 0;
}
void task_init()
{
os_task_h handle;
handle = os_create_task(user_task_1, NULL, 9);
//create the tasks;
if(handle != NULL) {
// iot_printf("task 1 init successfully...\n");
printstr("user mode task 1 init successfully...\n");
}
handle = os_create_task(user_task_2, NULL, 9);
//create the tasks;
if(handle != NULL) {
printstr("task 2 init successfully...\n");
}
handle = os_create_task(user_task_3, NULL, 9);
//create the tasks;
if(handle != NULL) {
printstr("task 3 init successfully...\n");
}
iot__module_start();
return;
}
int32_t iot__module_init(void)
{
//platform intialization;
iot__platform_init();
//create all the tasks;
iot__task_init();
iot_printf("starting...\n");
return 0;
}
int main(void) //IRAM_ATTR
{
unsigned int j;
//platform intialization;
iot__platform_init();
iot_printf("entering user mode...\n");
j = ((volatile uint32_t)*((volatile uint32_t*)(0x44000000)));
iot_printf("0x%xhahahahahaha!!! \n",j);
enter_user_mode(task_init, (uintptr_t)0x0fffd000);// 0x0ffe8800
return 0;
//module init;
iot__module_init();
//module start;
iot__module_start();
return 0;
//uint8_t buf[32];
uint32_t addr1 = 0xffd9000;
//uint32_t addr2 = 0x10003000;
//uint32_t i;
dbg_uart_init();
iot_printf("hello world.\n");
boot_loader();
while(1)
{};
dbg_uart_init();
// iot_mem_read(buf, addr1, 32);
//iot_mem_write(buf, addr2, 32);
// for(i = 0; i < 32; i++){
// iot_printf("0x%08x:0x%02x\r\n", addr1+i, *(uint8_t*)(addr1+i));
// iot_printf("0x%08x:0x%02x\r\n", addr2+i, *(uint8_t*)(addr2+i));
// }
while(1) {
iot_printf("hello world. 0x%x\n",*((uint32_t *)addr1));
}
while(1);
return 0;
}
#endif
static int32_t iot__platform_init()
{
/*platform intialization*/
platform_init();
//resource initializations;
// system_clock_init();
// system_uart_init();
dbg_uart_init();
// dbg_uart_stage1_init();
// iot_led_init();
return 0;
}
void user_task_1(){
iot_time_tm_t curr_tm;
*((volatile uint32_t*)(0x05c0f808)) = 0xffffffff;
curr_tm.tm_year=2012;
curr_tm.tm_mon=1;
curr_tm.tm_mday=11;
curr_tm.tm_hour=4;
curr_tm.tm_min=55;
curr_tm.tm_sec=0;
iot_rtc_set(&curr_tm);
while(1)
{
iot_rtc_get(&curr_tm);
iot_printf("user_task_1 %d-%d-%d %d:%d:%d\n",curr_tm.tm_year,curr_tm.tm_mon,curr_tm.tm_mday,curr_tm.tm_hour,curr_tm.tm_min,curr_tm.tm_sec);
os_delay(500);
}
}
int32_t iot__task_init()
{
os_task_h handle;
handle = os_create_task(user_task_1, NULL, 9);
//create the tasks;
if(handle != NULL) {
iot_printf("task 1 init successfully...\n");
}
return 0;
}
int32_t iot__module_init(void)
{
//platform intialization;
iot__platform_init();
//create all the tasks;
iot__task_init();
iot_rtc_init();
iot_printf("starting...\n");
return 0;
}
int32_t iot__task_start()
{
//start the tasks;
os_start_kernel();
return 0;
}
int32_t iot__module_start(void)
{
int32_t res = 0;
res = iot__task_start();
return res;
}
int main(void)
{
//module init;
iot__module_init();
//module start;
iot__module_start();
return 0;
}