source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/mpcore_timer.c@ 439

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

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.2 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * $Id$
39 */
40
41/*
42 * タイマドライバ(MPCore内蔵タイマ用)
43 *
44 * MPCoreがプロセッサ毎に持っているプライベートタイマとウォッチドッグ,
45 * 各プロセッサからアクセスできるグローバルタイマを用いて,カーネルが
46 * 必要とする各種のタイマを実現する.
47 */
48
49#include "kernel_impl.h"
50#include "time_event.h"
51#include "target_timer.h"
52#include <sil.h>
53#include "mpcore.h"
54
55/*
56 * スプリアス割込み対策マクロのデフォルト定義
57 */
58#ifndef MPCORE_TMR_CLEAR_INT
59#define MPCORE_TMR_CLEAR_INT()
60#endif /* MPCORE_TMR_CLEAR_INT */
61
62#ifdef USE_MPCORE_TMRWDG_HRT
63/*
64 * プライベートタイマとウォッチドッグを用いて高分解能タイマを実現
65 */
66
67/*
68 * タイマの起動処理
69 */
70void
71target_hrt_initialize(intptr_t exinf)
72{
73 /*
74 * タイマとウォッチドッグを停止する.
75 */
76 sil_wrw_mem(MPCORE_TMR_CTRL, MPCORE_TMR_CTRL_DISABLE);
77 sil_wrw_mem(MPCORE_WDG_CTRL, MPCORE_WDG_CTRL_DISABLE);
78
79 /*
80 * ウォッチドッグをタイマモードに設定する.
81 */
82 sil_wrw_mem(MPCORE_WDG_DIS, 0x12345678);
83 sil_wrw_mem(MPCORE_WDG_DIS, 0x87654321);
84 sil_wrw_mem(MPCORE_WDG_CTRL, MPCORE_WDG_CTRL_DISABLE);
85
86 /*
87 * ウォッチドッグのリロード値を設定し,動作を開始する.
88 */
89 sil_wrw_mem(MPCORE_WDG_LR, MPCORE_WDG_LR_VALUE);
90 sil_wrw_mem(MPCORE_WDG_CTRL,
91 MPCORE_WDG_CTRL_ENABLE | MPCORE_WDG_CTRL_AUTORELOAD
92 | (MPCORE_WDG_PS_VALUE << MPCORE_WDG_CTRL_PS_SHIFT));
93
94 /*
95 * タイマのカウント値を0(カウントダウンして停止した状態)に設定し,
96 * 動作を開始する.
97 */
98 sil_wrw_mem(MPCORE_TMR_CNT, 0U);
99 sil_wrw_mem(MPCORE_TMR_CTRL,
100 MPCORE_TMR_CTRL_ENABLE | MPCORE_TMR_CTRL_ENAINT
101 | (MPCORE_TMR_PS_VALUE << MPCORE_TMR_CTRL_PS_SHIFT));
102
103 /*
104 * タイマ割込み要求をクリアする.
105 */
106 sil_wrw_mem(MPCORE_TMR_ISR, MPCORE_TMR_ISR_EVENTFLAG);
107 MPCORE_TMR_CLEAR_INT();
108}
109
110/*
111 * タイマの停止処理
112 */
113void
114target_hrt_terminate(intptr_t exinf)
115{
116 /*
117 * タイマとウォッチドッグを停止する.
118 */
119 sil_wrw_mem(MPCORE_TMR_CTRL, MPCORE_TMR_CTRL_DISABLE);
120 sil_wrw_mem(MPCORE_WDG_CTRL, MPCORE_WDG_CTRL_DISABLE);
121
122 /*
123 * タイマ割込み要求をクリアする.
124 */
125 sil_wrw_mem(MPCORE_TMR_ISR, MPCORE_TMR_ISR_EVENTFLAG);
126 MPCORE_TMR_CLEAR_INT();
127}
128
129/*
130 * タイマ割込みハンドラ
131 */
132void
133target_hrt_handler(void)
134{
135 /*
136 * タイマ割込み要求をクリアする.
137 */
138 sil_wrw_mem(MPCORE_TMR_ISR, MPCORE_TMR_ISR_EVENTFLAG);
139 MPCORE_TMR_CLEAR_INT();
140
141 /*
142 * 高分解能タイマ割込みを処理する.
143 */
144 signal_time();
145}
146
147#endif /* USE_MPCORE_TMRWDG_HRT */
148
149#ifdef USE_MPCORE_GTC_HRT
150/*
151 * グローバルタイマを用いて高分解能タイマを実現
152 */
153
154/*
155 * タイマの起動処理
156 */
157void
158target_hrt_initialize(intptr_t exinf)
159{
160 /*
161 * タイマをディスエーブルする.
162 */
163 sil_wrw_mem(MPCORE_GTC_CTRL, MPCORE_GTC_CTRL_DISABLE);
164
165 /*
166 * カウンタを0に初期化する(セキュアモードでないと効果がない).
167 */
168 sil_wrw_mem(MPCORE_GTC_COUNT_L, 0U);
169 sil_wrw_mem(MPCORE_GTC_COUNT_U, 0U);
170
171 /*
172 * タイマの動作を開始する(コンパレータと割込みはディスエーブル).
173 */
174 sil_wrw_mem(MPCORE_GTC_CTRL,
175 MPCORE_GTC_CTRL_ENABLE
176 | (MPCORE_GTC_PS_VALUE << MPCORE_GTC_CTRL_PS_SHIFT));
177
178 /*
179 * タイマ割込み要求をクリアする.
180 */
181 sil_wrw_mem(MPCORE_GTC_ISR, MPCORE_GTC_ISR_EVENTFLAG);
182}
183
184/*
185 * タイマの停止処理
186 */
187void
188target_hrt_terminate(intptr_t exinf)
189{
190 /*
191 * タイマを停止する.
192 */
193 sil_wrw_mem(MPCORE_GTC_CTRL, MPCORE_GTC_CTRL_DISABLE);
194
195 /*
196 * タイマ割込み要求をクリアする.
197 */
198 sil_wrw_mem(MPCORE_GTC_ISR, MPCORE_GTC_ISR_EVENTFLAG);
199}
200
201/*
202 * タイマ割込みハンドラ
203 */
204void
205target_hrt_handler(void)
206{
207 /*
208 * タイマ割込み要求をクリアする.
209 */
210 sil_wrw_mem(MPCORE_GTC_ISR, MPCORE_GTC_ISR_EVENTFLAG);
211
212 /*
213 * 高分解能タイマ割込みを処理する.
214 */
215 signal_time();
216}
217
218#endif /* USE_MPCORE_GTC_HRT */
219
220#ifdef USE_MPCORE_WDG_OVRTIMER
221/*
222 * ウォッチドッグタイマを用いてオーバランタイマを実現
223 */
224#ifdef TOPPERS_SUPPORT_OVRHDR
225
226#include "overrun.h"
227
228/*
229 * オーバランタイマの初期化処理
230 */
231void
232target_ovrtimer_initialize(intptr_t exinf)
233{
234 /*
235 * ウォッチドッグを停止する.
236 */
237 sil_wrw_mem(MPCORE_WDG_CTRL, MPCORE_WDG_CTRL_DISABLE);
238
239 /*
240 * ウォッチドッグをタイマモードに設定する.
241 */
242 sil_wrw_mem(MPCORE_WDG_DIS, 0x12345678);
243 sil_wrw_mem(MPCORE_WDG_DIS, 0x87654321);
244
245 /*
246 * ウォッチドッグタイマを停止した状態で設定する.
247 */
248 sil_wrw_mem(MPCORE_WDG_CTRL,
249 MPCORE_WDG_CTRL_ENAINT
250 | (MPCORE_WDG_PS_VALUE << MPCORE_WDG_CTRL_PS_SHIFT));
251
252 /*
253 * ウォッチドッグ割込み要求をクリアする.
254 */
255 sil_wrw_mem(MPCORE_WDG_ISR, MPCORE_WDG_ISR_EVENTFLAG);
256}
257
258/*
259 * オーバランタイマの終了処理
260 */
261void
262target_ovrtimer_terminate(intptr_t exinf)
263{
264 /*
265 * ウォッチドッグを停止する.
266 */
267 sil_wrw_mem(MPCORE_WDG_CTRL, MPCORE_WDG_CTRL_DISABLE);
268
269 /*
270 * ウォッチドッグ割込み要求をクリアする.
271 */
272 sil_wrw_mem(MPCORE_WDG_ISR, MPCORE_WDG_ISR_EVENTFLAG);
273}
274
275/*
276 * オーバランタイマ割込みハンドラ
277 */
278void
279target_ovrtimer_handler(void)
280{
281 /*
282 * ウォッチドッグ割込み要求をクリアする.
283 */
284 sil_wrw_mem(MPCORE_WDG_ISR, MPCORE_WDG_ISR_EVENTFLAG);
285
286 /*
287 * オーバランハンドラの起動処理をする.
288 */
289 call_ovrhdr();
290}
291
292#endif /* TOPPERS_SUPPORT_OVRHDR */
293#endif /* USE_MPCORE_WDG_OVRTIMER */
Note: See TracBrowser for help on using the repository browser.