serial.c

#include <kernel.h>
#include <t_syslog.h>
#include "target_syssvc.h"
#include "target_serial.h"
#include "serial.h"
#include "kernel_cfg.h"

ソースコードを見る。

データ構造

struct  serial_port_initialization_block
struct  serial_port_control_block

マクロ定義

#define SERIAL_RCV_BUFSZ1   256
#define SERIAL_SND_BUFSZ1   256
#define FC_STOP   '\023'
#define FC_START   '\021'
#define BUFCNT_STOP(bufsz)   ((bufsz) * 3 / 4)
#define BUFCNT_START(bufsz)   ((bufsz) / 2)
#define INDEX_PORT(portid)   ((uint_t)((portid) - 1))
#define get_spcb(portid)   (&(spcb_table[INDEX_PORT(portid)]))
#define INC_PTR(ptr, bufsz)   { if (++(ptr) == (bufsz)) { (ptr) = 0; }}
#define SVC(exp, ercd_exp)   { if ((exp) < 0) { ercd = (ercd_exp); goto error_exit; }}

型定義

typedef struct
serial_port_initialization_block 
SPINIB
typedef struct
serial_port_control_block 
SPCB

関数

static ER gen_ercd_sys (SPCB *p_spcb)
static ER gen_ercd_wait (ER rercd, SPCB *p_spcb)
void serial_initialize (intptr_t exinf)
ER serial_opn_por (ID portid)
ER serial_cls_por (ID portid)
Inline bool_t serial_snd_chr (SPCB *p_spcb, char_t c)
static ER_BOOL serial_wri_chr (SPCB *p_spcb, char_t c)
ER_UINT serial_wri_dat (ID portid, char_t *buf, uint_t len)
static bool_t serial_rea_chr (SPCB *p_spcb, char_t *p_c)
ER_UINT serial_rea_dat (ID portid, char_t *buf, uint_t len)
ER serial_ctl_por (ID portid, uint_t ioctl)
ER serial_ref_por (ID portid, T_SERIAL_RPOR *pk_rpor)
void sio_irdy_snd (intptr_t exinf)
void sio_irdy_rcv (intptr_t exinf)
bool_t serial_get_chr (ID portid, char_t *p_c)

変数

static char_t rcv_buffer1 [SERIAL_RCV_BUFSZ1]
static char_t snd_buffer1 [SERIAL_SND_BUFSZ1]
static const SPINIB spinib_table [TNUM_PORT]
static SPCB spcb_table [TNUM_PORT]


マクロ定義

#define BUFCNT_START ( bufsz   )     ((bufsz) / 2)

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

参照元 serial_rea_chr().

#define BUFCNT_STOP ( bufsz   )     ((bufsz) * 3 / 4)

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

参照元 sio_irdy_rcv().

#define FC_START   '\021'

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

参照元 serial_rea_chr(), と sio_irdy_rcv().

#define FC_STOP   '\023'

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

参照元 sio_irdy_rcv().

#define get_spcb ( portid   )     (&(spcb_table[INDEX_PORT(portid)]))

#define INC_PTR ( ptr,
bufsz   )     { if (++(ptr) == (bufsz)) { (ptr) = 0; }}

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

参照元 serial_get_chr(), serial_rea_chr(), serial_wri_chr(), sio_irdy_rcv(), と sio_irdy_snd().

#define INDEX_PORT ( portid   )     ((uint_t)((portid) - 1))

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

#define SERIAL_RCV_BUFSZ1   256

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

#define SERIAL_SND_BUFSZ1   256

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

#define SVC ( exp,
ercd_exp   )     { if ((exp) < 0) { ercd = (ercd_exp); goto error_exit; }}


型定義


関数

static ER gen_ercd_sys ( SPCB p_spcb  )  [static]

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

参照先 E_SYS, と serial_port_control_block::errorflag.

参照元 serial_cls_por(), serial_opn_por(), serial_rea_chr(), serial_rea_dat(), serial_wri_chr(), と serial_wri_dat().

00184 {
00185     p_spcb->errorflag = true;
00186     return(E_SYS);
00187 }

static ER gen_ercd_wait ( ER  rercd,
SPCB p_spcb 
) [static]

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

参照先 E_DLT, E_RLWAI, E_SYS, serial_port_control_block::errorflag, と MERCD.

参照元 serial_rea_dat(), serial_wri_chr(), と serial_wri_dat().

