source: rc_os_nios2/atk2-sc1_1.3.2/target/nios2_dev_gcc/target_hw_counter.c@ 128

Last change on this file since 128 was 128, checked in by ertl-honda, 9 years ago

追加.

File size: 14.0 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2011-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2011-2013 by Spansion LLC, USA
10 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2011-2015 by Witz Corporation
16 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19 *
20 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25 * スコード中に含まれていること.
26 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32 * と.
33 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41 * 免責すること.
42 *
43 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
44 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
45 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
46 * 用する者に対して,AUTOSARパートナーになることを求めている.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: target_hw_counter.c 1801 2015-03-27 06:34:43Z t_ishikawa $
55 */
56
57/*
58 * 以下ハードウェアカウンタプログラムのターゲット依存定義(NIOS2_DEV用)
59 *
60 * 使用するタイマ:
61 * 差分タイマ:目的の時間を設定する時の現在時間(現在値タイマ)
62 * と次の満了時間との相対時間をカウントすることで
63 * 目的の絶対時間に満了したこととする
64 * count mode:count down once
65 *
66 * 現在値タイマ:カウンタ周期分のベースタイマを実現
67 * (絶対時間をカウント)
68 * count mode:continuous count down
69 *
70 * また上記のタイマは32bitのダウンカウンタタイマである
71 *
72 * 制御方針:
73 *
74 * 現在値タイマはユーザ定義カウンタ最大値2倍+1までカウントし,
75 * 周期タイマとして連続カウントダウンして,常に現在時刻を
76 * 取得する.割込み発生する必要がないため,割込みなしモード
77 *
78 * 差分タイマは,満了処理を行うため,割込みありモードで動く
79 * アラームなどの満了点とタイマー1で示した現在時刻の差を
80 * 現在値タイマに設定する
81 *
82 * ポイント:
83 * 満了処理は,現在時刻を影響しないため,現在値タイマを設けている
84 *
85 */
86#if defined(TOPPERS_NIOS2_DEV_2S180) || defined(TOPPERS_NIOS2_DEV_DE2_115) || defined(TOPPERS_NIOS2_DEV_DE0_NANO)
87
88#include "Os.h"
89#include "prc_sil.h"
90#include "target_hw_counter.h"
91
92/* 内部関数のプロトタイプ宣言 */
93static TickType get_curr_time(uint32 irq_no, TickType maxval);
94static void init_hwcounter(uint32 irq_no, TickType maxval, TimeType nspertick, TickRefType cycle);
95static void start_hwcounter(uint32 irq_no);
96static void stop_hwcounter(uint32 irq_no);
97static void set_hwcounter(uint32 irq_no, TickType exprtick, TickType maxval);
98static TickType get_hwcounter(uint32 irq_no, TickType maxval);
99static void cancel_hwcounter(uint32 irq_no);
100static void trigger_hwcounter(uint32 irq_no);
101static void int_clear_hwcounter(uint32 irq_no);
102static void int_cancel_hwcounter(uint32 irq_no);
103static void increment_hwcounter(uint32 irq_no);
104
105/*
106 * ハードウェアカウンタ現在ティック値取得
107 * ダウンカウンタタイマのため,変換が必要
108 */
109static TickType
110get_curr_time(uint32 irq_no, TickType maxval)
111{
112 TickType curr_time = 0U;
113
114 /* スナップレジスタに書き込むと値をホールドする */
115 sil_wrw_iop((void *) TIMER_SNAPL(irq_no + 1U), 0x00U);
116
117 /* タイマーからカウント値を読み込む */
118 curr_time = sil_rew_iop((void *) TIMER_SNAPL(irq_no + 1U));
119 curr_time |= sil_rew_iop((void *) TIMER_SNAPH(irq_no + 1U)) << 16U;
120
121 /* ダウンカウンタの為,現在チック値に変換 */
122 curr_time = maxval - curr_time;
123
124 return(curr_time);
125}
126
127/*
128 * ハードウェアカウンタの初期化
129 */
130static void
131init_hwcounter(uint32 irq_no, TickType maxval, TimeType nspertick, TickRefType cycle)
132{
133 *cycle = maxval;
134
135 /* 差分タイマ停止 */
136 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_STOP);
137 /* 差分タイマタイムアウトステータスクリア */
138 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
139
140 /* 現在値タイマ停止 */
141 sil_wrw_iop((void *) TIMER_CONTROL(irq_no + 1U), TIMER_CONTROL_STOP);
142 /* 現在値タイマタイムアウトステータスクリア */
143 sil_wrw_iop((void *) TIMER_STATUS(irq_no + 1U), 0x00U);
144
145 /* 現在値タイマカウンターセット 上位16bit */
146 sil_wrw_iop((void *) TIMER_PERIODH(irq_no + 1U), (maxval >> 16U));
147 /* 現在値タイマカウンターセット 下位16bit */
148 sil_wrw_iop((void *) TIMER_PERIODL(irq_no + 1U), (maxval & 0xffffU));
149}
150
151/*
152 * ハードウェアカウンタの開始
153 */
154static void
155start_hwcounter(uint32 irq_no)
156{
157 /*
158 * 現在値タイマ開始(continuous count down mode)
159 * 割込み必要がないため,割込みなしモード
160 */
161 sil_wrw_iop((void *) TIMER_CONTROL(irq_no + 1U), TIMER_CONTROL_CONT | TIMER_CONTROL_START);
162}
163
164/*
165 * ハードウェアカウンタの停止
166 */
167static void
168stop_hwcounter(uint32 irq_no)
169{
170 /* 差分タイマ停止 */
171 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_STOP);
172
173 /* 差分タイマの割込み要求のクリア */
174 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
175
176 /* 現在値タイマ停止 */
177 sil_wrw_iop((void *) TIMER_CONTROL(irq_no + 1U), TIMER_CONTROL_STOP);
178
179 /* 現在値タイマの割込み要求のクリア */
180 sil_wrw_iop((void *) TIMER_STATUS(irq_no + 1U), 0x00U);
181}
182
183/*
184 * ハードウェアカウンタへの満了時間の設定
185 */
186static void
187set_hwcounter(uint32 irq_no, TickType exprtick, TickType maxval)
188{
189 TickType curr_time;
190 TickType value;
191
192 /* 差分タイマの割込み要求のクリア */
193 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
194
195 /* 現在時刻の取得 */
196 curr_time = get_curr_time(irq_no, maxval);
197
198 /* タイマに設定する値を算出 */
199 if (exprtick >= curr_time) {
200 value = exprtick - curr_time;
201 }
202 else {
203 value = maxval - curr_time + exprtick + 1U;
204 }
205
206 /*
207 * タイマに0x00を設定し,割込み発生後,再度0を設定した場合,2回目の
208 * 0x00設定後の割込みは発生しないので,0x00設定値を0x01に直して設定
209 * タイマにセットする値は,期待する周期のカウント値から-1する必要がある
210 */
211 if (value <= 0x01U) {
212 value = 0x01U;
213 }
214 else {
215 value -= 1U;
216 }
217
218 /*
219 * 差分タイマカウンターセット 上位16bit
220 * 注意:下位bitより先に設定しないと,割込み2回発生する可能性がある
221 */
222 sil_wrw_iop((void *) TIMER_PERIODH(irq_no), (value >> 16U));
223 /* 差分タイマカウンターセット 下位16bit */
224 sil_wrw_iop((void *) TIMER_PERIODL(irq_no), (value & 0xffffU));
225
226 /*
227 * 差分タイマ開始(count down once mode)
228 * 割込み必要のため,割込みモードあり
229 */
230 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_ITO | TIMER_CONTROL_START);
231}
232
233/*
234 * ハードウェアカウンタの現在時間の取得
235 */
236static TickType
237get_hwcounter(uint32 irq_no, TickType maxval)
238{
239 return(get_curr_time(irq_no, maxval));
240}
241
242/*
243 * ハードウェアカウンタの設定された満了時間の取消
244 */
245static void
246cancel_hwcounter(uint32 irq_no)
247{
248 /* 差分タイマ停止 */
249 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_STOP);
250}
251
252/*
253 * ハードウェアカウンタの強制割込み要求
254 */
255static void
256trigger_hwcounter(uint32 irq_no)
257{
258 /* 差分タイマ停止 */
259 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_STOP);
260
261 /* 差分タイマの割込み要求のクリア */
262 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
263
264 /* 差分タイマカウンターに0x01をセットすることで,すぐ満了 */
265 sil_wrw_iop((void *) TIMER_PERIODH(irq_no), 0x00U);
266 sil_wrw_iop((void *) TIMER_PERIODL(irq_no), 0x01U);
267
268 /* 差分タイマ開始 */
269 sil_wrw_iop((void *) TIMER_CONTROL(irq_no), TIMER_CONTROL_ITO | TIMER_CONTROL_START);
270}
271
272/*
273 * 割込み要求のクリア
274 */
275static void
276int_clear_hwcounter(uint32 irq_no)
277{
278 /* 差分タイマの割込み要求のクリア */
279 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
280}
281
282/*
283 * 割込み要求のキャンセル
284 * ペンディングされている割込み要求をキャンセル
285 */
286static void
287int_cancel_hwcounter(uint32 irq_no)
288{
289 /* 差分タイマの割込み要求のクリア */
290 sil_wrw_iop((void *) TIMER_STATUS(irq_no), 0x00U);
291}
292
293/*
294 * ハードウェアカウンタのインクリメント
295 */
296static void
297increment_hwcounter(uint32 irq_no)
298{
299 /* Nios2ターゲットは未サポート */
300 return;
301}
302
303/*
304 * MAIN_HW_COUNTERの定義
305 */
306/* カウンタの最大値の2倍+1 */
307static TickType MAIN_HW_COUNTER_maxval;
308
309/*
310 * ハードウェアカウンタの初期化
311 */
312void
313init_hwcounter_MAIN_HW_COUNTER(TickType maxval, TimeType nspertick)
314{
315 init_hwcounter(TIMER_0_IRQ, maxval, nspertick, &MAIN_HW_COUNTER_maxval);
316}
317
318/*
319 * ハードウェアカウンタの開始
320 */
321void
322start_hwcounter_MAIN_HW_COUNTER(void)
323{
324 start_hwcounter(TIMER_0_IRQ);
325}
326
327/*
328 * ハードウェアカウンタの停止
329 */
330void
331stop_hwcounter_MAIN_HW_COUNTER(void)
332{
333 stop_hwcounter(TIMER_0_IRQ);
334}
335
336/*
337 * ハードウェアカウンタへの満了時間の設定
338 */
339void
340set_hwcounter_MAIN_HW_COUNTER(TickType exprtick)
341{
342 set_hwcounter(TIMER_0_IRQ, exprtick, MAIN_HW_COUNTER_maxval);
343}
344
345/*
346 * ハードウェアカウンタの現在時間の取得
347 */
348TickType
349get_hwcounter_MAIN_HW_COUNTER(void)
350{
351 return(get_hwcounter(TIMER_0_IRQ, MAIN_HW_COUNTER_maxval));
352}
353
354/*
355 * ハードウェアカウンタの設定された満了時間の取消
356 */
357void
358cancel_hwcounter_MAIN_HW_COUNTER(void)
359{
360 cancel_hwcounter(TIMER_0_IRQ);
361}
362
363/*
364 * ハードウェアカウンタの強制割込み要求
365 */
366void
367trigger_hwcounter_MAIN_HW_COUNTER(void)
368{
369 trigger_hwcounter(TIMER_0_IRQ);
370}
371
372/*
373 * ハードウェアカウンタの設定された満了時間の取消
374 */
375void
376int_clear_hwcounter_MAIN_HW_COUNTER(void)
377{
378 int_clear_hwcounter(TIMER_0_IRQ);
379}
380
381/*
382 * ハードウェアカウンタの設定された満了時間の取消
383 */
384void
385int_cancel_hwcounter_MAIN_HW_COUNTER(void)
386{
387 int_cancel_hwcounter(TIMER_0_IRQ);
388}
389
390/*
391 * ハードウェアカウンタのインクリメント
392 */
393void
394increment_hwcounter_MAIN_HW_COUNTER(void)
395{
396 increment_hwcounter(TIMER_0_IRQ);
397}
398
399/*
400 * SUB_HW_COUNTER1Bの定義
401 */
402/* カウンタの最大値の2倍+1 */
403static TickType SUB_HW_COUNTER1_maxval;
404
405/*
406 * ハードウェアカウンタの初期化
407 */
408void
409init_hwcounter_SUB_HW_COUNTER1(TickType maxval, TimeType nspertick)
410{
411 init_hwcounter(TIMER_2_IRQ, maxval, nspertick, &SUB_HW_COUNTER1_maxval);
412}
413
414/*
415 * ハードウェアカウンタの開始
416 */
417void
418start_hwcounter_SUB_HW_COUNTER1(void)
419{
420 start_hwcounter(TIMER_2_IRQ);
421}
422
423/*
424 * ハードウェアカウンタの停止
425 */
426void
427stop_hwcounter_SUB_HW_COUNTER1(void)
428{
429 stop_hwcounter(TIMER_2_IRQ);
430}
431
432/*
433 * ハードウェアカウンタへの満了時間の設定
434 */
435void
436set_hwcounter_SUB_HW_COUNTER1(TickType exprtick)
437{
438 set_hwcounter(TIMER_2_IRQ, exprtick, SUB_HW_COUNTER1_maxval);
439}
440
441/*
442 * ハードウェアカウンタの現在時間の取得
443 */
444TickType
445get_hwcounter_SUB_HW_COUNTER1(void)
446{
447 return(get_hwcounter(TIMER_2_IRQ, SUB_HW_COUNTER1_maxval));
448}
449
450/*
451 * ハードウェアカウンタの設定された満了時間の取消
452 */
453void
454cancel_hwcounter_SUB_HW_COUNTER1(void)
455{
456 cancel_hwcounter(TIMER_2_IRQ);
457}
458
459/*
460 * ハードウェアカウンタの強制割込み要求
461 */
462void
463trigger_hwcounter_SUB_HW_COUNTER1(void)
464{
465 trigger_hwcounter(TIMER_2_IRQ);
466}
467
468/*
469 * ハードウェアカウンタの設定された満了時間の取消
470 */
471void
472int_clear_hwcounter_SUB_HW_COUNTER1(void)
473{
474 int_clear_hwcounter(TIMER_2_IRQ);
475}
476
477/*
478 * ハードウェアカウンタの設定された満了時間の取消
479 */
480void
481int_cancel_hwcounter_SUB_HW_COUNTER1(void)
482{
483 int_cancel_hwcounter(TIMER_2_IRQ);
484}
485
486/*
487 * ハードウェアカウンタのインクリメント
488 */
489void
490increment_hwcounter_SUB_HW_COUNTER1(void)
491{
492 increment_hwcounter(TIMER_2_IRQ);
493}
494
495/*
496 * SUB_HW_COUNTER2の定義
497 */
498/* カウンタの最大値の2倍+1 */
499static TickType SUB_HW_COUNTER2_maxval;
500
501/*
502 * ハードウェアカウンタの初期化
503 */
504void
505init_hwcounter_SUB_HW_COUNTER2(TickType maxval, TimeType nspertick)
506{
507 init_hwcounter(TIMER_4_IRQ, maxval, nspertick, &SUB_HW_COUNTER2_maxval);
508}
509
510/*
511 * ハードウェアカウンタの開始
512 */
513void
514start_hwcounter_SUB_HW_COUNTER2(void)
515{
516 start_hwcounter(TIMER_4_IRQ);
517}
518
519/*
520 * ハードウェアカウンタの停止
521 */
522void
523stop_hwcounter_SUB_HW_COUNTER2(void)
524{
525 stop_hwcounter(TIMER_4_IRQ);
526}
527
528/*
529 * ハードウェアカウンタへの満了時間の設定
530 */
531void
532set_hwcounter_SUB_HW_COUNTER2(TickType exprtick)
533{
534 set_hwcounter(TIMER_4_IRQ, exprtick, SUB_HW_COUNTER2_maxval);
535}
536
537/*
538 * ハードウェアカウンタの現在時間の取得
539 */
540TickType
541get_hwcounter_SUB_HW_COUNTER2(void)
542{
543 return(get_hwcounter(TIMER_4_IRQ, SUB_HW_COUNTER2_maxval));
544}
545
546/*
547 * ハードウェアカウンタの設定された満了時間の取消
548 */
549void
550cancel_hwcounter_SUB_HW_COUNTER2(void)
551{
552 cancel_hwcounter(TIMER_4_IRQ);
553}
554
555/*
556 * ハードウェアカウンタの強制割込み要求
557 */
558void
559trigger_hwcounter_SUB_HW_COUNTER2(void)
560{
561 trigger_hwcounter(TIMER_4_IRQ);
562}
563
564/*
565 * ハードウェアカウンタの設定された満了時間の取消
566 */
567void
568int_clear_hwcounter_SUB_HW_COUNTER2(void)
569{
570 int_clear_hwcounter(TIMER_4_IRQ);
571}
572
573/*
574 * ハードウェアカウンタの設定された満了時間の取消
575 */
576void
577int_cancel_hwcounter_SUB_HW_COUNTER2(void)
578{
579 int_cancel_hwcounter(TIMER_4_IRQ);
580}
581
582/*
583 * ハードウェアカウンタのインクリメント
584 */
585void
586increment_hwcounter_SUB_HW_COUNTER2(void)
587{
588 increment_hwcounter(TIMER_4_IRQ);
589}
590
591#endif /* defined(TOPPERS_NIOS2_DEV_2S180) || defined(TOPPERS_NIOS2_DEV_DE2_115) */
Note: See TracBrowser for help on using the repository browser.