xref: /nrf52832-nimble/rt-thread/libcpu/blackfin/bf53x/cpuport.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : cpuport.c
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2012, 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  * 2012-02-13 	mojingxian 	first version
13*10465441SEvalZero  */
14*10465441SEvalZero 
15*10465441SEvalZero #include <rtthread.h>
16*10465441SEvalZero 
17*10465441SEvalZero /* flag in interrupt handling */
18*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread;
19*10465441SEvalZero rt_uint32_t rt_interrupt_to_thread;
20*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag;
21*10465441SEvalZero 
22*10465441SEvalZero /**
23*10465441SEvalZero  * initializes stack of thread
24*10465441SEvalZero  */
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)25*10465441SEvalZero rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
26*10465441SEvalZero 	rt_uint8_t *stack_addr, void *texit)
27*10465441SEvalZero {
28*10465441SEvalZero     unsigned char i;
29*10465441SEvalZero 	unsigned long *stk;
30*10465441SEvalZero 
31*10465441SEvalZero     stk    = (unsigned long *)stack_addr;     /* Load stack pointer                                    */
32*10465441SEvalZero 
33*10465441SEvalZero                                               /* Simulate a function call to the task with an argument */
34*10465441SEvalZero     stk   -= 3;                               /* 3 words assigned for incoming args (R0, R1, R2)       */
35*10465441SEvalZero 
36*10465441SEvalZero                                               /* Now simulating vectoring to an ISR                    */
37*10465441SEvalZero     *--stk = (unsigned long)parameter;        /* R0 value - caller's incoming argument #1              */
38*10465441SEvalZero     *--stk = (unsigned long)0;                /* P1 value - value irrelevant                           */
39*10465441SEvalZero 
40*10465441SEvalZero     *--stk = (unsigned long)texit;            /* RETS value - NO task should return with RTS.          */
41*10465441SEvalZero                                               /* however OS_CPU_Invalid_Task_Return is a safety        */
42*10465441SEvalZero                                               /* catch-allfor tasks that return with an RTS            */
43*10465441SEvalZero 
44*10465441SEvalZero     *--stk = (unsigned long)parameter;        /* R1 value - caller's incoming argument #2              */
45*10465441SEvalZero                                               /* (not relevant in current test example)                */
46*10465441SEvalZero     *--stk = (unsigned long)parameter;        /* R2 value - caller's incoming argument #3              */
47*10465441SEvalZero                                               /* (not relevant in current test example)                */
48*10465441SEvalZero     *--stk = (unsigned long)0;                /* P0 value - value irrelevant                           */
49*10465441SEvalZero     *--stk = (unsigned long)0;                /* P2 value - value irrelevant                           */
50*10465441SEvalZero     *--stk = (unsigned long)0;                /* ASTAT value - caller's ASTAT value - value            */
51*10465441SEvalZero                                               /* irrelevant                                            */
52*10465441SEvalZero 
53*10465441SEvalZero     *--stk = (unsigned long)tentry;           /* RETI value- pushing the start address of the task     */
54*10465441SEvalZero 
55*10465441SEvalZero     for (i = 0; i < 35; i++)                  /* remaining reg values - R7:3, P5:3,                    */
56*10465441SEvalZero     {                                         /* 4 words of A1:0(.W,.X), LT0, LT1,                     */
57*10465441SEvalZero         *--stk = (unsigned long)0;            /* LC0, LC1, LB0, LB1,I3:0, M3:0, L3:0, B3:0,            */
58*10465441SEvalZero     }                                         /* All values irrelevant                                 */
59*10465441SEvalZero 
60*10465441SEvalZero     return (rt_uint8_t *)stk;                 /* Return top-of-stack                                   */
61*10465441SEvalZero }
62*10465441SEvalZero 
rt_hw_context_switch(rt_uint32_t from,rt_uint32_t to)63*10465441SEvalZero void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to)
64*10465441SEvalZero {
65*10465441SEvalZero     if (rt_thread_switch_interrupt_flag != 1)
66*10465441SEvalZero     {
67*10465441SEvalZero         rt_thread_switch_interrupt_flag = 1;
68*10465441SEvalZero         rt_interrupt_from_thread = from;
69*10465441SEvalZero     }
70*10465441SEvalZero 
71*10465441SEvalZero     rt_interrupt_to_thread = to;
72*10465441SEvalZero     asm("raise 14;");                     // Raise Interrupt 14 (trap)
73*10465441SEvalZero }
74*10465441SEvalZero 
rt_hw_context_switch_interrupt(rt_uint32_t from,rt_uint32_t to)75*10465441SEvalZero void rt_hw_context_switch_interrupt(rt_uint32_t from, rt_uint32_t to)
76*10465441SEvalZero {
77*10465441SEvalZero     if (rt_thread_switch_interrupt_flag != 1)
78*10465441SEvalZero     {
79*10465441SEvalZero         rt_thread_switch_interrupt_flag = 1;
80*10465441SEvalZero         rt_interrupt_from_thread = from;
81*10465441SEvalZero     }
82*10465441SEvalZero 
83*10465441SEvalZero     rt_interrupt_to_thread = to;
84*10465441SEvalZero     asm("raise 14;");                     // Raise Interrupt 14 (trap)
85*10465441SEvalZero }
86*10465441SEvalZero 
rt_hw_context_switch_to(rt_uint32_t to)87*10465441SEvalZero void rt_hw_context_switch_to(rt_uint32_t to)
88*10465441SEvalZero {
89*10465441SEvalZero     rt_thread_switch_interrupt_flag = 1;
90*10465441SEvalZero     rt_interrupt_from_thread = 0;
91*10465441SEvalZero     rt_interrupt_to_thread = to;
92*10465441SEvalZero     asm("raise 14;");                     // Raise Interrupt 14 (trap)
93*10465441SEvalZero }
94