00194 {
00195     switch (MERCD(rercd)) {
00196     case E_RLWAI:
00197     case E_DLT:
00198         return(rercd);
00199     default:
00200         p_spcb->errorflag = true;
00201         return(E_SYS);
00202     }
00203 }

ER serial_cls_por ( ID  portid  ) 

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

参照先 dis_dsp(), E_CTX, E_ID, E_OBJ, E_OK, ena_dsp(), gen_ercd_sys(), get_spcb, ini_sem(), loc_cpu(), serial_port_control_block::openflag, serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_semid, sio_cls_por(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と unl_cpu().

00296 {
00297     SPCB    *p_spcb;
00298     ER      ercd;
00299     bool_t  eflag = false;
00300 
00301     if (sns_dpn()) {                /* コンテキストのチェック */
00302         return(E_CTX);
00303     }
00304     if (!(1 <= portid && portid <= TNUM_PORT)) {
00305         return(E_ID);               /* ポート番号のチェック */
00306     }
00307     p_spcb = get_spcb(portid);
00308 
00309     SVC(dis_dsp(), gen_ercd_sys(p_spcb));
00310     if (!(p_spcb->openflag)) {      /* オープン済みかのチェック */
00311         ercd = E_OBJ;
00312     }
00313     else {
00314         /*
00315          *  ハードウェア依存のクローズ処理
00316          */
00317         if (loc_cpu() < 0) {
00318             eflag = true;
00319         }
00320         sio_cls_por(p_spcb->p_siopcb);
00321         p_spcb->openflag = false;
00322         if (unl_cpu() < 0) {
00323             eflag = true;
00324         }
00325 
00326         /*
00327          *  セマフォの初期化
00328          */
00329         if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) {
00330             eflag = true;
00331         }
00332         if (ini_sem(p_spcb->p_spinib->rcv_semid) < 0) {
00333             eflag = true;
00334         }
00335 
00336         /*
00337          *  エラーコードの設定
00338          */
00339         if (eflag) {
00340             ercd = gen_ercd_sys(p_spcb);
00341         }
00342         else {
00343             ercd = E_OK;
00344         }
00345     }
00346     SVC(ena_dsp(), gen_ercd_sys(p_spcb));
00347 
00348   error_exit:
00349     return(ercd);
00350 }

ER serial_ctl_por ( ID  portid,
uint_t  ioctl 
)

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

参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, get_spcb, serial_port_control_block::ioctl, serial_port_control_block::openflag, sns_dpn(), と TNUM_PORT.

参照元 main_task().

00565 {
00566     SPCB    *p_spcb;
00567 
00568     if (sns_dpn()) {                /* コンテキストのチェック */
00569         return(E_CTX);
00570     }
00571     if (!(1 <= portid && portid <= TNUM_PORT)) {
00572         return(E_ID);               /* ポート番号のチェック */
00573     }
00574 
00575     p_spcb = get_spcb(portid);
00576     if (!(p_spcb->openflag)) {      /* オープン済みかのチェック */
00577         return(E_OBJ);
00578     }
00579     if (p_spcb->errorflag) {        /* エラー状態かのチェック */
00580         return(E_SYS);
00581     }
00582 
00583     p_spcb->ioctl = ioctl;
00584     return(E_OK);
00585 }

bool_t serial_get_chr ( ID  portid,
char_t p_c 
)

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

参照先 get_spcb, INC_PTR, serial_port_control_block::openflag, serial_port_control_block::p_spinib, 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, と TNUM_PORT.

参照元 logtask_terminate().

00731 {
00732     SPCB    *p_spcb;
00733 
00734     if (1 <= portid && portid <= TNUM_PORT) {   /* ポート番号のチェック */
00735         p_spcb = get_spcb(portid);
00736         if (p_spcb->openflag) {                 /* オープン済みかのチェック */
00737             if (p_spcb->snd_count > 0U) {
00738                 *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
00739                 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
00740                 p_spcb->snd_count--;
00741                 return(true);
00742             }
00743         }
00744     }
00745     return(false);
00746 }

void serial_initialize ( intptr_t  exinf  ) 

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

参照先 serial_port_control_block::openflag, serial_port_control_block::p_spinib, と TNUM_PORT.

