#include "dve68k.h"
#include "pdic/upd72001/upd72001.h"
マクロ定義 | |
#define | INTNO_SIO TINTNO_GP0 |
#define | INTPRI_SIO TIRQ_LEVEL6 |
#define | INTATR_SIO TA_NULL |
関数 | |
void | sio_initialize (intptr_t exinf) |
SIOPCB * | sio_opn_por (ID siopid, intptr_t exinf) |
void | sio_cls_por (SIOPCB *p_siopcb) |
void | sio_isr (intptr_t exinf) |
bool_t | sio_snd_chr (SIOPCB *siopcb, char_t c) |
int_t | sio_rcv_chr (SIOPCB *siopcb) |
void | sio_ena_cbr (SIOPCB *siopcb, uint_t cbrtn) |
void | sio_dis_cbr (SIOPCB *siopcb, uint_t cbrtn) |
void | sio_irdy_snd (intptr_t exinf) |
void | sio_irdy_rcv (intptr_t exinf) |
#define INTATR_SIO TA_NULL |
target_serial.h の 58 行で定義されています。
#define INTNO_SIO TINTNO_GP0 |
#define INTPRI_SIO TIRQ_LEVEL6 |
target_serial.h の 57 行で定義されています。
void sio_cls_por | ( | SIOPCB * | p_siopcb | ) |
target_serial.c の 96 行で定義されています。
参照先 assert, dis_int(), E_OK, INTNO_SIO, upd72001_cls_por(), と upd72001_openflag().
参照元 serial_cls_por().
00097 { 00098 ER ercd; 00099 00100 /* 00101 * デバイス依存のクローズ処理. 00102 */ 00103 upd72001_cls_por(p_siopcb); 00104 00105 /* 00106 * シリアルI/O割込みをマスクする. 00107 */ 00108 if (!upd72001_openflag()) { 00109 ercd = dis_int(INTNO_SIO); 00110 assert(ercd == E_OK); 00111 } 00112 }
target_serial.c の 154 行で定義されています。
参照先 upd72001_dis_cbr().
参照元 sio_irdy_snd().
00155 { 00156 upd72001_dis_cbr(siopcb, cbrtn); 00157 }
target_serial.c の 145 行で定義されています。
参照先 upd72001_ena_cbr().
参照元 serial_opn_por(), と serial_snd_chr().
00146 { 00147 upd72001_ena_cbr(siopcb, cbrtn); 00148 }
void sio_initialize | ( | intptr_t | exinf | ) |
void sio_irdy_rcv | ( | intptr_t | exinf | ) |
参照先 BUFCNT_STOP, serial_port_control_block::errorflag, FC_START, FC_STOP, INC_PTR, serial_port_control_block::ioctl, IOCTL_FCANY, IOCTL_FCRCV, IOCTL_FCSND, isig_sem(), serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_buffer, serial_port_initialization_block::rcv_bufsz, serial_port_control_block::rcv_count, serial_port_control_block::rcv_fc_chr, serial_port_initialization_block::rcv_semid, serial_port_control_block::rcv_stopped, serial_port_control_block::rcv_write_ptr, serial_snd_chr(), sio_rcv_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_initialization_block::snd_semid, と serial_port_control_block::snd_stopped.
参照元 upd72001_irdy_rcv().
00658 { 00659 SPCB *p_spcb; 00660 char_t c; 00661 00662 p_spcb = (SPCB *) exinf; 00663 c = (char_t) sio_rcv_chr(p_spcb->p_siopcb); 00664 if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) { 00665 /* 00666 * 送信を一時停止する.送信中の文字はそのまま送信する. 00667 */ 00668 p_spcb->snd_stopped = true; 00669 } 00670 else if (p_spcb->snd_stopped && (c == FC_START 00671 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) { 00672 /* 00673 * 送信を再開する. 00674 */ 00675 p_spcb->snd_stopped = false; 00676 if (p_spcb->snd_count > 0U) { 00677 c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; 00678 if (serial_snd_chr(p_spcb, c)) { 00679 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 00680 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) { 00681 if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) { 00682 p_spcb->errorflag = true; 00683 } 00684 } 00685 p_spcb->snd_count--; 00686 } 00687 } 00688 } 00689 else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) { 00690 /* 00691 * 送信に対してフロー制御している場合,START は捨てる. 00692 */ 00693 } 00694 else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) { 00695 /* 00696 * バッファフルの場合,受信した文字を捨てる. 00697 */ 00698 } 00699 else { 00700 /* 00701 * 受信した文字を受信バッファに入れる. 00702 */ 00703 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c; 00704 INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz); 00705 if (p_spcb->rcv_count == 0U) { 00706 if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) { 00707 p_spcb->errorflag = true; 00708 } 00709 } 00710 p_spcb->rcv_count++; 00711 00712 /* 00713 * STOPを送信する. 00714 */ 00715 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped) 00716 && p_spcb->rcv_count 00717 >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) { 00718 if (!serial_snd_chr(p_spcb, FC_STOP)) { 00719 p_spcb->rcv_fc_chr = FC_STOP; 00720 } 00721 p_spcb->rcv_stopped = true; 00722 } 00723 } 00724 }
void sio_irdy_snd | ( | intptr_t | exinf | ) |
参照先 serial_port_control_block::errorflag, INC_PTR, isig_sem(), serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_control_block::rcv_fc_chr, sio_dis_cbr(), SIO_RDY_SND, sio_snd_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_initialization_block::snd_semid, と serial_port_control_block::snd_stopped.
参照元 upd72001_irdy_snd().
00620 { 00621 SPCB *p_spcb; 00622 00623 p_spcb = (SPCB *) exinf; 00624 if (p_spcb->rcv_fc_chr != '\0') { 00625 /* 00626 * START/STOP を送信する. 00627 */ 00628 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr); 00629 p_spcb->rcv_fc_chr = '\0'; 00630 } 00631 else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) { 00632 /* 00633 * 送信バッファ中から文字を取り出して送信する. 00634 */ 00635 (void) sio_snd_chr(p_spcb->p_siopcb, 00636 p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]); 00637 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 00638 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) { 00639 if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) { 00640 p_spcb->errorflag = true; 00641 } 00642 } 00643 p_spcb->snd_count--; 00644 } 00645 else { 00646 /* 00647 * 送信すべき文字がない場合は,送信可能コールバックを禁止する. 00648 */ 00649 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND); 00650 } 00651 }
void sio_isr | ( | intptr_t | exinf | ) |
target_serial.c の 66 行で定義されています。
参照先 assert, E_OK, ena_int(), INTNO_SIO, upd72001_openflag(), と upd72001_opn_por().
参照元 serial_opn_por().
00067 { 00068 SIOPCB *p_siopcb; 00069 bool_t opnflg; 00070 ER ercd; 00071 00072 /* 00073 * オープンしたポートがあるかをopnflgに読んでおく. 00074 */ 00075 opnflg = upd72001_openflag(); 00076 00077 /* 00078 * デバイス依存のオープン処理. 00079 */ 00080 p_siopcb = upd72001_opn_por(siopid, exinf); 00081 00082 /* 00083 * シリアルI/O割込みのマスクを解除する. 00084 */ 00085 if (!opnflg) { 00086 ercd = ena_int(INTNO_SIO); 00087 assert(ercd == E_OK); 00088 } 00089 return(p_siopcb); 00090 }
target_serial.c の 136 行で定義されています。
参照先 upd72001_rcv_chr().
参照元 sio_irdy_rcv().
00137 { 00138 return(upd72001_rcv_chr(siopcb)); 00139 }
target_serial.c の 127 行で定義されています。
参照先 upd72001_snd_chr().
参照元 serial_snd_chr(), と sio_irdy_snd().
00128 { 00129 return(upd72001_snd_chr(siopcb, c)); 00130 }
Copyright © 2008 by Kijineko Inc.