target_serial.h

#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)
SIOPCBsio_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.h58 行で定義されています。

#define INTNO_SIO   TINTNO_GP0

target_serial.h56 行で定義されています。

参照元 sio_cls_por(), と sio_opn_por().

#define INTPRI_SIO   TIRQ_LEVEL6

target_serial.h57 行で定義されています。


関数

void sio_cls_por ( SIOPCB p_siopcb  ) 

target_serial.c96 行で定義されています。

参照先 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 }

void sio_dis_cbr ( SIOPCB siopcb,
uint_t  cbrtn 
)

target_serial.c154 行で定義されています。

参照先 upd72001_dis_cbr().

参照元 sio_irdy_snd().

00155 {
00156     upd72001_dis_cbr(siopcb, cbrtn);
00157 }

void sio_ena_cbr ( SIOPCB siopcb,
uint_t  cbrtn 
)

target_serial.c145 行で定義されています。

参照先 upd72001_ena_cbr().

参照元 serial_opn_por(), と serial_snd_chr().

00146 {
00147     upd72001_ena_cbr(siopcb, cbrtn);
00148 }

void sio_initialize ( intptr_t  exinf  ) 

target_serial.c57 行で定義されています。

参照先 upd72001_initialize().

00058 {
00059     upd72001_initialize();
00060 }

void sio_irdy_rcv ( intptr_t  exinf  ) 

serial.c657 行で定義されています。

参照先 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.c619 行で定義されています。

参照先 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.c118 行で定義されています。

参照先 upd72001_isr().

00119 {
00120     upd72001_isr();
00121 }

SIOPCB* sio_opn_por ( ID  siopid,
intptr_t  exinf 
)

target_serial.c66 行で定義されています。

参照先 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 }

int_t sio_rcv_chr ( SIOPCB siopcb  ) 

target_serial.c136 行で定義されています。

参照先 upd72001_rcv_chr().

参照元 sio_irdy_rcv().

00137 {
00138     return(upd72001_rcv_chr(siopcb));
00139 }

bool_t sio_snd_chr ( SIOPCB siopcb,
char_t  c 
)

target_serial.c127 行で定義されています。

参照先 upd72001_snd_chr().

参照元 serial_snd_chr(), と sio_irdy_snd().

00128 {
00129     return(upd72001_snd_chr(siopcb, c));
00130 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作