00210 {
00211     uint_t  i;
00212     SPCB    *p_spcb;
00213 
00214     for (p_spcb = spcb_table, i = 0; i < TNUM_PORT; p_spcb++, i++) {
00215         p_spcb->p_spinib = &(spinib_table[i]);
00216         p_spcb->openflag = false;
00217     }
00218 }

ER serial_opn_por ( ID  portid  ) 

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

参照先 dis_dsp(), E_CTX, E_ID, E_OBJ, E_OK, E_SYS, ena_dsp(), gen_ercd_sys(), get_spcb, serial_port_control_block::ioctl, IOCTL_CRLF, IOCTL_ECHO, IOCTL_FCRCV, IOCTL_FCSND, loc_cpu(), serial_port_control_block::openflag, serial_port_control_block::p_siopcb, serial_port_control_block::rcv_count, serial_port_control_block::rcv_fc_chr, serial_port_control_block::rcv_read_ptr, serial_port_control_block::rcv_stopped, serial_port_control_block::rcv_write_ptr, sio_ena_cbr(), sio_opn_por(), SIO_RDY_RCV, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_control_block::snd_stopped, serial_port_control_block::snd_write_ptr, sns_dpn(), SVC, TNUM_PORT, と unl_cpu().

参照元 logtask_main(), と main_task().

00225 {
00226     SPCB    *p_spcb;
00227     ER      ercd;
00228 
00229     if (sns_dpn()) {                /* コンテキストのチェック */
00230         return(E_CTX);
00231     }
00232     if (!(1 <= portid && portid <= TNUM_PORT)) {
00233         return(E_ID);               /* ポート番号のチェック */
00234     }
00235     p_spcb = get_spcb(portid);
00236 
00237     SVC(dis_dsp(), gen_ercd_sys(p_spcb));
00238     if (p_spcb->openflag) {         /* オープン済みかのチェック */
00239         ercd = E_OBJ;
00240     }
00241     else {
00242         /*
00243          *  変数の初期化
00244          */
00245         p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
00246 
00247         p_spcb->rcv_read_ptr = p_spcb->rcv_write_ptr = 0U;
00248         p_spcb->rcv_count = 0U;
00249         p_spcb->rcv_fc_chr = '\0';
00250         p_spcb->rcv_stopped = false;
00251 
00252         p_spcb->snd_read_ptr = p_spcb->snd_write_ptr = 0U;
00253         p_spcb->snd_count = 0U;
00254         p_spcb->snd_stopped = false;
00255 
00256         /*
00257          *  これ以降,割込みを禁止する.
00258          */
00259         if (loc_cpu() < 0) {
00260             ercd = E_SYS;
00261             goto error_exit_enadsp;
00262         }
00263 
00264         /*
00265          *  ハードウェア依存のオープン処理
00266          */
00267         p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb);
00268 
00269         /*
00270          *  受信通知コールバックを許可する.
00271          */
00272         sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV);
00273         p_spcb->openflag = true;
00274         p_spcb->errorflag = false;
00275 
00276         if (unl_cpu() < 0) {
00277             p_spcb->errorflag = true;
00278             ercd = E_SYS;
00279             goto error_exit_enadsp;
00280         }
00281         ercd = E_OK;
00282     }
00283 
00284   error_exit_enadsp:
00285     SVC(ena_dsp(), gen_ercd_sys(p_spcb));
00286 
00287   error_exit:
00288     return(ercd);
00289 }

static bool_t serial_rea_chr ( SPCB p_spcb,
char_t p_c 
) [static]

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

参照先 BUFCNT_START, FC_START, gen_ercd_sys(), INC_PTR, loc_cpu(), 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_control_block::rcv_read_ptr, serial_port_control_block::rcv_stopped, serial_snd_chr(), SVC, と unl_cpu().

参照元 serial_rea_dat().

00468 {
00469     bool_t  buffer_empty;
00470     ER      ercd;
00471 
00472     SVC(loc_cpu(), gen_ercd_sys(p_spcb));
00473 
00474     /*
00475      *  受信バッファから文字を取り出す.
00476      */
00477     *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr];
00478     INC_PTR(p_spcb->rcv_read_ptr, p_spcb->p_spinib->rcv_bufsz);
00479     p_spcb->rcv_count--;
00480     buffer_empty = (p_spcb->rcv_count == 0U);
00481 
00482     /*
00483      *  STARTを送信する.
00484      */
00485     if (p_spcb->rcv_stopped && p_spcb->rcv_count
00486                                 <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) {
00487         if (!serial_snd_chr(p_spcb, FC_START)) {
00488             p_spcb->rcv_fc_chr = FC_START;
00489         }
00490         p_spcb->rcv_stopped = false;
00491     }
00492 
00493     SVC(unl_cpu(), gen_ercd_sys(p_spcb));
00494     ercd = (ER_BOOL) buffer_empty;
00495 
00496   error_exit:
00497     return(ercd);
00498 }

