553 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| }
 | |
| 
 |