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