source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/h8s/h8s_sci.c@ 26

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

initial

File size: 12.2 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-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
9 * Tomakomai National College of Technology, JAPAN
10 * Copyright (C) 2001-2004 by Industrial Technology Institute,
11 * Miyagi Prefectural Government, JAPAN
12 *
13 * 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25 * 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28 * 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 * の無保証規定を掲載すること.
31 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32 * 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34 * と.
35 * (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
39 * (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42 * 報告すること.
43 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44 * 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53 */
54
55#include <h8s_sci.h>
56
57/*
58 * H8S内
59蔵SCI用 簡易SIOドライバ
60 * ・下記は、2チャンネル用に記述している。H8Sシリーズの中には、2チャンネル
61 * 以上サポートしているチップもあるが、そのときの対応は容易である。
62 */
63
64/* TNUM_SIOP : サポートするシリアルポートの数 (デフォルト値 2)
65 TNUM_PORT : サポートするシリアルI/Oポートの数 (デフォルト値 2)
66 (sys_config.h に記載) */
67
68/* 以下で、レジスタのアドレスを、UW 型へキャストをしている。これは、ベース
69 アドレスにオフセット値を加えて、最終的なレジスタのアドレスを求めている
70 ためである。取得後に、最終的に VP 型にキャストされている。(h8s_sci.h) */
71
72/*
73 * シリアルI/Oポート初期化ブロックの定義
74 */
75typedef struct sio_port_initialization_block {
76 UW reg_base; /* レジスタのベースアドレス */
77 UB smr_def; /* SMR 設定値 b6-b3;
78 (送受信ビット数、ストップビット,パリティ) */
79 UB boud_brr_def; /* BRR 設定値(ボーレートの設定値) */
80} SIOPINIB;
81
82/*
83 * シリアルI/Oポート管理ブロックの定義
84 */
85struct sio_port_control_block {
86 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
87 VP_INT exinf; /* 拡張情
88å ± */
89 BOOL openflag; /* オープン済みフラグ */
90 BOOL getready; /* 文字を受信した状æ…
91‹ */
92 BOOL putready; /* 文字を送信できる状æ…
93‹ */
94};
95
96/*
97 * シリアルI/Oポート初期化ブロック
98 */
99const SIOPINIB siopinib_table[TNUM_SIOP] = {
100 { (UW) SCI0_BASE_ADDR,
101 (UB) 0,
102 (UB) BRR_RATE /* N 値 */
103 },
104#if TNUM_SIOP >= 2
105 { (UW) SCI1_BASE_ADDR,
106 (UB) 0,
107 (UB) BRR_RATE /* N 値 */
108 }
109#endif /* TNUM_SIOP >= 2 */
110};
111
112/*
113 * シリアルI/Oポート初期化ブロックの取出し
114 */
115#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))
116#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))
117
118/*
119 * シリアルI/Oポート管理ブロックのエリア
120 */
121SIOPCB siopcb_table[TNUM_SIOP];
122
123/*
124 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
125 */
126#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
127#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
128
129/*
130 * SCI用レジスタ操作関数
131 */
132Inline void
133h8s_sci_or( const SIOPINIB *siopinib, UW reg, UB val )
134{
135 h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) | val );
136}
137
138Inline void
139h8s_sci_and( const SIOPINIB *siopinib, UW reg, UB val )
140{
141 h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) & val );
142}
143
144/*
145 * 文字を受信できるか?
146 */
147Inline BOOL
148h8s_sci_getready(SIOPCB *siopcb)
149{
150 siopcb->getready = FALSE;
151 if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & RDRF )
152 siopcb->getready = TRUE;
153
154 return( siopcb->getready );
155}
156
157/*
158 * 文字を送信できるか?
159 */
160Inline BOOL
161h8s_sci_putready(SIOPCB *siopcb)
162{
163 siopcb->putready = FALSE;
164 if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TDRE )
165 siopcb->putready = TRUE;
166
167 return( siopcb->putready );
168}
169
170/*
171 * 受信した文字の取出し
172 */
173Inline char
174h8s_sci_getchar(SIOPCB *siopcb)
175{
176 /* RDRFクリア */
177 h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~RDRF );
178
179 return( (char) h8s_sci_reb( siopcb->siopinib->reg_base, (UW) RDR ) );
180}
181
182/*
183 * 送信する文字の書込み
184 */
185Inline void
186h8s_sci_putchar(SIOPCB *siopcb, char c)
187{
188#ifndef GDB_STUB
189 h8s_sci_wrb( siopcb->siopinib->reg_base, (UW) TDR, c );
190
191 /* TDREクリア */
192 h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~TDRE );
193#else
194 stub_putc( c );
195#endif
196}
197
198/*
199 * SIOドライバの初期化ルーチン
200 */
201void
202h8s_sci_initialize()
203{
204 SIOPCB *siopcb;
205 UINT i;
206
207 /*
208 * シリアルI/Oポート管理ブロックの初期化
209 */
210 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
211 siopcb->siopinib = &(siopinib_table[i]);
212 siopcb->openflag = FALSE;
213 }
214}
215
216/*
217 * SIOレジスタ初期化ルーチン
218 */
219void
220h8s_sci_init_siopinib( const SIOPINIB *siopinib )
221{
222 /*
223 * SCIレジスタの初期化
224 */
225
226 /* 送受信停止 */
227 h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TE | RE ) );
228
229 /* ビット長など設定 */
230 h8s_sci_wrb( siopinib->reg_base, (UW) SMR, siopinib->smr_def );
231
232 /* ボーレート設定 */
233 h8s_sci_wrb( siopinib->reg_base, (UW) BRR, siopinib->boud_brr_def );
234
235 /* 割込み禁止とクロックソース選択 */
236 h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TIE | RIE | MPIE | TEIE | CKE1 | CKE0 ) );
237
238 /* ボーレートの安定化(1bit分の待
239ち) */
240 sil_dly_nse( 1/BAUD_RATE );
241
242 /* エラーフラグをクリア */
243 h8s_sci_and( siopinib, (UW) SSR, ~( ORER | FER | PER ) );
244
245 /* 送受信許可、受信割込み許可 */
246 h8s_sci_or( siopinib, (UW) SCR, ( RIE | TE | RE ) );
247}
248
249/*
250 * カーネル起動時のバーナー出力用の初期化
251 */
252void
253h8s_sci_init(void)
254{
255 h8s_sci_init_siopinib( get_siopinib(1) );
256#if TNUM_SIOP >= 2
257 h8s_sci_init_siopinib( get_siopinib(2) );
258#endif /* TNUM_SIOP >= 2 */
259}
260
261/*
262 * オープンしているポートがあるか?
263 */
264BOOL
265h8s_sci_openflag(void)
266{
267#if TNUM_SIOP < 2
268 return( siopcb_table[0].openflag );
269#else /* TNUM_SIOP < 2 */
270 return( siopcb_table[0].openflag || siopcb_table[1].openflag );
271#endif /* TNUM_SIOP < 2 */
272}
273
274/*
275 * シリアルI/Oポートのオープン
276 */
277SIOPCB *
278h8s_sci_opn_por(ID siopid, VP_INT exinf)
279{
280 SIOPCB *siopcb = get_siopcb(siopid);
281 const SIOPINIB *siopinib = siopcb->siopinib;
282
283#ifndef GDB_STUB
284 /* SCIレジスタの初期化 */
285 h8s_sci_init_siopinib( siopinib );
286#endif /* GDB_STUB */
287
288 /* 割込みレベル設定、割込み要求クリアは、sio_opn_por で行う。 */
289
290 siopcb->exinf = exinf;
291 siopcb->getready = siopcb->putready = FALSE;
292 siopcb->openflag = TRUE;
293
294 return(siopcb);
295}
296
297/*
298 * シリアルI/Oポートのクローズ
299 */
300void
301h8s_sci_cls_por(SIOPCB *siopcb)
302{
303 /* TEND が 1 になるまで待
304つ */
305 while ( !(h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TEND ) );
306
307 h8s_sci_and( siopcb->siopinib, (UW) SCR, ~( TE | RE ) );
308 siopcb->openflag = FALSE;
309}
310
311/*
312 * シリアルI/Oポートへの文字送信
313 */
314BOOL
315h8s_sci_snd_chr(SIOPCB *siopcb, char c)
316{
317 if( h8s_sci_putready(siopcb) ) {
318 h8s_sci_putchar(siopcb, c);
319 siopcb->putready = FALSE;
320 return(TRUE);
321 }
322 return(FALSE);
323}
324
325/*
326 * シリアルI/Oポートからの文字受信
327 */
328INT
329h8s_sci_rcv_chr(SIOPCB *siopcb)
330{
331 if( h8s_sci_getready(siopcb) ) {
332 siopcb->getready = FALSE;
333 return( (INT)(UB) h8s_sci_getchar(siopcb) );
334 /* UB のキャストは、符号拡張防止するため */
335 }
336
337 return(-1);
338}
339
340/*
341 * シリアルI/Oポートからのコールバックの許可
342 */
343void
344h8s_sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
345{
346 switch (cbrtn) {
347 case SIO_ERDY_SND:
348 h8s_sci_or( siopcb->siopinib, (UW) SCR, TIE );
349 return;
350 case SIO_ERDY_RCV:
351 h8s_sci_or( siopcb->siopinib, (UW) SCR, RIE );
352 return;
353 }
354}
355
356/*
357 * シリアルI/Oポートからのコールバックの禁止
358 */
359void
360h8s_sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
361{
362 switch( cbrtn ) {
363 case SIO_ERDY_SND:
364 h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~TIE );
365 return;
366 case SIO_ERDY_RCV:
367 h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~RIE );
368 return;
369 }
370}
371
372/*
373 * SIOの割込みサービスルーチン (SCI0専用)
374 */
375void
376h8s_sci0_isr_in()
377{
378 SIOPCB *siopcb = get_siopcb(1);
379
380 /* 受信通知コールバックルーチンの呼び出し */
381 if( siopcb->openflag ) {
382 h8s_sci_ierdy_rcv( siopcb->exinf );
383 }
384}
385
386void
387h8s_sci0_isr_out()
388{
389 SIOPCB *siopcb = get_siopcb(1);
390
391 /* 送信可能コールバックルーチンの呼び出し */
392 if( siopcb->openflag ) {
393 h8s_sci_ierdy_snd( siopcb->exinf );
394 }
395}
396
397/*
398 * SIOの受信エラー割込みサービスルーチン (SCI0専用)
399 *
400 * エラー処理は、下記エラーフラグのクリアのみ。
401 * ・オーバーランエラー、フレーミングエラー、パリティエラー
402 */
403void
404h8s_sci0_isr_error(void)
405{
406 SIOPCB *siopcb = get_siopcb(1);
407
408 if( siopcb->openflag ) {
409 /* エラーフラグクリア */
410 h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) );
411 }
412}
413
414/*
415 * SIOの割込みサービスルーチン (SCI1専用)
416 */
417void
418h8s_sci1_isr_in()
419{
420 SIOPCB *siopcb = get_siopcb(2);
421
422 /* 受信通知コールバックルーチンの呼び出し */
423 if( siopcb->openflag ) {
424 h8s_sci_ierdy_rcv( siopcb->exinf );
425 }
426}
427
428void
429h8s_sci1_isr_out()
430{
431 SIOPCB *siopcb = get_siopcb(2);
432
433 /* 送信可能コールバックルーチンの呼び出し */
434 if( siopcb->openflag ) {
435 h8s_sci_ierdy_snd( siopcb->exinf );
436 }
437}
438
439/*
440 * SIOの受信エラー割込みサービスルーチン (SCI1専用)
441 *
442 * エラー処理は、下記エラーフラグのクリアのみ。
443 * ・オーバーランエラー、フレーミングエラー、パリティエラー
444 */
445void
446h8s_sci1_isr_error(void)
447{
448 SIOPCB *siopcb = get_siopcb(2);
449
450 if( siopcb->openflag ) {
451 /* エラーフラグクリア */
452 h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) );
453 }
454}
455
456/*
457 * H8S 内
458蔵 SCI 用ポーリング出力 (LOGTASK_PORTID専用、sys_putcで利用)
459 */
460void
461h8s_sci0_putchar_pol( char c )
462{
463
464 const SIOPINIB *siopinib = get_siopinib( LOGTASK_PORTID );
465
466 /* TDRE が 1 になるまで待
467つ */
468 while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TDRE ) );
469
470 h8s_sci_wrb( siopinib->reg_base, (UW) TDR, (UB) c );
471
472 /* TDREクリア */
473 h8s_sci_and( siopinib, (UW) SSR, (UB) ~TDRE );
474
475 /* TEND が 1 になるまで待
476つ */
477 while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TEND ) );
478}
Note: See TracBrowser for help on using the repository browser.