Subversion Repositories FuelGauge

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**************************************************************************//**
2
 * @file     cmsis_cp15.h
3
 * @brief    CMSIS compiler specific macros, functions, instructions
4
 * @version  V1.0.1
5
 * @date     07. Sep 2017
6
 ******************************************************************************/
7
/*
8
 * Copyright (c) 2009-2017 ARM Limited. All rights reserved.
9
 *
10
 * SPDX-License-Identifier: Apache-2.0
11
 *
12
 * Licensed under the Apache License, Version 2.0 (the License); you may
13
 * not use this file except in compliance with the License.
14
 * You may obtain a copy of the License at
15
 *
16
 * www.apache.org/licenses/LICENSE-2.0
17
 *
18
 * Unless required by applicable law or agreed to in writing, software
19
 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
20
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
 * See the License for the specific language governing permissions and
22
 * limitations under the License.
23
 */
24
 
25
#if   defined ( __ICCARM__ )
26
  #pragma system_include         /* treat file as system include file for MISRA check */
27
#elif defined (__clang__)
28
  #pragma clang system_header   /* treat file as system include file */
29
#endif
30
 
31
#ifndef __CMSIS_CP15_H
32
#define __CMSIS_CP15_H
33
 
34
/** \brief  Get ACTLR
35
    \return               Auxiliary Control register value
36
 */
37
__STATIC_FORCEINLINE uint32_t __get_ACTLR(void)
38
{
39
  uint32_t result;
40
  __get_CP(15, 0, result, 1, 0, 1);
41
  return(result);
42
}
43
 
44
/** \brief  Set ACTLR
45
    \param [in]    actlr  Auxiliary Control value to set
46
 */
47
__STATIC_FORCEINLINE void __set_ACTLR(uint32_t actlr)
48
{
49
  __set_CP(15, 0, actlr, 1, 0, 1);
50
}
51
 
52
/** \brief  Get CPACR
53
    \return               Coprocessor Access Control register value
54
 */
55
__STATIC_FORCEINLINE uint32_t __get_CPACR(void)
56
{
57
  uint32_t result;
58
  __get_CP(15, 0, result, 1, 0, 2);
59
  return result;
60
}
61
 
62
/** \brief  Set CPACR
63
    \param [in]    cpacr  Coprocessor Access Control value to set
64
 */
65
__STATIC_FORCEINLINE void __set_CPACR(uint32_t cpacr)
66
{
67
  __set_CP(15, 0, cpacr, 1, 0, 2);
68
}
69
 
70
/** \brief  Get DFSR
71
    \return               Data Fault Status Register value
72
 */
73
__STATIC_FORCEINLINE uint32_t __get_DFSR(void)
74
{
75
  uint32_t result;
76
  __get_CP(15, 0, result, 5, 0, 0);
77
  return result;
78
}
79
 
80
/** \brief  Set DFSR
81
    \param [in]    dfsr  Data Fault Status value to set
82
 */
83
__STATIC_FORCEINLINE void __set_DFSR(uint32_t dfsr)
84
{
85
  __set_CP(15, 0, dfsr, 5, 0, 0);
86
}
87
 
88
/** \brief  Get IFSR
89
    \return               Instruction Fault Status Register value
90
 */
91
__STATIC_FORCEINLINE uint32_t __get_IFSR(void)
92
{
93
  uint32_t result;
94
  __get_CP(15, 0, result, 5, 0, 1);
95
  return result;
96
}
97
 
98
/** \brief  Set IFSR
99
    \param [in]    ifsr  Instruction Fault Status value to set
100
 */
101
__STATIC_FORCEINLINE void __set_IFSR(uint32_t ifsr)
102
{
103
  __set_CP(15, 0, ifsr, 5, 0, 1);
104
}
105
 
106
/** \brief  Get ISR
107
    \return               Interrupt Status Register value
108
 */
109
__STATIC_FORCEINLINE uint32_t __get_ISR(void)
110
{
111
  uint32_t result;
112
  __get_CP(15, 0, result, 12, 1, 0);
113
  return result;
114
}
115
 
116
/** \brief  Get CBAR
117
    \return               Configuration Base Address register value
118
 */
119
__STATIC_FORCEINLINE uint32_t __get_CBAR(void)
120
{
121
  uint32_t result;
122
  __get_CP(15, 4, result, 15, 0, 0);
123
  return result;
124
}
125
 
126
/** \brief  Get TTBR0
127
 
128
    This function returns the value of the Translation Table Base Register 0.
129
 
130
    \return               Translation Table Base Register 0 value
131
 */
