source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/arm.h@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 14.0 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 *
10 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * $Id$
40 */
41
42/*
43 * ARMコアサポートモジュール
44 */
45
46#ifndef TOPPERS_ARM_H
47#define TOPPERS_ARM_H
48
49#include <t_stddef.h>
50
51/*
52 * ARMコアの特殊命令のインライン関数定義
53 */
54#ifndef TOPPERS_MACRO_ONLY
55#ifndef TECSGEN
56#include "arm_insn.h" /* tecsgenが解釈できないためスキップ */
57#endif /* TECSGEN */
58#endif /* TOPPERS_MACRO_ONLY */
59
60/*
61 * ARM例外ベクタ
62 */
63#define RESET_VECTOR UINT_C(0x00)
64#define UNDEF_VECTOR UINT_C(0x04)
65#define SVC_VECTOR UINT_C(0x08)
66#define PABORT_VECTOR UINT_C(0x0c)
67#define DABORT_VECTOR UINT_C(0x10)
68#define IRQ_VECTOR UINT_C(0x18)
69#define FIQ_VECTOR UINT_C(0x1c)
70
71/*
72 * ARM例外ベクタ番号
73 */
74#define RESET_NUMBER UINT_C(0)
75#define UNDEF_NUMBER UINT_C(1)
76#define SVC_NUMBER UINT_C(2)
77#define PABORT_NUMBER UINT_C(3)
78#define DABORT_NUMBER UINT_C(4)
79#define IRQ_NUMBER UINT_C(6)
80#define FIQ_NUMBER UINT_C(7)
81
82/*
83 * CPSRの割込み禁止ビット
84 */
85#define CPSR_INT_MASK UINT_C(0xc0)
86#define CPSR_IRQ_BIT UINT_C(0x80)
87#define CPSR_FIQ_BIT UINT_C(0x40)
88
89/*
90 * CPSRのThumbビット
91 */
92#define CPSR_THUMB_BIT UINT_C(0x20)
93
94/*
95 * CPSRのモードビット
96 */
97#define CPSR_MODE_MASK UINT_C(0x1f)
98#define CPSR_USER_MODE UINT_C(0x10)
99#define CPSR_FIQ_MODE UINT_C(0x11)
100#define CPSR_IRQ_MODE UINT_C(0x12)
101#define CPSR_SVC_MODE UINT_C(0x13)
102#define CPSR_ABT_MODE UINT_C(0x17)
103#define CPSR_UND_MODE UINT_C(0x1b)
104#define CPSR_SYS_MODE UINT_C(0x1f)
105
106/*
107 * CP15のシステム制御レジスタ(SCTLR)の設定値
108 *
109 * ARMv7では,CP15_SCTLR_EXTPAGEは常に1になっている.
110 */
111#if __TARGET_ARCH_ARM == 6
112#define CP15_SCTLR_EXTPAGE UINT_C(0x00800000)
113#endif /* __TARGET_ARCH_ARM == 6 */
114#define CP15_SCTLR_VECTOR UINT_C(0x00002000)
115#define CP15_SCTLR_ICACHE UINT_C(0x00001000)
116#define CP15_SCTLR_BP UINT_C(0x00000800)
117#define CP15_SCTLR_DCACHE UINT_C(0x00000004)
118#define CP15_SCTLR_MMU UINT_C(0x00000001)
119
120/*
121 * CP15のコプロセッサアクセス制御レジスタ(CPACR)の設定値
122 */
123#define CP15_CPACR_ASEDIS UINT_C(0x80000000)
124#define CP15_CPACR_D32DIS UINT_C(0x40000000)
125#define CP15_CPACR_CP11_FULLACCESS UINT_C(0x00c00000)
126#define CP15_CPACR_CP10_FULLACCESS UINT_C(0x00300000)
127
128/*
129 * CP15のフォールト状態レジスタの参照値
130 */
131#define CP15_FSR_FS_MASK UINT_C(0x0000040f)
132#define CP15_FSR_FS_ALIGNMENT UINT_C(0x00000001)
133#define CP15_FSR_FS_TRANSLATION1 UINT_C(0x00000005)
134#define CP15_FSR_FS_TRANSLATION2 UINT_C(0x00000007)
135#define CP15_FSR_FS_PERMISSION1 UINT_C(0x0000000d)
136#define CP15_FSR_FS_PERMISSION2 UINT_C(0x0000000f)
137
138/*
139 * CP15のパフォーマンスモニタ制御レジスタ(PMCR)の設定値
140 */
141#define CP15_PMCR_ALLCNTR_ENABLE UINT_C(0x01)
142#define CP15_PMCR_PMCCNTR_DIVIDER UINT_C(0x08)
143
144/*
145 * CP15のパフォーマンスモニタカウントイネーブルセットレジスタ(PMCNTENSET)
146 * の設定値
147 */
148#define CP15_PMCNTENSET_CCNTR_ENABLE UINT_C(0x80000000)
149
150/*
151 * CP15の変換テーブルベースレジスタ(TTBR)の設定値
152 */
153#define CP15_TTBR_RGN_SHAREABLE UINT_C(0x00000002)
154#if __TARGET_ARCH_ARM == 7
155#define CP15_TTBR_RGN_WBWA UINT_C(0x00000008)
156#endif /* __TARGET_ARCH_ARM == 7 */
157#define CP15_TTBR_RGN_WTHROUGH UINT_C(0x00000010)
158#define CP15_TTBR_RGN_WBACK UINT_C(0x00000018)
159#if __TARGET_ARCH_ARM < 7
160#define CP15_TTBR_RGN_CACHEABLE UINT_C(0x00000001)
161#else /* __TARGET_ARCH_ARM < 7 */
162#define CP15_TTBR_IRGN_WBWA UINT_C(0x00000040)
163#define CP15_TTBR_IRGN_WTHROUGH UINT_C(0x00000001)
164#define CP15_TTBR_IRGN_WBACK UINT_C(0x00000041)
165#endif /* __TARGET_ARCH_ARM < 7 */
166
167/*
168 * MMU関連の定義(VMSA)
169 */
170
171/*
172 * セクションとページのサイズ
173 */
174#define ARM_SSECTION_SIZE UINT_C(0x1000000)
175#define ARM_SECTION_SIZE UINT_C(0x0100000)
176#define ARM_LPAGE_SIZE UINT_C(0x0010000)
177#define ARM_PAGE_SIZE UINT_C(0x0001000)
178
179/*
180 * セクションテーブルとページテーブルのサイズ
181 */
182#define ARM_SECTION_TABLE_SIZE UINT_C(0x4000)
183#define ARM_SECTION_TABLE_ALIGN UINT_C(0x4000)
184#define ARM_SECTION_TABLE_ENTRY (ARM_SECTION_TABLE_SIZE / sizeof(uint32_t))
185
186#define ARM_PAGE_TABLE_SIZE UINT_C(0x0400)
187#define ARM_PAGE_TABLE_ALIGN UINT_C(0x0400)
188#define ARM_PAGE_TABLE_ENTRY (ARM_PAGE_TABLE_SIZE / sizeof(uint32_t))
189
190/*
191 * 第1レベルディスクリプタの設定値
192 */
193#define ARM_MMU_DSCR1_FAULT 0x00000U /* フォルト */
194#define ARM_MMU_DSCR1_PAGETABLE 0x00001U /* コアースページテーブル */
195#define ARM_MMU_DSCR1_SECTION 0x00002U /* セクション */
196#define ARM_MMU_DSCR1_SSECTION 0x40002U /* スーパーセクション */
197
198#define ARM_MMU_DSCR1_SHARED 0x10000U /* プロセッサ間で共有 */
199#define ARM_MMU_DSCR1_TEX000 0x00000U /* TEXビットが000 */
200#define ARM_MMU_DSCR1_TEX001 0x01000U /* TEXビットが001 */
201#define ARM_MMU_DSCR1_TEX010 0x02000U /* TEXビットが010 */
202#define ARM_MMU_DSCR1_TEX100 0x04000U /* TEXビットが100 */
203#define ARM_MMU_DSCR1_AP01 0x00400U /* APビットが01 */
204#define ARM_MMU_DSCR1_AP10 0x00800U /* APビットが10 */
205#define ARM_MMU_DSCR1_AP11 0x00c00U /* APビットが11 */
206#define ARM_MMU_DSCR1_CB00 0x00000U /* Cビットが0,Bビットが0 */
207#define ARM_MMU_DSCR1_CB01 0x00004U /* Cビットが0,Bビットが1 */
208#define ARM_MMU_DSCR1_CB10 0x00008U /* Cビットが1,Bビットが0 */
209#define ARM_MMU_DSCR1_CB11 0x0000cU /* Cビットが1,Bビットが1 */
210
211#if __TARGET_ARCH_ARM >= 6
212#define ARMV6_MMU_DSCR1_NONGLOBAL 0x20000U /* グローバルでない */
213#define ARMV6_MMU_DSCR1_APX0 0x00000U /* APXビットが0 */
214#define ARMV6_MMU_DSCR1_APX1 0x08000U /* APXビットが1 */
215#define ARMV6_MMU_DSCR1_ECC 0x00200U /* ECCが有効(MPCore)*/
216#define ARMV6_MMU_DSCR1_NOEXEC 0x00010U /* 実行不可 */
217#endif /* __TARGET_ARCH_ARM >= 6 */
218
219/*
220 * 第2レベルディスクリプタの設定値
221 */
222#define ARM_MMU_DSCR2_FAULT 0x0000U /* フォルト */
223#define ARM_MMU_DSCR2_LARGE 0x0001U /* ラージページ */
224#define ARM_MMU_DSCR2_SMALL 0x0002U /* スモールページ */
225
226#define ARM_MMU_DSCR2_CB00 0x0000U /* Cビットが0,Bビットが0 */
227#define ARM_MMU_DSCR2_CB01 0x0004U /* Cビットが0,Bビットが1 */
228#define ARM_MMU_DSCR2_CB10 0x0008U /* Cビットが1,Bビットが0 */
229#define ARM_MMU_DSCR2_CB11 0x000cU /* Cビットが1,Bビットが1 */
230
231#if __TARGET_ARCH_ARM < 6
232
233#define ARMV5_MMU_DSCR2_AP01 0x0550U /* AP[0-3]ビットが01 */
234#define ARMV5_MMU_DSCR2_AP10 0x0aa0U /* AP[0-3]ビットが10 */
235#define ARMV5_MMU_DSCR2_AP11 0x0ff0U /* AP[0-3]ビットが11 */
236
237/* ラージページのディスクリプタ用 */
238#define ARMV5_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
239#define ARMV5_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
240#define ARMV5_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
241#define ARMV5_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
242
243#else /* __TARGET_ARCH_ARM < 6 */
244
245#define ARMV6_MMU_DSCR2_NONGLOBAL 0x0800U /* グローバルでない */
246#define ARMV6_MMU_DSCR2_SHARED 0x0400U /* プロセッサ間で共有 */
247#define ARMV6_MMU_DSCR2_APX0 0x0000U /* APXビットが0 */
248#define ARMV6_MMU_DSCR2_APX1 0x0200U /* APXビットが1 */
249#define ARMV6_MMU_DSCR2_AP01 0x0010U /* APビットが01 */
250#define ARMV6_MMU_DSCR2_AP10 0x0020U /* APビットが10 */
251#define ARMV6_MMU_DSCR2_AP11 0x0030U /* APビットが11 */
252
253/* ラージページのディスクリプタ用 */
254#define ARMV6_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
255#define ARMV6_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
256#define ARMV6_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
257#define ARMV6_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
258#define ARMV6_MMU_DSCR2L_NOEXEC 0x8000U /* 実行不可 */
259
260/* スモールページのディスクリプタ用 */
261#define ARMV6_MMU_DSCR2S_TEX000 0x0000U /* TEXビットが000 */
262#define ARMV6_MMU_DSCR2S_TEX001 0x0040U /* TEXビットが001 */
263#define ARMV6_MMU_DSCR2S_TEX010 0x0080U /* TEXビットが010 */
264#define ARMV6_MMU_DSCR2S_TEX100 0x0100U /* TEXビットが100 */
265#define ARMV6_MMU_DSCR2S_NOEXEC 0x0001U /* 実行不可 */
266
267#endif /* __TARGET_ARCH_ARM < 6 */
268
269#ifndef TOPPERS_MACRO_ONLY
270
271/*
272 * コプロセッサ15の操作関数
273 */
274
275/*
276 * High exception vectorsを使うように設定
277 */
278Inline void
279arm_set_high_vectors(void)
280{
281 uint32_t reg;
282
283 CP15_READ_SCTLR(reg);
284 reg |= CP15_SCTLR_VECTOR;
285 CP15_WRITE_SCTLR(reg);
286}
287
288/*
289 * Low exception vectorsを使うように設定
290 */
291Inline void
292arm_set_low_vectors(void)
293{
294 uint32_t reg;
295
296 CP15_READ_SCTLR(reg);
297 reg &= ~CP15_SCTLR_VECTOR;
298 CP15_WRITE_SCTLR(reg);
299}
300
301/*
302 * 分岐予測をイネーブル
303 */
304Inline void
305arm_enable_bp(void)
306{
307 uint32_t reg;
308
309 CP15_READ_SCTLR(reg);
310 reg |= CP15_SCTLR_BP;
311 CP15_WRITE_SCTLR(reg);
312}
313
314/*
315 * 分岐予測をディスエーブル
316 */
317Inline void
318arm_disable_bp(void)
319{
320 uint32_t reg;
321
322 CP15_READ_SCTLR(reg);
323 reg &= ~CP15_SCTLR_BP;
324 CP15_WRITE_SCTLR(reg);
325}
326
327/*
328 * プロセッサ番号の取得
329 *
330 * マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返す.
331 * ARMv6では,マルチプロセッサをサポートしている場合にのみ使用できる.
332 */
333#if __TARGET_ARCH_ARM >= 6
334
335Inline uint32_t
336arm_prc_index(void)
337{
338 uint32_t reg;
339
340 CP15_READ_MPIDR(reg);
341 return(reg & 0xffU);
342}
343
344#endif /* __TARGET_ARCH_ARM >= 6 */
345
346/*
347 * キャッシュの操作
348 */
349
350/*
351 * 命令/データキャッシュのイネーブル/ディスエーブル
352 */
353extern void arm_enable_icache(void);
354extern void arm_disable_icache(void);
355extern void arm_enable_dcache(void);
356extern void arm_disable_dcache(void);
357
358/*
359 * キャッシュのイネーブル
360 */
361Inline void
362arm_enable_cache(void)
363{
364 arm_enable_icache();
365 arm_enable_dcache();
366}
367
368/*
369 * キャッシュのディスエーブル
370 */
371Inline void
372arm_disable_cache(void)
373{
374 arm_disable_icache();
375 arm_disable_dcache();
376}
377
378/*
379 * ARMv5におけるデータキャッシュの無効化/クリーン
380 */
381#if __TARGET_ARCH_ARM <= 5
382extern void armv5_clean_and_invalidate_dcache(void);
383#endif /* __TARGET_ARCH_ARM <= 5 */
384
385/*
386 * ARMv7におけるデータキャッシュの無効化/クリーン
387 */
388#if __TARGET_ARCH_ARM == 7
389extern void armv7_invalidate_dcache(void);
390extern void armv7_clean_and_invalidate_dcache(void);
391#endif /* __TARGET_ARCH_ARM == 7 */
392
393/*
394 * データキャッシュと統合キャッシュの無効化
395 */
396Inline void
397arm_invalidate_dcache(void)
398{
399#if __TARGET_ARCH_ARM <= 6
400 CP15_INVALIDATE_DCACHE();
401 CP15_INVALIDATE_UCACHE();
402#else /* __TARGET_ARCH_ARM <= 6 */
403 armv7_invalidate_dcache();
404#endif /* __TARGET_ARCH_ARM <= 6 */
405}
406
407/*
408 * データキャッシュと統合キャッシュのクリーンと無効化
409 */
410Inline void
411arm_clean_and_invalidate_dcache(void)
412{
413#if __TARGET_ARCH_ARM <= 5
414 armv5_clean_and_invalidate_dcache();
415#elif __TARGET_ARCH_ARM == 6
416 CP15_CLEAN_AND_INVALIDATE_DCACHE();
417 CP15_CLEAN_AND_INVALIDATE_UCACHE();
418#else
419 armv7_clean_and_invalidate_dcache();
420#endif
421}
422
423/*
424 * 命令キャッシュの無効化
425 */
426Inline void
427arm_invalidate_icache(void)
428{
429 CP15_INVALIDATE_ICACHE();
430}
431
432/*
433 * 分岐予測の無効化
434 */
435Inline void
436arm_invalidate_bp(void)
437{
438 CP15_INVALIDATE_BP();
439 data_sync_barrier();
440 inst_sync_barrier();
441}
442
443/*
444 * TLBの無効化
445 */
446Inline void
447arm_invalidate_tlb(void)
448{
449 CP15_INVALIDATE_TLB();
450 data_sync_barrier();
451}
452
453#endif /* TOPPERS_MACRO_ONLY */
454
455/*
456 * 浮動小数点例外制御レジスタ(FPEXC)の設定値
457 */
458#define FPEXC_ENABLE UINT_C(0x40000000)
459
460#endif /* TOPPERS_ARM_H */
Note: See TracBrowser for help on using the repository browser.