ER_UINT serial_rea_dat ( ID  portid,
char_t buf,
uint_t  len 
)

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

参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, gen_ercd_sys(), gen_ercd_wait(), get_spcb, serial_port_control_block::ioctl, IOCTL_ECHO, serial_port_control_block::openflag, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_semid, serial_rea_chr(), serial_wri_chr(), sig_sem(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と wai_sem().

参照元 main_task().

00505 {
00506     SPCB    *p_spcb;
00507     bool_t  buffer_empty;
00508     uint_t  reacnt = 0U;
00509     char_t  c = '\0';       /* コンパイラの警告を抑止するために初期化する */
00510     ER      ercd, rercd;
00511 
00512     if (sns_dpn()) {                /* コンテキストのチェック */
00513         return(E_CTX);
00514     }
00515     if (!(1 <= portid && portid <= TNUM_PORT)) {
00516         return(E_ID);               /* ポート番号のチェック */
00517     }
00518 
00519     p_spcb = get_spcb(portid);
00520     if (!(p_spcb->openflag)) {      /* オープン済みかのチェック */
00521         return(E_OBJ);
00522     }
00523     if (p_spcb->errorflag) {        /* エラー状態かのチェック */
00524         return(E_SYS);
00525     }
00526 
00527     buffer_empty = true;            /* ループの1回めはwai_semする */
00528     while (reacnt < len) {
00529         if (buffer_empty) {
00530             SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid),
00531                                         gen_ercd_wait(rercd, p_spcb));
00532         }
00533         SVC(rercd = serial_rea_chr(p_spcb, &c), rercd);
00534         *buf++ = c;
00535         reacnt++;
00536         buffer_empty = (bool_t) rercd;
00537 
00538         /*
00539          *  エコーバック処理.
00540          */
00541         if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) {
00542             SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
00543                                         gen_ercd_wait(rercd, p_spcb));
00544             SVC(rercd = serial_wri_chr(p_spcb, c), rercd);
00545             if (!((bool_t) rercd)) {
00546                 SVC(sig_sem(p_spcb->p_spinib->snd_semid),
00547                                         gen_ercd_sys(p_spcb));
00548             }
00549         }
00550     }
00551     if (!buffer_empty) {
00552         SVC(sig_sem(p_spcb->p_spinib->rcv_semid), gen_ercd_sys(p_spcb));
00553     }
00554     ercd = E_OK;
00555 
00556   error_exit:
00557     return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
00558 }

ER serial_ref_por ( ID  portid,
T_SERIAL_RPOR pk_rpor 
)

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

参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, get_spcb, serial_port_control_block::openflag, serial_port_control_block::rcv_count, T_SERIAL_RPOR::reacnt, serial_port_control_block::snd_count, sns_dpn(), TNUM_PORT, と T_SERIAL_RPOR::wricnt.

参照元 logtask_flush().

00592 {
00593     SPCB    *p_spcb;
00594 
00595     if (sns_dpn()) {                /* コンテキストのチェック */
00596         return(E_CTX);
00597     }
00598     if (!(1 <= portid && portid <= TNUM_PORT)) {
00599         return(E_ID);               /* ポート番号のチェック */
00600     }
00601 
00602     p_spcb = get_spcb(portid);
00603     if (!(p_spcb->openflag)) {      /* オープン済みかのチェック */
00604         return(E_OBJ);
00605     }
00606     if (p_spcb->errorflag) {        /* エラー状態かのチェック */
00607         return(E_SYS);
00608     }
00609 
00610     pk_rpor->reacnt = p_spcb->rcv_count;
00611     pk_rpor->wricnt = p_spcb->snd_count;
00612     return(E_OK);
00613 }

Inline bool_t serial_snd_chr ( SPCB p_spcb,
char_t  c 
)

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

参照先 serial_port_control_block::p_siopcb, sio_ena_cbr(), SIO_RDY_SND, と sio_snd_chr().