132
__STATIC_FORCEINLINE uint32_t __get_TTBR0(void)
133
{
134
  uint32_t result;
135
  __get_CP(15, 0, result, 2, 0, 0);
136
  return result;
137
}
138
 
139
/** \brief  Set TTBR0
140
 
141
    This function assigns the given value to the Translation Table Base Register 0.
142
 
143
    \param [in]    ttbr0  Translation Table Base Register 0 value to set
144
 */
145
__STATIC_FORCEINLINE void __set_TTBR0(uint32_t ttbr0)
146
{
147
  __set_CP(15, 0, ttbr0, 2, 0, 0);
148
}
149
 
150
/** \brief  Get DACR
151
 
152
    This function returns the value of the Domain Access Control Register.
153
 
154
    \return               Domain Access Control Register value
155
 */
156
__STATIC_FORCEINLINE uint32_t __get_DACR(void)
157
{
158
  uint32_t result;
159
  __get_CP(15, 0, result, 3, 0, 0);
160
  return result;
161
}
162
 
163
/** \brief  Set DACR
164
 
165
    This function assigns the given value to the Domain Access Control Register.
166
 
167
    \param [in]    dacr   Domain Access Control Register value to set
168
 */
169
__STATIC_FORCEINLINE void __set_DACR(uint32_t dacr)
170
{
171
  __set_CP(15, 0, dacr, 3, 0, 0);
172
}
173
 
174
/** \brief  Set SCTLR
175
 
176
    This function assigns the given value to the System Control Register.
177
 
178
    \param [in]    sctlr  System Control Register value to set
179
 */
180
__STATIC_FORCEINLINE void __set_SCTLR(uint32_t sctlr)
181
{
182
  __set_CP(15, 0, sctlr, 1, 0, 0);
183
}
184
 
185
/** \brief  Get SCTLR
186
    \return               System Control Register value
187
 */
188
__STATIC_FORCEINLINE uint32_t __get_SCTLR(void)
189
{
190
  uint32_t result;
191
  __get_CP(15, 0, result, 1, 0, 0);
192
  return result;
193
}
194
 
195
/** \brief  Set ACTRL
196
    \param [in]    actrl  Auxiliary Control Register value to set
197
 */
198
__STATIC_FORCEINLINE void __set_ACTRL(uint32_t actrl)
199
{
200
  __set_CP(15, 0, actrl, 1, 0, 1);
201
}
202
 
203
/** \brief  Get ACTRL
204
    \return               Auxiliary Control Register value
205
 */
206
__STATIC_FORCEINLINE uint32_t __get_ACTRL(void)
207
{
208
  uint32_t result;
209
  __get_CP(15, 0, result, 1, 0, 1);
210
  return result;
211
}
212
 
213
/** \brief  Get MPIDR
214
 
215
    This function returns the value of the Multiprocessor Affinity Register.
216
 
217
    \return               Multiprocessor Affinity Register value
218
 */
219
__STATIC_FORCEINLINE uint32_t __get_MPIDR(void)
220
{
221
  uint32_t result;
222
  __get_CP(15, 0, result, 0, 0, 5);
223
  return result;
224
}
225
 
226
/** \brief  Get VBAR
227
 
228
    This function returns the value of the Vector Base Address Register.
229
 
230
    \return               Vector Base Address Register
231
 */
232
__STATIC_FORCEINLINE uint32_t __get_VBAR(void)
233
{
234
  uint32_t result;
235
  __get_CP(15, 0, result, 12, 0, 0);
236
  return result;
237
}
238
 
239
/** \brief  Set VBAR
240
 
241
    This function assigns the given value to the Vector Base Address Register.
242
 
243
    \param [in]    vbar  Vector Base Address Register value to set
244
 */
245
__STATIC_FORCEINLINE void __set_VBAR(uint32_t vbar)
246
{
247
  __set_CP(15, 0, vbar, 12, 0, 0);
248
}
249
 
250
/** \brief  Get MVBAR
251
 
252
    This function returns the value of the Monitor Vector Base Address Register.
253
 
254
    \return               Monitor Vector Base Address Register
255
 */
256
__STATIC_FORCEINLINE uint32_t __get_MVBAR(void)
257
{
258
  uint32_t result;
259
  __get_CP(15, 0, result, 12, 0, 1);
260
  return result;
261
}
262
 
263
/** \brief  Set MVBAR
264
 
265
    This function assigns the given value to the Monitor Vector Base Address Register.
266
 
267
    \param [in]    mvbar  Monitor Vector Base Address Register value to set
268
 */
