3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: hw_timer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
46 #include <s_services.h>
47 #include <dve68k_dga.h>
52 #define INHNO_TIMER TVEC_TT0
62 * タイマ値の内部表現とミリ秒・μ秒単位との変換
64 * DVE68K/40 CPUボードでは,タイマは1μ秒毎にカウントアップする.
66 #define TIMER_CLOCK 1000
67 #define TO_CLOCK(nume, deno) (TIMER_CLOCK * (nume) / (deno))
68 #define TO_USEC(clock) ((clock) * 1000 / TIMER_CLOCK)
71 * 設定できる最大のタイマ周期(単位は内部表現)
73 #define MAX_CLOCK ((CLOCK) 0xffffff)
76 * タイマの現在値を割込み発生前の値とみなすかの判断
78 #define GET_TOLERANCE 100 /* 処理遅れの見積り値(単位は内部表現)*/
79 #define BEFORE_IREQ(clock) \
80 ((clock) >= TO_CLOCK(TIC_NUME, TIC_DENO) - GET_TOLERANCE)
87 #define TIMER_STOP_DELAY 200
92 #define CSR12_START 0x80000000u /* タイマ動作 */
97 * タイマを初期化し,周期的なタイマ割込み要求を発生させる.
100 hw_timer_initialize()
102 CLOCK cyc = TO_CLOCK(TIC_NUME, TIC_DENO);
105 * タイマ周期を設定し,タイマの動作を開始する.
107 assert(cyc <= MAX_CLOCK);
108 dga_write((VP) TADR_DGA_CSR12, CSR12_START | cyc);
111 * タイマ割込みの割込みレベルを設定し,要求をクリアした後,
114 dga_set_ilv((VP) TADR_DGA_CSR25, TBIT_TT0IL, TIRQ_LEVEL4);
115 dga_write((VP) TADR_DGA_CSR23, TBIT_TT0);
116 dga_bit_or((VP) TADR_DGA_CSR21, TBIT_TT0);
125 dga_write((VP) TADR_DGA_CSR23, TBIT_TT0);
139 dga_bit_and((VP) TADR_DGA_CSR12, ~CSR12_START);
142 * タイマ割込みをマスクし,要求をクリアする.
144 dga_bit_and((VP) TADR_DGA_CSR21, ~TBIT_TT0);
145 dga_write((VP) TADR_DGA_CSR23, TBIT_TT0);
152 hw_timer_get_current()
157 * タイマの動作を一時的に停止し,タイマ値を読み出す.
159 dga_bit_and((VP) TADR_DGA_CSR12, ~CSR12_START);
160 sil_dly_nse(TIMER_STOP_DELAY);
161 clk = dga_read((VP) TADR_DGA_CSR13) & 0x00ffffffu;
162 dga_bit_or((VP) TADR_DGA_CSR12, CSR12_START);
170 hw_timer_fetch_interrupt()
172 return((dga_read((VP) TADR_DGA_CSR20) & TBIT_TT0) != 0);
175 #endif /* _MACRO_ONLY */
176 #endif /* _HW_TIMER_H_ */