Ignore:
Timestamp:
Sep 14, 2020, 6:36:03 PM (4 years ago)
Author:
coas-nagasima
Message:

SPIとSerial、KPUの動作を改善

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub_riscv/trunk/asp_baseplatform/syssvc/serial.c

    r453 r458  
    5656 */
    5757#ifndef SERIAL_RCV_BUFSZ1
    58 #define SERIAL_RCV_BUFSZ1       256                     /* ポート1の受信バッファサイズ */
    59 #endif /* SERIAL_RCV_BUFSZ1 */
     58#define SERIAL_RCV_BUFSZ1 256 /* ポート1の受信バッファサイズ */
     59#endif                                            /* SERIAL_RCV_BUFSZ1 */
    6060
    6161#ifndef SERIAL_SND_BUFSZ1
    62 #define SERIAL_SND_BUFSZ1       256                     /* ポート1の送信バッファサイズ */
    63 #endif /* SERIAL_SND_BUFSZ1 */
    64 
    65 static char     rcv_buffer1[SERIAL_RCV_BUFSZ1];
    66 static char     snd_buffer1[SERIAL_SND_BUFSZ1];
    67 
    68 #if TNUM_PORT >= 2                                              /* ポート2に関する定義 */
     62#define SERIAL_SND_BUFSZ1 256 /* ポート1の送信バッファサイズ */
     63#endif                                            /* SERIAL_SND_BUFSZ1 */
     64
     65static char rcv_buffer1[SERIAL_RCV_BUFSZ1];
     66static char snd_buffer1[SERIAL_SND_BUFSZ1];
     67
     68#if TNUM_PORT >= 2 /* ポート2に関する定義 */
    6969
    7070#ifndef SERIAL_RCV_BUFSZ2
    71 #define SERIAL_RCV_BUFSZ2       256                     /* ポート2の受信バッファサイズ */
    72 #endif /* SERIAL_RCV_BUFSZ2 */
     71#define SERIAL_RCV_BUFSZ2 256 /* ポート2の受信バッファサイズ */
     72#endif                                            /* SERIAL_RCV_BUFSZ2 */
    7373
    7474#ifndef SERIAL_SND_BUFSZ2
    75 #define SERIAL_SND_BUFSZ2       256                     /* ポート2の送信バッファサイズ */
    76 #endif /* SERIAL_SND_BUFSZ2 */
    77 
    78 static char     rcv_buffer2[SERIAL_RCV_BUFSZ2];
    79 static char     snd_buffer2[SERIAL_SND_BUFSZ2];
     75#define SERIAL_SND_BUFSZ2 256 /* ポート2の送信バッファサイズ */
     76#endif                                            /* SERIAL_SND_BUFSZ2 */
     77
     78static char rcv_buffer2[SERIAL_RCV_BUFSZ2];
     79static char snd_buffer2[SERIAL_SND_BUFSZ2];
    8080
    8181#endif /* TNUM_PORT >= 2 */
    8282
    83 #if TNUM_PORT >= 3                                              /* ポート3に関する定義 */
     83#if TNUM_PORT >= 3 /* ポート3に関する定義 */
    8484
    8585#ifndef SERIAL_RCV_BUFSZ3
    86 #define SERIAL_RCV_BUFSZ3       256                     /* ポート3の受信バッファサイズ */
    87 #endif /* SERIAL_RCV_BUFSZ3 */
     86#define SERIAL_RCV_BUFSZ3 256 /* ポート3の受信バッファサイズ */
     87#endif                                            /* SERIAL_RCV_BUFSZ3 */
    8888
    8989#ifndef SERIAL_SND_BUFSZ3
    90 #define SERIAL_SND_BUFSZ3       256                     /* ポート3の送信バッファサイズ */
    91 #endif /* SERIAL_SND_BUFSZ3 */
    92 
    93 static char     rcv_buffer3[SERIAL_RCV_BUFSZ3];
    94 static char     snd_buffer3[SERIAL_SND_BUFSZ3];
     90#define SERIAL_SND_BUFSZ3 256 /* ポート3の送信バッファサイズ */
     91#endif                                            /* SERIAL_SND_BUFSZ3 */
     92
     93static char rcv_buffer3[SERIAL_RCV_BUFSZ3];
     94static char snd_buffer3[SERIAL_SND_BUFSZ3];
    9595
    9696#endif /* TNUM_PORT >= 3 */
    9797
    98 #if TNUM_PORT >= 4                                              /* ポート4に関する定義 */
     98#if TNUM_PORT >= 4 /* ポート4に関する定義 */
    9999
    100100#ifndef SERIAL_RCV_BUFSZ4
    101 #define SERIAL_RCV_BUFSZ4       256                     /* ポート4の受信バッファサイズ */
    102 #endif /* SERIAL_RCV_BUFSZ4 */
     101#define SERIAL_RCV_BUFSZ4 256 /* ポート4の受信バッファサイズ */
     102#endif                                            /* SERIAL_RCV_BUFSZ4 */
    103103
    104104#ifndef SERIAL_SND_BUFSZ4
    105 #define SERIAL_SND_BUFSZ4       256                     /* ポート4の送信バッファサイズ */
    106 #endif /* SERIAL_SND_BUFSZ4 */
    107 
    108 static char     rcv_buffer4[SERIAL_RCV_BUFSZ4];
    109 static char     snd_buffer4[SERIAL_SND_BUFSZ4];
     105#define SERIAL_SND_BUFSZ4 256 /* ポート4の送信バッファサイズ */
     106#endif                                            /* SERIAL_SND_BUFSZ4 */
     107
     108static char rcv_buffer4[SERIAL_RCV_BUFSZ4];
     109static char snd_buffer4[SERIAL_SND_BUFSZ4];
    110110
    111111#endif /* TNUM_PORT >= 4 */
     
    118118 *  フロー制御に関連する定数とマクロ
    119119 */
    120 #define FC_STOP                 '\023'          /* コントロール-S */
    121 #define FC_START                '\021'          /* コントロール-Q */
    122 
    123 #define BUFCNT_STOP(bufsz)              ((bufsz) * 3 / 4)       /* STOPを送る基準文字数 */
    124 #define BUFCNT_START(bufsz)             ((bufsz) / 2)           /* STARTを送る基準文字数 */
     120#define FC_STOP '\023'  /* コントロール-S */
     121#define FC_START '\021' /* コントロール-Q */
     122
     123#define BUFCNT_STOP(bufsz) ((bufsz)*3 / 4) /* STOPを送る基準文字数 */
     124#define BUFCNT_START(bufsz) ((bufsz) / 2)  /* STARTを送る基準文字数 */
    125125
    126126/*
     
    128128 */
    129129typedef struct serial_port_initialization_block {
    130         ID              rcv_semid;              /* 受信バッファ管理用セマフォのID */
    131         ID              snd_semid;              /* 送信バッファ管理用セマフォのID */
    132         uint_t  rcv_bufsz;              /* 受信バッファサイズ */
    133         char    *rcv_buffer;    /* 受信バッファ */
    134         uint_t  snd_bufsz;              /* 送信バッファサイズ */
    135         char    *snd_buffer;    /* 送信バッファ */
     130        ID rcv_semid;     /* 受信バッファ管理用セマフォのID */
     131        ID snd_semid;     /* 送信バッファ管理用セマフォのID */
     132        uint_t rcv_bufsz; /* 受信バッファサイズ */
     133        char *rcv_buffer; /* 受信バッファ */
     134        uint_t snd_bufsz; /* 送信バッファサイズ */
     135        char *snd_buffer; /* 送信バッファ */
    136136} SPINIB;
    137137
    138138static const SPINIB spinib_table[TNUM_PORT] = {
    139         { SERIAL_RCV_SEM1, SERIAL_SND_SEM1,
    140           SERIAL_RCV_BUFSZ1, rcv_buffer1,
    141           SERIAL_SND_BUFSZ1, snd_buffer1 },
     139        {SERIAL_RCV_SEM1, SERIAL_SND_SEM1,
     140         SERIAL_RCV_BUFSZ1, rcv_buffer1,
     141         SERIAL_SND_BUFSZ1, snd_buffer1},
    142142#if TNUM_PORT >= 2
    143         { SERIAL_RCV_SEM2, SERIAL_SND_SEM2,
    144           SERIAL_RCV_BUFSZ2, rcv_buffer2,
    145           SERIAL_SND_BUFSZ2, snd_buffer2 },
     143        {SERIAL_RCV_SEM2, SERIAL_SND_SEM2,
     144         SERIAL_RCV_BUFSZ2, rcv_buffer2,
     145         SERIAL_SND_BUFSZ2, snd_buffer2},
    146146#endif /* TNUM_PORT >= 2 */
    147147#if TNUM_PORT >= 3
    148         { SERIAL_RCV_SEM3, SERIAL_SND_SEM3,
    149           SERIAL_RCV_BUFSZ3, rcv_buffer3,
    150           SERIAL_SND_BUFSZ3, snd_buffer3 },
     148        {SERIAL_RCV_SEM3, SERIAL_SND_SEM3,
     149         SERIAL_RCV_BUFSZ3, rcv_buffer3,
     150         SERIAL_SND_BUFSZ3, snd_buffer3},
    151151#endif /* TNUM_PORT >= 3 */
    152152#if TNUM_PORT >= 4
    153         { SERIAL_RCV_SEM4, SERIAL_SND_SEM4,
    154           SERIAL_RCV_BUFSZ4, rcv_buffer4,
    155           SERIAL_SND_BUFSZ4, snd_buffer4 },
     153        {SERIAL_RCV_SEM4, SERIAL_SND_SEM4,
     154         SERIAL_RCV_BUFSZ4, rcv_buffer4,
     155         SERIAL_SND_BUFSZ4, snd_buffer4},
    156156#endif /* TNUM_PORT >= 4 */
    157157};
     
    161161 */
    162162typedef struct serial_port_control_block {
    163         const SPINIB *p_spinib;         /* シリアルポート初期化ブロック */
    164         SIOPCB  *p_siopcb;                      /* シリアルI/Oポート管理ブロック */
    165         bool_t  openflag;                       /* オープン済みフラグ */
    166         bool_t  errorflag;                      /* エラーフラグ */
    167         uint_t  ioctl;                          /* 動作制御の設定値 */
    168 
    169         uint_t  rcv_read_ptr;           /* 受信バッファ読出しポインタ */
    170         uint_t  rcv_write_ptr;          /* 受信バッファ書込みポインタ */
    171         uint_t  rcv_count;                      /* 受信バッファ中の文字数 */
    172         char    rcv_fc_chr;                     /* 送るべきSTART/STOP */
    173         bool_t  rcv_stopped;            /* STOPを送った状態か? */
    174 
    175         uint_t  snd_read_ptr;           /* 送信バッファ読出しポインタ */
    176         uint_t  snd_write_ptr;          /* 送信バッファ書込みポインタ */
    177         uint_t  snd_count;                      /* 送信バッファ中の文字数 */
    178         bool_t  snd_stopped;            /* STOPを受け取った状態か? */
     163        const SPINIB *p_spinib; /* シリアルポート初期化ブロック */
     164        SIOPCB *p_siopcb;               /* シリアルI/Oポート管理ブロック */
     165        bool_t openflag;                /* オープン済みフラグ */
     166        bool_t errorflag;               /* エラーフラグ */
     167        uint_t ioctl;                   /* 動作制御の設定値 */
     168
     169        uint_t rcv_read_ptr;  /* 受信バッファ読出しポインタ */
     170        uint_t rcv_write_ptr; /* 受信バッファ書込みポインタ */
     171        uint_t rcv_count;         /* 受信バッファ中の文字数 */
     172        char rcv_fc_chr;          /* 送るべきSTART/STOP */
     173        bool_t rcv_stopped;       /* STOPを送った状態か? */
     174
     175        uint_t snd_read_ptr;  /* 送信バッファ読出しポインタ */
     176        uint_t snd_write_ptr; /* 送信バッファ書込みポインタ */
     177        uint_t snd_count;         /* 送信バッファ中の文字数 */
     178        bool_t snd_stopped;       /* STOPを受け取った状態か? */
    179179} SPCB;
    180180
    181 static SPCB     spcb_table[TNUM_PORT];
     181static SPCB spcb_table[TNUM_PORT];
    182182
    183183/*
    184184 *  シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ
    185185 */
    186 #define INDEX_PORT(portid)      ((uint_t)((portid) - 1))
    187 #define get_spcb(portid)        (&(spcb_table[INDEX_PORT(portid)]))
     186#define INDEX_PORT(portid) ((uint_t)((portid)-1))
     187#define get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)]))
    188188
    189189/*
    190190 *  ポインタのインクリメント
    191191 */
    192 #define INC_PTR(ptr, bufsz) do {        \
    193         if (++(ptr) == (bufsz)) {               \
    194                 (ptr) = 0;                                      \
    195          }                                                              \
    196 } while (false)
     192#define INC_PTR(ptr, bufsz) do {   \
     193                if (++(ptr) == (bufsz)) {  \
     194                        (ptr) = 0;             \
     195                }                          \
     196        } while (false)
    197197
    198198/*
     
    202202 *  合には,ercにercd_expを評価した値を代入し,error_exitにgotoする.
    203203 */
    204 #define SVC(exp, ercd_exp) do {         \
    205         if ((exp) < 0) {                                \
    206                 ercd = (ercd_exp);                      \
    207                 goto error_exit;                        \
    208         }                                                               \
    209 } while (false)
     204#define SVC(exp, ercd_exp) do {    \
     205                if ((exp) < 0) {           \
     206                        ercd = (ercd_exp);     \
     207                        goto error_exit;       \
     208                }                          \
     209        } while (false)
    210210
    211211/*
     
    216216{
    217217        p_spcb->errorflag = true;
    218         return(E_SYS);
     218        return (E_SYS);
    219219}
    220220
     
    228228        case E_RLWAI:
    229229        case E_DLT:
    230                 return(rercd);
     230                return (rercd);
    231231        default:
    232232                p_spcb->errorflag = true;
    233                 return(E_SYS);
     233                return (E_SYS);
    234234        }
    235235}
     
    241241serial_initialize(intptr_t exinf)
    242242{
    243         uint_t  i;
    244         SPCB    *p_spcb;
     243        uint_t i;
     244        SPCB *p_spcb;
    245245
    246246        for (i = 0; i < TNUM_PORT; i++) {
     
    257257serial_opn_por(ID portid)
    258258{
    259         SPCB    *p_spcb;
    260         ER              ercd;
    261 
    262         if (sns_dpn()) {                                /* コンテキストのチェック */
    263                 return(E_CTX);
     259        SPCB *p_spcb;
     260        ER ercd;
     261
     262        if (sns_dpn()) { /* コンテキストのチェック */
     263                return (E_CTX);
    264264        }
    265265        if (!(1 <= portid && portid <= TNUM_PORT)) {
    266                 return(E_ID);                           /* ポート番号のチェック */
     266                return (E_ID); /* ポート番号のチェック */
    267267        }
    268268        p_spcb = get_spcb(portid);
    269269
    270270        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    271         if (p_spcb->openflag) {                 /* オープン済みかのチェック */
     271        if (p_spcb->openflag) { /* オープン済みかのチェック */
    272272                ercd = E_OBJ;
    273273        }
     
    292292                 *  これ以降,割込みを禁止する.
    293293                 */
    294                 if (loc_cpu() < 0) {
     294                if (loc_cpu() < 0)      {
    295295                        ercd = E_SYS;
    296296                        goto error_exit_enadsp;
     
    300300                 *  ハードウェア依存のオープン処理
    301301                 */
    302                 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb);
     302                p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t)p_spcb);
    303303
    304304                /*
     
    317317        }
    318318
    319   error_exit_enadsp:
     319error_exit_enadsp:
    320320        SVC(ena_dsp(), gen_ercd_sys(p_spcb));
    321321
    322   error_exit:
    323         return(ercd);
     322error_exit:
     323        return (ercd);
    324324}
    325325
     
    330330serial_cls_por(ID portid)
    331331{
    332         SPCB    *p_spcb;
    333         ER              ercd;
    334         bool_t  eflag = false;
    335 
    336         if (sns_dpn()) {                                /* コンテキストのチェック */
    337                 return(E_CTX);
     332        SPCB *p_spcb;
     333        ER ercd;
     334        bool_t eflag = false;
     335
     336        if (sns_dpn()) { /* コンテキストのチェック */
     337                return (E_CTX);
    338338        }
    339339        if (!(1 <= portid && portid <= TNUM_PORT)) {
    340                 return(E_ID);                           /* ポート番号のチェック */
     340                return (E_ID); /* ポート番号のチェック */
    341341        }
    342342        p_spcb = get_spcb(portid);
    343343
    344344        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    345         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
     345        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
    346346                ercd = E_OBJ;
    347347        }
     
    381381        SVC(ena_dsp(), gen_ercd_sys(p_spcb));
    382382
    383   error_exit:
    384         return(ercd);
     383error_exit:
     384        return (ercd);
    385385}
    386386
     
    397397{
    398398        if (sio_snd_chr(p_spcb->p_siopcb, c)) {
    399                 return(true);
     399                return (true);
    400400        }
    401401        else {
    402402                sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
    403                 return(false);
     403                return (false);
    404404        }
    405405}
     
    411411serial_wri_chr(SPCB *p_spcb, char c)
    412412{
    413         bool_t  buffer_full;
    414         ER              ercd, rercd;
     413        bool_t buffer_full;
     414        ER ercd, rercd;
    415415
    416416        /*
     
    424424                 */
    425425                SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd);
    426                 if ((bool_t) rercd) {
     426                if ((bool_t)rercd) {
    427427                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    428                                                                                 gen_ercd_wait(rercd, p_spcb));
     428                                gen_ercd_wait(rercd, p_spcb));
    429429                }
    430430        }
     
    432432        SVC(loc_cpu(), gen_ercd_sys(p_spcb));
    433433        if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped)
    434                                                                 && serial_snd_chr(p_spcb, c)) {
     434                && serial_snd_chr(p_spcb, c)) {
    435435                /*
    436436                 *  シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し
     
    450450
    451451        SVC(unl_cpu(), gen_ercd_sys(p_spcb));
    452         ercd = (ER_BOOL) buffer_full;
    453 
    454   error_exit:
    455         return(ercd);
     452        ercd = (ER_BOOL)buffer_full;
     453
     454error_exit:
     455        return (ercd);
    456456}
    457457
     
    462462serial_wri_dat(ID portid, const char *buf, uint_t len)
    463463{
    464         SPCB    *p_spcb;
    465         bool_t  buffer_full;
    466         uint_t  wricnt = 0U;
    467         ER              ercd, rercd;
    468 
    469         if (sns_dpn()) {                                /* コンテキストのチェック */
    470                 return(E_CTX);
     464        SPCB *p_spcb;
     465        bool_t buffer_full;
     466        uint_t wricnt = 0U;
     467        ER ercd, rercd;
     468
     469        if (sns_dpn()) { /* コンテキストのチェック */
     470                return (E_CTX);
    471471        }
    472472        if (!(1 <= portid && portid <= TNUM_PORT)) {
    473                 return(E_ID);                           /* ポート番号のチェック */
     473                return (E_ID); /* ポート番号のチェック */
    474474        }
    475475
    476476        p_spcb = get_spcb(portid);
    477         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    478                 return(E_OBJ);
    479         }
    480         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    481                 return(E_SYS);
    482         }
    483 
    484         buffer_full = true;                             /* ループの1回めはwai_semする */
     477        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     478                return (E_OBJ);
     479        }
     480        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     481                return (E_SYS);
     482        }
     483
     484        buffer_full = true; /* ループの1回めはwai_semする */
    485485        while (wricnt < len) {
    486486                if (buffer_full) {
    487487                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    488                                                                                 gen_ercd_wait(rercd, p_spcb));
     488                                gen_ercd_wait(rercd, p_spcb));
    489489                }
    490490                SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd);
    491491                wricnt++;
    492                 buffer_full = (bool_t) rercd;
     492                buffer_full = (bool_t)rercd;
    493493        }
    494494        if (!buffer_full) {
     
    497497        ercd = E_OK;
    498498
    499   error_exit:
    500         return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
     499error_exit:
     500        return (wricnt > 0U ? (ER_UINT)wricnt : ercd);
    501501}
    502502
     
    507507serial_rea_chr(SPCB *p_spcb, char *p_c)
    508508{
    509         bool_t  buffer_empty;
    510         ER              ercd;
     509        bool_t buffer_empty;
     510        ER ercd;
    511511
    512512        SVC(loc_cpu(), gen_ercd_sys(p_spcb));
     
    523523         *  STARTを送信する.
    524524         */
    525         if (p_spcb->rcv_stopped && p_spcb->rcv_count
    526                                                                 <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) {
     525        if (p_spcb->rcv_stopped
     526                && p_spcb->rcv_count <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) {
    527527                if (!serial_snd_chr(p_spcb, FC_START)) {
    528528                        p_spcb->rcv_fc_chr = FC_START;
     
    532532
    533533        SVC(unl_cpu(), gen_ercd_sys(p_spcb));
    534         ercd = (ER_BOOL) buffer_empty;
    535 
    536   error_exit:
    537         return(ercd);
     534        ercd = (ER_BOOL)buffer_empty;
     535
     536error_exit:
     537        return (ercd);
    538538}
    539539
     
    544544serial_rea_dat(ID portid, char *buf, uint_t len)
    545545{
    546         SPCB    *p_spcb;
    547         bool_t  buffer_empty;
    548         uint_t  reacnt = 0U;
    549         char    c = '\0';               /* コンパイラの警告を抑止するために初期化する */
    550         ER              ercd, rercd;
    551 
    552         if (sns_dpn()) {                                /* コンテキストのチェック */
    553                 return(E_CTX);
     546        SPCB *p_spcb;
     547        bool_t buffer_empty;
     548        uint_t reacnt = 0U;
     549        char c = '\0'; /* コンパイラの警告を抑止するために初期化する */
     550        ER ercd, rercd;
     551
     552        if (sns_dpn()) { /* コンテキストのチェック */
     553                return (E_CTX);
    554554        }
    555555        if (!(1 <= portid && portid <= TNUM_PORT)) {
    556                 return(E_ID);                           /* ポート番号のチェック */
     556                return (E_ID); /* ポート番号のチェック */
    557557        }
    558558
    559559        p_spcb = get_spcb(portid);
    560         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    561                 return(E_OBJ);
    562         }
    563         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    564                 return(E_SYS);
    565         }
    566 
    567         buffer_empty = true;                    /* ループの1回めはwai_semする */
     560        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     561                return (E_OBJ);
     562        }
     563        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     564                return (E_SYS);
     565        }
     566
     567        buffer_empty = true; /* ループの1回めはwai_semする */
    568568        while (reacnt < len) {
    569569                if (buffer_empty) {
    570570                        SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid),
    571                                                                                 gen_ercd_wait(rercd, p_spcb));
     571                                gen_ercd_wait(rercd, p_spcb));
    572572                }
    573573                SVC(rercd = serial_rea_chr(p_spcb, &c), rercd);
    574574                *buf++ = c;
    575575                reacnt++;
    576                 buffer_empty = (bool_t) rercd;
     576                buffer_empty = (bool_t)rercd;
    577577
    578578                /*
     
    581581                if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) {
    582582                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    583                                                                                 gen_ercd_wait(rercd, p_spcb));
     583                                gen_ercd_wait(rercd, p_spcb));
    584584                        SVC(rercd = serial_wri_chr(p_spcb, c), rercd);
    585                         if (!((bool_t) rercd)) {
     585                        if (!((bool_t)rercd)) {
    586586                                SVC(sig_sem(p_spcb->p_spinib->snd_semid),
    587                                                                                 gen_ercd_sys(p_spcb));
     587                                        gen_ercd_sys(p_spcb));
    588588                        }
    589589                }
     
    594594        ercd = E_OK;
    595595
    596   error_exit:
    597         return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
     596error_exit:
     597        return (reacnt > 0U ? (ER_UINT)reacnt : ercd);
    598598}
    599599
     
    604604serial_ctl_por(ID portid, uint_t ioctl)
    605605{
    606         SPCB    *p_spcb;
    607 
    608         if (sns_dpn()) {                                /* コンテキストのチェック */
    609                 return(E_CTX);
     606        SPCB *p_spcb;
     607
     608        if (sns_dpn()) { /* コンテキストのチェック */
     609                return (E_CTX);
    610610        }
    611611        if (!(1 <= portid && portid <= TNUM_PORT)) {
    612                 return(E_ID);                           /* ポート番号のチェック */
     612                return (E_ID); /* ポート番号のチェック */
    613613        }
    614614
    615615        p_spcb = get_spcb(portid);
    616         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    617                 return(E_OBJ);
    618         }
    619         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    620                 return(E_SYS);
     616        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     617                return (E_OBJ);
     618        }
     619        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     620                return (E_SYS);
    621621        }
    622622
    623623        p_spcb->ioctl = ioctl;
    624         return(E_OK);
     624        return (E_OK);
    625625}
    626626
     
    631631serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
    632632{
    633         SPCB    *p_spcb;
    634 
    635         if (sns_dpn()) {                                /* コンテキストのチェック */
    636                 return(E_CTX);
     633        SPCB *p_spcb;
     634
     635        if (sns_dpn()) { /* コンテキストのチェック */
     636                return (E_CTX);
    637637        }
    638638        if (!(1 <= portid && portid <= TNUM_PORT)) {
    639                 return(E_ID);                           /* ポート番号のチェック */
     639                return (E_ID); /* ポート番号のチェック */
    640640        }
    641641
    642642        p_spcb = get_spcb(portid);
    643         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    644                 return(E_OBJ);
    645         }
    646         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    647                 return(E_SYS);
     643        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     644                return (E_OBJ);
     645        }
     646        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     647                return (E_SYS);
    648648        }
    649649
    650650        pk_rpor->reacnt = p_spcb->rcv_count;
    651651        pk_rpor->wricnt = p_spcb->snd_count;
    652         return(E_OK);
     652        return (E_OK);
    653653}
    654654
     
    659659sio_irdy_snd(intptr_t exinf)
    660660{
    661         SPCB    *p_spcb;
    662 
    663         p_spcb = (SPCB *) exinf;
    664         if (p_spcb->rcv_fc_chr != '\0') {
    665                 /*
    666                  *  START/STOP を送信する.
    667                  */
    668                 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr);
    669                 p_spcb->rcv_fc_chr = '\0';
    670         }
    671         else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
    672                 /*
    673                  *  送信バッファ中から文字を取り出して送信する.
    674                  */
    675                 (void) sio_snd_chr(p_spcb->p_siopcb,
    676                                         p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]);
    677                 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    678                 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
    679                         if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
    680                                 p_spcb->errorflag = true;
     661        SPCB *p_spcb;
     662
     663        p_spcb = (SPCB *)exinf;
     664        for (;;) {
     665                if (p_spcb->rcv_fc_chr != '\0') {
     666                        /*
     667                        *  START/STOP を送信する.
     668                        */
     669                        if (!sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr))
     670                                break;
     671                        p_spcb->rcv_fc_chr = '\0';
     672                }
     673                else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
     674                        /*
     675                        *  送信バッファ中から文字を取り出して送信する.
     676                        */
     677                        if (!sio_snd_chr(p_spcb->p_siopcb,
     678                                                         p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]))
     679                                break;
     680                        INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
     681                        if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
     682                                if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
     683                                        p_spcb->errorflag = true;
     684                                }
    681685                        }
    682                 }
    683                 p_spcb->snd_count--;
    684         }
    685         else {
    686                 /*
    687                  *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
    688                  */
    689                 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
     686                        p_spcb->snd_count--;
     687                }
     688                else {
     689                        /*
     690                        *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
     691                        */
     692                        sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
     693                        break;
     694                }
    690695        }
    691696}
     
    697702sio_irdy_rcv(intptr_t exinf)
    698703{
    699         SPCB    *p_spcb;
    700         char    c;
    701 
    702         p_spcb = (SPCB *) exinf;
    703         c = (char) sio_rcv_chr(p_spcb->p_siopcb);
    704         if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
    705                 /*
    706                  *  送信を一時停止する.送信中の文字はそのまま送信する.
    707                  */
    708                 p_spcb->snd_stopped = true;
    709         }
    710         else if (p_spcb->snd_stopped && (c == FC_START
    711                                 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
    712                 /*
    713                  *  送信を再開する.
    714                  */
    715                 p_spcb->snd_stopped = false;
    716                 if (p_spcb->snd_count > 0U) {
    717                         c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
    718                         if (serial_snd_chr(p_spcb, c)) {
    719                                 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    720                                 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
    721                                         if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
    722                                                 p_spcb->errorflag = true;
     704        SPCB *p_spcb;
     705        int_t c;
     706
     707        p_spcb = (SPCB *)exinf;
     708        for (;;) {
     709                c = sio_rcv_chr(p_spcb->p_siopcb);
     710                if (c < 0)
     711                        break;
     712                if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
     713                        /*
     714                        *  送信を一時停止する.送信中の文字はそのまま送信する.
     715                        */
     716                        p_spcb->snd_stopped = true;
     717                }
     718                else if (p_spcb->snd_stopped && (c == FC_START
     719                        || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
     720                        /*
     721                        *  送信を再開する.
     722                        */
     723                        p_spcb->snd_stopped = false;
     724                        if (p_spcb->snd_count > 0U) {
     725                                c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
     726                                if (serial_snd_chr(p_spcb, c)) {
     727                                        INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
     728                                        if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
     729                                                if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
     730                                                        p_spcb->errorflag = true;
     731                                                }
    723732                                        }
     733                                        p_spcb->snd_count--;
    724734                                }
    725                                 p_spcb->snd_count--;
    726735                        }
    727736                }
    728         }
    729         else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
    730                 /*
    731                  *  送信に対してフロー制御している場合,START は捨てる.
    732                  */
    733         }
    734         else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
    735                 /*
    736                  *  バッファフルの場合,受信した文字を捨てる.
    737                  */
    738         }
    739         else {
    740                 /*
    741                  *  受信した文字を受信バッファに入れる.
    742                  */
    743                 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
    744                 INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
    745                 if (p_spcb->rcv_count == 0U) {
    746                         if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) {
    747                                 p_spcb->errorflag = true;
     737                else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
     738                        /*
     739                        *  送信に対してフロー制御している場合,START は捨てる.
     740                        */
     741                }
     742                else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
     743                        /*
     744                        *  バッファフルの場合,受信した文字を捨てる.
     745                        */
     746                }
     747                else {
     748                        /*
     749                        *  受信した文字を受信バッファに入れる.
     750                        */
     751                        p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
     752                        INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
     753                        if (p_spcb->rcv_count == 0U) {
     754                                if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) {
     755                                        p_spcb->errorflag = true;
     756                                }
    748757                        }
    749                 }
    750                 p_spcb->rcv_count++;
    751 
    752                 /*
    753                  *  STOPを送信する.
    754                  */
    755                 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
    756                                                 && p_spcb->rcv_count
    757                                                         >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) {
    758                         if (!serial_snd_chr(p_spcb, FC_STOP)) {
    759                                 p_spcb->rcv_fc_chr = FC_STOP;
     758                        p_spcb->rcv_count++;
     759
     760                        /*
     761                        *  STOPを送信する.
     762                        */
     763                        if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
     764                                && p_spcb->rcv_count >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) {
     765                                if (!serial_snd_chr(p_spcb, FC_STOP)) {
     766                                        p_spcb->rcv_fc_chr = FC_STOP;
     767                                }
     768                                p_spcb->rcv_stopped = true;
    760769                        }
    761                         p_spcb->rcv_stopped = true;
    762770                }
    763771        }
     
    770778serial_get_chr(ID portid, char *p_c)
    771779{
    772         SPCB    *p_spcb;
    773 
    774         if (1 <= portid && portid <= TNUM_PORT) {       /* ポート番号のチェック */
     780        SPCB *p_spcb;
     781
     782        if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */
    775783                p_spcb = get_spcb(portid);
    776                 if (p_spcb->openflag) {                                 /* オープン済みかのチェック */
     784                if (p_spcb->openflag) { /* オープン済みかのチェック */
    777785                        if (p_spcb->snd_count > 0U) {
    778786                                *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
    779787                                INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    780788                                p_spcb->snd_count--;
    781                                 return(true);
     789                                return (true);
    782790                        }
    783791                }
    784792        }
    785         return(false);
    786 }
     793        return (false);
     794}
Note: See TracChangeset for help on using the changeset viewer.