source: anotherchoice/tags/jsp-1.4.4-full-UTF8/pdic/simple_sio/tl16pir552.c@ 26

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

initial

File size: 11.0 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
54#include <tl16pir552.h>
55
56/*
57 * TL16PIR552(TI)用 簡易SIOドライバ
58 */
59
60/*
61 * シリアルI/Oポート初期化ブロックの定義
62 */
63typedef struct sio_port_initialization_block {
64 VP channel_addr; /* シリアルポートの開始番地 */
65
66 UB lcr_def; /* LCR設定値 b0-b6;
67 (送受信ビット数、ストップビット,パリティ) */
68 UB scr_def; /* SCR設定値(プリスケーラ;)*/
69 UB boud_hi_def; /* DLM設定値(ボーレート上位の設定値) */
70 UB boud_lo_def; /* DLL設定値(ボーレート下位の設定値) */
71} SIOPINIB;
72
73/*
74 * シリアルI/Oポート管理ブロックの定義
75 */
76struct sio_port_control_block {
77 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
78 VP_INT exinf; /* 拡張情
79å ± */
80 BOOL openflag; /* オープン済みフラグ */
81 BOOL getready; /* 文字を受信した状æ…
82‹ */
83 BOOL putready; /* 文字を送信できる状æ…
84‹ */
85};
86
87/*
88 * シリアルI/Oポート初期化ブロック
89 * ID = 1 をポート1,ID = 2 をポート2に対応させている.
90 */
91const SIOPINIB siopinib_table[TNUM_SIOP] = {
92 { (VP) UART_CH01,
93 (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON,
94 (UB) PRE_DIVISOR,
95 (UB) HI8(DIVISOR),
96 (UB) LO8(DIVISOR) },
97#if TNUM_SIOP >= 2
98 { (VP) UART_CH02,
99 (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON,
100 (UB) PRE_DIVISOR,
101 (UB) HI8(DIVISOR),
102 (UB) LO8(DIVISOR) },
103#endif /* TNUM_SIOP >= 2 */
104};
105
106/*
107 * シリアルI/Oポート初期化ブロックの取出し
108 */
109#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))
110#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))
111
112
113/*
114 * シリアルI/Oポート管理ブロックのエリア
115 */
116SIOPCB siopcb_table[TNUM_SIOP];
117
118/*
119 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
120 */
121#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
122#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
123
124/*
125 * SIO用レジスタ操作関数
126 */
127Inline void
128tl16pir552_orb( VP addr, UW reg, UB val )
129{
130 tl16pir552_wrb( addr, reg, tl16pir552_reb( addr, reg ) | val );
131}
132
133Inline void
134tl16pir552_andb( VP addr, UW reg, UB val )
135{
136 tl16pir552_wrb( addr, reg, tl16pir552_reb( addr, reg ) & val );
137}
138
139
140/*
141 * 状æ…
142‹ã®èª­å‡ºã—(IIRの読出し)
143 */
144static void
145tl16pir552_get_stat(SIOPCB *siopcb)
146{
147 UB iir;
148
149 iir = tl16pir552_reb( siopcb->siopinib->channel_addr, IIR) & INT_MASK;
150
151 switch( iir ) {
152 case INT_TRANS_EMPTY :
153 siopcb->putready = TRUE;
154 break;
155 case INT_RECEIVE_DATA :
156 case INT_CHAR_TIME_OUT :
157 siopcb->getready = TRUE;
158 break;
159 default :
160 break;
161 }
162
163}
164
165/*
166 * 文字を受信できるか?
167 */
168Inline BOOL
169tl16pir552_getready(SIOPCB *siopcb)
170{
171 return(siopcb->getready);
172}
173
174/*
175 * 文字を送信できるか?
176 */
177Inline BOOL
178tl16pir552_putready(SIOPCB *siopcb)
179{
180 return(siopcb->putready);
181}
182
183/*
184 * 受信した文字の取出し
185 */
186Inline char
187tl16pir552_getchar(SIOPCB *siopcb)
188{
189 siopcb->getready = FALSE;
190 return((char) tl16pir552_reb( siopcb->siopinib->channel_addr, RBR ));
191 /* 1byte 単位での文字の取り出しを行ったいるため、tl16pir552_opn_por内
192の
193 受信バッファ設定を増やしたとしても性能の向上は見られない。
194 性能の向上には、バッファå…
195¨ä½“のブロック転送を行うなどの修正が必
196要。*/
197}
198
199/*
200 * 送信する文字の書込み
201 */
202Inline void
203tl16pir552_putchar(SIOPCB *siopcb, char c)
204{
205 siopcb->putready = FALSE;
206 tl16pir552_wrb( siopcb->siopinib->channel_addr, THR, c );
207}
208
209/*
210 * SIOドライバの初期化ルーチン
211 */
212void
213tl16pir552_initialize()
214{
215 SIOPCB *siopcb;
216 UINT i;
217
218 /*
219 * シリアルI/Oポート管理ブロックの初期化
220 */
221 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
222 siopcb->siopinib = &(siopinib_table[i]);
223 siopcb->openflag = FALSE;
224 }
225}
226
227/*
228 * SIOレジスタ初期化ルーチン
229 */
230void
231tl16pir552_init_siopinib( const SIOPINIB *siopinib )
232{
233 /*
234 * SIOレジスタの初期化
235 */
236 /* 初期処理 */
237 tl16pir552_wrb( siopinib->channel_addr, IER, DIS_INT );
238
239 tl16pir552_wrb( siopinib->channel_addr, MCR, ENABLE_EXT_INT );
240
241 /* ボーレートの設定 */
242 tl16pir552_wrb( siopinib->channel_addr, LCR, siopinib->lcr_def | DIVISOR_LATCH_ACC );
243
244 tl16pir552_wrb( siopinib->channel_addr, SCR, siopinib->scr_def );
245
246 tl16pir552_wrb( siopinib->channel_addr, DLL, siopinib->boud_lo_def );
247 tl16pir552_wrb( siopinib->channel_addr, DLM, siopinib->boud_hi_def );
248
249 /* モードの設定 */
250 tl16pir552_wrb( siopinib->channel_addr, LCR, siopinib->lcr_def );
251
252 /* FIFOの設定 */
253 tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE );
254 tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE | RECEIVE_FIFO_RESET | TRANS_FIFO_RESET | RECEIVE_TRIG_1_BYTE );
255 tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE | RECEIVE_TRIG_1_BYTE );
256
257 /* 終了処理 */
258 tl16pir552_wrb( siopinib->channel_addr, MCR, DTR | RTS | ENABLE_EXT_INT );
259
260 tl16pir552_wrb( siopinib->channel_addr, IER, RECEIVE_DATA_AVAILABLE);
261}
262
263/*
264 * カーネル起動時のバーナー出力用の初期化
265 */
266void
267tl16pir552_init(void)
268{
269 tl16pir552_init_siopinib( get_siopinib(1) );
270#if TNUM_SIOP >= 2
271 tl16pir552_init_siopinib( get_siopinib(2) );
272#endif /* TNUM_SIOP >= 2 */
273}
274
275/*
276 * オープンしているポートがあるか?
277 */
278BOOL
279tl16pir552_openflag(void)
280{
281#if TNUM_SIOP < 2
282 return(siopcb_table[0].openflag);
283#else /* TNUM_SIOP < 2 */
284 return(siopcb_table[0].openflag || siopcb_table[1].openflag);
285#endif /* TNUM_SIOP < 2 */
286}
287
288/*
289 * シリアルI/Oポートのオープン
290 */
291SIOPCB *
292tl16pir552_opn_por(ID siopid, VP_INT exinf)
293{
294 SIOPCB *siopcb = get_siopcb(siopid);
295 const SIOPINIB *siopinib = siopcb->siopinib;
296
297 /* シリアルコントローラの初期化 */
298 tl16pir552_init_siopinib( siopinib );
299
300 /* 割込みレベル設定、割込み要求クリアは、sio_opn_por(hw_serial.h)で行う。 */
301
302 siopcb->exinf = exinf;
303 siopcb->getready = siopcb->putready = FALSE;
304 siopcb->openflag = TRUE;
305
306 return(siopcb);
307}
308
309/*
310 * シリアルI/Oポートのクローズ
311 */
312void
313tl16pir552_cls_por(SIOPCB *siopcb)
314{
315 tl16pir552_wrb( siopcb->siopinib->channel_addr, IER, DIS_INT );
316
317 siopcb->openflag = FALSE;
318}
319
320/*
321 * シリアルI/Oポートへの文字送信
322 */
323BOOL
324tl16pir552_snd_chr(SIOPCB *siopcb, char c)
325{
326 if (tl16pir552_putready(siopcb)) {
327 tl16pir552_putchar(siopcb, c);
328 return(TRUE);
329 }
330 return(FALSE);
331}
332
333/*
334 * シリアルI/Oポートからの文字受信
335 */
336INT
337tl16pir552_rcv_chr(SIOPCB *siopcb)
338{
339 if (tl16pir552_getready(siopcb)) {
340 return((INT)(UB) tl16pir552_getchar(siopcb));
341 }
342 return(-1);
343}
344
345/*
346 * シリアルI/Oポートからのコールバックの許可
347 */
348void
349tl16pir552_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
350{
351 UB ier_bit = 0;
352
353 switch (cbrtn) {
354 case SIO_ERDY_SND:
355 ier_bit = TRANS_REG_EMPTY;
356 break;
357 case SIO_ERDY_RCV:
358 ier_bit = (RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS);
359 break;
360 }
361
362 tl16pir552_orb( siopcb->siopinib->channel_addr, IER, ier_bit );
363}
364
365/*
366 * シリアルI/Oポートからのコールバックの禁止
367 */
368void
369tl16pir552_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
370{
371 UB ier_bit = 0;
372
373 switch (cbrtn) {
374 case SIO_ERDY_SND:
375 ier_bit = TRANS_REG_EMPTY;
376 break;
377 case SIO_ERDY_RCV:
378 ier_bit = (RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS);
379 break;
380 }
381
382 tl16pir552_andb( siopcb->siopinib->channel_addr, IER, ~ier_bit );
383}
384
385/*
386 * シリアルI/Oポートに対する割込み処理
387 */
388static void
389tl16pir552_isr_siop(SIOPCB *siopcb)
390{
391 tl16pir552_get_stat(siopcb);
392
393 if ( tl16pir552_getready(siopcb) ) {
394 /*
395 * 受信通知コールバックルーチンを呼び出す.
396 */
397 tl16pir552_ierdy_rcv(siopcb->exinf);
398 } else if ( tl16pir552_putready(siopcb) ) {
399 /*
400 * 送信可能コールバックルーチンを呼び出す.
401 */
402 tl16pir552_ierdy_snd(siopcb->exinf);
403 }
404}
405
406/*
407 * SIOの割込みサービスルーチン
408 */
409void
410tl16pir552_uart0_isr()
411{
412 if (siopcb_table[0].openflag) {
413 tl16pir552_isr_siop(&(siopcb_table[0]));
414 }
415}
416
417#if TNUM_SIOP >= 2
418void
419tl16pir552_uart1_isr()
420{
421 if (siopcb_table[1].openflag) {
422 tl16pir552_isr_siop(&(siopcb_table[1]));
423 }
424}
425#endif /* TNUM_SIOP >= 2 */
426
427/*
428 * シリアルI/Oポートへのポーリングでの出力
429 */
430void
431tl16pir552_putchar_pol( char val ) {
432
433 const SIOPINIB *siopinib = get_siopinib( LOGTASK_PORTID );
434
435 /* 送信部エンプティになるまで待
436つ。 */
437 while( (tl16pir552_reb( siopinib->channel_addr, LSR ) & (TEMT) ) == 0 );
438
439 tl16pir552_wrb( siopinib->channel_addr, THR, val );
440}
Note: See TracBrowser for help on using the repository browser.