1 /* 2 * File : cpuport.c 3 * This file is part of RT-Thread RTOS 4 * COPYRIGHT (C) 2006 - 2011, RT-Thread Development Team 5 * 6 * The license and distribution terms for this file may be 7 * found in the file LICENSE in this distribution or at 8 * http://www.rt-thread.org/license/LICENSE 9 * 10 * Change Logs: 11 * Date Author Notes 12 * 2010-07-09 Bernard first version 13 * 2010-09-11 Bernard add CPU reset implementation 14 */ 15 16 #include <rtthread.h> 17 #include "ls1b.h" 18 19 /** 20 * @addtogroup Loongson LS1B 21 */ 22 23 /*@{*/ 24 25 /** 26 * this function will reset CPU 27 * 28 */ rt_hw_cpu_reset(void)29void rt_hw_cpu_reset(void) 30 { 31 /* open the watch-dog */ 32 WDT_EN = 0x01; /* watch dog enable */ 33 WDT_TIMER = 0x01; /* watch dog will be timeout after 1 tick */ 34 WDT_SET = 0x01; /* watch dog start */ 35 36 rt_kprintf("reboot system...\n"); 37 while (1); 38 } 39 40 /** 41 * this function will shutdown CPU 42 * 43 */ rt_hw_cpu_shutdown(void)44void rt_hw_cpu_shutdown(void) 45 { 46 rt_kprintf("shutdown...\n"); 47 48 while (1); 49 } 50 51 extern rt_uint32_t cp0_get_cause(void); 52 extern rt_uint32_t cp0_get_status(void); 53 extern rt_uint32_t cp0_get_hi(void); 54 extern rt_uint32_t cp0_get_lo(void); 55 56 /** 57 * This function will initialize thread stack 58 * 59 * @param tentry the entry of thread 60 * @param parameter the parameter of entry 61 * @param stack_addr the beginning stack address 62 * @param texit the function will be called when thread exit 63 * 64 * @return stack address 65 */ rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)66rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) 67 { 68 rt_uint32_t *stk; 69 static rt_uint32_t g_sr = 0; 70 71 if (g_sr == 0) 72 { 73 g_sr = cp0_get_status(); 74 g_sr &= 0xfffffffe; 75 g_sr |= 0x8401; 76 } 77 78 /** Start at stack top */ 79 stk = (rt_uint32_t *)stack_addr; 80 *(stk) = (rt_uint32_t) tentry; /* pc: Entry Point */ 81 *(--stk) = (rt_uint32_t) 0xeeee; /* c0_cause */ 82 *(--stk) = (rt_uint32_t) 0xffff; /* c0_badvaddr */ 83 *(--stk) = (rt_uint32_t) cp0_get_lo(); /* lo */ 84 *(--stk) = (rt_uint32_t) cp0_get_hi(); /* hi */ 85 *(--stk) = (rt_uint32_t) g_sr; /* C0_SR: HW2 = En, IE = En */ 86 *(--stk) = (rt_uint32_t) texit; /* ra */ 87 *(--stk) = (rt_uint32_t) 0x0000001e; /* s8 */ 88 *(--stk) = (rt_uint32_t) stack_addr; /* sp */ 89 *(--stk) = (rt_uint32_t) 0x0000001c; /* gp */ 90 *(--stk) = (rt_uint32_t) 0x0000001b; /* k1 */ 91 *(--stk) = (rt_uint32_t) 0x0000001a; /* k0 */ 92 *(--stk) = (rt_uint32_t) 0x00000019; /* t9 */ 93 *(--stk) = (rt_uint32_t) 0x00000018; /* t8 */ 94 *(--stk) = (rt_uint32_t) 0x00000017; /* s7 */ 95 *(--stk) = (rt_uint32_t) 0x00000016; /* s6 */ 96 *(--stk) = (rt_uint32_t) 0x00000015; /* s5 */ 97 *(--stk) = (rt_uint32_t) 0x00000014; /* s4 */ 98 *(--stk) = (rt_uint32_t) 0x00000013; /* s3 */ 99 *(--stk) = (rt_uint32_t) 0x00000012; /* s2 */ 100 *(--stk) = (rt_uint32_t) 0x00000011; /* s1 */ 101 *(--stk) = (rt_uint32_t) 0x00000010; /* s0 */ 102 *(--stk) = (rt_uint32_t) 0x0000000f; /* t7 */ 103 *(--stk) = (rt_uint32_t) 0x0000000e; /* t6 */ 104 *(--stk) = (rt_uint32_t) 0x0000000d; /* t5 */ 105 *(--stk) = (rt_uint32_t) 0x0000000c; /* t4 */ 106 *(--stk) = (rt_uint32_t) 0x0000000b; /* t3 */ 107 *(--stk) = (rt_uint32_t) 0x0000000a; /* t2 */ 108 *(--stk) = (rt_uint32_t) 0x00000009; /* t1 */ 109 *(--stk) = (rt_uint32_t) 0x00000008; /* t0 */ 110 *(--stk) = (rt_uint32_t) 0x00000007; /* a3 */ 111 *(--stk) = (rt_uint32_t) 0x00000006; /* a2 */ 112 *(--stk) = (rt_uint32_t) 0x00000005; /* a1 */ 113 *(--stk) = (rt_uint32_t) parameter; /* a0 */ 114 *(--stk) = (rt_uint32_t) 0x00000003; /* v1 */ 115 *(--stk) = (rt_uint32_t) 0x00000002; /* v0 */ 116 *(--stk) = (rt_uint32_t) 0x00000001; /* at */ 117 *(--stk) = (rt_uint32_t) 0x00000000; /* zero */ 118 119 /* return task's current stack address */ 120 return (rt_uint8_t *)stk; 121 } 122 123 /*@}*/ 124 125