source: rtems/cpukit/score/cpu/arm/rtems/score/armv7m.h @ 6091f1a6

4.115
Last change on this file since 6091f1a6 was 6091f1a6, checked in by Sebastian Huber <sebastian.huber@…>, on 02/07/12 at 21:11:01

ARMv7-M NVIC and MPU API changes.

  • Property mode set to 100644
File size: 12.6 KB
Line 
1/*
2 * Copyright (c) 2011 Sebastian Huber.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Obere Lagerstr. 30
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.com/license/LICENSE.
13 *
14 * $Id$
15 */
16
17#ifndef RTEMS_SCORE_ARMV7M_H
18#define RTEMS_SCORE_ARMV7M_H
19
20#include <stdint.h>
21#include <stdbool.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif /* __cplusplus */
26
27typedef struct {
28  uint32_t reserved_0;
29  uint32_t ictr;
30  uint32_t actlr;
31  uint32_t reserved_1;
32} ARMV7M_ICTAC;
33
34typedef void (*ARMV7M_Exception_handler)(void);
35
36typedef struct {
37  uint32_t register_r0;
38  uint32_t register_r1;
39  uint32_t register_r2;
40  uint32_t register_r3;
41  uint32_t register_r12;
42  void *register_lr;
43  void *register_pc;
44  uint32_t register_xpsr;
45} ARMV7M_Exception_frame;
46
47typedef struct {
48  uint32_t cpuid;
49
50#define ARMV7M_SCB_ICSR_NMIPENDSET (1U << 31)
51#define ARMV7M_SCB_ICSR_PENDSVSET (1U << 28)
52#define ARMV7M_SCB_ICSR_PENDSVCLR (1U << 27)
53#define ARMV7M_SCB_ICSR_PENDSTSET (1U << 26)
54#define ARMV7M_SCB_ICSR_PENDSTCLR (1U << 25)
55#define ARMV7M_SCB_ICSR_ISRPREEMPT (1U << 23)
56#define ARMV7M_SCB_ICSR_ISRPENDING (1U << 22)
57#define ARMV7M_SCB_ICSR_VECTPENDING_GET(reg) (((reg) >> 12) & 0x1ffU)
58#define ARMV7M_SCB_ICSR_RETTOBASE (1U << 11)
59#define ARMV7M_SCB_ICSR_VECTACTIVE_GET(reg) ((reg) & 0x1ffU)
60  uint32_t icsr;
61
62  ARMV7M_Exception_handler *vtor;
63  uint32_t aircr;
64  uint32_t scr;
65  uint32_t ccr;
66  uint8_t shpr [12];
67  uint32_t shcsr;
68  uint32_t cfsr;
69  uint32_t hfsr;
70  uint32_t dfsr;
71  uint32_t mmfar;
72  uint32_t bfar;
73  uint32_t afsr;
74} ARMV7M_SCB;
75
76typedef struct {
77#define ARMV7M_SYSTICK_CSR_COUNTFLAG (1U << 16)
78#define ARMV7M_SYSTICK_CSR_CLKSOURCE (1U << 2)
79#define ARMV7M_SYSTICK_CSR_TICKINT (1U << 1)
80#define ARMV7M_SYSTICK_CSR_ENABLE (1U << 0)
81  uint32_t csr;
82
83  uint32_t rvr;
84  uint32_t cvr;
85
86#define ARMV7M_SYSTICK_CALIB_NOREF (1U << 31)
87#define ARMV7M_SYSTICK_CALIB_SKEW (1U << 30)
88#define ARMV7M_SYSTICK_CALIB_TENMS_GET(reg) ((reg) & 0xffffffU)
89  uint32_t calib;
90} ARMV7M_Systick;
91
92typedef struct {
93  uint32_t iser [8];
94  uint32_t reserved_0 [24];
95  uint32_t icer [8];
96  uint32_t reserved_1 [24];
97  uint32_t ispr [8];
98  uint32_t reserved_2 [24];
99  uint32_t icpr [8];
100  uint32_t reserved_3 [24];
101  uint32_t iabr [8];
102  uint32_t reserved_4 [56];
103  uint8_t  ipr [240];
104  uint32_t reserved_5 [644];
105  uint32_t stir;
106} ARMV7M_NVIC;
107
108typedef struct {
109#define ARMV7M_MPU_TYPE_IREGION_GET(reg) (((reg) >> 16) & 0xffU)
110#define ARMV7M_MPU_TYPE_DREGION_GET(reg) (((reg) >> 8) & 0xffU)
111#define ARMV7M_MPU_TYPE_SEPARATE (1U << 0)
112  uint32_t type;
113
114#define ARMV7M_MPU_CTRL_PRIVDEFENA (1U << 2)
115#define ARMV7M_MPU_CTRL_HFNMIENA (1U << 1)
116#define ARMV7M_MPU_CTRL_ENABLE (1U << 0)
117  uint32_t ctrl;
118
119  uint32_t rnr;
120
121#define ARMV7M_MPU_RBAR_ADDR_SHIFT 5
122#define ARMV7M_MPU_RBAR_ADDR_MASK \
123  ((0x7ffffffU) << ARMV7M_MPU_RBAR_ADDR_SHIFT)
124#define ARMV7M_MPU_RBAR_ADDR(val) \
125  (((val) << ARMV7M_MPU_RBAR_ADDR_SHIFT) & ARMV7M_MPU_RBAR_ADDR_MASK)
126#define ARMV7M_MPU_RBAR_ADDR_GET(reg) \
127  (((val) & ARMV7M_MPU_RBAR_ADDR_MASK) >> ARMV7M_MPU_RBAR_ADDR_SHIFT)
128#define ARMV7M_MPU_RBAR_ADDR_SET(reg, val) \
129  (((reg) & ~ARMV7M_MPU_RBAR_ADDR_MASK) | ARMV7M_MPU_RBAR_ADDR(val))
130#define ARMV7M_MPU_RBAR_VALID (1U << 4)
131#define ARMV7M_MPU_RBAR_REGION_SHIFT 0
132#define ARMV7M_MPU_RBAR_REGION_MASK \
133  ((0xfU) << ARMV7M_MPU_RBAR_REGION_SHIFT)
134#define ARMV7M_MPU_RBAR_REGION(val) \
135  (((val) << ARMV7M_MPU_RBAR_REGION_SHIFT) & ARMV7M_MPU_RBAR_REGION_MASK)
136#define ARMV7M_MPU_RBAR_REGION_GET(reg) \
137  (((val) & ARMV7M_MPU_RBAR_REGION_MASK) >> ARMV7M_MPU_RBAR_REGION_SHIFT)
138#define ARMV7M_MPU_RBAR_REGION_SET(reg, val) \
139  (((reg) & ~ARMV7M_MPU_RBAR_REGION_MASK) | ARMV7M_MPU_RBAR_REGION(val))
140  uint32_t rbar;
141
142#define ARMV7M_MPU_RASR_XN (1U << 28)
143#define ARMV7M_MPU_RASR_AP_SHIFT 24
144#define ARMV7M_MPU_RASR_AP_MASK \
145  ((0x7U) << ARMV7M_MPU_RASR_AP_SHIFT)
146#define ARMV7M_MPU_RASR_AP(val) \
147  (((val) << ARMV7M_MPU_RASR_AP_SHIFT) & ARMV7M_MPU_RASR_AP_MASK)
148#define ARMV7M_MPU_RASR_AP_GET(reg) \
149  (((val) & ARMV7M_MPU_RASR_AP_MASK) >> ARMV7M_MPU_RASR_AP_SHIFT)
150#define ARMV7M_MPU_RASR_AP_SET(reg, val) \
151  (((reg) & ~ARMV7M_MPU_RASR_AP_MASK) | ARMV7M_MPU_RASR_AP(val))
152#define ARMV7M_MPU_RASR_TEX_SHIFT 19
153#define ARMV7M_MPU_RASR_TEX_MASK \
154  ((0x7U) << ARMV7M_MPU_RASR_TEX_SHIFT)
155#define ARMV7M_MPU_RASR_TEX(val) \
156  (((val) << ARMV7M_MPU_RASR_TEX_SHIFT) & ARMV7M_MPU_RASR_TEX_MASK)
157#define ARMV7M_MPU_RASR_TEX_GET(reg) \
158  (((val) & ARMV7M_MPU_RASR_TEX_MASK) >> ARMV7M_MPU_RASR_TEX_SHIFT)
159#define ARMV7M_MPU_RASR_TEX_SET(reg, val) \
160  (((reg) & ~ARMV7M_MPU_RASR_TEX_MASK) | ARMV7M_MPU_RASR_TEX(val))
161#define ARMV7M_MPU_RASR_S (1U << 18)
162#define ARMV7M_MPU_RASR_C (1U << 17)
163#define ARMV7M_MPU_RASR_B (1U << 16)
164#define ARMV7M_MPU_RASR_SRD_SHIFT 8
165#define ARMV7M_MPU_RASR_SRD_MASK \
166  ((0xffU) << ARMV7M_MPU_RASR_SRD_SHIFT)
167#define ARMV7M_MPU_RASR_SRD(val) \
168  (((val) << ARMV7M_MPU_RASR_SRD_SHIFT) & ARMV7M_MPU_RASR_SRD_MASK)
169#define ARMV7M_MPU_RASR_SRD_GET(reg) \
170  (((val) & ARMV7M_MPU_RASR_SRD_MASK) >> ARMV7M_MPU_RASR_SRD_SHIFT)
171#define ARMV7M_MPU_RASR_SRD_SET(reg, val) \
172  (((reg) & ~ARMV7M_MPU_RASR_SRD_MASK) | ARMV7M_MPU_RASR_SRD(val))
173#define ARMV7M_MPU_RASR_SIZE_SHIFT 1
174#define ARMV7M_MPU_RASR_SIZE_MASK \
175  ((0x1fU) << ARMV7M_MPU_RASR_SIZE_SHIFT)
176#define ARMV7M_MPU_RASR_SIZE(val) \
177  (((val) << ARMV7M_MPU_RASR_SIZE_SHIFT) & ARMV7M_MPU_RASR_SIZE_MASK)
178#define ARMV7M_MPU_RASR_SIZE_GET(reg) \
179  (((val) & ARMV7M_MPU_RASR_SIZE_MASK) >> ARMV7M_MPU_RASR_SIZE_SHIFT)
180#define ARMV7M_MPU_RASR_SIZE_SET(reg, val) \
181  (((reg) & ~ARMV7M_MPU_RASR_SIZE_MASK) | ARMV7M_MPU_RASR_SIZE(val))
182#define ARMV7M_MPU_RASR_ENABLE (1U << 0)
183  uint32_t rasr;
184
185  uint32_t rbar_a1;
186  uint32_t rasr_a1;
187  uint32_t rbar_a2;
188  uint32_t rasr_a2;
189  uint32_t rbar_a3;
190  uint32_t rasr_a3;
191} ARMV7M_MPU;
192
193typedef enum {
194  ARMV7M_MPU_AP_PRIV_NO_USER_NO,
195  ARMV7M_MPU_AP_PRIV_RW_USER_NO,
196  ARMV7M_MPU_AP_PRIV_RW_USER_RO,
197  ARMV7M_MPU_AP_PRIV_RW_USER_RW,
198  ARMV7M_MPU_AP_PRIV_RO_USER_NO = 0x5,
199  ARMV7M_MPU_AP_PRIV_RO_USER_RO,
200} ARMV7M_MPU_Access_permissions;
201
202typedef enum {
203  ARMV7M_MPU_ATTR_R = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
204    | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN,
205  ARMV7M_MPU_ATTR_RW = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
206    | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN | ARMV7M_MPU_RASR_B,
207  ARMV7M_MPU_ATTR_RWX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
208    | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_B,
209  ARMV7M_MPU_ATTR_X = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_NO_USER_NO)
210    | ARMV7M_MPU_RASR_C,
211  ARMV7M_MPU_ATTR_RX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
212    | ARMV7M_MPU_RASR_C,
213  ARMV7M_MPU_ATTR_IO = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
214    | ARMV7M_MPU_RASR_XN,
215} ARMV7M_MPU_Attributes;
216
217typedef enum {
218  ARMV7M_MPU_SIZE_32_B = 0x4,
219  ARMV7M_MPU_SIZE_64_B,
220  ARMV7M_MPU_SIZE_128_B,
221  ARMV7M_MPU_SIZE_256_B,
222  ARMV7M_MPU_SIZE_512_B,
223  ARMV7M_MPU_SIZE_1_KB,
224  ARMV7M_MPU_SIZE_2_KB,
225  ARMV7M_MPU_SIZE_4_KB,
226  ARMV7M_MPU_SIZE_8_KB,
227  ARMV7M_MPU_SIZE_16_KB,
228  ARMV7M_MPU_SIZE_32_KB,
229  ARMV7M_MPU_SIZE_64_KB,
230  ARMV7M_MPU_SIZE_128_KB,
231  ARMV7M_MPU_SIZE_256_KB,
232  ARMV7M_MPU_SIZE_512_KB,
233  ARMV7M_MPU_SIZE_1_MB,
234  ARMV7M_MPU_SIZE_2_MB,
235  ARMV7M_MPU_SIZE_4_MB,
236  ARMV7M_MPU_SIZE_8_MB,
237  ARMV7M_MPU_SIZE_16_MB,
238  ARMV7M_MPU_SIZE_32_MB,
239  ARMV7M_MPU_SIZE_64_MB,
240  ARMV7M_MPU_SIZE_128_MB,
241  ARMV7M_MPU_SIZE_256_MB,
242  ARMV7M_MPU_SIZE_512_MB,
243  ARMV7M_MPU_SIZE_1_GB,
244  ARMV7M_MPU_SIZE_2_GB,
245  ARMV7M_MPU_SIZE_4_GB
246} ARMV7M_MPU_Size;
247
248typedef struct {
249  uint32_t rbar;
250  uint32_t rasr;
251} ARMV7M_MPU_Region;
252
253#define ARMV7M_MPU_REGION_INITIALIZER(idx, addr, size, attr) \
254  { \
255    ((addr) & ARMV7M_MPU_RBAR_ADDR_MASK) \
256      | ARMV7M_MPU_RBAR_VALID \
257      | ARMV7M_MPU_RBAR_REGION(idx), \
258    ARMV7M_MPU_RASR_SIZE(size) | (attr) | ARMV7M_MPU_RASR_ENABLE \
259  }
260
261#define ARMV7M_MPU_REGION_DISABLED_INITIALIZER(idx) \
262  { \
263    ARMV7M_MPU_RBAR_VALID | ARMV7M_MPU_RBAR_REGION(idx), \
264    0 \
265  }
266
267#define ARMV7M_SCS_BASE 0xe000e000
268#define ARMV7M_ICTAC_BASE (ARMV7M_SCS_BASE + 0x0)
269#define ARMV7M_SYSTICK_BASE (ARMV7M_SCS_BASE + 0x10)
270#define ARMV7M_NVIC_BASE (ARMV7M_SCS_BASE + 0x100)
271#define ARMV7M_SCB_BASE (ARMV7M_SCS_BASE + 0xd00)
272#define ARMV7M_MPU_BASE (ARMV7M_SCS_BASE + 0xd90)
273
274#define _ARMV7M_ICTAC \
275  ((volatile ARMV7M_ICTAC *) ARMV7M_ICTAC_BASE)
276#define _ARMV7M_SCB \
277  ((volatile ARMV7M_SCB *) ARMV7M_SCB_BASE)
278#define _ARMV7M_Systick \
279  ((volatile ARMV7M_Systick *) ARMV7M_SYSTICK_BASE)
280#define _ARMV7M_NVIC \
281  ((volatile ARMV7M_NVIC *) ARMV7M_NVIC_BASE)
282#define _ARMV7M_MPU \
283  ((volatile ARMV7M_MPU *) ARMV7M_MPU_BASE)
284
285#define ARMV7M_VECTOR_MSP 0
286#define ARMV7M_VECTOR_RESET 1
287#define ARMV7M_VECTOR_NMI 2
288#define ARMV7M_VECTOR_HARD_FAULT 3
289#define ARMV7M_VECTOR_MEM_MANAGE 4
290#define ARMV7M_VECTOR_BUS_FAULT 5
291#define ARMV7M_VECTOR_USAGE_FAULT 6
292#define ARMV7M_VECTOR_SVC 11
293#define ARMV7M_VECTOR_DEBUG_MONITOR 12
294#define ARMV7M_VECTOR_PENDSV 14
295#define ARMV7M_VECTOR_SYSTICK 15
296#define ARMV7M_VECTOR_IRQ(n) ((n) + 16)
297#define ARMV7M_IRQ_OF_VECTOR(n) ((n) - 16)
298
299static inline bool _ARMV7M_Is_vector_an_irq( int vector )
300{
301  return vector >= 16;
302}
303
304static inline uint32_t _ARMV7M_Get_basepri(void)
305{
306  uint32_t val;
307  __asm__ volatile ("mrs %[val], basepri\n" : [val] "=&r" (val));
308  return val;
309}
310
311static inline void _ARMV7M_Set_basepri(uint32_t val)
312{
313  __asm__ volatile ("msr basepri, %[val]\n" : : [val] "r" (val));
314}
315
316static inline uint32_t _ARMV7M_Get_primask(void)
317{
318  uint32_t val;
319  __asm__ volatile ("mrs %[val], primask\n" : [val] "=&r" (val));
320  return val;
321}
322
323static inline void _ARMV7M_Set_primask(uint32_t val)
324{
325  __asm__ volatile ("msr primask, %[val]\n" : : [val] "r" (val));
326}
327
328static inline uint32_t _ARMV7M_Get_faultmask(void)
329{
330  uint32_t val;
331  __asm__ volatile ("mrs %[val], faultmask\n" : [val] "=&r" (val));
332  return val;
333}
334
335static inline void _ARMV7M_Set_faultmask(uint32_t val)
336{
337  __asm__ volatile ("msr faultmask, %[val]\n" : : [val] "r" (val));
338}
339
340static inline uint32_t _ARMV7M_Get_control(void)
341{
342  uint32_t val;
343  __asm__ volatile ("mrs %[val], control\n" : [val] "=&r" (val));
344  return val;
345}
346
347static inline void _ARMV7M_Set_control(uint32_t val)
348{
349  __asm__ volatile ("msr control, %[val]\n" : : [val] "r" (val));
350}
351
352static inline uint32_t _ARMV7M_Get_MSP(void)
353{
354  uint32_t val;
355  __asm__ volatile ("mrs %[val], msp\n" : [val] "=&r" (val));
356  return val;
357}
358
359static inline void _ARMV7M_Set_MSP(uint32_t val)
360{
361  __asm__ volatile ("msr msp, %[val]\n" : : [val] "r" (val));
362}
363
364static inline uint32_t _ARMV7M_Get_PSP(void)
365{
366  uint32_t val;
367  __asm__ volatile ("mrs %[val], psp\n" : [val] "=&r" (val));
368  return val;
369}
370
371static inline void _ARMV7M_Set_PSP(uint32_t val)
372{
373  __asm__ volatile ("msr psp, %[val]\n" : : [val] "r" (val));
374}
375
376static inline uint32_t _ARMV7M_Get_XPSR(void)
377{
378  uint32_t val;
379  __asm__ volatile ("mrs %[val], xpsr\n" : [val] "=&r" (val));
380  return val;
381}
382
383static inline bool _ARMV7M_NVIC_Is_enabled( int irq )
384{
385  int index = irq >> 5;
386  uint32_t bit = 1U << (irq & 0x1f);
387
388  return (_ARMV7M_NVIC->iser [index] & bit) != 0;
389}
390
391static inline void _ARMV7M_NVIC_Set_enable( int irq )
392{
393  int index = irq >> 5;
394  uint32_t bit = 1U << (irq & 0x1f);
395
396  _ARMV7M_NVIC->iser [index] = bit;
397}
398
399static inline void _ARMV7M_NVIC_Clear_enable( int irq )
400{
401  int index = irq >> 5;
402  uint32_t bit = 1U << (irq & 0x1f);
403
404  _ARMV7M_NVIC->icer [index] = bit;
405}
406
407static inline bool _ARMV7M_NVIC_Is_pending( int irq )
408{
409  int index = irq >> 5;
410  uint32_t bit = 1U << (irq & 0x1f);
411
412  return (_ARMV7M_NVIC->ispr [index] & bit) != 0;
413}
414
415static inline void _ARMV7M_NVIC_Set_pending( int irq )
416{
417  int index = irq >> 5;
418  uint32_t bit = 1U << (irq & 0x1f);
419
420  _ARMV7M_NVIC->ispr [index] = bit;
421}
422
423static inline void _ARMV7M_NVIC_Clear_pending( int irq )
424{
425  int index = irq >> 5;
426  uint32_t bit = 1U << (irq & 0x1f);
427
428  _ARMV7M_NVIC->icpr [index] = bit;
429}
430
431static inline bool _ARMV7M_NVIC_Is_active( int irq )
432{
433  int index = irq >> 5;
434  uint32_t bit = 1U << (irq & 0x1f);
435
436  return (_ARMV7M_NVIC->iabr [index] & bit) != 0;
437}
438
439static inline void _ARMV7M_NVIC_Set_priority( int irq, int priority )
440{
441  _ARMV7M_NVIC->ipr [irq] = (uint8_t) priority;
442}
443
444static inline int _ARMV7M_NVIC_Get_priority( int irq )
445{
446  return _ARMV7M_NVIC->ipr [irq];
447}
448
449int _ARMV7M_Get_exception_priority( int vector );
450
451void _ARMV7M_Set_exception_priority( int vector, int priority );
452
453ARMV7M_Exception_handler _ARMV7M_Get_exception_handler( int index );
454
455void _ARMV7M_Set_exception_handler(
456  int index,
457  ARMV7M_Exception_handler handler
458);
459
460void _ARMV7M_Interrupt_service_enter( void );
461
462void _ARMV7M_Interrupt_service_leave( void );
463
464void _ARMV7M_Pendable_service_call( void );
465
466void _ARMV7M_Supervisor_call( void );
467
468#ifdef __cplusplus
469}
470#endif /* __cplusplus */
471
472#endif /* RTEMS_SCORE_ARMV7M_H */
Note: See TracBrowser for help on using the repository browser.