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

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

initial

File size: 17.3 KB
RevLine 
[26]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 _VR4131_ICU_H_
54#define _VR4131_ICU_H_
55
56/*
57 * 割込みコントローラ(ICU)関係の定義
58 */
59
60/* 割込み番号の定義(0-7番は mips3.h で使用。8番以降を指定する。) */
61/* SYSINT1REG */
62#define INTNO_BAT 8 /* バッテリ割込み */
63#define INTNO_POWER 9 /* パワースイッチ割込み */
64#define INTNO_RTCL1 10 /* RTCLong1割込み */
65#define INTNO_ETIME 11 /* ElipsedTimeタイマ割込み */
66#define INTNO_GIU 12 /* GIU割込み */
67#define INTNO_SIU 13 /* SIU割込み */
68#define INTNO_SOFTINT 14 /* ソフトウェア割込み */
69#define INTNO_CLKRUN 15 /* CLKRUN割込み */
70
71/* SYSINT2REG */
72#define INTNO_RTCL2 16 /* RTCLong2割込み */
73#define INTNO_LED 17 /* LED割込み */
74#define INTNO_TCLK 18 /* TClockカウンタ割込み */
75#define INTNO_FIR 19 /* FIR割込み */
76#define INTNO_DSIU 20 /* DSIU割込み */
77#define INTNO_PCI 21 /* PCI割込み */
78#define INTNO_SCU 22 /* SCU割込み */
79#define INTNO_CSI 23 /* CSI割込み */
80#define INTNO_BCU 24 /* BCU割込み */
81
82/* 割込みコントローラが管理する割込みの本数 */
83#define TMAX_ICU_INTNO 17u
84
85/* 割込みコントローラのレジスタのアドレス定義 */
86/* 以下の xxx_asm、xxx_offset は、アセンブラでの利用向け。 */
87#define ICU_BASE_ADDR 0x0f000000
88#define ICU_BASE_ADDR_asm ASM_SIL( ICU_BASE_ADDR )
89
90#define SYSINT1_offset 0x80
91#define MSYSINT1_offset 0x8c
92#define MDSIUINT_offset 0x96
93#define SYSINT2_offset 0xa0
94#define MSYSINT2_offset 0xa6
95
96#define MSYSINT1REG (ICU_BASE_ADDR + MSYSINT1_offset)
97 /* システム割込みマスクレジスタ1(レベル1) */
98#define MDSIUINTREG (ICU_BASE_ADDR + MDSIUINT_offset)
99 /* DSIU割込みマスクレジスタ(レベル2) */
100#define MSYSINT2REG (ICU_BASE_ADDR + MSYSINT2_offset)
101 /* システム割込みマスクレジスタ2(レベル1) */
102
103/* 割込み要因ビットパターン (下記、アセンブラ部分でも利用している。) */
104/* MSYSINT1REG / SYSINT1REG 関係 */
105#define CLKRUNINTR BIT12 /* CLKRUN 割込み */
106#define SOFTINTR BIT11 /* ソフトウェア割込み */
107#define SIUINTR BIT9 /* SIU 割込み */
108#define GIUINTR BIT8 /* GIU(下位) 割込み */
109#define ETIMERINTR BIT3 /* ElapsedTimeタイマ 割込み */
110#define RTCL1INTR BIT2 /* RTCLong1タイマ 割込み */
111#define POWERINTR BIT1 /* パワースイッチ割込み */
112#define BATINTR BIT0 /* バッテリ割込み */
113
114/* MSYSINT2REG / SYSINT2REG 関係 */
115#define BCUINTR BIT9 /* BCU 割込み */
116#define CSIINTR BIT8 /* CSI 割込み */
117#define SCUINTR BIT7 /* SCU 割込み */
118#define PCIINTR BIT6 /* PCI 割込み */
119#define DSIUINTR BIT5 /* DSIU 割込み */
120#define FIRINTR BIT4 /* FIR 割込み */
121#define TCLKINTR BIT3 /* VTClockカウンタ 割込み */
122#define LEDINTR BIT1 /* LED 割込み */
123#define RTCL2INTR BIT0 /* RTCLong2 割込み */
124
125/* MDSIUINTREG 関係 */
126#define INTDSIU BIT11 /* DSIUの変化割込み許可 */
127
128/*
129 * 割込みコントローラの割込みマスク関係
130 */
131
132/* 構造体ICU_IPM内
133のオフセットを求めるためのマクロ(makeoffset.cで用いる)
134 なお、このマクロで定義した値は、特に利用していない。*/
135#define OFFSET_DEF_ICU_IPM OFFSET_DEF(ICU_IPM, msysint2)
136
137/* MSYSINT1,2に設定してはいけないビット */
138#define NG_BIT_MSYSINT1 (BIT4 | BIT5 | BIT6 | BIT7 | BIT10 | BIT13 |BIT14 | BIT15)
139#define NG_BIT_MSYSINT2 (BIT2 | BIT10 | BIT11 | BIT12 | BIT13 | BIT14 | BIT15)
140
141/* 割込みコントローラに設定する割込みマスクのチェック */
142#define CHECK_ICU_IPM(ipm) \
143 CHECK_PAR(!(ipm.msysint1 & NG_BIT_MSYSINT1)); \
144 CHECK_PAR(!(ipm.msysint2 & NG_BIT_MSYSINT2))
145
146#ifndef _MACRO_ONLY
147
148/* 割込みコントローラに対する割込みマスクの擬似テーブル */
149extern ICU_IPM icu_intmask_table[];
150
151/* 割込みコントローラのintmaskテーブルの設定 */
152Inline void icu_set_ilv(INTNO intno, ICU_IPM *ipm) {
153 /* CHECK_ICU_IPM(ipm) は、上位ルーチンで実行済み */
154 icu_intmask_table[intno].msysint1 = ipm->msysint1;
155 icu_intmask_table[intno].msysint2 = ipm->msysint2;
156}
157
158/* 割り込みコントローラのマスク設定 */
159Inline void icu_set_ipm(ICU_IPM *ipm) {
160 /* CHECK_ICU_IPM(ipm) は、上位ルーチンで実行済み */
161 vr4131_wrh_mem( (VP) MSYSINT1REG, ipm->msysint1 );
162 vr4131_wrh_mem( (VP) MSYSINT2REG, ipm->msysint2 );
163}
164
165/* 割り込みコントローラのマスク取得 */
166Inline void icu_get_ipm(ICU_IPM *ipm) {
167 ipm->msysint1 = vr4131_reh_mem( (VP) MSYSINT1REG );
168 ipm->msysint2 = vr4131_reh_mem( (VP) MSYSINT2REG );
169}
170
171#endif /* _MACRO_ONLY */
172
173/*============================================================================*/
174/* アセンブラ処理関係 */
175
176/* 割込み許可ビットの待
177避と復å…
178ƒ */
179/* 割込みコントローラICUのIPMをスタックに保存 */
180#define PUSH_ICU_IPM \
181 li t1, ICU_BASE_ADDR_asm; \
182 addi sp, sp, -2*2; \
183 lh t3, MSYSINT1_offset(t1); /* t3 = MSYSINT1REG */ \
184 lh t4, MSYSINT2_offset(t1); /* t4 = MSYSINT2REG */ \
185 sh t3, (sp); \
186 sh t4, 2(sp)
187
188/* 割込みコントローラICUのIPMをスタックから復å…
189ƒ */
190#define POP_ICU_IPM \
191 li t1, ICU_BASE_ADDR_asm; \
192 lw t3, (sp); /* t3 = MSYSINT2REG:MSYSINT1REG */ \
193 /* 注意:リトルエンディアン依存 */ \
194 sh t3, MSYSINT1_offset(t1); /* MSYSINT1REG = t3の下位2バイト*/ \
195 srl t4, t3, 16; \
196 sh t4, MSYSINT2_offset(t1); /* MSYSINT2REG = t3の上位2バイト*/ \
197 addi sp, sp, 2*2
198
199/* 割込みコントローラICUのIPMを設定 */
200/* t0に割込み要因番号がå…
201¥ã£ãŸçŠ¶æ…
202‹ã§å‘¼ã°ã‚Œã‚‹ */
203/* t0の内
204容を壊してはいけない */
205/* t1に割込み要求クリアの定数がå…
206¥ã£ã¦ã„るので破壊してはならない。 */
207#define SET_ICU_IPM \
208 la t4, icu_intmask_table; /* データテーブルのå…
209ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */ \
210 sll t2, t0, 2; /* オフセット=割込み要因番号×4倍 */ \
211 li t3, ICU_BASE_ADDR_asm; \
212 add t4, t4, t2; /* å…
213ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‹ã‚ªãƒ•ã‚»ãƒƒãƒˆ */ \
214 lw t5, (t4); /* t5 = MSYSINT2REG:MSYSINT1REG */ \
215 /* 注意:リトルエンディアン依存 */ \
216 sh t5, MSYSINT1_offset(t3); /* MSYSINT1REG = t5の下位2バイト */ \
217 srl t6, t5, 16; \
218 sh t6, MSYSINT2_offset(t3) /* MSYSINT2REG = t5の上位2バイト */
219
220/* デバイス名から個別処理を展開するマクロ
221 割込み要因を t0 にå…
222¥ã‚Œã¦ proc_END に飛ぶ */
223#define MAKE_PROC(device) \
224proc_##device: \
225 li t0, INTNO_##device; \
226 j proc_END; \
227 nop;
228
229/* 割込み要因の判別 */
230/* 割込みコントローラはMIPS3コアのInt0に接続されているマスクのチェック */
231#define PROC_INT0 \
232/* タイマの応答性を上げるため、SYSINT2REGから調べる */ \
233 li t1, ICU_BASE_ADDR_asm; \
234 lh t3, SYSINT2_offset(t1); /* t3 = SYSINT2REG */ \
235 lh t4, MSYSINT2_offset(t1); /* t4 = MSYSINT2REG */ \
236 and t5, t3, t4; /* 割込み要求ビットにマスク */ \
237 beq t5, zero, proc_SYSINT1; \
238 andi t6, t5, (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 ); \
239 beq t6, zero, proc_SYSINT2_HIGH_5BIT; \
240 \
241/* SYSINT2REG (b0:4) の処理 */ \
242 andi t7, t5, ( RTCL2INTR | LEDINTR ); \
243 beq t7, zero, proc_SYSINT2_BIT3_4; \
244 andi t8, t5, LEDINTR; \
245 beq t8, zero, proc_LED; \
246MAKE_PROC(RTCL2); \
247MAKE_PROC(LED); \
248 \
249proc_SYSINT2_BIT3_4: \
250 andi t1, t5, TCLKINTR; \
251 beq t1, zero, proc_FIR; \
252MAKE_PROC(TCLK); \
253MAKE_PROC(FIR); \
254 \
255/* SYSINT2REG (b5:9) の処理 */ \
256proc_SYSINT2_HIGH_5BIT: \
257 andi t7, t5, (DSIUINTR | PCIINTR); \
258 beq t7, zero, proc_SYSINT2_BIT7_7; \
259 andi t2, t5, DSIUINTR; \
260 beq t2, zero, proc_PCI; \
261MAKE_PROC(DSIU); \
262MAKE_PROC(PCI); \
263 \
264proc_SYSINT2_BIT7_7: \
265 andi t3, t5, SCUINTR; \
266 beq t3, zero, proc_SYSINT2_BIT8_9; \
267MAKE_PROC(SCU); \
268 \
269proc_SYSINT2_BIT8_9: \
270 andi t4, t5, CSIINTR; \
271 beq t4, zero, proc_BCU; \
272MAKE_PROC(CSI); \
273MAKE_PROC(BCU); \
274 \
275/* SYSINT1REGのチェック */ \
276/* t1にICU_BASE_ADDRがå…
277¥ã£ãŸçŠ¶æ…
278‹ã§ã“こに来る */ \
279proc_SYSINT1: \
280 lh t3, SYSINT1_offset(t1); /* t3 = SYSINT1REG */ \
281 lh t4, MSYSINT1_offset(t2); /* t4 = MSYSINT1REG */ \
282 and t5, t3, t4; /* 割込み要求ビットにマスク */ \
283 andi t6, t5, 0xff; \
284 beq t6, zero, proc_SYSINT1_HIGH_BYTE; \
285 \
286/* SYSINT1REG (下位バイト) の処理 */ \
287 andi t7, t5, (BATINTR | POWERINTR); \
288 beq t7, zero, proc_SYSINT1_BIT2_3; \
289 andi t8, t5, BATINTR; \
290 beq t8, zero, proc_POWER; \
291MAKE_PROC(BAT); \
292MAKE_PROC(POWER); \
293 \
294proc_SYSINT1_BIT2_3: \
295 andi t1, t5, ETIMERINTR; \
296 beq t1, zero, proc_ETIME; \
297MAKE_PROC(RTCL1); \
298MAKE_PROC(ETIME); \
299 \
300/* SYSINT1REG (上位バイト) の処理 */ \
301proc_SYSINT1_HIGH_BYTE: \
302 andi t8, t5, (GIUINTR | SIUINTR); \
303 beq t8, zero, proc_SYSINT1_BIT11_12; \
304 andi t9, t5, GIUINTR; \
305 beq t9, zero, proc_SIU; \
306MAKE_PROC(GIU); \
307MAKE_PROC(SIU); \
308 \
309proc_SYSINT1_BIT11_12: \
310 andi t1, t5, SOFTINTR; \
311 beq t1, zero, proc_CLKRUN; \
312MAKE_PROC(SOFTINT); \
313MAKE_PROC(CLKRUN); \
314 \
315proc_END:
316
317/*============================================================================*/
318
319/* 割込み処理に関する、割込み要因の判断分岐処理のシステム依存部 */
320
321 /* 呼び出されたとき、 */
322 /* a1にステータスレジスタ */
323 /* a2に原因レジスタ */
324 /* の値がå…
325¥ã£ã¦ã„ã‚‹ */
326
327#define PROC_INTERRUPT_SYS \
328 and t2, a2, a1; /* 割込み要求ビットにマスクをかける */ \
329 andi t3, t2, Cause_IP0; /* IP0ビット取り出し */ \
330 bne t3, zero, proc_IP0; \
331 andi t4, t2, Cause_IP1; /* IP1ビット取り出し */ \
332 bne t4, zero, proc_IP1; \
333 andi t5, t2, Cause_IP2; /* IP2ビット取り出し */ \
334 bne t5, zero, proc_IP2; \
335 andi t6, t2, Cause_IP3; /* IP3ビット取り出し */ \
336 bne t6, zero, proc_IP3; \
337 andi t7, t2, Cause_IP4; /* IP4ビット取り出し */ \
338 bne t7, zero, proc_IP4; \
339 nop; \
340 /* VR4131の場合、Cause_IP5とCause_IP6は未接続なので省略 */ \
341 /*(ハードウェア編p196参ç…
342§ï¼‰*/ \
343 \
344 /* なんらかの原因で分岐できない場合 */ \
345 j join_interrupt_and_exception; \
346 nop; \
347 \
348 \
349/* MIPS3コアレベルで分岐したレベルでの処理 */ \
350/* 割込み要因番号を t0 にå…
351¥ã‚Œã¦ */ \
352/* 割込み要求クリアのための定数を t1 にå…
353¥ã‚Œã¦ */ \
354/* set_ICU_IPM へ飛ぶ */ \
355proc_IP7: /* 割込み要因IP7(タイマ)の場合 */ \
356 xori t1, zero, Cause_IP7; \
357 j set_ICU_IPM; \
358 ori t0, zero, INTNO_IP7; \
359 \
360proc_IP0: /* 割込み要因IP0(ソフトウェア割込み0)の場合 */ \
361 xori t1, zero, Cause_IP0; \
362 j set_ICU_IPM; \
363 ori t0, zero, INTNO_IP0; \
364 \
365proc_IP1: /* 割込み要因IP1(ソフトウェア割込み1)の場合 */ \
366 xori t1, zero, Cause_IP1; \
367 j set_ICU_IPM; \
368 ori t0, zero, INTNO_IP1; \
369 \
370proc_IP2: /* 割込み要因IP2(Int0)の場合 */ \
371 /* 「すべての割込み」が通知される。*/ \
372 PROC_INT0; /* 分岐処理は vr4131_icu.h でマクロ定義されている */ \
373 xori t1, zero, Cause_IP2; \
374 j set_ICU_IPM; \
375 nop; \
376 \
377proc_IP3: /* 割込み要因IP3(Int1)の場合 */ \
378 /* 「rtc_long1_intr」(インターバルタイマ)が通知される。*/ \
379 xori t1, zero, Cause_IP3; \
380 j set_ICU_IPM; \
381 ori t0, zero, INTNO_IP3; \
382 \
383proc_IP4: /* 割込み要因IP4(Int2)の場合 */ \
384 /* 「rtc_long2_intr」(インターバルタイマ)が通知される。*/ \
385 xori t1, zero, Cause_IP4; \
386 j set_ICU_IPM; \
387 ori t0, zero, INTNO_IP4; \
388 \
389/* 割込みコントローラ依存のマスク設定 */ \
390set_ICU_IPM: \
391 \
392 SET_ICU_IPM; /* 割込みマスクを設定するマクロ */ \
393 /* 実装
394を行うときには、下記にてt0、t1は利用するの */ \
395 /* で破壊しないように、注意しなければならない。 */ \
396 \
397/* 原因レジスタIPビットに保持されている各種割込みの割込み要求をクリアする。 \
398 t1には、割込み要求ビットを反転したものがå…
399¥ã£ã¦ã„る。 */ \
400 \
401 mfc0 t8, Cause; \
402 and t8, t8, t1; \
403 mtc0 t8, Cause; \
404 \
405/* ステータスレジスタのマスク設定とC言語ルーチン呼び出し */ \
406/* t0に割込み要因番号が設定された状æ…
407‹ã§ã“こに来る */ \
408 la t3, int_table; /* 擬似ベクタアドレス */ \
409 sll t4, t0, 3; /* 割込み要因番号を8倍 \
410 INT_TABLE型は、 \
411 ハンドラのアドレス(4バイト) \
412 +MIPS3コアの割込みマスク(4バイト) \
413 の、合計8バイト。 */ \
414 add t5, t3, t4; /* ベクタアドレスを算出 */ \
415 lw t6, INT_TABLE_intmask(t5); \
416 /* IPM(割込み許可ビット)読み出し。 \
417 割込みマスク以外の値は、 \
418 IEビットはセット \
419 EXLビットはリセット \
420 状æ…
421‹ã«ãªã£ã¦ã„る。*/ \
422 lw t7, (t5); /* C言語ルーチンå…
423ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹èª­ã¿å‡ºã— */ \
424 \
425 jalr ra, t7; /* C言語ルーチン呼び出し */ \
426 mtc0 t6, Status; /* 割込み許可;ステータスレジスタのマスク設定*/\
427 \
428 mfc0 t0, Status; \
429 ori t0, t0, SR_EXL; /* 割込み禁止;IEビットの値は保持しなければなら\
430 ないのでEXLビットを用いる。*/ \
431 mtc0 t0, Status; \
432 \
433 /* CP0ハザードのための時間稼ぎ */ \
434 NOP_FOR_CP0_HAZARD;
435
436#endif /* _VR4131_ICU_H_ */
Note: See TracBrowser for help on using the repository browser.