source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/xstormy16/hw_serial.c@ 26

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

initial

File size: 13.8 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) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
14 * 再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
17 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
18 * コード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
20 * できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
23マ
24 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
25 * 証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
27 * できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこと.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著作
32 * 権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに報
36 * 告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
38 * からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.また,
41 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
42 * く請求からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47およ
48 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
49 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
50 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
51 * わない.
52 */
53
54/*
55 * シリアルI/Oデバイス(SIO)ドライバ(Xstormy16用)
56 */
57
58#include <kernel.h>
59#include <s_services.h>
60#include <hw_serial.h>
61#include <cpu_sfrs.h>
62
63/*
64 * 非同期送信でのTxReadyのタイムアウト
65 */
66#define TXREADY_TIMEOUT 400
67
68/*
69 * SIOPCB*チェックのためのマジック値
70 */
71#define MAGIC_SIOPCB 0xabcd
72
73/*
74 * シリアルI/Oポート管理ブロックのエリア
75 */
76static SIOPCB siopcb_table[TNUM_PORT] = {
77 { MAGIC_SIOPCB, __U0CR, 0x1400 },
78 { MAGIC_SIOPCB, __U1CR, 0x4800 },
79} ;
80
81/*
82 * SIOドライバの初期化ルーチン
83 */
84void sio_initialize(void)
85{
86 /* nothing to do here */
87}
88
89/*
90 * シリアルI/Oポートのオープン
91 */
92SIOPCB *sio_opn_por(ID siopid, VP_INT exinf)
93{
94 SIOPCB* siopcb ;
95 UH uhBase ;
96 /*
97 * オープン出来るポートかのチェック
98 */
99 if ( siopid < 1 || siopid > TNUM_PORT ) return NULL ;
100 siopcb = &siopcb_table[siopid-1] ;
101 if ( siopcb->bNotExist ) return NULL ;
102 /*
103 * 既にオープン済みの場合
104 */
105 if ( siopcb->bOpened ) {
106 siopcb->vpiExinf = exinf ;
107 return siopcb ;
108 }
109 /*
110 * SIOの初期化と存在のチェック
111 */
112 uhBase = siopcb->uhBase ;
113 __SFR(uhBase) = __UxCR_RUN|__UxCR_TXEMPTY ;
114 if ( ( __SFR(uhBase) &
115 ( __UxCR_RUN|__UxCR_BAUDRATE|__UxCR_PARITY|__UxCR_TXIE|
116 __UxCR_RXIE) ) != __UxCR_RUN ) {
117 siopcb->bNotExist = TRUE ;
118 return NULL ;
119 }
120 /*
121 * 管理テーブルの初期化
122 */
123 siopcb->vpiExinf = exinf ;
124 siopcb->bOpened = TRUE ;
125 siopcb->bTxIe = FALSE ;
126 siopcb->bRxIe = FALSE ;
127 siopcb->bLastIsCr = FALSE ;
128 /*
129 * 割り込みハンドラの登録と許可
130 */
131 define_inh( INHNO_SIO, sio_handler ) ;
132 __UNLOCK_EXCP() ;
133 __SFRW(__EXCPL) |= siopcb->uhExcpMask ;
134 __LOCK_EXCP() ;
135 return siopcb ;
136}
137
138/*
139 * シリアルI/Oポートのクローズ
140 */
141void sio_cls_por(SIOPCB *siopcb)
142{
143 /*
144 * クローズ出来るポートかのチェック
145 */
146 if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB ||
147 siopcb->bNotExist || !siopcb->bOpened ) return ;
148 /*
149 * 管理テーブルの変更
150 */
151 siopcb->bOpened = FALSE ;
152 /*
153 * 割り込みの禁止
154 */
155 __UNLOCK_EXCP() ;
156 __SFRW(__EXCPL) &= ~siopcb->uhExcpMask ;
157 __LOCK_EXCP() ;
158 /*
159 * SIOの停止
160 */
161 __SFR(siopcb->uhBase) = 0 ;
162}
163
164/*
165 * SIOの割込みハンドラ
166 */
167void sio_handler(void)
168{
169 /*
170 * å…
171¨ã¦ã®ãƒãƒ¼ãƒˆã«ã¤ã„てチェック
172 */
173 ID portid ;
174 for ( portid = 0 ; portid < TNUM_PORT ; portid++ ) {
175 SIOPCB *siopcb = &siopcb_table[portid] ;
176 UH uhBase = siopcb->uhBase ;
177 /*
178 * 送信完了割り込みか
179 */
180 if ( ( __SFR(uhBase) & ( __UxCR_TXIE | __UxCR_TXEMPTY ) ) ==
181 ( __UxCR_TXIE | __UxCR_TXEMPTY ) ) {
182 sio_ierdy_snd( siopcb->vpiExinf ) ;
183 }
184 /*
185 * 受信割り込みか
186 */
187 if ( ( __SFR(uhBase) & ( __UxCR_RXIE | __UxCR_RXREADY ) ) ==
188 ( __UxCR_RXIE | __UxCR_RXREADY ) ) {
189 sio_ierdy_rcv( siopcb->vpiExinf ) ;
190 }
191 }
192}
193
194/*
195 * シリアルI/Oポートへの文字送信
196 */
197BOOL sio_snd_chr(SIOPCB *siopcb, char c)
198{
199 UH uhBase ;
200 /*
201 * 有効なポートかどうかのチェック
202 */
203 if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB ||
204 siopcb->bNotExist || !siopcb->bOpened ) return FALSE ;
205 uhBase = siopcb->uhBase ;
206 /*
207 * 送信可能かどうかのチェック
208 */
209 if ( ! ( __SFR(uhBase) & __UxCR_TXEMPTY ) ) return FALSE ;
210 /*
211 * 送信データの書き込み
212 */
213 __SFRW(uhBase+4) = __UxTX_STOPBIT | c ;
214 return TRUE ;
215}
216
217/*
218 * シリアルI/Oポートからの文字受信
219 */
220INT sio_rcv_chr(SIOPCB *siopcb)
221{
222 UH uhBase ;
223 /*
224 * 有効なポートかどうかのチェック
225 */
226 if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB ||
227 siopcb->bNotExist || !siopcb->bOpened ) return -1 ;
228 uhBase = siopcb->uhBase ;
229 /*
230 * 受信データ有無のチェック
231 */
232 if ( ! ( __SFR(uhBase) & __UxCR_RXREADY ) ) return -1 ;
233 /*
234 * 受信データの取り出し
235 */
236 return __SFRW(uhBase+2) & 0xff ;
237}
238
239/*
240 * シリアルI/Oポートからのコールバックの許可
241 */
242void sio_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
243{
244 UH uhBase ;
245 /*
246 * 有効なポートかどうかのチェック
247 */
248 if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB ||
249 siopcb->bNotExist || !siopcb->bOpened ) return ;
250 uhBase = siopcb->uhBase ;
251 /*
252 * 送信割り込みの許可
253 */
254 if ( cbrtn == SIO_ERDY_SND ) {
255 __SFR(uhBase) |= __UxCR_TXIE ;
256 siopcb->bTxIe = TRUE ;
257 }
258 /*
259 * 受信割り込みの許可
260 */
261 if ( cbrtn == SIO_ERDY_RCV ) {
262 __SFR(uhBase) |= __UxCR_RXIE ;
263 siopcb->bRxIe = TRUE ;
264 }
265}
266
267/*
268 * シリアルI/Oポートからのコールバックの禁止
269 */
270void sio_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
271{
272 UH uhBase ;
273 /*
274 * 有効なポートかどうかのチェック
275 */
276 if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB ||
277 siopcb->bNotExist || !siopcb->bOpened ) return ;
278 uhBase = siopcb->uhBase ;
279 /*
280 * 送信割り込みの禁止
281 */
282 if ( cbrtn == SIO_ERDY_SND ) {
283 __SFR(uhBase) &= ~__UxCR_TXIE ;
284 siopcb->bTxIe = FALSE ;
285 }
286 /*
287 * 受信割り込みの禁止
288 */
289 if ( cbrtn == SIO_ERDY_RCV ) {
290 __SFR(uhBase) &= ~__UxCR_RXIE ;
291 siopcb->bRxIe = FALSE ;
292 }
293}
294
295/*
296 * デフォルトの送信可能コールバック
297 */
298void sio_ierdy_snd(VP_INT exinf) __attribute__((__weak__)) ;
299void sio_ierdy_snd(VP_INT exinf)
300{
301}
302
303/*
304 * デフォルトの受信通知コールバック
305 */
306void sio_ierdy_rcv(VP_INT exinf) __attribute__((__weak__)) ;
307void sio_ierdy_rcv(VP_INT exinf)
308{
309}
310
311/*
312 * シリアルI/Oポートへの非同期文字出力
313 */
314void sio_asnd_chr( INT c )
315{
316 SIOPCB* siopcb ;
317 UH uhBase ;
318 int i ;
319 /*
320 * CPUロック状æ…
321‹ã«ã™ã‚‹
322 */
323 BOOL bLocked ;
324 if ( sns_loc() ) bLocked = TRUE ;
325 else {
326 bLocked = FALSE ;
327 if ( sns_ctx() ) iloc_cpu() ;
328 else loc_cpu() ;
329 }
330 /*
331 * 非同期用ポートを開く
332 */
333 if ( ( siopcb = sio_opn_por( LOGTASK_PORTID,
334 siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) {
335 uhBase = siopcb->uhBase ;
336 /*
337 * LFならまずCRを送出
338 */
339 if ( c == '\n' ) {
340 for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) {
341 if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ;
342 }
343 if ( i < TXREADY_TIMEOUT ) {
344 __SFRW(uhBase+4) = __UxTX_STOPBIT | '\r' ;
345 }
346 }
347 /*
348 * データ送出
349 */
350 for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) {
351 if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ;
352 }
353 if ( i < TXREADY_TIMEOUT ) {
354 __SFRW(uhBase+4) = __UxTX_STOPBIT | c ;
355 }
356 }
357 /*
358 * CPUロックをå…
359ƒã«æˆ»ã™
360 */
361 if ( !bLocked ) {
362 if ( sns_ctx() ) iunl_cpu() ;
363 else unl_cpu() ;
364 }
365}
366
367/*
368 * シリアルI/Oポートからの非同期文字å…
369¥åŠ›
370 */
371INT sio_arcv_chr( void )
372{
373 SIOPCB* siopcb ;
374 UH uhBase ;
375 INT c = -1 ;
376 /*
377 * タスクコンテキストからのみ使用可
378 */
379 if ( sns_ctx() || sns_loc() || sns_dsp() ) return -1 ;
380 /*
381 * CPUロック状æ…
382‹ã«ã™ã‚‹
383 */
384 loc_cpu() ;
385 /*
386 * 非同期用ポートを開く
387 */
388 if ( ( siopcb = sio_opn_por( LOGTASK_PORTID,
389 siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) {
390 uhBase = siopcb->uhBase ;
391 /*
392 * 受信待
393ち
394 */
395 while(1) {
396 if ( __SFR(uhBase) & __UxCR_RXREADY ) {
397 c = __SFRW(uhBase+2) & 0xff ;
398 if ( c == '\r' ) {
399 c = '\n' ;
400 siopcb->bLastIsCr = TRUE ;
401 }
402 else {
403 if ( c == '\n' && siopcb->bLastIsCr ) c = -1 ;
404 siopcb->bLastIsCr = FALSE ;
405 }
406 }
407 if ( c != -1 ) break ;
408 unl_cpu() ;
409 dly_tsk( 50 ) ;
410 loc_cpu() ;
411 }
412 }
413 /*
414 * CPUロックを解除
415 */
416 unl_cpu() ;
417 return c ;
418}
419
Note: See TracBrowser for help on using the repository browser.