269
__STATIC_FORCEINLINE void __set_MVBAR(uint32_t mvbar)
270
{
271
  __set_CP(15, 0, mvbar, 12, 0, 1);
272
}
273
 
274
#if (defined(__CORTEX_A) && (__CORTEX_A == 7U) && \
275
    defined(__TIM_PRESENT) && (__TIM_PRESENT == 1U)) || \
276
    defined(DOXYGEN)
277
 
278
/** \brief  Set CNTFRQ
279
 
280
  This function assigns the given value to PL1 Physical Timer Counter Frequency Register (CNTFRQ).
281
 
282
  \param [in]    value  CNTFRQ Register value to set
283
*/
284
__STATIC_FORCEINLINE void __set_CNTFRQ(uint32_t value)
285
{
286
  __set_CP(15, 0, value, 14, 0, 0);
287
}
288
 
289
/** \brief  Get CNTFRQ
290
 
291
    This function returns the value of the PL1 Physical Timer Counter Frequency Register (CNTFRQ).
292
 
293
    \return               CNTFRQ Register value
294
 */
295
__STATIC_FORCEINLINE uint32_t __get_CNTFRQ(void)
296
{
297
  uint32_t result;
298
  __get_CP(15, 0, result, 14, 0 , 0);
299
  return result;
300
}
301
 
302
/** \brief  Set CNTP_TVAL
303
 
304
  This function assigns the given value to PL1 Physical Timer Value Register (CNTP_TVAL).
305
 
306
  \param [in]    value  CNTP_TVAL Register value to set
307
*/
308
__STATIC_FORCEINLINE void __set_CNTP_TVAL(uint32_t value)
309
{
310
  __set_CP(15, 0, value, 14, 2, 0);
311
}
312
 
313
/** \brief  Get CNTP_TVAL
314
 
315
    This function returns the value of the PL1 Physical Timer Value Register (CNTP_TVAL).
316
 
317
    \return               CNTP_TVAL Register value
318
 */
319
__STATIC_FORCEINLINE uint32_t __get_CNTP_TVAL(void)
320
{
321
  uint32_t result;
322
  __get_CP(15, 0, result, 14, 2, 0);
323
  return result;
324
}
325
 
326
/** \brief  Get CNTPCT
327
 
328
    This function returns the value of the 64 bits PL1 Physical Count Register (CNTPCT).
329
 
330
    \return               CNTPCT Register value
331
 */
332
__STATIC_FORCEINLINE uint64_t __get_CNTPCT(void)
333
{
334
  uint64_t result;
335
  __get_CP64(15, 0, result, 14);
336
  return result;
337
}
338
 
339
/** \brief  Set CNTP_CVAL
340
 
341
  This function assigns the given value to 64bits PL1 Physical Timer CompareValue Register (CNTP_CVAL).
342
 
343
  \param [in]    value  CNTP_CVAL Register value to set
344
*/
345
__STATIC_FORCEINLINE void __set_CNTP_CVAL(uint64_t value)
346
{
347
  __set_CP64(15, 2, value, 14);
348
}
349
 
350
/** \brief  Get CNTP_CVAL
351
 
352
    This function returns the value of the 64 bits PL1 Physical Timer CompareValue Register (CNTP_CVAL).
353
 
354
    \return               CNTP_CVAL Register value
355
 */
356
__STATIC_FORCEINLINE uint64_t __get_CNTP_CVAL(void)
357
{
358
  uint64_t result;
359
  __get_CP64(15, 2, result, 14);
360
  return result;
361
}
362
 
363
/** \brief  Set CNTP_CTL
364
 
365
  This function assigns the given value to PL1 Physical Timer Control Register (CNTP_CTL).
366
 
367
  \param [in]    value  CNTP_CTL Register value to set
368
*/
369
__STATIC_FORCEINLINE void __set_CNTP_CTL(uint32_t value)
370
{
371
  __set_CP(15, 0, value, 14, 2, 1);
372
}
373
 
374
/** \brief  Get CNTP_CTL register
375
    \return               CNTP_CTL Register value
376
 */
377
__STATIC_FORCEINLINE uint32_t __get_CNTP_CTL(void)
378
{
379
  uint32_t result;
380
  __get_CP(15, 0, result, 14, 2, 1);
381
  return result;
382
}
383
 
384
#endif
385
 
386
/** \brief  Set TLBIALL
387
 
388
  TLB Invalidate All
389
 */
390
__STATIC_FORCEINLINE void __set_TLBIALL(uint32_t value)
391
{
392
  __set_CP(15, 0, value, 8, 7, 0);
393
}
394
 
