source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/powerpc32/mpc860t/mpc860_smc.c@ 26

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

initial

File size: 21.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 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 * @(#) $Id: mpc860_smc.c,v 1.2 2004/10/07 17:10:56 honda Exp $
53 */
54
55/*
56 * MPC860内
57蔵シリアル・マネージメントコントローラSMC1用 簡易ドライバ
58 *    
59 *    SMC1のみをサポートしている
60 *
61 *    smc.{c,h}とhw_serial.hの分割の基準
62 *      ・smc.{c,h}:シリアルデバイスに依存する部分のみ記述
63 *      ・hw_serial.h:割込みコントローラ依存
64 *      
65 *      ・クロック周波数依存について
66 *        ・デバイス依存のパラメータはmpc860_smc.c内
67で用意する。
68 *        ・大å…
69ƒã®ã‚¯ãƒ­ãƒƒã‚¯å‘¨æ³¢æ•°ã¯ã‚³ãƒ³ãƒ‘イルオプションとして与える
70 */
71
72#include <s_services.h>
73#include <mpc860_smc.h>
74
75/*
76 * コントロールレジスタの定義
77 */
78
79/* SMCモードレジスタ */
80#define SMCMR1 (VH *)(IMMR_BASE + 0xa82)
81#define SMCMR_SM_UART BIT10_16 /* SMCモード:UART */
82#define SMCMR_TEN BIT14_16 /* SMC送信イネーブル */
83#define SMCMR_REN BIT15_16 /* SMC受信イネーブル */
84
85
86/*
87 * 30.2.3 パラメータRAM
88 */
89/* バッファ・ディスクリプタBDのå…
90ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
91#define BD1_BASE (IMMR_BASE + 0x3e80)
92#define RBASE1 (VH *)BD1_BASE /* RxBDベースアドレス */
93#define TBASE1 (VH *)(BD1_BASE+2) /* TxBDベースアドレス */
94#define RFCR1 (VB *)(BD1_BASE+4) /* 受信ファンクションコード */
95 /* バイト順(受信) */
96#if SIL_ENDIAN == SIL_ENDIAN_BIG /* ビッグエンディアン */
97#define RFCR_BO 0x10
98#else /* SIL_ENDIAN == SIL_ENDIAN_BIG */ /* リトルエンディアン */
99#define RFCR_BO 0x08
100#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG */
101
102#define TFCR1 (VB *)(BD1_BASE+5) /* 送信ファンクションコード */
103 /* バイト順(送信) */
104#if SIL_ENDIAN == SIL_ENDIAN_BIG /* ビッグエンディアン */
105#define TFCR_BO 0x10
106#else /* SIL_ENDIAN == SIL_ENDIAN_BIG */ /* リトルエンディアン */
107#define TFCR_BO 0x08
108#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG */
109
110/*
111 * 30.3.2 UARTの場合のパラメータRAM
112 */
113#define MRBLR1 (VH *)(BD1_BASE+6) /* 最大受信バッファ長 */
114#define RBPTR1 (VH *)(BD1_BASE+0x10) /* RxBDポインタ */
115#define TBPTR1 (VH *)(BD1_BASE+0x20) /* TxBDポインタ */
116 /* 最大アイドルキャラクタ数 */
117#define MAX_IDL1 (VH *)(BD1_BASE+0x28)
118#define IDLC1 (VH *)(BD1_BASE+0x2a) /* 一時アイドル・カウンタ */
119#define BRKLN1 (VH *)(BD1_BASE+0x2c) /* 最終受信ブレーク長 */
120 /* 受信ブレーク条件カウンタ */
121#define BRKEC1 (VH *)(BD1_BASE+0x2e)
122 /* ブレークカウントレジスタ(送信) */
123#define BRKCR1 (VH *)(BD1_BASE+0x30)
124#define R_MASK1 (VH *)(BD1_BASE+0x32) /* 一時ビット・マスク */
125
126
127/*
128 * デュアルポート・メモリ上に確保する領域
129 */
130
131/*
132 * バッファ・ディスクリプタBDのベースアドレス
133 */
134#define RxBD_BASE_ADDRESS 0x0 /* RxBDベースアドレス */
135#define TxBD_BASE_ADDRESS 0x8 /* TxBDベースアドレス */
136
137/* 30.3.10 受信用バッファディスクリプタRxBD */
138#define RxBD (DUAL_PORT_RAM + RxBD_BASE_ADDRESS)
139#define RxBD_STATUS (VH *)RxBD /* ステータスと制御 */
140#define RxBD_LENGTH (VH *)(RxBD+2) /* データ長 */
141#define RxBD_BUFFP (VW *)(RxBD+4) /* 受信バッファポインタ */
142
143/* 30.3.11 送信用バッファディスクリプタTxBD */
144#define TxBD (DUAL_PORT_RAM + TxBD_BASE_ADDRESS)
145#define TxBD_STATUS (VH *)TxBD /* ステータスと制御 */
146#define TxBD_LENGTH (VH *)(TxBD+2) /* データ長 */
147#define TxBD_BUFFP (VW *)(TxBD+4) /* 送信バッファポインタ */
148
149/* 受信用バッファディスクリプタRxBD */
150/*  「ステータスと制御」フィールドの定数 */
151#define RxBD_STATUS_E BIT0_16 /* 空白 */
152#define RxBD_STATUS_W BIT2_16 /* ラップ */
153#define RxBD_STATUS_I BIT3_16 /* 割込み */
154#define RxBD_STATUS_CM BIT6_16 /* 継続モード */
155#define RxBD_STATUS_ID BIT7_16 /* アイドル受信 */
156#define RxBD_STATUS_BR BIT10_16 /* ブレーク受信 */
157#define RxBD_STATUS_FR BIT11_16 /* フレーミング・エラー */
158#define RxBD_STATUS_PR BIT12_16 /* パリティ・エラー */
159#define RxBD_STATUS_OV BIT14_16 /* オーバーラン */
160
161/* 送信用バッファディスクリプタTxBD */
162/*  「ステータスと制御」フィールドの定数 */
163#define TxBD_STATUS_R BIT0_16 /* レディ */
164#define TxBD_STATUS_W BIT2_16 /* ラップ */
165#define TxBD_STATUS_I BIT3_16 /* 割込み */
166#define TxBD_STATUS_CM BIT6_16 /* 継続モード */
167#define TxBD_STATUS_P BIT7_16 /* プリアンブル */
168
169/* 30.3.12 SMC UARTイベントレジスタ */
170#define SMCE1 (VB *)(IMMR_BASE + 0xa86)
171#define SMCE_BRKE BIT1_8 /* ブレーク最終 */
172#define SMCE_BRK BIT3_8 /* ブレークキャラクタ受信 */
173#define SMCE_BSY BIT5_8 /* ビジー条件 */
174#define SMCE_TX BIT6_8 /* 送信バッファ */
175#define SMCE_RX BIT7_8 /* 受信バッファ */
176
177/* SMC UARTマスクレジスタ */
178#define SMCM1 (VB *)(IMMR_BASE + 0xa8a)
179#define SMCM_BRKE BIT1_8 /* ブレーク最終 */
180#define SMCM_BRK BIT3_8 /* ブレークキャラクタ受信 */
181#define SMCM_BSY BIT5_8 /* ビジー条件 */
182#define SMCM_TX BIT6_8 /* 送信バッファ */
183#define SMCM_RX BIT7_8 /* 受信バッファ */
184
185#define PIC_BUFFER_SIZE 1 /* バッファサイズ */
186
187volatile static UB Rx_buffer[PIC_BUFFER_SIZE]; /* 受信バッファ */
188volatile static UB Tx_buffer[PIC_BUFFER_SIZE]; /* 送信バッファ */
189
190
191/*
192 * ボーレート設定用定数
193 *
194 *  非同期の場合は×16クロックを用いるので16で割っている
195 * (ユーザーの設定で16分周しているわけではない)
196 *
197 */
198#define MHZ 1000000
199
200#define BRGC1_CD_VAL \
201 (((SYSTEM_CLOCK * MHZ * 10 + 10) / (16 * BAUD_RATE * 10)) - 1)
202
203/* BRGC1レジスタのCDフィールドは20ビットに制限されている */
204#if (BRGC1_CD_VAL & ~0xfffff) != 0
205 ここでコンパイルエラー
206#endif
207
208
209/*
210 * 分周比とビットレートの設定
211 *
212 */
213
214
215/*
216 * ボーレート設定後、クロックが安定するまでの待
217ち時間
218 *  (最初の1ビット分) 
219 * BPS=9600bpsの場合
220 *  t = 1 / BPS = 104,167 = 105,000[nsec]
221 */
222#define SMC_1BIT_TIME 105000
223
224
225/*
226 * シリアルI/Oポート管理ブロックの定義
227 *  2chサポートに拡張する場合は初期値用のデータも含める
228 */
229struct sio_port_control_block {
230 VP_INT exinf; /* 拡張情
231å ± */
232 BOOL openflag; /* オープン済みフラグ */
233};
234
235/*
236 * シリアルI/Oポート管理ブロックのエリア
237 *   ID = 1 をSMC1に対応させている.
238 */
239static SIOPCB siopcb_table[TNUM_SIOP];
240
241/*
242 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
243 */
244#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
245#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
246
247
248#define CODE_LF 0x0a /* 改行コード */
249
250/* キャラクタ送信後の待
251ち時間 */
252#ifdef DOWNLOAD_TO_RAM /* デバッグ用 */
253
254#define DELAY_CH 0 /* 通常のキャラクタ */
255#define DELAY_LF 5000000 /* 改行コード */
256
257#else /* DOWNLOAD_TO_RAM */ /* ROM化 */
258
259#define DELAY_CH 4000000 /* 通常のキャラクタ */
260#define DELAY_LF 1000000 /* 改行コード */
261
262#endif /* DOWNLOAD_TO_RAM */
263
264
265
266/*
267 * 文字を受信できるか?
268 */
269Inline BOOL
270smc_getready(SIOPCB *siopcb)
271{
272 VH status;
273
274 status = mpc860_reh_mem(RxBD_STATUS);
275 return(!(status & RxBD_STATUS_E));
276}
277
278/*
279 * 文字を送信できるか?
280 */
281Inline BOOL
282smc_putready(SIOPCB *siopcb)
283{
284 VH status;
285
286 status = mpc860_reh_mem(TxBD_STATUS);
287 return(!(status & TxBD_STATUS_R));
288}
289
290/*
291 * 受信した文字の取出し
292 */
293Inline char
294smc_getchar(SIOPCB *siopcb)
295{
296 char c;
297 SIL_PRE_LOC;
298
299 SIL_LOC_INT(); /* 割込み禁止 */
300 c = Rx_buffer[0];
301
302 /* 注意:受信バッファサイズが1の場合のみ有効 */
303 mpc860_orh_mem(RxBD_STATUS, RxBD_STATUS_E);
304 SIL_UNL_INT(); /* 割込み許可 */
305 return(c);
306}
307
308/*
309 * 送信する文字の書込み
310 */
311Inline void
312smc_putchar(SIOPCB *siopcb, char c)
313{
314 SIL_PRE_LOC;
315
316 SIL_LOC_INT(); /* 割込み禁止 */
317 Tx_buffer[0] = c;
318
319 /* 注意:送信バッファサイズが1の場合のみ有効 */
320 mpc860_orh_mem(TxBD_STATUS, TxBD_STATUS_R);
321
322 SIL_UNL_INT(); /* 割込み許可 */
323
324 /*
325 * 文字化けを防ぐため、待
326ち時間をå…
327¥ã‚Œã‚‹
328 */
329 sil_dly_nse(DELAY_CH);
330
331 /* 改行コードの場合 */
332 if (c == CODE_LF) {
333 sil_dly_nse(DELAY_LF);
334 }
335}
336
337/*
338 * SIOドライバの初期化ルーチン
339 */
340void
341smc_initialize()
342{
343 SIOPCB *siopcb;
344 UINT i;
345
346 /*
347 * シリアルI/Oポート管理ブロックの初期化
348 */
349 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
350 siopcb->openflag = FALSE;
351 }
352}
353
354
355/*
356 * オープンしているポートがあるか?
357 */
358BOOL
359smc_openflag(void)
360{
361 return(siopcb_table[0].openflag);
362}
363
364/*
365 * シリアルI/Oポートのオープン
366 */
367SIOPCB *
368smc_opn_por(ID siopid, VP_INT exinf)
369{
370 SIOPCB *siopcb;
371
372 siopcb = get_siopcb(siopid);
373 /* 送受信停止 */
374 mpc860_andh_mem(SMCMR1, ~(SMCMR_TEN | SMCMR_REN));
375
376 /*
377 * ピン・アサイン
378 *   ポートBの設定
379 *     BP25ピン:SMTXD1
380 *     BP24ピン:SMRXD1
381 */
382 /* 専用ペリフェラル機能選択 */
383 mpc860_orw_mem(PBPAR, (PBPAR_DD24 | PBPAR_DD25));
384 /* ペリフェラル機能0選択 */
385 mpc860_andw_mem(PBDIR, ~(PBDIR_DR24 | PBDIR_DR25));
386 /* アクティブにドライブ */
387 mpc860_andw_mem(PBODR, ~(PBODR_OD24 | PBODR_OD25));
388
389 /*
390 * VCOUTからBRGCLKへの分周係数設定
391 * SCCR.DFBRG=00:分周比1
392 */
393 unlock_sccr(); /* SCCRアンロック */
394 mpc860_andw_mem(SCCR, ~SCCR_DFBRG); /* 分周比設定 */
395 lock_sccr(); /* SCCRロック */
396
397 /*
398 * ボーレート設定(BRG1)
399 *   EN=1:BRGカウントイネーブル
400 *   EXTC=00:クロックソースにBRGCLKを選択
401 *   ATB=0:オートボー機能ディセーブル
402 *   CD:分周比
403 *   DIV16:16分周するか否か
404 */
405 mpc860_wrw_mem(BRGC1, BRGC1_EN | (BRGC1_CD_VAL<<1));
406
407 /*
408 * BRG1とSMC1の接続
409 *   SMC1=0:NMSIモード(多重化しない)
410 *   SMC1CS=000:クロックソースBRG1
411 */
412 mpc860_andw_mem(SIMODE, ~(SIMODE_SMC1 | SIMODE_SMC1CS));
413
414 /* クロックが安定するまで待
415つ */
416 sil_dly_nse(SMC_1BIT_TIME);
417
418 /*
419 * バッファ・ディスクリプタBDの設定
420 */
421 /* RxBDベースアドレス */
422 mpc860_wrh_mem(RBASE1, RxBD_BASE_ADDRESS);
423 /* TxBDベースアドレス */
424 mpc860_wrh_mem(TBASE1, TxBD_BASE_ADDRESS);
425
426 /*
427 * 通信プロセッサCPにINIT RX AND TX PARAMETERSコマンドを発行
428 */
429 mpc860_CP_command(CPCR_INIT_RX_TX_PARAMETERS, CPCR_CH_NUM_SMC1);
430
431 /* SDMAのUバス調停優å…
432ˆåº¦ã‚’設定 */
433 mpc860_wrw_mem(SDCR, SDCR_RAID_RB5); /* 優å…
434ˆåº¦5:通常処理 */
435
436 /* バッファ・ディスクリプタBDのエンディアン設定 */
437 mpc860_wrb_mem(RFCR1, RFCR_BO); /* 受信 */
438 mpc860_wrb_mem(TFCR1, TFCR_BO); /* 送信 */
439 /* 最大受信バッファ長 */
440 mpc860_wrh_mem(MRBLR1, PIC_BUFFER_SIZE);
441 /* アイドルキャラクタ数検出機能ディセーブル */
442 mpc860_wrh_mem(MAX_IDL1, 0);
443
444 /* 受信ブレークに関する設定は必
445要ないのでクリア */
446 mpc860_wrh_mem(BRKLN1, 0);
447 mpc860_wrh_mem(BRKEC1, 0);
448
449 /* STOP TRANSMITコマンドで送信されるブレークキャラクタの数を設定 */
450 mpc860_wrh_mem(BRKCR1, 1);
451
452 /* 受信バッファ・ディスクリプタRxBDの初期化 */
453 mpc860_wrh_mem(RxBD_STATUS,
454 RxBD_STATUS_E | RxBD_STATUS_W | RxBD_STATUS_I);
455 /* Eフラグセット */
456 /* W=1:テーブル内
457の最終BD */
458 /* I=1:受信割込み発生 */
459
460 mpc860_wrh_mem(RxBD_LENGTH, PIC_BUFFER_SIZE); /* データ長 */
461 /* 受信バッファポインタ */
462 mpc860_wrw_mem(RxBD_BUFFP, (VW)Rx_buffer);
463
464 /* 送信バッファ・ディスクリプタTxBDの初期化 */
465 mpc860_wrh_mem(TxBD_STATUS,
466 TxBD_STATUS_R | TxBD_STATUS_W | TxBD_STATUS_I);
467 /* Rフラグセット */
468 /* W=1:テーブル内
469の最終BD */
470 /* I=1:送信割込み発生 */
471
472 mpc860_wrh_mem(TxBD_LENGTH, PIC_BUFFER_SIZE); /* データ長 */
473 /* 送信バッファポインタ */
474 mpc860_wrw_mem(TxBD_BUFFP, (VW)Tx_buffer);
475
476 /* 以前のイベントをクリア */
477 mpc860_wrb_mem(SMCE1,
478 SMCE_BRKE | SMCE_BRK | SMCE_BSY | SMCE_TX | SMCE_RX);
479
480 /* すべてのUART割込みを許可 */
481 mpc860_wrb_mem(SMCM1,
482 SMCM_BRKE | SMCM_BRK | SMCM_BSY | SMCM_TX | SMCM_RX);
483
484 /* SMCモード設定 */
485 mpc860_wrh_mem(SMCMR1, (VH)((0x9<<11) | SMCMR_SM_UART));
486 /*
487 * CLEN=9:キャラクタ長
488 * SL=0:1ストップビット
489 * PEN=0:パリティなし
490 * SM=10:SMCモード UART
491 * DM=00:診断モード 通常動作
492 * TEN=0:SMC送信ディセーブル
493 * REN=0:SMC受信ディセーブル
494 * この時点ではまだ、送信も受信もイネーブルではない
495 */
496
497 mpc860_orh_mem(SMCMR1, (SMCMR_TEN | SMCMR_REN));
498 /*
499 * 上記に加えて
500 *  TEN=1:SMC送信イネーブル
501 *  REN=1:SMC受信イネーブル
502 */
503
504 siopcb->exinf = exinf;
505 siopcb->openflag = TRUE;
506 return(siopcb);
507}
508
509/*
510 * シリアルI/Oポートのクローズ
511 */
512void
513smc_cls_por(SIOPCB *siopcb)
514{
515 /* 送受信停止 */
516 mpc860_andh_mem(SMCMR1, ~(SMCMR_TEN | SMCMR_REN));
517 siopcb->openflag = FALSE;
518}
519
520/*
521 * シリアルI/Oポートへの文字送信
522 */
523BOOL
524smc_snd_chr(SIOPCB *siopcb, char c)
525{
526 if (smc_putready(siopcb)) {
527 smc_putchar(siopcb, c);
528 return(TRUE);
529 }
530 return(FALSE);
531}
532
533/*
534 * シリアルI/Oポートからの文字受信
535 */
536INT
537smc_rcv_chr(SIOPCB *siopcb)
538{
539 if (smc_getready(siopcb)) {
540 return((INT)(UB) smc_getchar(siopcb));
541 }
542 return(-1);
543}
544
545/*
546 * シリアルI/Oポートからのコールバックの許可
547 */
548void
549smc_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
550{
551 SIL_PRE_LOC;
552
553 switch (cbrtn) {
554 case SIO_ERDY_SND: /* 送信割り込み要求を許可 */
555 SIL_LOC_INT();
556 mpc860_orh_mem(SMCMR1, SMCMR_TEN);
557 SIL_UNL_INT();
558 break;
559 case SIO_ERDY_RCV: /* 受信割り込み要求を許可 */
560 SIL_LOC_INT();
561 mpc860_orh_mem(SMCMR1, SMCMR_REN);
562 SIL_UNL_INT();
563 break;
564 }
565}
566
567/*
568 * シリアルI/Oポートからのコールバックの禁止
569 */
570void
571smc_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
572{
573 SIL_PRE_LOC;
574
575 switch (cbrtn) {
576 case SIO_ERDY_SND: /* 送信割り込み要求を禁止 */
577 SIL_LOC_INT();
578 mpc860_andh_mem(SMCMR1, ~SMCMR_TEN);
579 SIL_UNL_INT();
580 break;
581 case SIO_ERDY_RCV: /* 受信割り込み要求を禁止 */
582 SIL_LOC_INT();
583 mpc860_andh_mem(SMCMR1, ~SMCMR_REN);
584 SIL_UNL_INT();
585 break;
586 }
587}
588
589/*
590 * シリアルI/Oポートに対する送信割込み処理
591 */
592Inline void
593smc_isr_siop_out(SIOPCB *siopcb)
594{
595 /* SMCE1での割込み要因のチェックは済んでいる */
596
597 if (smc_putready(siopcb)) {
598 /*
599 * 送信通知コールバックルーチンを呼び出す.
600 */
601 smc_ierdy_snd(siopcb->exinf);
602 }
603}
604
605/*
606 * シリアルI/Oポートに対する受信割込み処理
607 */
608Inline void
609smc_isr_siop_in(SIOPCB *siopcb)
610{
611 /* SMCE1での割込み要因のチェックは済んでいる */
612
613 if (smc_getready(siopcb)) {
614 /*
615 * 受信通知コールバックルーチンを呼び出す.
616 */
617 smc_ierdy_rcv(siopcb->exinf);
618 }
619}
620
621/*
622 * SILを使用したときのログ機能
623 */
624#ifdef SIL_DEBUG
625#define ENTER_SMC_ISR \
626 if (sil_debug_on) { \
627 syslog(LOG_EMERG, "Enter selial interrupt."); \
628 }
629
630#else /* SIL_DEBUG */
631
632#define ENTER_SMC_ISR
633
634#endif /* SIL_DEBUG */
635
636
637/*
638 * SIO送信割込みサービスルーチン
639 *
640 *  送受信å…
641±é€š
642 *
643 */
644void
645smc_isr()
646{
647 UB smce1, smcm1, event;
648 SIL_PRE_LOC;
649
650 ENTER_SMC_ISR
651
652 if (!siopcb_table[0].openflag) goto exit_label;
653
654 smce1 = mpc860_reb_mem(SMCE1);
655 smcm1 = mpc860_reb_mem(SMCM1);
656 event = smce1 & smcm1;
657
658 if (event & (SMCE_BRKE | SMCE_BRK | SMCE_BSY)) {
659 /* エラー処理:未完成 */
660 goto exit_label;
661 }
662
663 if (event & SMCE_RX) { /* 受信割込み */
664 /* 1をセットすることにより、イベントをクリア */
665 mpc860_wrb_mem(SMCE1, SMCE_RX);
666 smc_isr_siop_in(&siopcb_table[0]);
667 }
668 if (event & SMCE_TX) { /* 送信割込み */
669 /* 1をセットすることにより、イベントをクリア */
670 mpc860_wrb_mem(SMCE1, SMCE_TX);
671 smc_isr_siop_out(&siopcb_table[0]);
672 }
673
674exit_label:
675 /*
676 *  割込み要求のクリア
677 *   割込みコントローラ依存
678 *   (sys_config.hで定義)
679 */
680 SIL_LOC_INT();
681 CLEAR_IRQ_TO_ICU(SMC1);
682 SIL_UNL_INT();
683}
684
685/*
686 * ポーリングによる文字の送信
687 */
688void
689smc_putc_pol(char c)
690{
691 BOOL is_ten_ok;
692 VH smcmr;
693 if (smc_openflag()) { /* 初期化されているかチェック */
694 smcmr = mpc860_reh_mem(SMCMR1);
695 is_ten_ok = smcmr & SMCMR_TEN;
696 if (!is_ten_ok) {
697 /* 送信許可 */
698 mpc860_orh_mem(SMCMR1, SMCMR_TEN);
699 }
700 /* バッファが空になるのを待
701つ */
702 while(!smc_putready(&siopcb_table[0]));
703 smc_putchar(&siopcb_table[0], c); /* 1文字送信 */
704
705 if (!is_ten_ok) {
706 /* バッファが空になるのを待
707つ */
708 while(!smc_putready(&siopcb_table[0]));
709 /* 2キャラクタ分待
710つ */
711 sil_dly_nse(SMC_1BIT_TIME*18*10);
712 /* 送信禁止 */
713 mpc860_andh_mem(SMCMR1, ~SMCMR_TEN);
714 }
715 }
716}
717
718/* end of file */
Note: See TracBrowser for help on using the repository browser.