source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/mpcore_timer.h@ 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-chdr;charset=UTF-8
File size: 12.6 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * タイマドライバ(MPCore内蔵タイマ用)
45 *
46 * MPCoreは,プロセッサ毎にプライベートタイマとウォッチドッグを持つ.
47 * ウォッチドッグは,タイマとして使用することができる.また,各プロセッ
48 * サからアクセスできるグローバルタイマを持つ.このモジュールは,対応
49 * するシンボルをマクロ定義することにより,以下の機能を提供する.
50 *
51 * USE_MPCORE_TMRWDG_HRT:
52 * プライベートタイマとウォッチドッグを用いて,高分解能タイマを実
53 * 現する.具体的には,ウォッチドッグをタイマモードに設定して現在
54 * 時刻の管理のために用い,プライベートタイマを相対時間割込みの発
55 * 生のために用いる.
56 *
57 * USE_MPCORE_GTC_HRT:
58 * グローバルタイマを用いて,高分解能タイマを実現する.グローバル
59 * タイマは,Cortex-A9 MPCoreのr2p0以降の新しい仕様のものを想定し
60 * ている.
61 *
62 * USE_MPCORE_WDG_OVRTIMER:
63 * ウォッチドッグを用いて,オーバランタイマを実現する.
64 */
65
66#ifndef TOPPERS_MPCORE_TIMER_H
67#define TOPPERS_MPCORE_TIMER_H
68
69#include "kernel/kernel_impl.h"
70#include <sil.h>
71#include "mpcore.h"
72
73#ifdef USE_MPCORE_TMRWDG_HRT
74/*
75 * プライベートタイマとウォッチドッグを用いて高分解能タイマを実現
76 */
77
78/*
79 * タイマ割込みハンドラ登録のための定数
80 */
81#define INHNO_TIMER MPCORE_IRQNO_TMR /* 割込みハンドラ番号 */
82#define INTNO_TIMER MPCORE_IRQNO_TMR /* 割込み番号 */
83#define INTPRI_TIMER (TMAX_INTPRI - 1) /* 割込み優先度 */
84#define INTATR_TIMER TA_NULL /* 割込み属性 */
85
86/*
87 * タイマの設定値のデフォルト値の定義
88 */
89#ifndef MPCORE_WDG_LR_VALUE
90#define MPCORE_WDG_LR_VALUE 0xffffffffU /* ウォッチドッグのリロード値 */
91#endif /* MPCORE_WDG_LR_VALUE */
92
93#ifndef MPCORE_WDG_FREQ
94#define MPCORE_WDG_FREQ 1 /* ウォッチドッグの駆動周波数 */
95#endif /* MPCORE_WDG_FREQ */
96
97#ifndef MPCORE_TMR_FREQ
98#define MPCORE_TMR_FREQ 1 /* プライベートタイマの駆動周波数 */
99#endif /* MPCORE_TMR_FREQ */
100
101#ifndef TOPPERS_MACRO_ONLY
102
103/*
104 * 高分解能タイマの起動処理
105 */
106extern void target_hrt_initialize(intptr_t exinf);
107
108/*
109 * 高分解能タイマの停止処理
110 */
111extern void target_hrt_terminate(intptr_t exinf);
112
113/*
114 * 高分解能タイマの現在のカウント値の読出し
115 */
116Inline HRTCNT
117target_hrt_get_current(void)
118{
119 /*
120 * ウォッチドッグのカウント値を読み出し,ダウンカウンタであるため,
121 * MPCORE_WDG_LR_VALUEから引き,MPCORE_WDG_FREQで除した値を返す.
122 */
123 return((HRTCNT)((MPCORE_WDG_LR_VALUE - sil_rew_mem(MPCORE_WDG_CNT))
124 / MPCORE_WDG_FREQ));
125}
126
127/*
128 * 高分解能タイマへの割込みタイミングの設定
129 *
130 * 高分解能タイマを,hrtcntで指定した値カウントアップしたら割込みを発
131 * 生させるように設定する.
132 */
133Inline void
134target_hrt_set_event(HRTCNT hrtcnt)
135{
136 /*
137 * タイマのカウント値を(hrtcnt * MPCORE_TMR_FREQ)に設定する.
138 */
139 sil_wrw_mem(MPCORE_TMR_CNT, hrtcnt * MPCORE_TMR_FREQ);
140}
141
142/*
143 * 高分解能タイマ割込みの要求
144 */
145Inline void
146target_hrt_raise_event(void)
147{
148 raise_int(INTNO_TIMER);
149}
150
151/*
152 * 割込みタイミングに指定する最大値
153 */
154#if !defined(TCYC_HRTCNT) || (TCYC_HRTCNT > 4002000002U)
155#define HRTCNT_BOUND 4000000002U
156#else
157#define HRTCNT_BOUND (TCYC_HRTCNT - 2000000U)
158#endif
159
160/*
161 * 高分解能タイマ割込みハンドラ
162 */
163extern void target_hrt_handler(void);
164
165#endif /* TOPPERS_MACRO_ONLY */
166#endif /* USE_MPCORE_TMRWDG_HRT */
167
168#ifdef USE_MPCORE_GTC_HRT
169/*
170 * グローバルタイマを用いて高分解能タイマを実現
171 */
172
173/*
174 * タイマ割込みハンドラ登録のための定数
175 */
176#define INHNO_TIMER MPCORE_IRQNO_GTC /* 割込みハンドラ番号 */
177#define INTNO_TIMER MPCORE_IRQNO_GTC /* 割込み番号 */
178#define INTPRI_TIMER (TMAX_INTPRI - 1) /* 割込み優先度 */
179#define INTATR_TIMER TA_NULL /* 割込み属性 */
180
181/*
182 * タイマの設定値のデフォルト値の定義
183 */
184#ifndef MPCORE_GTC_FREQ
185#define MPCORE_GTC_FREQ 1 /* グローバルタイマの駆動周波数 */
186#endif /* MPCORE_GTC_FREQ */
187
188#ifndef TOPPERS_MACRO_ONLY
189
190/*
191 * グローバルタイマの現在のカウント値(64bit)の読出し
192 */
193Inline uint64_t
194mpcore_gtc_get_count(void)
195{
196 uint32_t count_l, count_u, prev_count_u;
197
198 count_u = sil_rew_mem(MPCORE_GTC_COUNT_U);
199 do {
200 prev_count_u = count_u;
201 count_l = sil_rew_mem(MPCORE_GTC_COUNT_L);
202 count_u = sil_rew_mem(MPCORE_GTC_COUNT_U);
203 } while (count_u != prev_count_u);
204 return((((uint64_t) count_u) << 32) | ((uint64_t) count_l));
205}
206
207/*
208 * グローバルタイマのコンパレータ値(64bit)の設定
209 */
210Inline void
211mpcore_gtc_set_cvr(uint64_t cvr)
212{
213
214 uint32_t cvr_l, cvr_u;
215 uint32_t reg;
216
217 cvr_l = ((uint32_t) cvr);
218 cvr_u = ((uint32_t)(cvr >> 32));
219
220 /* コンパレータをディスエーブル */
221 reg = sil_rew_mem(MPCORE_GTC_CTRL);
222 sil_wrw_mem(MPCORE_GTC_CTRL, reg & ~(MPCORE_GTC_CTRL_ENACOMP));
223
224 /* コンパレータ値を設定 */
225 sil_wrw_mem(MPCORE_GTC_CVR_L, cvr_l);
226 sil_wrw_mem(MPCORE_GTC_CVR_U, cvr_u);
227
228#ifdef ARM_CA9_GTC_ERRATA
229 /* ARM Cortex-A9 Errata 740657への対策 */
230 sil_wrw_mem(MPCORE_GTC_ISR, MPCORE_GTC_ISR_EVENTFLAG);
231 clear_int(MPCORE_IRQNO_GTC);
232#endif /* ARM_CA9_GTC_ERRATA */
233
234 /* コンパレータと割込みをイネーブル */
235 sil_wrw_mem(MPCORE_GTC_CTRL,
236 reg | (MPCORE_GTC_CTRL_ENACOMP|MPCORE_GTC_CTRL_ENAINT));
237}
238
239/*
240 * 高分解能タイマの起動処理
241 */
242extern void target_hrt_initialize(intptr_t exinf);
243
244/*
245 * 高分解能タイマの停止処理
246 */
247extern void target_hrt_terminate(intptr_t exinf);
248
249/*
250 * 高分解能タイマの現在のカウント値の読出し
251 */
252Inline HRTCNT
253target_hrt_get_current(void)
254{
255 /*
256 * グローバルタイマのカウント値(64ビット)を読み出し,
257 * MPCORE_GTC_FREQで除し,32ビットに切り詰めた値を返す.
258 */
259 return((HRTCNT)(mpcore_gtc_get_count() / MPCORE_GTC_FREQ));
260}
261
262/*
263 * 高分解能タイマへの割込みタイミングの設定
264 *
265 * 高分解能タイマを,hrtcntで指定した値カウントアップしたら割込みを発
266 * 生させるように設定する.
267 */
268Inline void
269target_hrt_set_event(HRTCNT hrtcnt)
270{
271 /*
272 * コンパレータ値を,(現在のカウント値+hrtcnt×MPCORE_GTC_FREQ)
273 * に設定し,コンパレータと割込みをイネーブルする.
274 */
275 mpcore_gtc_set_cvr(mpcore_gtc_get_count()
276 + (((uint64_t) hrtcnt) * MPCORE_GTC_FREQ));
277}
278
279/*
280 * 高分解能タイマへの割込みタイミングのクリア
281 */
282#ifdef USE_64BIT_HRTCNT
283
284Inline void
285target_hrt_clear_event(void)
286{
287 sil_wrw_mem(MPCORE_GTC_CTRL,
288 sil_rew_mem(MPCORE_GTC_CTRL) & ~(MPCORE_GTC_CTRL_ENACOMP));
289#ifdef ARM_CA9_GTC_ERRATA
290 /* ARM Cortex-A9 Errata 740657への対策 */
291 sil_wrw_mem(MPCORE_GTC_ISR, MPCORE_GTC_ISR_EVENTFLAG);
292 clear_int(MPCORE_IRQNO_GTC);
293#endif /* ARM_CA9_GTC_ERRATA */
294}
295
296#endif /* USE_64BIT_HRTCNT */
297
298/*
299 * 高分解能タイマ割込みの要求
300 */
301Inline void
302target_hrt_raise_event(void)
303{
304 raise_int(INTNO_TIMER);
305}
306
307/*
308 * 割込みタイミングに指定する最大値
309 */
310#ifndef USE_64BIT_HRTCNT
311
312#if !defined(TCYC_HRTCNT) || (TCYC_HRTCNT > 4002000002U)
313#define HRTCNT_BOUND 4000000002U
314#else
315#define HRTCNT_BOUND (TCYC_HRTCNT - 2000000U)
316#endif
317
318#endif /* USE_64BIT_HRTCNT */
319
320/*
321 * 高分解能タイマ割込みハンドラ
322 */
323extern void target_hrt_handler(void);
324
325#endif /* TOPPERS_MACRO_ONLY */
326#endif /* USE_MPCORE_GTC_HRT */
327
328#ifdef USE_MPCORE_WDG_OVRTIMER
329/*
330 * ウォッチドッグを用いてオーバランタイマを実現
331 */
332#ifdef TOPPERS_SUPPORT_OVRHDR
333
334/*
335 * オーバランタイマ割込みハンドラ登録のための定数
336 */
337#define INHNO_OVRTIMER MPCORE_IRQNO_WDG /* 割込みハンドラ番号 */
338#define INTNO_OVRTIMER MPCORE_IRQNO_WDG /* 割込み番号 */
339#define INTPRI_OVRTIMER TMAX_INTPRI /* 割込み優先度 */
340#define INTATR_OVRTIMER TA_NULL /* 割込み属性 */
341
342/*
343 * タイマの設定値のデフォルト値の定義
344 */
345#ifndef MPCORE_WDG_FREQ
346#define MPCORE_WDG_FREQ 1 /* ウォッチドッグの駆動周波数 */
347#endif /* MPCORE_WDG_FREQ */
348
349#ifndef TOPPERS_MACRO_ONLY
350
351/*
352 * オーバランタイマの初期化処理
353 */
354extern void target_ovrtimer_initialize(intptr_t exinf);
355
356/*
357 * オーバランタイマの終了処理
358 */
359extern void target_ovrtimer_terminate(intptr_t exinf);
360
361/*
362 * オーバランタイマの動作開始
363 */
364Inline void
365target_ovrtimer_start(PRCTIM ovrtim)
366{
367 /*
368 * ウォッチドッグのカウント値を(ovrtim * MPCORE_WDG_FREQ)に設定する.
369 */
370 sil_wrw_mem(MPCORE_WDG_CNT, ovrtim * MPCORE_WDG_FREQ);
371
372 /*
373 * ウォッチドッグの動作を開始する.
374 */
375 sil_wrw_mem(MPCORE_WDG_CTRL,
376 sil_rew_mem(MPCORE_WDG_CTRL) | MPCORE_WDG_CTRL_ENABLE);
377}
378
379/*
380 * オーバランタイマの停止
381 */
382Inline PRCTIM
383target_ovrtimer_stop(void)
384{
385 PRCTIM ovrtim;
386
387 /*
388 * ウォッチドッグの現在値の読出し
389 */
390 ovrtim = (PRCTIM)(sil_rew_mem(MPCORE_WDG_CNT) / MPCORE_WDG_FREQ);
391
392 /*
393 * ウォッチドッグを停止する.
394 */
395 sil_wrw_mem(MPCORE_WDG_CTRL,
396 sil_rew_mem(MPCORE_WDG_CTRL) & ~(MPCORE_WDG_CTRL_ENABLE));
397
398 return(ovrtim);
399}
400
401/*
402 * オーバランタイマの現在値の読出し
403 */
404Inline PRCTIM
405target_ovrtimer_get_current(void)
406{
407 /*
408 * ウォッチドッグのカウント値を読み出し,MPCORE_WDG_FREQで除した
409 * 値を返す.
410 */
411 return((PRCTIM)(sil_rew_mem(MPCORE_WDG_CNT) / MPCORE_WDG_FREQ));
412}
413
414/*
415 * オーバランタイマ割込みハンドラ
416 */
417extern void target_ovrtimer_handler(void);
418
419#endif /* TOPPERS_MACRO_ONLY */
420#endif /* TOPPERS_SUPPORT_OVRHDR */
421#endif /* USE_MPCORE_WDG_OVRTIMER */
422#endif /* TOPPERS_MPCORE_TIMER_H */
Note: See TracBrowser for help on using the repository browser.