OSDN Git Service

7066e6e84e647dd0b9b6ba97571a7d696e00be39
[trx-305dsp/dsp.git] / hirado / kernel / config / m68k / dve68k / hw_timer.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
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  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: hw_timer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 /*
40  *  タイマドライバ(DVE68K/40用)
41  */
42
43 #ifndef _HW_TIMER_H_
44 #define _HW_TIMER_H_
45
46 #include <s_services.h>
47 #include <dve68k_dga.h>
48
49 /*
50  *  タイマ割込みハンドラのベクタ番号
51  */
52 #define INHNO_TIMER TVEC_TT0
53
54 #ifndef _MACRO_ONLY
55
56 /*
57  *  タイマ値の内部表現の型
58  */
59 typedef UW  CLOCK;
60
61 /*
62  *  タイマ値の内部表現とミリ秒・μ秒単位との変換
63  *
64  *  DVE68K/40 CPUボードでは,タイマは1μ秒毎にカウントアップする.
65  */
66 #define TIMER_CLOCK     1000
67 #define TO_CLOCK(nume, deno)    (TIMER_CLOCK * (nume) / (deno))
68 #define TO_USEC(clock)      ((clock) * 1000 / TIMER_CLOCK)
69
70 /*
71  *  設定できる最大のタイマ周期(単位は内部表現)
72  */
73 #define MAX_CLOCK   ((CLOCK) 0xffffff)
74
75 /*
76  *  タイマの現在値を割込み発生前の値とみなすかの判断
77  */
78 #define GET_TOLERANCE   100 /* 処理遅れの見積り値(単位は内部表現)*/
79 #define BEFORE_IREQ(clock) \
80         ((clock) >= TO_CLOCK(TIC_NUME, TIC_DENO) - GET_TOLERANCE)
81
82 /*
83  *  タイマ停止までの時間(nsec単位)
84  *
85  *  値に根拠はない.
86  */
87 #define TIMER_STOP_DELAY    200
88
89 /*
90  *  レジスタの設定値
91  */
92 #define CSR12_START 0x80000000u /* タイマ動作 */
93
94 /*
95  *  タイマの起動処理
96  *
97  *  タイマを初期化し,周期的なタイマ割込み要求を発生させる.
98  */
99 Inline void
100 hw_timer_initialize()
101 {
102     CLOCK   cyc = TO_CLOCK(TIC_NUME, TIC_DENO);
103
104     /*
105      *  タイマ周期を設定し,タイマの動作を開始する.
106      */
107     assert(cyc <= MAX_CLOCK);
108     dga_write((VP) TADR_DGA_CSR12, CSR12_START | cyc);
109
110     /*
111      *  タイマ割込みの割込みレベルを設定し,要求をクリアした後,
112      *  マスクを解除する.
113      */
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);
117 }
118
119 /*
120  *  タイマ割込み要求のクリア
121  */
122 Inline void
123 hw_timer_int_clear()
124 {
125     dga_write((VP) TADR_DGA_CSR23, TBIT_TT0);
126 }
127
128 /*
129  *  タイマの停止処理
130  *
131  *  タイマの動作を停止させる.
132  */
133 Inline void
134 hw_timer_terminate()
135 {
136     /*
137      *  タイマの動作を停止する.
138      */
139     dga_bit_and((VP) TADR_DGA_CSR12, ~CSR12_START);
140
141     /*
142      *  タイマ割込みをマスクし,要求をクリアする.
143      */
144     dga_bit_and((VP) TADR_DGA_CSR21, ~TBIT_TT0);
145     dga_write((VP) TADR_DGA_CSR23, TBIT_TT0);
146 }
147
148 /*
149  *  タイマの現在値の読出し
150  */
151 Inline CLOCK
152 hw_timer_get_current()
153 {
154     CLOCK   clk;
155
156     /*
157      *  タイマの動作を一時的に停止し,タイマ値を読み出す.
158      */
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);
163     return(clk);
164 }
165
166 /*
167  *  タイマ割込み要求のチェック
168  */
169 Inline BOOL
170 hw_timer_fetch_interrupt()
171 {
172     return((dga_read((VP) TADR_DGA_CSR20) & TBIT_TT0) != 0);
173 }
174
175 #endif /* _MACRO_ONLY */
176 #endif /* _HW_TIMER_H_ */