summaryrefslogtreecommitdiff
path: root/ports_arch/ARMv7-M/threadx/ghs/example_build/tx_initialize_low_level.arm
blob: 57c964b34a706aebc93a72486432f2af56fca8cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/***************************************************************************
 * Copyright (c) 2024 Microsoft Corporation
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * SPDX-License-Identifier: MIT
 **************************************************************************/


/**************************************************************************/
/**************************************************************************/
/**                                                                       */
/** ThreadX Component                                                     */
/**                                                                       */
/**   Initialize                                                          */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/

    SYSTEM_CLOCK    =   6000000
    SYSTICK_CYCLES  =   ((SYSTEM_CLOCK / 100) -1)

    .text
    .align  4
/**************************************************************************/
/*                                                                        */
/*  FUNCTION                                               RELEASE        */
/*                                                                        */
/*    _tx_initialize_low_level                          Cortex-M7/GHS     */
/*                                                           6.1          */
/*  AUTHOR                                                                */
/*                                                                        */
/*    William E. Lamie, Microsoft Corporation                             */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This function is responsible for any low-level processor            */
/*    initialization, including setting up interrupt vectors, setting     */
/*    up a periodic timer interrupt source, saving the system stack       */
/*    pointer for use in ISR processing later, and finding the first      */
/*    available RAM memory address for tx_application_define.             */
/*                                                                        */
/*  INPUT                                                                 */
/*                                                                        */
/*    None                                                                */
/*                                                                        */
/*  OUTPUT                                                                */
/*                                                                        */
/*    None                                                                */
/*                                                                        */
/*  CALLS                                                                 */
/*                                                                        */
/*    None                                                                */
/*                                                                        */
/*  CALLED BY                                                             */
/*                                                                        */
/*    _tx_initialize_kernel_enter           ThreadX entry function        */
/*                                                                        */
/*  RELEASE HISTORY                                                       */
/*                                                                        */
/*    DATE              NAME                      DESCRIPTION             */
/*                                                                        */
/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
/*                                                                        */
/**************************************************************************/
/* VOID   _tx_initialize_low_level(VOID)
{  */
    .globl  _tx_initialize_low_level
_tx_initialize_low_level:

    /* Disable interrupts.  */

    CPSID   i                                   ; Disable interrupts


    /* Save the system stack pointer.  */
    /* _tx_thread_system_stack_ptr = (VOID_PTR) (sp);  */

    LDR     r1,=_tx_thread_system_stack_ptr     ; Pickup address of system stack ptr
    STR     sp, [r1]                            ; Save system stack


    /* Save the first available memory address.  */
    /* _tx_initialize_unused_memory =  (VOID_PTR) __ghsbegin_free_mem;  */

    LDR     r0,=__ghsbegin_free_mem             ; Pickup free memory address
    LDR     r2,=_tx_initialize_unused_memory    ; Pickup unused memory ptr address
    STR     r0, [r2]                            ; Save first free memory address


    /* Enable the cycle count register.  */

    LDR     r0, =0xE0001000                     ; Build address of DWT register
    LDR     r1, [r0]                            ; Pickup the current value
    ORR     r1, r1, 1                           ; Set the CYCCNTENA bit
    STR     r1, [r0]                            ; Enable the cycle count register


    /* Setup Vector Table Offset Register.  */

    MOV     r0, 0xE000E000                      ; Build address of NVIC registers
    LDR     r1, =__vectors                      ; Pickup address of vector table
    STR     r1, [r0, 0xD08]                     ; Set vector table address


    /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference.  */

    LDR     r1, =SYSTICK_CYCLES
    STR     r1, [r0, 0x14]                      ; Setup SysTick Reload Value
    MOV     r1, 0x7                             ; Build SysTick Control Enable Value
    STR     r1, [r0, 0x10]                      ; Setup SysTick Control

    /* Configure handler priorities.  */

    LDR     r1, =0x00000000                     ; Rsrv, UsgF, BusF, MemM
    STR     r1, [r0, 0xD18]                     ; Setup System Handlers 4-7 Priority Registers

    LDR     r1, =0xFF000000                     ; SVCl, Rsrv, Rsrv, Rsrv
    STR     r1, [r0, 0xD1C]                     ; Setup System Handlers 8-11 Priority Registers
                                                ; Note: SVC must be lowest priority, which is 0xFF

    LDR     r1, =0x40FF0000                     ; SysT, PnSV, Rsrv, DbgM
    STR     r1, [r0, 0xD20]                     ; Setup System Handlers 12-15 Priority Registers
                                                ; Note: PnSV must be lowest priority, which is 0xFF

