1 | /*
|
---|
2 | * TOPPERS Software
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems
|
---|
4 | *
|
---|
5 | * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
|
---|
6 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
7 | *
|
---|
8 | * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
9 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
10 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
11 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
12 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
13 | * スコード中に含まれていること.
|
---|
14 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
15 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
16 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
17 | * の無保証規定を掲載すること.
|
---|
18 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
19 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
20 | * と.
|
---|
21 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
22 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
23 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
24 | * 報告すること.
|
---|
25 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
26 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
27 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
28 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
29 | * 免責すること.
|
---|
30 | *
|
---|
31 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
32 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
33 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
34 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
35 | * の責任を負わない.
|
---|
36 | *
|
---|
37 | * $Id$
|
---|
38 | */
|
---|
39 |
|
---|
40 | /*
|
---|
41 | * MPCoreサポートモジュール
|
---|
42 | */
|
---|
43 |
|
---|
44 | #ifndef TOPPERS_MPCORE_H
|
---|
45 | #define TOPPERS_MPCORE_H
|
---|
46 |
|
---|
47 | #include <sil.h>
|
---|
48 | #include "arm.h"
|
---|
49 |
|
---|
50 | /*
|
---|
51 | * CP15の補助制御レジスタ(ACTLR)の設定値
|
---|
52 | */
|
---|
53 | #if __TARGET_ARCH_ARM == 6
|
---|
54 | #define CP15_ACTLR_SMP UINT_C(0x00000020)
|
---|
55 | #else /* __TARGET_ARCH_ARM == 6 */
|
---|
56 | #define CP15_ACTLR_SMP UINT_C(0x00000040)
|
---|
57 | #endif /* __TARGET_ARCH_ARM == 6 */
|
---|
58 |
|
---|
59 | /*
|
---|
60 | * SCU(スヌープ制御ユニット)関連の定義
|
---|
61 | */
|
---|
62 |
|
---|
63 | /*
|
---|
64 | * SCUレジスタの番地の定義
|
---|
65 | */
|
---|
66 | #define MPCORE_SCU_BASE (MPCORE_PMR_BASE + 0x0000U)
|
---|
67 | #define MPCORE_SCU_CTRL ((uint32_t *)(MPCORE_SCU_BASE + 0x00U))
|
---|
68 | #define MPCORE_SCU_CONFIG ((uint32_t *)(MPCORE_SCU_BASE + 0x04U))
|
---|
69 | #define MPCORE_SCU_CPUSTAT ((uint32_t *)(MPCORE_SCU_BASE + 0x08U))
|
---|
70 | #define MPCORE_SCU_INVALL ((uint32_t *)(MPCORE_SCU_BASE + 0x0cU))
|
---|
71 |
|
---|
72 | /*
|
---|
73 | * SCU制御レジスタ(MPCORE_SCU_CTRL)の設定値
|
---|
74 | */
|
---|
75 | #define MPCORE_SCU_CTRL_ENABLE UINT_C(0x00000001)
|
---|
76 |
|
---|
77 | /*
|
---|
78 | * SCUパワーステータスレジスタ(MPCORE_SCU_CPUSTAT)の設定値
|
---|
79 | */
|
---|
80 | #define MPCORE_SCU_CPUSTAT_ALLNORMAL UINT_C(0x00000000)
|
---|
81 |
|
---|
82 | /*
|
---|
83 | * SCUインバリデートオールレジスタ(MPCORE_SCU_INVALL)の設定値
|
---|
84 | */
|
---|
85 | #define MPCORE_SCU_INVALL_ALLWAYS UINT_C(0x0000ffff)
|
---|
86 |
|
---|
87 | /*
|
---|
88 | * GIC関連の定義
|
---|
89 | */
|
---|
90 |
|
---|
91 | /*
|
---|
92 | * GICレジスタのベースアドレスの定義
|
---|
93 | */
|
---|
94 | #ifndef GICC_BASE
|
---|
95 | #define GICC_BASE (MPCORE_PMR_BASE + UINT_C(0x0100))
|
---|
96 | #endif /* GICC_BASE */
|
---|
97 |
|
---|
98 | #ifndef GICD_BASE
|
---|
99 | #define GICD_BASE (MPCORE_PMR_BASE + UINT_C(0x1000))
|
---|
100 | #endif /* GICD_BASE */
|
---|
101 |
|
---|
102 | /*
|
---|
103 | * 割込み番号の定義
|
---|
104 | */
|
---|
105 | #define MPCORE_IRQNO_GTC 27U /* グローバルタイマの割込み番号 */
|
---|
106 | #define MPCORE_IRQNO_TMR 29U /* プライベートタイマの割込み番号 */
|
---|
107 | #define MPCORE_IRQNO_WDG 30U /* ウォッチドッグの割込み番号 */
|
---|
108 |
|
---|
109 | /*
|
---|
110 | * プライベートタイマとウォッチドッグ関連の定義
|
---|
111 | */
|
---|
112 |
|
---|
113 | /*
|
---|
114 | * プライベートタイマとウォッチドッグレジスタの番地の定義
|
---|
115 | */
|
---|
116 | #define MPCORE_TMR_BASE (MPCORE_PMR_BASE + 0x0600U)
|
---|
117 | #define MPCORE_TMR_LR ((uint32_t *)(MPCORE_TMR_BASE + 0x00U))
|
---|
118 | #define MPCORE_TMR_CNT ((uint32_t *)(MPCORE_TMR_BASE + 0x04U))
|
---|
119 | #define MPCORE_TMR_CTRL ((uint32_t *)(MPCORE_TMR_BASE + 0x08U))
|
---|
120 | #define MPCORE_TMR_ISR ((uint32_t *)(MPCORE_TMR_BASE + 0x0cU))
|
---|
121 | #define MPCORE_WDG_LR ((uint32_t *)(MPCORE_TMR_BASE + 0x20U))
|
---|
122 | #define MPCORE_WDG_CNT ((uint32_t *)(MPCORE_TMR_BASE + 0x24U))
|
---|
123 | #define MPCORE_WDG_CTRL ((uint32_t *)(MPCORE_TMR_BASE + 0x28U))
|
---|
124 | #define MPCORE_WDG_ISR ((uint32_t *)(MPCORE_TMR_BASE + 0x2cU))
|
---|
125 | #define MPCORE_WDG_RST ((uint32_t *)(MPCORE_TMR_BASE + 0x30U))
|
---|
126 | #define MPCORE_WDG_DIS ((uint32_t *)(MPCORE_TMR_BASE + 0x34U))
|
---|
127 |
|
---|
128 | /*
|
---|
129 | * プライベートタイマ制御レジスタ(MPCORE_TMR_CTRL)の設定値
|
---|
130 | */
|
---|
131 | #define MPCORE_TMR_CTRL_DISABLE 0x00U
|
---|
132 | #define MPCORE_TMR_CTRL_ENABLE 0x01U
|
---|
133 | #define MPCORE_TMR_CTRL_AUTORELOAD 0x02U
|
---|
134 | #define MPCORE_TMR_CTRL_ENAINT 0x04U
|
---|
135 | #define MPCORE_TMR_CTRL_PS_SHIFT 8
|
---|
136 |
|
---|
137 | /*
|
---|
138 | * プライベートタイマ割込みステータスレジスタ(MPCORE_TMR_ISR)の設定値
|
---|
139 | */
|
---|
140 | #define MPCORE_TMR_ISR_EVENTFLAG 0x01U
|
---|
141 |
|
---|
142 | /*
|
---|
143 | * ウォッチドッグ制御レジスタ(MPCORE_WDG_CTRL)の参照値
|
---|
144 | */
|
---|
145 | #define MPCORE_WDG_CTRL_DISABLE 0x00U
|
---|
146 | #define MPCORE_WDG_CTRL_ENABLE 0x01U
|
---|
147 | #define MPCORE_WDG_CTRL_AUTORELOAD 0x02U
|
---|
148 | #define MPCORE_WDG_CTRL_ENAINT 0x04U
|
---|
149 | #define MPCORE_WDG_CTRL_WDGMODE 0x08U
|
---|
150 | #define MPCORE_WDG_CTRL_PS_SHIFT 8
|
---|
151 |
|
---|
152 | /*
|
---|
153 | * ウォッチドッグ割込みステータスレジスタ(MPCORE_WDG_ISR)の参照値
|
---|
154 | */
|
---|
155 | #define MPCORE_WDG_ISR_EVENTFLAG 0x01U
|
---|
156 |
|
---|
157 | /*
|
---|
158 | * グローバルタイマ関連の定義
|
---|
159 | */
|
---|
160 | #if __TARGET_ARCH_ARM == 7
|
---|
161 |
|
---|
162 | /*
|
---|
163 | * グローバルタイマレジスタの番地の定義
|
---|
164 | */
|
---|
165 | #define MPCORE_GTC_BASE (MPCORE_PMR_BASE + 0x0200U)
|
---|
166 | #define MPCORE_GTC_COUNT_L ((uint32_t *)(MPCORE_GTC_BASE + 0x00U))
|
---|
167 | #define MPCORE_GTC_COUNT_U ((uint32_t *)(MPCORE_GTC_BASE + 0x04U))
|
---|
168 | #define MPCORE_GTC_CTRL ((uint32_t *)(MPCORE_GTC_BASE + 0x08U))
|
---|
169 | #define MPCORE_GTC_ISR ((uint32_t *)(MPCORE_GTC_BASE + 0x0cU))
|
---|
170 | #define MPCORE_GTC_CVR_L ((uint32_t *)(MPCORE_GTC_BASE + 0x10U))
|
---|
171 | #define MPCORE_GTC_CVR_U ((uint32_t *)(MPCORE_GTC_BASE + 0x14U))
|
---|
172 | #define MPCORE_GTC_AUTOINCR ((uint32_t *)(MPCORE_GTC_BASE + 0x18U))
|
---|
173 |
|
---|
174 | /*
|
---|
175 | * グローバルタイマ制御レジスタ(MPCORE_GTC_CTRL)の設定値
|
---|
176 | */
|
---|
177 | #define MPCORE_GTC_CTRL_DISABLE 0x00U
|
---|
178 | #define MPCORE_GTC_CTRL_ENABLE 0x01U
|
---|
179 | #define MPCORE_GTC_CTRL_ENACOMP 0x02U
|
---|
180 | #define MPCORE_GTC_CTRL_ENAINT 0x04U
|
---|
181 | #define MPCORE_GTC_CTRL_AUTOINCR 0x08U
|
---|
182 | #define MPCORE_GTC_CTRL_PS_SHIFT 8
|
---|
183 |
|
---|
184 | /*
|
---|
185 | * グローバルタイマ割込みステータスレジスタ(MPCORE_GTC_ISR)の設定値
|
---|
186 | */
|
---|
187 | #define MPCORE_GTC_ISR_EVENTFLAG 0x01U
|
---|
188 |
|
---|
189 | #endif /* __TARGET_ARCH_ARM == 7 */
|
---|
190 |
|
---|
191 | #ifndef TOPPERS_MACRO_ONLY
|
---|
192 |
|
---|
193 | /*
|
---|
194 | * SMPモードに設定
|
---|
195 | */
|
---|
196 | Inline void
|
---|
197 | mpcore_enable_smp(void)
|
---|
198 | {
|
---|
199 | uint32_t reg;
|
---|
200 |
|
---|
201 | CP15_READ_ACTLR(reg);
|
---|
202 | reg |= CP15_ACTLR_SMP;
|
---|
203 | CP15_WRITE_ACTLR(reg);
|
---|
204 | }
|
---|
205 |
|
---|
206 | /*
|
---|
207 | * SCU(スヌープ制御ユニット)の操作
|
---|
208 | */
|
---|
209 |
|
---|
210 | /*
|
---|
211 | * SCUのイネーブル
|
---|
212 | */
|
---|
213 | Inline void
|
---|
214 | mpcore_enable_scu(void)
|
---|
215 | {
|
---|
216 | uint32_t reg;
|
---|
217 |
|
---|
218 | /*
|
---|
219 | * すべてのプロセッサをノーマルモードにする.
|
---|
220 | */
|
---|
221 | sil_wrw_mem(MPCORE_SCU_CPUSTAT, MPCORE_SCU_CPUSTAT_ALLNORMAL);
|
---|
222 |
|
---|
223 | /*
|
---|
224 | * SCUのすべてのタグを無効化する.
|
---|
225 | */
|
---|
226 | sil_wrw_mem(MPCORE_SCU_INVALL, MPCORE_SCU_INVALL_ALLWAYS);
|
---|
227 |
|
---|
228 | /*
|
---|
229 | * SCUを有効にする.
|
---|
230 | */
|
---|
231 | reg = sil_rew_mem(MPCORE_SCU_CTRL);
|
---|
232 | reg |= MPCORE_SCU_CTRL_ENABLE;
|
---|
233 | sil_wrw_mem(MPCORE_SCU_CTRL, reg);
|
---|
234 | data_sync_barrier();
|
---|
235 | }
|
---|
236 |
|
---|
237 | #endif /* TOPPERS_MACRO_ONLY */
|
---|
238 | #endif /* TOPPERS_MPCORE_H */
|
---|