/* * シリアルポートへの文字送信 * * p_spcbで指定されるシリアルI/Oポートに対して,文字cを送信する.文字 * を送信レジスタにいれた場合にはtrueを返す.そうでない場合には,送信 * レジスタが空いたことを通知するコールバック関数を許可し,falseを返す. * この関数は,CPUロック状態で呼び出される. */ Inline bool_t serial_snd_chr(SPCB *p_spcb, char c) { if (sio_snd_chr(p_spcb->p_siopcb, c)) { return(true); } else { sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND); return(false); } }
/* * シリアルポートへの文字送信 */ Inline BOOL serial_snd_chr(SPCB *spcb, char c) { if (sio_snd_chr(spcb->siopcb, c)) { return(TRUE); } else { sio_ena_cbr(spcb->siopcb, SIO_ERDY_SND); return(FALSE); } }
/* * シリアルポートのオープン */ ER serial_opn_por(ID portid) { SPCB *spcb; ER ercd; if (sns_ctx()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); _syscall(loc_cpu()); if (spcb->openflag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * 変数の初期化 */ spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); spcb->rcv_read_ptr = spcb->rcv_write_ptr = 0; spcb->rcv_count = 0; spcb->rcv_fc_chr = '\0'; spcb->rcv_stopped = FALSE; spcb->snd_read_ptr = spcb->snd_write_ptr = 0; spcb->snd_count = 0; spcb->snd_stopped = FALSE; /* * ハードウェア依存のオープン処理 */ spcb->siopcb = sio_opn_por(portid, (VP_INT) spcb); /* * 受信通知コールバックを許可する. */ sio_ena_cbr(spcb->siopcb, SIO_ERDY_RCV); spcb->openflag = TRUE; ercd = E_OK; } _syscall(unl_cpu()); return(ercd); }
/* * シリアルポートのオープン(サービスコール) */ ER serial_opn_por(ID portid) { SPCB *p_spcb; ER ercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); SVC(dis_dsp(), gen_ercd_sys(p_spcb)); if (p_spcb->openflag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * 変数の初期化 */ p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); p_spcb->rcv_read_ptr = 0U; p_spcb->rcv_write_ptr = 0U; p_spcb->rcv_count = 0U; p_spcb->rcv_fc_chr = '\0'; p_spcb->rcv_stopped = false; p_spcb->snd_read_ptr = 0U; p_spcb->snd_write_ptr = 0U; p_spcb->snd_count = 0U; p_spcb->snd_stopped = false; /* * これ以降,割込みを禁止する. */ if (loc_cpu() < 0) { ercd = E_SYS; goto error_exit_enadsp; } /* * ハードウェア依存のオープン処理 */ p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb); /* * 受信通知コールバックを許可する. */ sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV); p_spcb->openflag = true; p_spcb->errorflag = false; if (unl_cpu() < 0) { p_spcb->errorflag = true; ercd = E_SYS; goto error_exit_enadsp; } ercd = E_OK; } error_exit_enadsp: SVC(ena_dsp(), gen_ercd_sys(p_spcb)); error_exit: return(ercd); }