#ifdef __VFP__
    LDR     r0, =0xE000EF34                     ; Pickup FPCCR
    LDR     r1, [r0]                            ;
    LDR     r2, =0x3FFFFFFF                     ; Build mask to clear ASPEN and LSPEN
    AND     r1, r1, r2                          ; Clear the ASPEN and LSPEN bits
    STR     r1, [r0]                            ; Update FPCCR
#endif

    /* Return to caller.  */

    BX      lr                                  ; Return to caller

    .type _tx_initialize_low_level,$function
    .size _tx_initialize_low_level,.-_tx_initialize_low_level
/* }  */


/* Define shells for each of the interrupt vectors.  */

    .globl  __tx_BadHandler
__tx_BadHandler:
    B       __tx_BadHandler

    .type __tx_BadHandler,$function
    .size __tx_BadHandler,.-__tx_BadHandler


    .globl  __tx_IntHandler
__tx_IntHandler:
    PUSH    {lr}
    BL      _tx_thread_context_save

#ifdef  TX_ENABLE_EVENT_LOGGING
    MOV     r0, 0                               ; Build interrupt code
    BL      _tx_el_interrupt                    ; Call interrupt event logging
#endif

;    /* Do interrupt handler work here */
;    /* .... */

#ifdef  TX_ENABLE_EVENT_LOGGING
    MOV     r0, 0                               ; Build interrupt code
    BL      _tx_el_interrupt_end                ; Call interrupt event logging
#endif

    B       _tx_thread_context_restore

    .type __tx_IntHandler,$function
    .size __tx_IntHandler,.-__tx_IntHandler


    .globl  __tx_SysTickHandler
__tx_SysTickHandler:
    PUSH    {lr}
    BL      _tx_thread_context_save

#ifdef  TX_ENABLE_EVENT_LOGGING
    MOV     r0, 15                              ; Build interrupt code
    BL      _tx_el_interrupt                    ; Call interrupt event logging
#endif

    BL      _tx_timer_interrupt

#ifdef  TX_ENABLE_EVENT_LOGGING
    MOV     r0, 15                              ; Build interrupt code
    BL      _tx_el_interrupt_end                ; Call interrupt event logging
#endif

    B       _tx_thread_context_restore

    .type __tx_SysTickHandler,$function
    .size __tx_SysTickHandler,.-__tx_SysTickHandler


    .globl  __tx_NMIHandler
__tx_NMIHandler:
    B       __tx_NMIHandler

    .type __tx_NMIHandler,$function
    .size __tx_NMIHandler,.-__tx_NMIHandler


    .globl  __tx_DBGHandler
__tx_DBGHandler:
    B       __tx_DBGHandler

    .type __tx_DBGHandler,$function
    .size __tx_DBGHandler,.-__tx_DBGHandler


    .globl  __tx_SVCallHandler
__tx_SVCallHandler:
    B       __tx_SVCallHandler

    .type __tx_SVCallHandler,$function
    .size __tx_SVCallHandler,.-__tx_SVCallHandler


    /* Reference build options and version ID to ensure they come in.  */

BUILD_OPTIONS:
    .data.w _tx_build_options
VERSION_ID:
    .data.w _tx_version_id