TLK: Clean up obsolete files
[3rdparty/ote_partner/tlk.git] / arch / arm / arm-m / arch.c
1 /*
2  * Copyright (c) 2012 Travis Geiselbrecht
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #include <debug.h>
24 #include <arch.h>
25 #include <arch/ops.h>
26 #include <arch/arm.h>
27 #include <platform.h>
28 #include <arch/arm/cm3.h>
29
30 #define ENABLE_CYCLE_COUNTER 1
31
32 extern void *vectab;
33
34 extern int _end_of_ram;
35 void *_heap_end = &_end_of_ram;
36
37 #if ARM_M_DYNAMIC_PRIORITY_SIZE
38 unsigned int cm3_num_irq_pri_bits;
39 unsigned int cm3_irq_pri_mask;
40 #endif
41
42 void arch_early_init(void)
43 {
44         arch_disable_ints();
45
46         /* set the vector table base */
47         SCB->VTOR = (uint32_t)&vectab;
48
49         /* clear any pending interrupts and set all the vectors to medium priority */
50         int i;
51         int groups = SCnSCB->ICTR & 0xf;
52         for (i = 0; i < groups; i++) {
53                 NVIC->ICER[i] = 0xffffffff;
54                 NVIC->ICPR[i] = 0xffffffff;
55                 NVIC->IP[i*4] = 128; /* medium priority */
56                 NVIC->IP[i*4+1] = 128; /* medium priority */
57                 NVIC->IP[i*4+2] = 128; /* medium priority */
58                 NVIC->IP[i*4+3] = 128; /* medium priority */
59         }
60
61 #if ARM_M_DYNAMIC_PRIORITY_SIZE
62         /* number of priorities */
63         for (i=0; i < 7; i++) {
64                 __set_BASEPRI(1 << i);
65                 if (__get_BASEPRI() != 0)
66                         break;
67         }
68         cm3_num_irq_pri_bits = 8 - i;
69         cm3_irq_pri_mask = ~((1 << i) - 1) & 0xff;
70 #endif
71
72         /* leave BASEPRI at 0 */
73         __set_BASEPRI(0);
74
75         /* set priority grouping to 0 */
76         NVIC_SetPriorityGrouping(0);
77
78         /* enable certain faults */
79         SCB->SHCSR |= (SCB_SHCSR_USGFAULTENA_Msk | SCB_SHCSR_BUSFAULTENA_Msk | SCB_SHCSR_MEMFAULTENA_Msk);
80
81         /* set the svc and pendsv priority level to pretty low */
82         SCB->SHP[11-4] = cm3_lowest_priority();
83         SCB->SHP[14-4] = cm3_lowest_priority();
84
85         /* initialize the systick mechanism */
86         cm3_systick_init();
87 }
88
89 void arch_init(void)
90 {
91 #if ENABLE_CYCLE_COUNTER
92         *REG32(SCB_DEMCR) |= 0x01000000; // global trace enable
93         *REG32(DWT_CYCCNT) = 0;
94         *REG32(DWT_CTRL) |= 1; // enable cycle counter
95 #endif
96 }
97
98 void arch_quiesce(void)
99 {
100 }
101
102 void arch_idle(void)
103 {
104 }
105
106 void _cm3_set_irqpri(uint32_t pri)
107 {
108         if (pri == 0) {
109                 __disable_irq(); // cpsid i
110                 __set_BASEPRI(0);
111         } else if (pri >= 256) {
112                 __set_BASEPRI(0);
113                 __enable_irq();
114         } else {
115                 uint32_t _pri = pri & cm3_irq_pri_mask;
116
117                 if (_pri == 0)
118                         __set_BASEPRI(1 << (8 - cm3_num_irq_pri_bits));
119                 else
120                         __set_BASEPRI(_pri);
121                 __enable_irq(); // cpsie i
122         }
123 }
124