395
/** \brief  Set BPIALL.
396
 
397
  Branch Predictor Invalidate All
398
 */
399
__STATIC_FORCEINLINE void __set_BPIALL(uint32_t value)
400
{
401
  __set_CP(15, 0, value, 7, 5, 6);
402
}
403
 
404
/** \brief  Set ICIALLU
405
 
406
  Instruction Cache Invalidate All
407
 */
408
__STATIC_FORCEINLINE void __set_ICIALLU(uint32_t value)
409
{
410
  __set_CP(15, 0, value, 7, 5, 0);
411
}
412
 
413
/** \brief  Set DCCMVAC
414
 
415
  Data cache clean
416
 */
417
__STATIC_FORCEINLINE void __set_DCCMVAC(uint32_t value)
418
{
419
  __set_CP(15, 0, value, 7, 10, 1);
420
}
421
 
422
/** \brief  Set DCIMVAC
423
 
424
  Data cache invalidate
425
 */
426
__STATIC_FORCEINLINE void __set_DCIMVAC(uint32_t value)
427
{
428
  __set_CP(15, 0, value, 7, 6, 1);
429
}
430
 
431
/** \brief  Set DCCIMVAC
432
 
433
  Data cache clean and invalidate
434
 */
435
__STATIC_FORCEINLINE void __set_DCCIMVAC(uint32_t value)
436
{
437
  __set_CP(15, 0, value, 7, 14, 1);
438
}
439
 
440
/** \brief  Set CSSELR
441
 */
442
__STATIC_FORCEINLINE void __set_CSSELR(uint32_t value)
443
{
444
//  __ASM volatile("MCR p15, 2, %0, c0, c0, 0" : : "r"(value) : "memory");
445
  __set_CP(15, 2, value, 0, 0, 0);
446
}
447
 
448
/** \brief  Get CSSELR
449
    \return CSSELR Register value
450
 */
451
__STATIC_FORCEINLINE uint32_t __get_CSSELR(void)
452
{
453
  uint32_t result;
454
//  __ASM volatile("MRC p15, 2, %0, c0, c0, 0" : "=r"(result) : : "memory");
455
  __get_CP(15, 2, result, 0, 0, 0);
456
  return result;
457
}
458
 
459
/** \brief  Set CCSIDR
460
    \deprecated CCSIDR itself is read-only. Use __set_CSSELR to select cache level instead.
461
 */
462
CMSIS_DEPRECATED
463
__STATIC_FORCEINLINE void __set_CCSIDR(uint32_t value)
464
{
465
  __set_CSSELR(value);
466
}
467
 
468
/** \brief  Get CCSIDR
469
    \return CCSIDR Register value
470
 */
471
__STATIC_FORCEINLINE uint32_t __get_CCSIDR(void)
472
{
473
  uint32_t result;
474
//  __ASM volatile("MRC p15, 1, %0, c0, c0, 0" : "=r"(result) : : "memory");
475
  __get_CP(15, 1, result, 0, 0, 0);
476
  return result;
477
}
478
 
479
/** \brief  Get CLIDR
480
    \return CLIDR Register value
481
 */
482
__STATIC_FORCEINLINE uint32_t __get_CLIDR(void)
483
{
484
  uint32_t result;
485
//  __ASM volatile("MRC p15, 1, %0, c0, c0, 1" : "=r"(result) : : "memory");
486
  __get_CP(15, 1, result, 0, 0, 1);
487
  return result;
488
}
489
 
490
/** \brief  Set DCISW
491
 */
492
__STATIC_FORCEINLINE void __set_DCISW(uint32_t value)
493
{
494
//  __ASM volatile("MCR p15, 0, %0, c7, c6, 2" : : "r"(value) : "memory")
495
  __set_CP(15, 0, value, 7, 6, 2);
496
}
497
 
498
/** \brief  Set DCCSW
499
 */
500
__STATIC_FORCEINLINE void __set_DCCSW(uint32_t value)
501
{
502
//  __ASM volatile("MCR p15, 0, %0, c7, c10, 2" : : "r"(value) : "memory")
503
  __set_CP(15, 0, value, 7, 10, 2);
504
}
505
 
506
/** \brief  Set DCCISW
507
 */
508
__STATIC_FORCEINLINE void __set_DCCISW(uint32_t value)
509
{
510
//  __ASM volatile("MCR p15, 0, %0, c7, c14, 2" : : "r"(value) : "memory")
511
  __set_CP(15, 0, value, 7, 14, 2);
512
}
513
 
514
#endif