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

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

initial

File size: 15.4 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-2007 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/*
56 * H8S内
57蔵SCI用 簡易SIOドライバ
58 * ・下記は、2チャンネル用に記述している。H8Sシリーズの中には、3チャンネル
59 * 以上サポートしているチップもあるが、そのときの対応は容易である。
60 */
61
62#include <h8s_sci.h>
63
64/* SCIレジスタのアドレス */
65/* ベースアドレス */
66#define SCI0_BASE_ADDR 0xff78 /* チャネル0 */
67#define SCI1_BASE_ADDR 0xff80 /* チャネル1 */
68#define SCI2_BASE_ADDR 0xff88 /* チャネル2 */
69
70/* レジスタオフセット */
71#define SMR 0 /* シリアルモードレジスタ */
72#define BRR 1 /* ビットレートレジスタ */
73#define SCR 2 /* シリアルコントロールレジスタ */
74#define TDR 3 /* トランスミットデータレジスタ */
75#define SSR 4 /* シリアルステータスレジスタ */
76#define RDR 5 /* レシーブデータレジスタ */
77#define SCMR 6 /* スマートカードモードレジスタ */
78
79/* 各レジスタのビットパターン */
80
81/* RSR, RDR, TSR, TDR */
82/* 定義すべきものは、特に無い */
83
84/* SMR */
85#define CA BIT7
86#define CHR BIT6 /* 8bit = 0 / 7bit = 1 */
87#define PE BIT5 /* Parity OFF = 0 / Parity ON = 1 */
88#define OE BIT4 /* EVEN Parity = 0 / ODD Parity = 1 */
89#define STOP BIT3 /* 1 STOP BIT = 0 / 2 STOP BIT = 1 */
90#define MP BIT2
91#define CSK1 BIT1
92#define CSK0 BIT0
93
94/*
95 * SMRの初期値
96 *
97 * ビット7=0:調歩同期式モード
98 * ビット6=0:キャラクタレングス=8ビット
99 * ビット5=0:パリティの付加、チェックを禁止
100 * ビット4 :パリティモード(未使用)
101 * ビット3=0:ストップビットレングス=1ビット
102 * ビット1,0:ボーレートジェネレータへのクロックソース選択
103 *       ボード依存部でSCRn_CKSとして定義(nはch番号)
104 */
105#define SMR_INIT 0
106
107/* SCR */
108#define TIE BIT7
109#define RIE BIT6
110#define TE BIT5
111#define RE BIT4
112#define MPIE BIT3
113#define TEIE BIT2
114#define CKE1 BIT1
115#define CKE0 BIT0
116
117/* SSR */
118#define TDRE BIT7
119#define RDRF BIT6
120#define ORER BIT5
121#define FER BIT4
122#define PER BIT3
123#define TEND BIT2
124#define MPB BIT1
125#define MPBT BIT0
126
127
128/*
129 * TNUM_PORT : シリアルドライバ(serial.c)、つまり GDICレベルでサポートする
130 *       シリアルポートの数
131 * TNUM_SIOP : PDICレベル(プロセッサ内
132蔵SIO)でサポートするシリアルI/Oポート
133 *       の数(現在の実装
134では最大3)
135 *
136 * いずれもuser_config.hで定義する。
137 */
138
139/* 以下で、レジスタのアドレスを、UW 型へキャストをしている。これは、ベース
140 アドレスにオフセット値を加えて、最終的なレジスタのアドレスを求めている
141 ためである。取得後に、最終的に VP 型にキャストされている。(h8s_sci.h) */
142
143/*
144 * シリアルI/Oポート初期化ブロックの定義
145 */
146typedef struct sio_port_initialization_block {
147 UW reg_base; /* レジスタのベースアドレス */
148 UH boud_rate; /* ボーレート[bps] */
149 UB boud_brr_def; /* BRR 設定値(ボーレートの設定値) */
150 UB smr_def; /* SMR 設定値
151 (送受信ビット数、ストップビット,パリティ) */
152} SIOPINIB;
153
154/*
155 * シリアルI/Oポート管理ブロックの定義
156 */
157struct sio_port_control_block {
158 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
159 VP_INT exinf; /* 拡張情
160å ± */
161 BOOL openflag; /* オープン済みフラグ */
162 BOOL getready; /* 文字を受信した状æ…
163‹ */
164 BOOL putready; /* 文字を送信できる状æ…
165‹ */
166};
167
168/*
169 * シリアルI/Oポート初期化ブロック
170 */
171const SIOPINIB siopinib_table[TNUM_SIOP] = {
172 { (UW)SCI0_BASE_ADDR,
173 (UH)BAUD_RATE1,
174 (UB)BRR0_RATE, /* N 値 */
175 (UB)(SMR_INIT | (SCR0_CKS & (CKE1 | CKE0)))
176 },
177#if TNUM_SIOP >= 2
178 { (UW)SCI1_BASE_ADDR,
179 (UH)BAUD_RATE1,
180 (UB)BRR1_RATE, /* N 値 */
181 (UB)(SMR_INIT | (SCR1_CKS & (CKE1 | CKE0)))
182 }
183#endif /* TNUM_SIOP >= 2 */
184#if TNUM_SIOP >= 3
185 ,{(UW)SCI2_BASE_ADDR,
186 (UH)BAUD_RATE2,
187 (UB)BRR2_RATE, /* N 値 */
188 (UB)(SMR_INIT | (SCR2_CKS & (CKE1 | CKE0)))
189 }
190#endif /* TNUM_SIOP >= 3 */
191};
192
193/*
194 * シリアルI/Oポート初期化ブロックの取出し
195 */
196#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))
197#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))
198
199/*
200 * シリアルI/Oポート管理ブロックのエリア
201 */
202SIOPCB siopcb_table[TNUM_SIOP];
203
204/*
205 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
206 */
207#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
208#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
209
210/*
211 * SCI用システムインタフェースレイヤ
212 *
213 * base : ポートのベースアドレス
214 * offset : レジスタオフセット
215 * val : レジスタ値
216 */
217#define h8s_sci_wrb( base, offset, val ) h8s_wrb_reg( (base) + (offset), (val) )
218#define h8s_sci_reb( base, offset ) h8s_reb_reg( (base) + (offset) )
219
220/*
221 * SCI用レジスタ操作関数
222 */
223Inline void
224h8s_sci_or( const SIOPINIB *siopinib, INT offset, INT val )
225{
226 UB reg = h8s_sci_reb( siopinib->reg_base, offset );
227 h8s_sci_wrb( siopinib->reg_base, offset, reg | (UB)val );
228}
229
230Inline void
231h8s_sci_and( const SIOPINIB *siopinib, INT offset, INT val )
232{
233 UB reg = h8s_sci_reb( siopinib->reg_base, offset );
234 h8s_sci_wrb( siopinib->reg_base, offset, reg & (UB)val );
235}
236
237/*
238 * 文字を受信できるか?
239 */
240Inline BOOL
241h8s_sci_getready(SIOPCB *siopcb)
242{
243 UB ssr;
244
245 siopcb->getready = FALSE;
246 ssr = h8s_sci_reb( siopcb->siopinib->reg_base, SSR );
247 if( ssr & RDRF ) {
248 siopcb->getready = TRUE;
249 }
250 return( siopcb->getready );
251}
252
253/*
254 * 文字を送信できるか?
255 */
256Inline BOOL
257h8s_sci_putready(SIOPCB *siopcb)
258{
259 siopcb->putready = FALSE;
260 if( h8s_sci_reb( siopcb->siopinib->reg_base, SSR ) & TDRE ) {
261 siopcb->putready = TRUE;
262 }
263 return( siopcb->putready );
264}
265
266/*
267 * 受信した文字の取出し
268 */
269Inline char
270h8s_sci_getchar(SIOPCB *siopcb)
271{
272 /* RDRFクリア */
273 h8s_sci_and( siopcb->siopinib, SSR, ~RDRF );
274
275 return( (char) h8s_sci_reb( siopcb->siopinib->reg_base, RDR ) );
276}
277
278/*
279 * 送信する文字の書込み
280 */
281Inline void
282h8s_sci_putchar(SIOPCB *siopcb, char c)
283{
284 h8s_sci_wrb( siopcb->siopinib->reg_base, TDR, c );
285
286 /* TDREクリア */
287 h8s_sci_and( siopcb->siopinib, SSR, ~TDRE );
288}
289
290/*
291 * SIOドライバの初期化ルーチン
292 */
293void
294h8s_sci_initialize(void)
295{
296 SIOPCB *siopcb;
297 UINT i;
298
299 /*
300 * シリアルI/Oポート管理ブロックの初期化
301 */
302 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
303 siopcb->siopinib = &(siopinib_table[i]);
304 siopcb->openflag = FALSE;
305 }
306}
307
308/*
309 * SIOレジスタ初期化ルーチン
310 */
311void
312h8s_sci_init_siopinib( const SIOPINIB *siopinib )
313{
314 /*
315 * SCIレジスタの初期化
316 */
317
318 /* 送受信停止 */
319 h8s_sci_and( siopinib, SCR, ~( TE | RE ) );
320
321 /* ビット長など設定 */
322 h8s_sci_wrb( siopinib->reg_base, SMR, siopinib->smr_def );
323
324 /* ボーレート設定 */
325 h8s_sci_wrb( siopinib->reg_base, BRR, siopinib->boud_brr_def );
326
327 /*
328 * 割込み禁止とクロックソース選択
329 *  クロックソースは内
330部クロックを選択
331 */
332 h8s_sci_and( siopinib, SCR, ~( TIE | RIE | MPIE | TEIE | CKE1 | CKE0 ) );
333
334 /* ボーレートの安定化(1bit分の待
335ち) */
336 sil_dly_nse_long( 1000000000ul / (siopinib->boud_rate) );
337
338 /* エラーフラグをクリア */
339 h8s_sci_and( siopinib, SSR, ~( ORER | FER | PER ) ); /* 修正 */
340
341 /* 送受信許可、受信割込み許可 */
342 h8s_sci_or( siopinib, SCR, ( RIE | TE | RE ) );
343}
344
345
346/*
347 * SCI0の設定に矛盾がないかチェック
348 */
349#if defined(OMIT_SCI0) && (POL_PORTID == 1)
350#error h8s_sci_putchar_pol serial port ID error.
351#endif
352
353/*
354 * カーネル起動時のバーナー出力用の初期化
355 */
356void
357h8s_sci_init(void)
358{
359 h8s_sci_init_siopinib( get_siopinib(POL_PORTID) );
360}
361
362/*
363 * オープンしているポートがあるか?
364 */
365BOOL
366h8s_sci_openflag(void)
367{
368 BOOL ret;
369#ifndef OMIT_SCI0
370 ret = siopcb_table[0].openflag;
371#else /* OMIT_SCI0 */
372 ret = FALSE;
373#endif /* OMIT_SCI0 */
374
375#if TNUM_SIOP >= 2
376 ret |= siopcb_table[1].openflag;
377#endif /* TNUM_SIOP >= 2 */
378
379#if TNUM_SIOP >= 3
380 ret |= siopcb_table[2].openflag;
381#endif /* TNUM_SIOP >= 3 */
382
383 return(ret);
384}
385
386/*
387 * シリアルI/Oポートのオープン
388 */
389SIOPCB *
390h8s_sci_opn_por(ID siopid, VP_INT exinf)
391{
392 SIOPCB *siopcb = get_siopcb(siopid);
393 const SIOPINIB *siopinib = siopcb->siopinib;
394
395 /* SCIレジスタの初期化 */
396 h8s_sci_init_siopinib( siopinib );
397
398 /* 割込みレベル設定、割込み要求クリアは、sio_opn_por で行う。 */
399
400 siopcb->exinf = exinf;
401 siopcb->getready = siopcb->putready = FALSE;
402 siopcb->openflag = TRUE;
403
404 return(siopcb);
405}
406
407/*
408 * シリアルI/Oポートのクローズ
409 */
410void
411h8s_sci_cls_por(SIOPCB *siopcb)
412{
413 /* TEND が 1 になるまで待
414つ */
415 while ( !(h8s_sci_reb( siopcb->siopinib->reg_base, SSR ) & TEND ) );
416
417 h8s_sci_and( siopcb->siopinib, SCR, ~( TE | RE ) ); /* 修正 */
418 siopcb->openflag = FALSE;
419}
420
421/*
422 * シリアルI/Oポートへの文字送信
423 */
424BOOL
425h8s_sci_snd_chr(SIOPCB *siopcb, char c)
426{
427 if( h8s_sci_putready(siopcb) ) {
428 h8s_sci_putchar(siopcb, c);
429 siopcb->putready = FALSE;
430 return(TRUE);
431 }
432 return(FALSE);
433}
434
435/*
436 * シリアルI/Oポートからの文字受信
437 */
438INT
439h8s_sci_rcv_chr(SIOPCB *siopcb)
440{
441 if( h8s_sci_getready(siopcb) ) {
442 siopcb->getready = FALSE;
443 return( (INT)(UB) h8s_sci_getchar(siopcb) );
444 /* UB のキャストは、符号拡張を防止するため */
445 }
446
447 return(-1);
448}
449
450/*
451 * シリアルI/Oポートからのコールバックの許可
452 */
453void
454h8s_sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
455{
456 switch (cbrtn) {
457 case SIO_ERDY_SND:
458 h8s_sci_or( siopcb->siopinib, SCR, TIE );
459 return;
460 case SIO_ERDY_RCV:
461 h8s_sci_or( siopcb->siopinib, SCR, RIE );
462 return;
463 }
464}
465
466/*
467 * シリアルI/Oポートからのコールバックの禁止
468 */
469void
470h8s_sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
471{
472 switch( cbrtn ) {
473 case SIO_ERDY_SND:
474 h8s_sci_and( siopcb->siopinib, SCR, ~TIE );
475 return;
476 case SIO_ERDY_RCV:
477 h8s_sci_and( siopcb->siopinib, SCR, ~RIE );
478 return;
479 }
480}
481
482/*
483 * SIOの割込みサービスルーチン
484 *  å…
485¨ãƒãƒ£ãƒãƒ«å…
486±é€šéƒ¨åˆ†ã‚’インライン関数として定義しておく
487 */
488Inline void
489h8s_scix_isr_in(ID portid)
490{
491 SIOPCB *siopcb = get_siopcb(portid);
492
493 /* 受信通知コールバックルーチンの呼び出し */
494 if( siopcb->openflag ) {
495 h8s_sci_ierdy_rcv( siopcb->exinf );
496 }
497}
498
499Inline void
500h8s_scix_isr_out(ID portid)
501{
502 SIOPCB *siopcb = get_siopcb(portid);
503
504 /* 送信可能コールバックルーチンの呼び出し */
505 if( siopcb->openflag ) {
506 h8s_sci_ierdy_snd( siopcb->exinf );
507 }
508}
509
510/*
511 * SIOの受信エラー割込みサービスルーチン
512 *  å…
513¨ãƒãƒ£ãƒãƒ«å…
514±é€šéƒ¨åˆ†ã‚’インライン関数として定義しておく
515 *
516 * エラー処理は、下記エラーフラグのクリアのみ。
517 * ・オーバーランエラー、フレーミングエラー、パリティエラー
518 */
519Inline void
520h8s_scix_isr_error(INT portid)
521{
522 SIOPCB *siopcb = get_siopcb(portid);
523
524 if( siopcb->openflag ) {
525 /* エラーフラグクリア */
526 h8s_sci_and( siopcb->siopinib, SSR, ~( RDRF | ORER | FER | PER ) );
527 }
528}
529
530
531#ifndef OMIT_SCI0
532/*
533 * SIOの割込みサービスルーチン (SCI0専用)
534 */
535void
536h8s_sci0_isr_in(void)
537{
538 h8s_scix_isr_in(1);
539}
540
541void
542h8s_sci0_isr_out(void)
543{
544 h8s_scix_isr_out(1);
545}
546
547/*
548 * SIOの受信エラー割込みサービスルーチン (SCI0専用)
549 */
550void
551h8s_sci0_isr_error(void)
552{
553 h8s_scix_isr_error(1);
554}
555
556#endif /* OMIT_SCI0 */
557
558#if TNUM_SIOP >=2
559/*
560 * SIOの割込みサービスルーチン (SCI1専用)
561 */
562void
563h8s_sci1_isr_in(void)
564{
565 h8s_scix_isr_in(2);
566}
567
568void
569h8s_sci1_isr_out(void)
570{
571 h8s_scix_isr_out(2);
572}
573
574/*
575 * SIOの受信エラー割込みサービスルーチン (SCI1専用)
576 */
577void
578h8s_sci1_isr_error(void)
579{
580 h8s_scix_isr_error(2);
581}
582#endif /* TNUM_SIOP >=2 */
583
584#if TNUM_SIOP >=3
585/*
586 * SIOの割込みサービスルーチン (SCI2専用)
587 */
588void
589h8s_sci2_isr_in(void)
590{
591 h8s_scix_isr_in(3);
592}
593
594void
595h8s_sci2_isr_out(void)
596{
597 h8s_scix_isr_out(3);
598}
599
600/*
601 * SIOの受信エラー割込みサービスルーチン (SCI2専用)
602 */
603void
604h8s_sci2_isr_error(void)
605{
606 h8s_scix_isr_error(3);
607}
608#endif /* TNUM_SIOP >=3 */
609
610
611/*
612 * H8S 内
613蔵 SCI 用ポーリング出力 (POL_PORTID専用、sys_putcで利用)
614 */
615void
616h8s_sci_putchar_pol( char c )
617{
618
619 const SIOPINIB *siopinib = get_siopinib( POL_PORTID );
620
621 /* TDRE が 1 になるまで待
622つ */
623 while ( !(h8s_sci_reb( siopinib->reg_base, SSR ) & TDRE ) );
624
625 h8s_sci_wrb( siopinib->reg_base, TDR, c );
626
627 /* TDREクリア */
628 h8s_sci_and( siopinib, SSR, ~TDRE );
629
630 /* TEND が 1 になるまで待
631つ */
632 while ( !(h8s_sci_reb( siopinib->reg_base, SSR ) & TEND ) );
633}
Note: See TracBrowser for help on using the repository browser.