参照元 serial_rea_chr(), serial_wri_chr(), と sio_irdy_rcv().

00362 {
00363     if (sio_snd_chr(p_spcb->p_siopcb, c)) {
00364         return(true);
00365     }
00366     else {
00367         sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
00368         return(false);
00369     }
00370 }

static ER_BOOL serial_wri_chr ( SPCB p_spcb,
char_t  c 
) [static]

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

参照先 gen_ercd_sys(), gen_ercd_wait(), INC_PTR, serial_port_control_block::ioctl, IOCTL_CRLF, loc_cpu(), serial_port_control_block::p_spinib, serial_snd_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_initialization_block::snd_semid, serial_port_control_block::snd_stopped, serial_port_control_block::snd_write_ptr, SVC, unl_cpu(), と wai_sem().

参照元 serial_rea_dat(), と serial_wri_dat().

00377 {
00378     bool_t  buffer_full;
00379     ER      ercd, rercd;
00380 
00381     /*
00382      *  LFの前にCRを送信する.
00383      */
00384     if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) {
00385         SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd);
00386         if ((bool_t) rercd) {
00387             SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
00388                                         gen_ercd_wait(rercd, p_spcb));
00389         }
00390     }
00391 
00392     SVC(loc_cpu(), gen_ercd_sys(p_spcb));
00393     if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped)
00394                                 && serial_snd_chr(p_spcb, c)) {
00395         /*
00396          *  シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し
00397          *  た場合.
00398          */
00399         buffer_full = false;
00400     }
00401     else {
00402         /*
00403          *  送信バッファに文字を入れる.
00404          */
00405         p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c;
00406         INC_PTR(p_spcb->snd_write_ptr, p_spcb->p_spinib->snd_bufsz);
00407         p_spcb->snd_count++;
00408         buffer_full = (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz);
00409     }
00410 
00411     SVC(unl_cpu(), gen_ercd_sys(p_spcb));
00412     ercd = (ER_BOOL) buffer_full;
00413 
00414   error_exit:
00415     return(ercd);
00416 }

ER_UINT serial_wri_dat ( ID  portid,
char_t buf,
uint_t  len 
)

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

参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, gen_ercd_sys(), gen_ercd_wait(), get_spcb, serial_port_control_block::openflag, serial_port_control_block::p_spinib, serial_wri_chr(), sig_sem(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と wai_sem().

参照元 logtask_putc().

00423 {
00424     SPCB    *p_spcb;
00425     bool_t  buffer_full;
00426     uint_t  wricnt = 0U;
00427     ER      ercd, rercd;
00428 
00429     if (sns_dpn()) {                /* コンテキストのチェック */
00430         return(E_CTX);
00431     }
00432     if (!(1 <= portid && portid <= TNUM_PORT)) {
00433         return(E_ID);               /* ポート番号のチェック */
00434     }
00435 
00436     p_spcb = get_spcb(portid);
00437     if (!(p_spcb->openflag)) {      /* オープン済みかのチェック */
00438         return(E_OBJ);
00439     }
00440     if (p_spcb->errorflag) {        /* エラー状態かのチェック */
00441         return(E_SYS);
00442     }
00443 
00444     buffer_full = true;             /* ループの1回めはwai_semする */
00445     while (wricnt < len) {
00446         if (buffer_full) {
00447             SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
00448                                         gen_ercd_wait(rercd, p_spcb));
00449         }
00450         SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd);
00451         wricnt++;
00452         buffer_full = (bool_t) rercd;
00453     }
00454     if (!buffer_full) {
00455         SVC(sig_sem(p_spcb->p_spinib->snd_semid), gen_ercd_sys(p_spcb));
00456     }
00457     ercd = E_OK;
00458 
00459   error_exit:
00460     return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
00461 }

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 }


変数

char_t rcv_buffer1[SERIAL_RCV_BUFSZ1] [static]

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

char_t snd_buffer1[SERIAL_SND_BUFSZ1] [static]

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

SPCB spcb_table[TNUM_PORT] [static]

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

const SPINIB spinib_table[TNUM_PORT] [static]

初期値:

 {
    { SERIAL_RCV_SEM1, SERIAL_SND_SEM1,
      SERIAL_RCV_BUFSZ1, rcv_buffer1,
      SERIAL_SND_BUFSZ1, snd_buffer1 },




 




 
}

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


Copyright © 2008 by Kijineko Inc.

ホームページ制作