OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / target / dve68k_gcc / target_timer.h
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-2008 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: target_timer.h 889 2008-04-11 11:17:35Z hiro $
41  */
42
43 /*
44  *              タイマドライバ(DVE68K/40用)
45  */
46
47 #ifndef TOPPERS_TARGET_TIMER_H
48 #define TOPPERS_TARGET_TIMER_H
49
50 #include <sil.h>
51 #include "dve68k.h"
52
53 /*
54  *  タイマ割込みハンドラ登録のための定数
55  */
56 #define INHNO_TIMER             TINHNO_TT0              /* 割込みハンドラ番号 */
57 #define INTNO_TIMER             TINTNO_TT0              /* 割込み番号 */
58 #define INTPRI_TIMER    TIRQ_LEVEL4             /* 割込み優先度 */
59 #define INTATR_TIMER    TA_EDGE                 /* 割込み属性 */
60
61 #ifndef TOPPERS_MACRO_ONLY
62
63 /*
64  *  タイマ値の内部表現の型
65  */
66 typedef uint32_t        CLOCK;
67
68 /*
69  *  タイマ値の内部表現とミリ秒・μ秒単位との変換
70  *
71  *  DVE68K/40では,タイマは1μ秒毎にカウントアップする.
72  */
73 #define TIMER_CLOCK                             1000U
74 #define TO_CLOCK(nume, deno)    ((CLOCK)(TIMER_CLOCK * (nume) / (deno)))
75 #define TO_USEC(clock)                  (((SYSUTM) clock) * 1000U / TIMER_CLOCK)
76
77 /*
78  *  設定できる最大のタイマ周期(単位は内部表現)
79  */
80 #define MAX_CLOCK               ((CLOCK) 0xffffffU)
81
82 /*
83  *  タイマ停止までの時間(nsec単位)
84  *
85  *  値に根拠はない.
86  */
87 #define TIMER_STOP_DELAY        200U
88
89 /*
90  *  レジスタの設定値
91  */
92 #define CSR12_START             0x80000000U             /* タイマ動作 */
93 #define CSR12_STOP              0x00000000U             /* タイマ停止 */
94
95 /*
96  *  タイマの起動処理
97  *
98  *  タイマを初期化し,周期的なタイマ割込み要求を発生させる.
99  */
100 extern void     target_timer_initialize(intptr_t exinf);
101
102 /*
103  *  タイマの停止処理
104  *
105  *  タイマの動作を停止させる.
106  */
107 extern void     target_timer_terminate(intptr_t exinf);
108
109 /*
110  *  タイマの現在値の読出し
111  */
112 Inline CLOCK
113 target_timer_get_current(void)
114 {
115         CLOCK           clk;
116         uint32_t        saved_csr12;
117         SIL_PRE_LOC;
118
119         /*
120          *  タイマの動作を一時的に停止し,タイマ値を読み出す.タイマの動作
121          *  を一時的に停止させると,システム時刻がずれるために望ましくない
122          *  が,DVE68K/40のハードウェア的な制約であり,やむをえない.ずれを
123          *  最小に抑えるために,割込みロック状態とする.
124          */
125         SIL_LOC_INT();
126         saved_csr12 = dga_read((void *) TADR_DGA_CSR12);
127         dga_write((void *) TADR_DGA_CSR12, CSR12_STOP);
128         sil_dly_nse(TIMER_STOP_DELAY);
129         clk = dga_read((void *) TADR_DGA_CSR13) & 0x00ffffffU;
130         dga_write((void *) TADR_DGA_CSR12, saved_csr12);
131         SIL_UNL_INT();
132         return(clk);
133 }
134
135 /*
136  *  タイマ割込み要求のチェック
137  */
138 Inline bool_t
139 target_timer_probe_int(void)
140 {
141         return(x_probe_int(INTNO_TIMER));
142 }
143
144 /*
145  *  タイマ割込みハンドラ
146  */
147 extern void     target_timer_handler(void);
148
149 #endif /* TOPPERS_MACRO_ONLY */
150 #endif /* TOPPERS_TARGET_TIMER_H */