source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/sh1/zunda_sh1/sh1sci2.c@ 26

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

initial

File size: 22.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-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2004 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2003-2004 by CHUO ELECTRIC WORKS Co.,LTD.
11 *
12 * 上記著作権者
13は,以下の (1)〜(4) の条件か,Free Software Foundation
14 * によってå…
15¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
16 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
18å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
19 * 利用と呼ぶ)することを無償で許諾する.
20 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * スコード中に含まれていること.
23 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 * 用できる形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
27 * 者
28マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
33 * と.
34 * (a) 再é…
35å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
36マニュアルなど)に,上記の著
37 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
38 * (b) 再é…
39å¸ƒã®å½¢æ…
40‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
41 * 報告すること.
42 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
43 * 害からも,上記著作権者
44およびTOPPERSプロジェクトをå…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
50 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
51 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
52 *
53 */
54
55/*
56 * SH1内
57蔵シリアルコミュニケーションインタフェースSCI用 簡易ドライバ
58 * (株)中央製作所製μITRON搭載SH1CPUボード用
59 *    
60 * SCI0(RS232C)/SCI1(RS485)サポート
61 *
62 *    sh1sci.{c,h}とhw_serial.hの分割の基準
63 *      ・sh1sci.{c,h}:シリアルデバイスに依存する部分のみ記述
64 *      ・hw_serial.h:割込みコントローラ依存
65 *      
66 *      ・クロック周波数依存について
67 *        ・デバイス依存のパラメータはsh1sci.c内
68で用意する。
69 *        ・大å…
70ƒã®ã‚¯ãƒ­ãƒƒã‚¯å‘¨æ³¢æ•°ã¯ã‚³ãƒ³ãƒ‘イルオプションとして与える
71 */
72
73#include <s_services.h>
74#include <sh1sci2.h>
75
76/*
77 * コントロールレジスタのアドレス (すべて1バイトサイズ)
78 */
79 /* チャネル0 */
80#define SCI_SMR0 (VB *)0x5fffec0 /* シリアルモードレジスタ */
81#define SCI_BRR0 (VB *)0x5fffec1 /* ビットレートレジスタ */
82#define SCI_SCR0 (VB *)0x5fffec2 /* シリアルコントロールレジスタ */
83#define SCI_TDR0 (VB *)0x5fffec3 /* トランスミットデータレジスタ */
84#define SCI_SSR0 (VB *)0x5fffec4 /* シリアルステータスレジスタ */
85#define SCI_RDR0 (VB *)0x5fffec5 /* レシーブデータレジスタ */
86
87 /* チャネル1 */
88#define SCI_SMR1 (VB *)0x5fffec8 /* シリアルモードレジスタ */
89#define SCI_BRR1 (VB *)0x5fffec9 /* ビットレートレジスタ */
90#define SCI_SCR1 (VB *)0x5fffeca /* シリアルコントロールレジスタ */
91#define SCI_TDR1 (VB *)0x5fffecb /* トランスミットデータレジスタ */
92#define SCI_SSR1 (VB *)0x5fffecc /* シリアルステータスレジスタ */
93#define SCI_RDR1 (VB *)0x5fffecd /* レシーブデータレジスタ */
94
95/*
96 * コントロールレジスタの設定値
97 */
98/* シリアルステータスレジスタSSRの各ビット */
99#define SSR_TDRE 0x80u /* トランスミットデータレジスタエンプティ */
100#define SSR_RDRF 0x40u /* レシーブデータレジスタフル */
101#define SSR_ORER 0x20u /* オーバーランエラー */
102#define SSR_FER 0x10u /* フレーミングエラー */
103#define SSR_PER 0x08u /* パリティエラー */
104#define SSR_TEND 0x04u /* トランスミットエンド */
105#define SSR_MPB 0x02u /* マルチプロセッサビット */
106#define SSR_MPBT 0x01u /* マルチプロセッサビットトランスファ */
107
108/* シリアルコントロールレジスタSCRの各ビット */
109#define SCR_TIE 0x80u /* トランスミットインタラプトイネーブル */
110#define SCR_RIE 0x40u /* レシーブインタラプトイネーブル */
111#define SCR_TE 0x20u /* トランスミットイネーブル */
112#define SCR_RE 0x10u /* レシーブイネーブル */
113#define SCR_MPIE 0x08u /* マルチプロセッサインタラプトイネーブル */
114 /* トランスミットエンドインタラプト */
115#define SCR_TEIE 0x04u /* イネーブル */
116#define SCR_CKE_MASK 0x03u /* クロックソース選択用マスク */
117#define SCR_CKE 0x00u /* クロックイネーブル */
118 /* 調歩同期式のとき */
119 /* 内
120部クロック使用 */
121 /* 出力なし */
122
123/* シリアルモードジスタSMRの各ビット */
124 /* コミュニケーションモード */
125#define SMR_CA_CLOCK 0x80u /* クロック同期式 */
126#define SMR_CA_ASYNC 0x00u /* 調歩同期式通 */
127 /* 調歩同期式通信方:Asynchronous Communication method */
128 /* キャラクタレングス */
129#define SMR_CHR8 0x00u /* 8ビット */
130#define SMR_CHR7 0x40u /* 7ビット */
131 /* パリティイネーブル */
132#define SMR_PE 0x20u /* パリティあり */
133#define SMR_PE_NON 0x00u /* パリティなし */
134#define SMR_OE_ODD 0x10u /* パリティモード(奇数パリティ)*/
135#define SMR_STOP2 0x08u /* ストップビットレングス:2 */
136#define SMR_STOP1 0x00u /* ストップビットレングス:1 */
137#define SMR_MP 0x04u /* マルチプロセッサモード */
138
139/*
140 * シリアルコントロールレジスタのベースからのオフセット
141 */
142#define SMR (VB *)0x0 /* シリアルモードレジスタ */
143#define BRR (VB *)0x1 /* ビットレートレジスタ */
144#define SCR (VB *)0x2 /* シリアルコントロールレジスタ */
145#define TDR (VB *)0x3 /* トランスミットデータレジスタ */
146#define SSR (VB *)0x4 /* シリアルステータスレジスタ */
147#define RDR (VB *)0x5 /* レシーブデータレジスタ */
148
149/*
150 * クロック周波数依存
151 * クロック周波数は19.6608MHz
152 */
153/*
154 * チャネル0:分周比とビットレートの設定
155 */
156#if CONFIG_BAUD == 9600
157/*
158 * クロック  19.6608MHz
159 * ビットレート 9600bps
160 *
161 *  n=0(分周しないのでそのまま)
162 *  N=63で誤差0%
163 * よって、
164 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
165 *  ビットレートレジスタBRR=63
166 */
167#define SMR_CKS_0 0x0u /* 分周比 */
168#define SCI_BRR_0 63u /* ビットレート */
169/*
170 * ボーレート設定後、クロックが安定するまでの待
171ち時間
172 *  (最初の1ビット分) 
173 * BPS=9600bpsの場合
174 *  t = 1 / BPS = 104,167 = 105,000[nsec]
175 */
176#define SH1SCI_DELAY0 105000
177
178#elif CONFIG_BAUD == 19200
179/*
180 * クロック  19.6608MHz
181 * ビットレート 19200bps
182 *
183 *  n=0(分周しないのでそのまま)
184 *  N=31で誤差0%
185 * よって、
186 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
187 *  ビットレートレジスタBRR=31
188 */
189#define SMR_CKS_0 0x0u /* 分周比 */
190#define SCI_BRR_0 31u /* ビットレート */
191/*
192 * ボーレート設定後、クロックが安定するまでの待
193ち時間
194 *  (最初の1ビット分) 
195 * BPS=19200bpsの場合
196 *  t = 1 / BPS = 52,083 = 53,000[nsec]
197 */
198#define SH1SCI_DELAY0 53000
199
200#elif CONFIG_BAUD == 38400
201/*
202 * クロック  19.6608MHz
203 * ビットレート 38400bps
204 *
205 *  n=0(分周しないのでそのまま)
206 *  N=15で誤差0%
207 * よって、
208 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
209 *  ビットレートレジスタBRR=15
210 */
211#define SMR_CKS_0 0x0u /* 分周比 */
212#define SCI_BRR_0 15u /* ビットレート */
213/*
214 * ボーレート設定後、クロックが安定するまでの待
215ち時間
216 *  (最初の1ビット分) 
217 * BPS=38400bpsの場合
218 *  t = 1 / BPS = 26,042 = 27,000[nsec]
219 */
220#define SH1SCI_DELAY0 27000
221
222#else /* CONFIG_BAUD */
223#error chanel0 is unsupported baud rate.
224
225#endif /* CONFIG_BAUD */
226
227
228/*
229 * チャネル1:分周比とビットレートの設定
230 */
231#if CONFIG_BAUD_2 == 9600
232/*
233 * クロック  19.6608MHz
234 * ビットレート 9600bps
235 *
236 *  n=0(分周しないのでそのまま)
237 *  N=63で誤差0%
238 * よって、
239 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
240 *  ビットレートレジスタBRR=63
241 */
242#define SMR_CKS_1 0x0u /* 分周比 */
243#define SCI_BRR_1 63u /* ビットレート */
244/*
245 * ボーレート設定後、クロックが安定するまでの待
246ち時間
247 *  (最初の1ビット分) 
248 * BPS=9600bpsの場合
249 *  t = 1 / BPS = 104,167 = 105,000[nsec]
250 */
251#define SH1SCI_DELAY1 105000
252
253#elif CONFIG_BAUD_2 == 19200
254/*
255 * クロック  19.6608MHz
256 * ビットレート 19200bps
257 *
258 *  n=0(分周しないのでそのまま)
259 *  N=31で誤差0%
260 * よって、
261 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
262 *  ビットレートレジスタBRR=31
263 */
264#define SMR_CKS_1 0x0u /* 分周比 */
265#define SCI_BRR_1 31u /* ビットレート */
266/*
267 * ボーレート設定後、クロックが安定するまでの待
268ち時間
269 *  (最初の1ビット分) 
270 * BPS=19200bpsの場合
271 *  t = 1 / BPS = 52,083 = 53,000[nsec]
272 */
273#define SH1SCI_DELAY1 53000
274
275#elif CONFIG_BAUD_2 == 38400
276/*
277 * クロック  19.6608MHz
278 * ビットレート 38400bps
279 *
280 *  n=0(分周しないのでそのまま)
281 *  N=15で誤差0%
282 * よって、
283 *  シリアルモードレジスタSMRのクロックセレクトビットCKS=00
284 *  ビットレートレジスタBRR=15
285 */
286#define SMR_CKS_1 0x0u /* 分周比 */
287#define SCI_BRR_1 15u /* ビットレート */
288/*
289 * ボーレート設定後、クロックが安定するまでの待
290ち時間
291 *  (最初の1ビット分) 
292 * BPS=38400bpsの場合
293 *  t = 1 / BPS = 26,042 = 27,000[nsec]
294 */
295#define SH1SCI_DELAY1 27000
296
297#else /* CONFIG_BAUD */
298#error chanel1 is unsupported baud rate.
299
300#endif /* CONFIG_BAUD */
301
302/*
303 * シリアルポートの初期化ブロック
304 */
305static const SIOPINIB siopinib_table[TNUM_PORT] =
306{
307
308#if TNUM_PORT == 1
309
310 {
311 (UW)SCI_SMR0,
312 SCI_BRR_0,
313 IPRD,
314 0,
315 (SMR_CA_ASYNC | SMR_CHR8 | SMR_PE_NON | SMR_STOP1 | SMR_CKS_0),
316 SH1SCI_DELAY0,
317 RS232C_INTERFACE,
318 },
319
320#elif TNUM_PORT == 2 /* of #if TNUM_PORT == 1 */
321
322 {
323 (UW)SCI_SMR0,
324 SCI_BRR_0,
325 IPRD,
326 0,
327 (SMR_CA_ASYNC | SMR_CHR8 | SMR_PE_NON | SMR_STOP1 | SMR_CKS_0),
328 SH1SCI_DELAY0,
329 RS232C_INTERFACE,
330 },
331 {
332 (UW)SCI_SMR1,
333 SCI_BRR_1,
334 IPRE,
335 12,
336 (SMR_CA_ASYNC | SMR_CHR8 | SMR_PE_NON | SMR_STOP1 | SMR_CKS_1),
337 SH1SCI_DELAY1,
338 RS485_INTERFACE,
339 },
340
341#endif /* of #if TNUM_PORT == 1 */
342
343};
344
345/*
346 * シリアルI/Oポート管理ブロックのエリア
347 *   ID = 1 をSCI0に対応させている.
348 */
349static SIOPCB siopcb_table[TNUM_SIOP];
350
351/*
352 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
353 */
354#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
355#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
356
357/*
358 * 文字を受信できるか?
359 */
360Inline BOOL
361sh1sci_getready(SIOPCB *siopcb)
362{
363 VB ssr = sil_reb_mem(siopcb->inib->base + SSR);
364 return(ssr & SSR_RDRF);
365}
366
367/*
368 * 文字を送信できるか?
369 */
370Inline BOOL
371sh1sci_putready(SIOPCB *siopcb)
372{
373 VB ssr = sil_reb_mem(siopcb->inib->base + SSR);
374 return(ssr & SSR_TDRE);
375}
376
377/*
378 * 受信した文字の取出し
379 */
380Inline char
381sh1sci_getchar(SIOPCB *siopcb)
382{
383 char data;
384
385 data = sil_reb_mem(siopcb->inib->base + RDR);
386
387 /* レシーブデータレジスタフル・フラグのクリア */
388 sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_RDRF);
389 return data;
390}
391
392/*
393 * 送信する文字の書込み
394 */
395Inline void
396sh1sci_putchar(SIOPCB *siopcb, char c)
397{
398 if (siopcb->inib->rs485if) {
399 if (!(sil_reh_mem(PB_DR) & PB_TXE1)) {
400 sh1_orh_reg(PB_DR, PB_TXE1); /* TXENA ON */
401 sil_dly_nse(5000); /* 5us 保護時間 */
402 }
403 sil_wrb_mem(siopcb->inib->base + TDR ,c);
404 /* トランスミットデータレジスタエンプティ・フラグのクリア*/
405 sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE);
406 /* TXENA OFF制御のため、のコールバックの許可 */
407 sh1sci_ena_cbr(siopcb, SIO_ERDY_SND);
408 } else {
409#ifdef GDB_STUB
410 gdb_stub_putc( c );
411#else
412 sil_wrb_mem(siopcb->inib->base + TDR ,c);
413
414 /* トランスミットデータレジスタエンプティ・フラグのクリア*/
415 sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE);
416#endif
417 }
418}
419
420/*
421 * SIOドライバの初期化ルーチン
422 */
423void
424sh1sci_initialize(void)
425{
426 SIOPCB *siopcb;
427 UINT i;
428
429 /*
430 * シリアルI/Oポート管理ブロックの初期化
431 */
432 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
433 siopcb->inib = &siopinib_table[i];
434 siopcb->openflag = FALSE;
435 }
436}
437
438/*
439 * オープンしているポートがあるか?
440 */
441BOOL
442sh1sci_openflag(ID siopid)
443{
444 SIOPCB *siopcb;
445
446 siopcb = get_siopcb(siopid);
447 return (siopcb->openflag);
448}
449
450/*
451 * シリアルI/Oポートのオープン
452 */
453SIOPCB *
454sh1sci_opn_por(ID siopid, VP_INT exinf)
455{
456 SIOPCB *siopcb = get_siopcb(siopid);
457 VB scr, smr;
458 VH pbcr1;
459
460#ifdef GDB_STUB
461 if (siopid == PORT1) {
462 siopcb->exinf = exinf;
463 siopcb->openflag = TRUE;
464 return(siopcb);
465 }
466#endif /* GDB_STUB */
467
468 sh1_anb_reg(siopcb->inib->base + SCR, (VB)~(SCR_TE | SCR_RE)); /* 送受信停止 */
469
470 /* ピンアサイン
471 * シリアルデバイス自体の事項
472ではないので
473 * 本来はこのファイルに記述するのはふさわしくないが、
474 * hw_serial.cを用意するのもç…
475©é›‘なので暫定的にここにå…
476¥ã‚Œã¦ã„る。
477 */
478 pbcr1 = sil_reh_mem((VP)PBCR1);
479 if (siopid == PORT1) { /* PB08:RxD0 PB09:TxD0 */
480 pbcr1 = (pbcr1 & PBCR1_TD0_RD0_MASK) | PBCR1_TD0 | PBCR1_RD0;
481 } else { /* PB10:RxD1 PB11:TxD1 */
482 pbcr1 = (pbcr1 & PBCR1_TD1_RD1_MASK) | PBCR1_TD1 | PBCR1_RD1;
483 }
484 sil_wrh_mem((VP)PBCR1, pbcr1);
485
486 /* 送受信フォーマット */
487 smr = siopcb->inib->smr_init;
488
489 sil_wrb_mem(siopcb->inib->base + SMR, smr);
490
491 sil_wrb_mem(siopcb->inib->base + BRR, (UB)siopcb->inib->baudrate); /* ボーレート設定 */
492
493 /* 割込み禁止とクロックソースの選択 */
494 scr = (VB)(~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE |
495 SCR_MPIE | SCR_TEIE | SCR_CKE_MASK) | SCR_CKE);
496 sil_wrb_mem(siopcb->inib->base + SCR, scr);
497
498 /*
499 * ボーレートの設定後、1カウント分待
500たなければならない。
501 */
502 sil_dly_nse(siopcb->inib->delay);
503
504 /* エラーフラグをクリア */
505 sh1_anb_reg(siopcb->inib->base + SSR, (VB)~(SSR_ORER | SSR_FER | SSR_PER));
506 /* 受信割り込み許可 */
507 /* 送受信許可 */
508 sh1_orb_reg(siopcb->inib->base + SCR, (SCR_RIE | SCR_TE | SCR_RE));
509 /* 送信割込みの許可は送信制御関数で行う */
510
511 siopcb->exinf = exinf;
512 siopcb->openflag = TRUE;
513 return(siopcb);
514}
515
516/*
517 * シリアルI/Oポートのクローズ
518 */
519void
520sh1sci_cls_por(SIOPCB *siopcb)
521{
522 /* 送受信停止、割込み禁止 */
523 sh1_anb_reg(siopcb->inib->base + SCR, (VB)~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE));
524
525 siopcb->openflag = FALSE;
526}
527
528/*
529 * シリアルI/Oポートへの文字送信
530 */
531BOOL
532sh1sci_snd_chr(SIOPCB *siopcb, char c)
533{
534 if (sh1sci_putready(siopcb)) {
535 sh1sci_putchar(siopcb, c);
536 return(TRUE);
537 }
538 return(FALSE);
539}
540
541/*
542 * シリアルI/Oポートからの文字受信
543 */
544INT
545sh1sci_rcv_chr(SIOPCB *siopcb)
546{
547 if (sh1sci_getready(siopcb)) {
548 return((INT)(UB) sh1sci_getchar(siopcb));
549 /* (UB)でキャストするのはゼロ拡張にするため */
550 }
551 return(-1);
552}
553
554/*
555 * シリアルI/Oポートからのコールバックの許可
556 */
557void
558sh1sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
559{
560 switch (cbrtn) {
561 case SIO_ERDY_SND: /* 送信割り込み要求を許可 */
562 sh1_orb_reg(siopcb->inib->base + SCR, SCR_TIE);
563 break;
564 case SIO_ERDY_RCV: /* 受信割り込み要求を許可 */
565 sh1_orb_reg(siopcb->inib->base + SCR, SCR_RIE);
566 break;
567 }
568}
569
570/*
571 * シリアルI/Oポートからのコールバックの禁止
572 */
573void
574sh1sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
575{
576 switch (cbrtn) {
577 case SIO_ERDY_SND: /* 送信割り込み要求を禁止 */
578 sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SCR_TIE);
579 if (siopcb->inib->rs485if) {
580 /* 送信終了割り込み許可 */
581 sh1_orb_reg(siopcb->inib->base + SCR, SSR_TEND);
582 }
583 break;
584 case SIO_ERDY_RCV: /* 受信割り込み要求を禁止 */
585 sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SCR_RIE);
586 break;
587 }
588}
589
590/*
591 * シリアルI/Oポートに対する送信割込み処理
592 */
593Inline void
594sh1sci_isr_siop_out(SIOPCB *siopcb)
595{
596 VB scr = sil_reb_mem(siopcb->inib->base + SCR);
597
598 if ((scr & SCR_TIE) != 0 && sh1sci_putready(siopcb)) {
599 /*
600 * 送信通知コールバックルーチンを呼び出す.
601 */
602 sh1sci_ierdy_snd(siopcb->exinf);
603 }
604}
605
606/*
607 * シリアルI/Oポートに対する送信終了割込み処理
608 */
609Inline void
610sh1sci_isr_siop_tend(SIOPCB *siopcb)
611{
612 /*
613 * RS485 送信禁止制御
614 */
615 sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SSR_TEND);
616 sh1_anh_reg(PB_DR, ~PB_TXE1); /* txenaポート禁止 */
617}
618
619/*
620 * シリアルI/Oポートに対する受信割込み処理
621 */
622Inline void
623sh1sci_isr_siop_in(SIOPCB *siopcb)
624{
625 VB scr = sil_reb_mem(siopcb->inib->base + SCR);
626
627 if ((scr & SCR_RIE) != 0 && sh1sci_getready(siopcb)) {
628 /*
629 * 受信通知コールバックルーチンを呼び出す.
630 */
631 sh1sci_ierdy_rcv(siopcb->exinf);
632 }
633}
634
635/*
636 * SIO送信割込みサービスルーチン
637 *
638 *  SH1内
639蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
640 *  SCI0の送信割込み以外でこのルーチンが呼ばれることはない
641 *
642 */
643void
644sh1sci_isr_out(void)
645{
646 if (siopcb_table[0].openflag) {
647 sh1sci_isr_siop_out(&(siopcb_table[0]));
648 }
649}
650
651/*
652 * SIO受信割込みサービスルーチン
653 *
654 *  SH1内
655蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
656 *  SCI0の受信割込み以外でこのルーチンが呼ばれることはない
657 *
658 */
659void
660sh1sci_isr_in(void)
661{
662 if (siopcb_table[0].openflag) {
663 sh1sci_isr_siop_in(&(siopcb_table[0]));
664 }
665}
666
667/*
668 * SIO受信エラー割込みサービスルーチン
669 *
670 *  SH1内
671蔵のSCIでは割込み番号がチャネル別に分かれているので、
672 *  SCI0の受信エラー割込み以外でこのルーチンが呼ばれることはない
673 *  
674 *  エラー処理自体はエラーフラグのクリアのみにとどめている。
675 *    ・オーバーランエラー
676 *    ・フレーミングエラー
677 *    ・パリティエラー
678 */
679void
680sh1sci_isr_error(void)
681{
682 VB ssr0;
683
684 if (siopcb_table[0].openflag) {
685 ssr0 = sil_reb_mem(SCI_SSR0); /* 1度読み出して */
686 ssr0 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER);
687 sil_wrb_mem(SCI_SSR0, ssr0); /* エラーフラグクリア */
688 }
689}
690
691/*
692 * ポーリングによる文字の送信
693 */
694void
695sh1sci_putc_pol(char c)
696{
697 while(!sh1sci_putready(&siopcb_table[0]));
698 sh1sci_putchar(&siopcb_table[0], c);
699}
700
701/* シリアル2ch目 */
702#if TNUM_SIOP >= 2
703/*
704 * SIO送信割込みサービスルーチン
705 *
706 *  SH1内
707蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
708 *  SCI1の送信割込み以外でこのルーチンが呼ばれることはない
709 *
710 */
711void
712sh1sci2_isr_out(void)
713{
714 if (siopcb_table[1].openflag) {
715 sh1sci_isr_siop_out(&(siopcb_table[1]));
716 }
717}
718
719/*
720 * SIO送信終了割込みサービスルーチン
721 *
722 *  SH1内
723蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
724 *  SCI1の送信割込み以外でこのルーチンが呼ばれることはない
725 *
726 */
727void
728sh1sci2_isr_tend(void)
729{
730 if (siopcb_table[1].openflag) {
731 sh1sci_isr_siop_tend(&(siopcb_table[1]));
732 }
733}
734
735/*
736 * SIO受信割込みサービスルーチン
737 *
738 *  SH1内
739蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
740 *  SCI0の受信割込み以外でこのルーチンが呼ばれることはない
741 *
742 */
743void
744sh1sci2_isr_in(void)
745{
746 if (siopcb_table[1].openflag) {
747 sh1sci_isr_siop_in(&(siopcb_table[1]));
748 }
749}
750
751/*
752 * SIO受信エラー割込みサービスルーチン
753 *
754 *  SH1内
755蔵のSCIでは割込み番号がチャネル別に分かれているので、
756 *  SCI0の受信エラー割込み以外でこのルーチンが呼ばれることはない
757 *  
758 *  エラー処理自体はエラーフラグのクリアのみにとどめている。
759 *    ・オーバーランエラー
760 *    ・フレーミングエラー
761 *    ・パリティエラー
762 */
763void
764sh1sci2_isr_error(void)
765{
766 VB ssr1;
767
768 if (siopcb_table[1].openflag) {
769 ssr1 = sil_reb_mem(SCI_SSR1); /* 1度読み出して */
770 ssr1 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER);
771 sil_wrb_mem(SCI_SSR1, ssr1); /* エラーフラグクリア */
772 }
773}
774
775/*
776 * ポーリングによる文字の送信
777 */
778void
779sh1sci2_putc_pol(char c)
780{
781 while(!sh1sci_putready(&siopcb_table[1]));
782 sh1sci_putchar(&siopcb_table[1], c);
783}
784
785#endif /* TNUM_SIOP = 2 */
Note: See TracBrowser for help on using the repository browser.