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

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

initial

File size: 9.3 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#include <vr4131_dsiu.h>
54
55/*
56 * VR4131内
57蔵DSIU用 簡易SIOドライバ
58 */
59
60/*
61 * シリアルI/Oポート初期化ブロックの定義
62 */
63typedef struct sio_port_initialization_block {
64 UB lcr_def; /* LCR設定値 b0-b6;
65 (送受信ビット数、ストップビット,パリティ) */
66 UB boud_hi_def; /* DLM設定値(ボーレート上位の設定値) */
67 UB boud_lo_def; /* DLL設定値(ボーレート下位の設定値) */
68} SIOPINIB;
69
70/*
71 * シリアルI/Oポート管理ブロックの定義
72 */
73struct sio_port_control_block {
74 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
75 VP_INT exinf; /* 拡張情
76å ± */
77 BOOL openflag; /* オープン済みフラグ */
78 BOOL getready; /* 文字を受信した状æ…
79‹ */
80 BOOL putready; /* 文字を送信できる状æ…
81‹ */
82};
83
84/*
85 * シリアルI/Oポート初期化ブロック
86 * (ポートは1つしかないが、他のソースコードとの親和性からé…
87åˆ—で定義する)
88 */
89const SIOPINIB siopinib_table[TNUM_SIOP] = {
90 { (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON,
91 (UB) HI8(DIVISOR),
92 (UB) LO8(DIVISOR) }
93};
94
95/*
96 * シリアルI/Oポート初期化ブロックの取出し
97 */
98#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))
99#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))
100
101/*
102 * シリアルI/Oポート管理ブロックのエリア
103 */
104SIOPCB siopcb_table[TNUM_SIOP];
105
106/*
107 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
108 */
109#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
110#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
111
112/*
113 * 状æ…
114‹ã®èª­å‡ºã—(IIDの読出し)
115 */
116static void
117vr4131_dsiu_get_stat(SIOPCB *siopcb)
118{
119 UB iid;
120
121 iid = vr4131_reb_mem( (VP) DSIUIID ) & INT_MASK;
122
123 switch( iid ) {
124 case INT_TRANS_EMPTY :
125 siopcb->putready = TRUE;
126 break;
127 case INT_RECEIVE_DATA :
128 case INT_CHAR_TIME_OUT :
129 siopcb->getready = TRUE;
130 break;
131 default :
132 break;
133 }
134
135
136}
137
138/*
139 * 文字を受信できるか?
140 */
141Inline BOOL
142vr4131_dsiu_getready(SIOPCB *siopcb)
143{
144 return(siopcb->getready);
145}
146
147/*
148 * 文字を送信できるか?
149 */
150Inline BOOL
151vr4131_dsiu_putready(SIOPCB *siopcb)
152{
153 return(siopcb->putready);
154}
155
156/*
157 * 受信した文字の取出し
158 */
159Inline char
160vr4131_dsiu_getchar(SIOPCB *siopcb)
161{
162 siopcb->getready = FALSE;
163 return((char) vr4131_reb_mem( (VP) DSIURB ));
164}
165
166/*
167 * 送信する文字の書込み
168 */
169Inline void
170vr4131_dsiu_putchar(SIOPCB *siopcb, char c)
171{
172 siopcb->putready = FALSE;
173
174#ifndef GDB_STUB
175 vr4131_wrb_mem( (VP) DSIUTH, c );
176#else /* GDB_STUB */
177 stub_putc( c );
178#endif /* GDB_STUB */
179}
180
181/*
182 * SIOドライバの初期化ルーチン
183 */
184void
185vr4131_dsiu_initialize()
186{
187 SIOPCB *siopcb = siopcb_table;
188 UINT i = 0;
189
190 /*
191 * シリアルI/Oポート管理ブロックの初期化
192 */
193 siopcb->siopinib = &(siopinib_table[i]);
194 siopcb->openflag = FALSE;
195}
196
197/*
198 * SIOレジスタ初期化ルーチン
199 */
200void
201vr4131_dsiu_init_siopinib( const SIOPINIB *siopinib )
202{
203 /*
204 * DSIUレジスタの初期化
205 */
206 /* 初期処理 */
207 vr4131_wrb_mem( (VP) DSIUIE, DIS_INT );
208
209 /* ボーレートの設定 */
210 vr4131_wrb_mem( (VP) DSIULC, siopinib->lcr_def | DIVISOR_LATCH_ACC );
211
212 vr4131_wrb_mem( (VP) DSIUDLL, siopinib->boud_lo_def );
213 vr4131_wrb_mem( (VP) DSIUDLM, siopinib->boud_hi_def );
214
215 /* モードの設定 */
216 vr4131_wrb_mem( (VP) DSIULC, siopinib->lcr_def );
217
218 /* FIFOの設定 */
219 vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE );
220 vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE | RECEIVE_FIFO_RESET | TRANS_FIFO_RESET | RECEIVE_TRIG_1_BYTE );
221 vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE | RECEIVE_TRIG_1_BYTE );
222
223 /* 終了処理 */
224 vr4131_wrb_mem( (VP) DSIUMC, RTS );
225
226 vr4131_wrb_mem( (VP) DSIUIE, RECEIVE_DATA_AVAILABLE);
227}
228
229/*
230 * カーネル起動時のバーナー出力用の初期化
231 */
232void
233vr4131_dsiu_init(void)
234{
235 vr4131_dsiu_init_siopinib( get_siopinib(1) );
236}
237
238/*
239 * オープンしているポートがあるか?
240 */
241BOOL
242vr4131_dsiu_openflag(void)
243{
244 return( siopcb_table[0].openflag );
245}
246
247/*
248 * シリアルI/Oポートのオープン
249 */
250SIOPCB *
251vr4131_dsiu_opn_por(ID siopid, VP_INT exinf)
252{
253 SIOPCB *siopcb = get_siopcb(siopid);
254 const SIOPINIB *siopinib = siopcb->siopinib;
255
256#ifndef GDB_STUB
257 /* DSIUレジスタの初期化 */
258 vr4131_dsiu_init_siopinib( siopinib );
259#endif /* GDB_STUB */
260
261 /* 割込みレベル設定、割込み要求クリアは、sio_opn_por(hw_serial.h)で行う。 */
262
263 siopcb->exinf = exinf;
264 siopcb->getready = siopcb->putready = FALSE;
265 siopcb->openflag = TRUE;
266
267 return(siopcb);
268}
269
270/*
271 * シリアルI/Oポートのクローズ
272 */
273void
274vr4131_dsiu_cls_por(SIOPCB *siopcb)
275{
276 vr4131_wrb_mem( (VP) DSIUIE, DIS_INT );
277
278 siopcb->openflag = FALSE;
279}
280
281/*
282 * シリアルI/Oポートへの文字送信
283 */
284BOOL
285vr4131_dsiu_snd_chr(SIOPCB *siopcb, char c)
286{
287 if (vr4131_dsiu_putready(siopcb)) {
288 vr4131_dsiu_putchar(siopcb, c);
289 return(TRUE);
290 }
291 return(FALSE);
292}
293
294/*
295 * シリアルI/Oポートからの文字受信
296 */
297INT
298vr4131_dsiu_rcv_chr(SIOPCB *siopcb)
299{
300 if (vr4131_dsiu_getready(siopcb)) {
301 return((INT)(UB) vr4131_dsiu_getchar(siopcb));
302 }
303 return(-1);
304}
305
306/*
307 * シリアルI/Oポートからのコールバックの許可
308 */
309void
310vr4131_dsiu_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
311{
312 UB ie_bit = 0;
313
314 switch (cbrtn) {
315 case SIO_ERDY_SND:
316 ie_bit = TRANS_REG_EMPTY;
317 break;
318 case SIO_ERDY_RCV:
319 ie_bit = RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS;
320 break;
321 }
322
323 vr4131_orb( (VP) DSIUIE, ie_bit );
324}
325
326/*
327 * シリアルI/Oポートからのコールバックの禁止
328 */
329void
330vr4131_dsiu_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
331{
332 UB ie_bit = 0;
333
334 switch (cbrtn) {
335 case SIO_ERDY_SND:
336 ie_bit = TRANS_REG_EMPTY;
337 break;
338 case SIO_ERDY_RCV:
339 ie_bit = RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS;
340 break;
341 }
342
343 vr4131_andb( (VP) DSIUIE, ~ie_bit );
344}
345
346/*
347 * シリアルI/Oポートに対する割込み処理
348 */
349static void
350vr4131_dsiu_isr_siop(SIOPCB *siopcb)
351{
352 vr4131_dsiu_get_stat(siopcb);
353
354 if ( vr4131_dsiu_getready(siopcb) ) {
355 /*
356 * 受信通知コールバックルーチンを呼び出す.
357 */
358 vr4131_dsiu_ierdy_rcv(siopcb->exinf);
359 }
360 if ( vr4131_dsiu_putready(siopcb) ) {
361 /*
362 * 送信可能コールバックルーチンを呼び出す.
363 */
364 vr4131_dsiu_ierdy_snd(siopcb->exinf);
365 }
366}
367
368/*
369 * SIOの割込みサービスルーチン
370 */
371void
372vr4131_dsiu_isr()
373{
374 if (siopcb_table[0].openflag) {
375 vr4131_dsiu_isr_siop(&(siopcb_table[0]));
376 }
377}
378
379/*
380 * VR4131 内
381蔵 DSIU 用ポーリング出力 (sys_putcで利用)
382 */
383void
384vr4131_dsiu_putchar_pol( char val ) {
385
386 /* 送信部エンプティになるまで待
387つ。 */
388 while( (vr4131_reb_mem( (VP)DSIULS ) & (TEMT) ) == 0 );
389
390 vr4131_wrb_mem( (VP)DSIUTH, (VB) val );
391}
Note: See TracBrowser for help on using the repository browser.