source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/mips3/vr5500/pic_icu.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 9.1 KB
Line 
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 * Copyright (C) 2000-2003 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 */
52
53#ifndef _PIC_ICU_H_
54#define _PIC_ICU_H_
55
56#ifndef _MACRO_ONLY
57#include <sil.h>
58#endif /* _MACRO_ONLY */
59
60#include <rte_vr5500_cb.h> /* ICU_BASE_ADDR */
61
62/*
63 * 割込みコントローラ(Programable Interrupt Controler)関係の定義
64 */
65
66/* 割込み番号の定義(0-7はmips3.hで使用。8以降を指定する。) */
67#define INTNO_TIMER0 8 /* タイマ0 */
68#define INTNO_SERIAL0 9 /* シリアル0 */
69#define INTNO_GBUS 10 /* GBUS-INT0- */
70#define INTNO_BUS_ERR 11 /* BUS_ERROR */
71#define INTNO_TIMER1 12 /* タイマ1 */
72#define INTNO_SERIAL1 13 /* シリアル1 */
73#define INTNO_PARALEL 14 /* パラレル */
74#define INTNO_DMAC 15 /* DMAC_INTREQ- */
75
76/* 割込みコントローラが管理する割込みの本数 */
77#define TMAX_ICU_INTNO 8u
78
79/* 割込みコントローラのレジスタのアドレス定義 */
80/* 以下のxxx_offsetは、アセンブラで使う。 */
81#define INT0M_offset 0x00
82#define INT1M_offset 0x10
83#define INTR_offset 0x20
84#define INTEN_offset 0x30
85
86#define ICU_INT0M INT0M_offset
87#define ICU_INT1M INT1M_offset
88#define ICU_INTR INTR_offset
89#define ICU_INTEN INTEN_offset
90
91/* 割込み要因ビットパターン (下記、アセンブラ部分でも利用している。) */
92#define TIMER0 BIT0
93#define SERIAL0 BIT1
94#define GBUS BIT2
95#define BUS_ERR BIT3
96#define TIMER1 BIT4
97#define SERIAL1 BIT5
98#define PARALEL BIT6
99#define DMAC BIT7
100
101/* ICU内
102のレジスタアクセス用の関数 */
103#define icu_reb( addr ) sil_reb_mem( (VP)(ICU_BASE_ADDR + addr) )
104#define icu_wrb( addr, val ) sil_wrb_mem( (VP)(ICU_BASE_ADDR + addr), val )
105
106#define icu_orb( mem, val ) icu_wrb( mem, icu_reb( mem ) | val )
107#define icu_andb( mem, val ) icu_wrb( mem, icu_reb( mem ) & val )
108
109/*
110 * 割込みコントローラの割込みマスク関係
111 */
112
113/* 構造体ICU_IPM内
114のオフセットを求めるためのマクロ(makeoffset.cで用いる)
115 なお、このマクロで定義した値は、特に利用していない。*/
116#define OFFSET_DEF_ICU_IPM OFFSET_DEF(ICU_IPM, int1m)
117
118/* 割込みコントローラに設定可能な割込みマスクビットパターン(最高値)*/
119#define MAX_ICU_IPM 0xff
120
121/* 割込みコントローラに設定する割込みマスクのチェック */
122#define CHECK_ICU_IPM(ipm) \
123 CHECK_PAR( 0 < (ipm.int0m) && (ipm.int0m) <= MAX_ICU_IPM ); \
124 CHECK_PAR( 0 < (ipm.int1m) && (ipm.int1m) <= MAX_ICU_IPM )
125
126#ifndef _MACRO_ONLY
127
128/* 割込みコントローラに対する割込みマスクの擬似テーブル */
129extern ICU_IPM icu_intmask_table[];
130
131/* 割込みコントローラのintmaskテーブルの設定 */
132Inline void icu_set_ilv(INTNO intno, ICU_IPM *ipm) {
133 /* CHECK_ICU_IPM(ipm) は、上位ルーチンで実行済み */
134 icu_intmask_table[intno].int0m = ipm->int0m;
135 icu_intmask_table[intno].int1m = ipm->int1m;
136}
137
138/* 割り込みコントローラのマスク設定 */
139Inline void icu_set_ipm(ICU_IPM *ipm) {
140 /* CHECK_ICU_IPM(ipm) は、上位ルーチンで実行済み */
141 icu_wrb( (VP) ICU_INT0M, ipm->int0m );
142 icu_wrb( (VP) ICU_INT1M, ipm->int1m );
143}
144
145/* 割り込みコントローラのマスク取得 */
146Inline void icu_get_ipm(ICU_IPM *ipm) {
147 ipm->int0m = icu_reb( (VP) ICU_INT0M );
148 ipm->int1m = icu_reb( (VP) ICU_INT1M );
149}
150
151#endif /* _MACRO_ONLY */
152
153/*============================================================================*/
154/* アセンブラ処理関係 */
155
156/* 割込み許可ビットの待
157避と復å…
158ƒ */
159/* 割込みコントローラICUのIPMをスタックに保存 */
160/* ワード境界の関係で、本来は1バイトのマスクではあるけれども、
161 ワード境界のために2バイト単位で扱う必
162要がある。 */
163#define PUSH_ICU_IPM \
164 li t1, ICU_BASE_ADDR; \
165 addi sp, sp, -2*2; \
166 lb t3, INT0M_offset(t1); /* t3 = INT0M */ \
167 lb t4, INT1M_offset(t1); /* t4 = INT1M */ \
168 sh t3, (sp); \
169 sh t4, 2(sp)
170
171/* 割込みコントローラICUのIPMをスタックから復å…
172ƒ */
173#define POP_ICU_IPM \
174 li t1, ICU_BASE_ADDR; \
175 lh t3, (sp); \
176 lh t4, 2(sp); \
177 sb t3, INT0M_offset(t1); /* INT0M = t3 */ \
178 sb t4, INT1M_offset(t1); /* INT1M = t4 */ \
179 addi sp, sp, 2*2
180
181/* 割込みコントローラICUのIPMを設定 */
182/* t0に割込み要因番号がå…
183¥ã£ãŸçŠ¶æ…
184‹ã§å‘¼ã°ã‚Œã‚‹ */
185/* t0の内
186容を壊してはいけない */
187/* t1に割込み要求クリアの定数がå…
188¥ã£ã¦ã„るので破壊してはならない。 */
189#define SET_ICU_IPM \
190 la t4, icu_intmask_table; /* データテーブルのå…
191ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */ \
192 sll t2, t0, 1; /* オフセット=割込み要因番号×2倍 \
193 (マスクは、2バイト) */ \
194 li t3, ICU_BASE_ADDR; \
195 add t4, t4, t2; /* å…
196ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‹ã‚ªãƒ•ã‚»ãƒƒãƒˆ */ \
197 lh t5, (t4); /* t5 = INT0M:INT1M */ \
198 /* 注意:リトルエンディアン依存 */ \
199 sb t5, INT0M_offset(t3); /* INT0M=t5の下位1バイト */ \
200 srl t6, t5, 8; \
201 sb t6, INT1M_offset(t3); /* INT1M=t5の上位1バイト */
202
203/* デバイス名から個別処理を展開するマクロ */
204/* 割込み要因をt0にå…
205¥ã‚Œã¦ proc_END に飛ぶ */
206#define MAKE_PROC(device) \
207proc_##device: \
208 li t0, INTNO_##device; \
209 j proc_END; \
210 nop;
211
212/* 割込み要因の判別 */
213/* 割込みコントローラはMIPS3コアのInt0に接続されている */
214/* マスクのチェック*/
215#define PROC_INT0 \
216 li t2, ICU_BASE_ADDR; \
217 lb t3, INTR_offset(t2); \
218 lb t4, INT0M_offset(t2); \
219 and t5, t3, t4; /* INT0M とマスク */ \
220 beq t5, zero, proc_END; \
221 nop; \
222 \
223proc_BIT0: \
224 andi t4, t3, TIMER0; \
225 beq t4, zero, proc_BIT1; \
226 nop; \
227MAKE_PROC(TIMER0) \
228 \
229proc_BIT1: \
230 andi t4, t3, SERIAL0; \
231 beq t4, zero, proc_BIT2; \
232 nop; \
233MAKE_PROC(SERIAL0) \
234 \
235proc_BIT2: \
236 andi t4, t3, GBUS; \
237 beq t4, zero, proc_BIT3; \
238 nop; \
239MAKE_PROC(GBUS) \
240 \
241proc_BIT3: \
242 andi t4, t3, BUS_ERR; \
243 beq t4, zero, proc_BIT4; \
244 nop; \
245MAKE_PROC(BUS_ERR) \
246 \
247proc_BIT4: \
248 andi t4, t3, TIMER1; \
249 beq t4, zero, proc_BIT5; \
250 nop; \
251MAKE_PROC(TIMER1) \
252 \
253proc_BIT5: \
254 andi t4, t3, SERIAL1; \
255 beq t4, zero, proc_BIT6; \
256 nop; \
257MAKE_PROC(SERIAL1) \
258 \
259proc_BIT6: \
260 andi t4, t3, PARALEL; \
261 beq t4, zero, proc_BIT7; \
262 nop; \
263MAKE_PROC(PARALEL) \
264 \
265proc_BIT7: \
266 andi t4, t3, DMAC; \
267 beq t4, zero, proc_END; \
268 nop; \
269MAKE_PROC(DMAC) \
270 \
271proc_END:
272
273#endif /* _PIC_ICU_H_ */
Note: See TracBrowser for help on using the repository browser.