xref: /nrf52832-nimble/rt-thread/libcpu/ti-dsp/c28x/cpuport.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018-09-01     xuzhuoyi     the first version.
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero 
13*10465441SEvalZero /* exception and interrupt handler table */
14*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread;
15*10465441SEvalZero rt_uint32_t rt_interrupt_to_thread;
16*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag;
17*10465441SEvalZero /* exception hook */
18*10465441SEvalZero static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL;
19*10465441SEvalZero 
20*10465441SEvalZero struct exception_stack_frame
21*10465441SEvalZero {
22*10465441SEvalZero     rt_uint32_t t_st0;
23*10465441SEvalZero     rt_uint32_t acc;
24*10465441SEvalZero     rt_uint32_t p;
25*10465441SEvalZero     rt_uint32_t ar1_ar0;
26*10465441SEvalZero     rt_uint32_t dp_st1;
27*10465441SEvalZero     rt_uint32_t dbgstat_ier;
28*10465441SEvalZero     rt_uint32_t return_address;
29*10465441SEvalZero };
30*10465441SEvalZero 
31*10465441SEvalZero struct stack_frame
32*10465441SEvalZero {
33*10465441SEvalZero     struct exception_stack_frame exception_stack_frame;
34*10465441SEvalZero 
35*10465441SEvalZero     /* r4 ~ r11 register */
36*10465441SEvalZero     rt_uint16_t ar0h;
37*10465441SEvalZero     rt_uint16_t ar1h;
38*10465441SEvalZero     rt_uint32_t xar2;
39*10465441SEvalZero     rt_uint32_t xar3;
40*10465441SEvalZero     rt_uint32_t xar4;
41*10465441SEvalZero     rt_uint32_t xar5;
42*10465441SEvalZero     rt_uint32_t xar6;
43*10465441SEvalZero     rt_uint32_t xar7;
44*10465441SEvalZero     rt_uint32_t xt;
45*10465441SEvalZero     rt_uint32_t rpc;
46*10465441SEvalZero 
47*10465441SEvalZero 
48*10465441SEvalZero };
49*10465441SEvalZero 
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)50*10465441SEvalZero rt_uint8_t *rt_hw_stack_init(void       *tentry,
51*10465441SEvalZero                              void       *parameter,
52*10465441SEvalZero                              rt_uint8_t *stack_addr,
53*10465441SEvalZero                              void       *texit)
54*10465441SEvalZero {
55*10465441SEvalZero     struct stack_frame *stack_frame;
56*10465441SEvalZero     rt_uint8_t         *stk;
57*10465441SEvalZero     unsigned long       i;
58*10465441SEvalZero 
59*10465441SEvalZero     stk  = stack_addr;
60*10465441SEvalZero     stk  = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8);
61*10465441SEvalZero     //stk -= sizeof(struct stack_frame);
62*10465441SEvalZero 
63*10465441SEvalZero     stack_frame = (struct stack_frame *)stk;
64*10465441SEvalZero 
65*10465441SEvalZero     /* init all register */
66*10465441SEvalZero     for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++)
67*10465441SEvalZero     {
68*10465441SEvalZero         ((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;
69*10465441SEvalZero     }
70*10465441SEvalZero 
71*10465441SEvalZero     stack_frame->exception_stack_frame.t_st0   = 0x11110000 | rt_hw_get_st0();
72*10465441SEvalZero     stack_frame->exception_stack_frame.acc     = 0x33332222;
73*10465441SEvalZero     stack_frame->exception_stack_frame.ar1_ar0 = 0x00001111 & (unsigned long)parameter; /* ar0 : argument */
74*10465441SEvalZero     stack_frame->exception_stack_frame.p       = 0x55554444;                            /* p */
75*10465441SEvalZero     stack_frame->exception_stack_frame.dp_st1  = (0x00000000) | rt_hw_get_st1();        /* dp_st1 */
76*10465441SEvalZero     stack_frame->exception_stack_frame.dbgstat_ier    = 0;                              /* dbgstat_ier */
77*10465441SEvalZero     stack_frame->exception_stack_frame.return_address = (unsigned long)tentry;          /* return_address */
78*10465441SEvalZero     stack_frame->rpc = (unsigned long)texit;
79*10465441SEvalZero 
80*10465441SEvalZero     /* return task's current stack address */
81*10465441SEvalZero     return stk + sizeof(struct stack_frame);
82*10465441SEvalZero }
83*10465441SEvalZero 
84*10465441SEvalZero /**
85*10465441SEvalZero  * This function set the hook, which is invoked on fault exception handling.
86*10465441SEvalZero  *
87*10465441SEvalZero  * @param exception_handle the exception handling hook function.
88*10465441SEvalZero  */
rt_hw_exception_install(rt_err_t (* exception_handle)(void * context))89*10465441SEvalZero void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context))
90*10465441SEvalZero {
91*10465441SEvalZero     rt_exception_hook = exception_handle;
92*10465441SEvalZero }
93*10465441SEvalZero 
94*10465441SEvalZero 
95*10465441SEvalZero struct exception_info
96*10465441SEvalZero {
97*10465441SEvalZero     rt_uint32_t exc_return;
98*10465441SEvalZero     struct stack_frame stack_frame;
99*10465441SEvalZero };
100*10465441SEvalZero 
101*10465441SEvalZero 
102*10465441SEvalZero /**
103*10465441SEvalZero  * shutdown CPU
104*10465441SEvalZero  */
rt_hw_cpu_shutdown(void)105*10465441SEvalZero void rt_hw_cpu_shutdown(void)
106*10465441SEvalZero {
107*10465441SEvalZero     rt_kprintf("shutdown...\n");
108*10465441SEvalZero 
109*10465441SEvalZero     RT_ASSERT(0);
110*10465441SEvalZero }
111