Ignore:
Timestamp:
Mar 8, 2016, 8:37:45 PM (8 years ago)
Author:
coas-nagasima
Message:

MIMEにSJISを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • UsbWattMeter/trunk/asp_dcre/syssvc/serial.c

    • Property svn:mime-type changed from text/x-csrc to text/x-csrc; charset=SHIFT_JIS
    r164 r167  
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
    11  *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    12  *  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    13  *  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    14  *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    15  *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    16  *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    17  *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    18  *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    19 ƒƒ“ƒgi—˜—p
    20  *      ŽÒƒ}ƒjƒ
    21 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    22  *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    23  *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    24  *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    25  *      ‚ƁD
    26  *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    27 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    28 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    29  *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    30  *    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    31  *        •ñ‚·‚邱‚ƁD
    32  *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    33  *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    34  *      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    35  *      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    36  *      –Ɛӂ·‚邱‚ƁD
     11 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     12 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     13 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     14 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     15 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     16 *      スコード中に含まれていること.
     17 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     18 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     19 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     20 *      の無保証規定を掲載すること.
     21 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     22 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     23 *      と.
     24 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     25 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     26 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     27 *        報告すること.
     28 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     29 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     30 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     31 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     32 *      免責すること.
    3733 *
    38  *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    39  *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    40  *  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    41  *  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    42  *  ‚̐ӔC‚𕉂í‚È‚¢D
     34 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     35 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     36 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     37 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     38 *  の責任を負わない.
    4339 *
    4440 *  @(#) $Id$
     
    4642
    4743/*
    48  *              ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo
     44 *              シリアルインタフェースドライバ
    4945 */
    5046
     
    5753
    5854/*
    59  *  ƒoƒbƒtƒ@ƒTƒCƒY‚̃fƒtƒHƒ‹ƒg’l‚ƃoƒbƒtƒ@‚Ì’è‹`
     55 *  バッファサイズのデフォルト値とバッファの定義
    6056 */
    6157#ifndef SERIAL_RCV_BUFSZ1
    62 #define SERIAL_RCV_BUFSZ1       256                     /* ƒ|[ƒg1‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     58#define SERIAL_RCV_BUFSZ1       256                     /* ポート1の受信バッファサイズ */
    6359#endif /* SERIAL_RCV_BUFSZ1 */
    6460
    6561#ifndef SERIAL_SND_BUFSZ1
    66 #define SERIAL_SND_BUFSZ1       256                     /* ƒ|[ƒg1‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     62#define SERIAL_SND_BUFSZ1       256                     /* ポート1の送信バッファサイズ */
    6763#endif /* SERIAL_SND_BUFSZ1 */
    6864
     
    7066static char     snd_buffer1[SERIAL_SND_BUFSZ1];
    7167
    72 #if TNUM_PORT >= 2                                              /* ƒ|[ƒg2‚ÉŠÖ‚·‚é’è‹` */
     68#if TNUM_PORT >= 2                                              /* ポート2に関する定義 */
    7369
    7470#ifndef SERIAL_RCV_BUFSZ2
    75 #define SERIAL_RCV_BUFSZ2       256                     /* ƒ|[ƒg2‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     71#define SERIAL_RCV_BUFSZ2       256                     /* ポート2の受信バッファサイズ */
    7672#endif /* SERIAL_RCV_BUFSZ2 */
    7773
    7874#ifndef SERIAL_SND_BUFSZ2
    79 #define SERIAL_SND_BUFSZ2       256                     /* ƒ|[ƒg2‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     75#define SERIAL_SND_BUFSZ2       256                     /* ポート2の送信バッファサイズ */
    8076#endif /* SERIAL_SND_BUFSZ2 */
    8177
     
    8581#endif /* TNUM_PORT >= 2 */
    8682
    87 #if TNUM_PORT >= 3                                              /* ƒ|[ƒg3‚ÉŠÖ‚·‚é’è‹` */
     83#if TNUM_PORT >= 3                                              /* ポート3に関する定義 */
    8884
    8985#ifndef SERIAL_RCV_BUFSZ3
    90 #define SERIAL_RCV_BUFSZ3       256                     /* ƒ|[ƒg3‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     86#define SERIAL_RCV_BUFSZ3       256                     /* ポート3の受信バッファサイズ */
    9187#endif /* SERIAL_RCV_BUFSZ3 */
    9288
    9389#ifndef SERIAL_SND_BUFSZ3
    94 #define SERIAL_SND_BUFSZ3       256                     /* ƒ|[ƒg3‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     90#define SERIAL_SND_BUFSZ3       256                     /* ポート3の送信バッファサイズ */
    9591#endif /* SERIAL_SND_BUFSZ3 */
    9692
     
    10096#endif /* TNUM_PORT >= 3 */
    10197
    102 #if TNUM_PORT >= 4                                              /* ƒ|[ƒg4‚ÉŠÖ‚·‚é’è‹` */
     98#if TNUM_PORT >= 4                                              /* ポート4に関する定義 */
    10399
    104100#ifndef SERIAL_RCV_BUFSZ4
    105 #define SERIAL_RCV_BUFSZ4       256                     /* ƒ|[ƒg4‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     101#define SERIAL_RCV_BUFSZ4       256                     /* ポート4の受信バッファサイズ */
    106102#endif /* SERIAL_RCV_BUFSZ4 */
    107103
    108104#ifndef SERIAL_SND_BUFSZ4
    109 #define SERIAL_SND_BUFSZ4       256                     /* ƒ|[ƒg4‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     105#define SERIAL_SND_BUFSZ4       256                     /* ポート4の送信バッファサイズ */
    110106#endif /* SERIAL_SND_BUFSZ4 */
    111107
     
    115111#endif /* TNUM_PORT >= 4 */
    116112
    117 #if TNUM_PORT >= 5                                              /* ƒ|[ƒg5‚ÉŠÖ‚·‚é’è‹` */
     113#if TNUM_PORT >= 5                                              /* ポート5に関する定義 */
    118114
    119115#ifndef SERIAL_RCV_BUFSZ5
    120 #define SERIAL_RCV_BUFSZ5       256                     /* ƒ|[ƒg5‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     116#define SERIAL_RCV_BUFSZ5       256                     /* ポート5の受信バッファサイズ */
    121117#endif /* SERIAL_RCV_BUFSZ5 */
    122118
    123119#ifndef SERIAL_SND_BUFSZ5
    124 #define SERIAL_SND_BUFSZ5       256                     /* ƒ|[ƒg5‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     120#define SERIAL_SND_BUFSZ5       256                     /* ポート5の送信バッファサイズ */
    125121#endif /* SERIAL_SND_BUFSZ5 */
    126122
     
    130126#endif /* TNUM_PORT >= 5 */
    131127
    132 #if TNUM_PORT >= 6                                              /* ƒ|[ƒg6‚ÉŠÖ‚·‚é’è‹` */
     128#if TNUM_PORT >= 6                                              /* ポート6に関する定義 */
    133129
    134130#ifndef SERIAL_RCV_BUFSZ6
    135 #define SERIAL_RCV_BUFSZ6       256                     /* ƒ|[ƒg6‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
     131#define SERIAL_RCV_BUFSZ6       256                     /* ポート6の受信バッファサイズ */
    136132#endif /* SERIAL_RCV_BUFSZ6 */
    137133
    138134#ifndef SERIAL_SND_BUFSZ6
    139 #define SERIAL_SND_BUFSZ6       256                     /* ƒ|[ƒg6‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
     135#define SERIAL_SND_BUFSZ6       256                     /* ポート6の送信バッファサイズ */
    140136#endif /* SERIAL_SND_BUFSZ6 */
    141137
     
    150146
    151147/*
    152  *  ƒtƒ[§Œä‚ÉŠÖ˜A‚·‚é’萔‚ƃ}ƒNƒ
    153  */
    154 #define FC_STOP                 '\023'          /* ƒRƒ“ƒgƒ[ƒ‹-S */
    155 #define FC_START                '\021'          /* ƒRƒ“ƒgƒ[ƒ‹-Q */
    156 
    157 #define BUFCNT_STOP(bufsz)              ((bufsz) * 3 / 4)       /* STOP‚ð‘—‚éŠî€•¶Žš” */
    158 #define BUFCNT_START(bufsz)             ((bufsz) / 2)           /* START‚ð‘—‚éŠî€•¶Žš” */
    159 
    160 /*
    161  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‰Šú‰»ƒuƒƒbƒN
     148 *  フロー制御に関連する定数とマクロ
     149 */
     150#define FC_STOP                 '\023'          /* コントロール-S */
     151#define FC_START                '\021'          /* コントロール-Q */
     152
     153#define BUFCNT_STOP(bufsz)              ((bufsz) * 3 / 4)       /* STOPを送る基準文字数 */
     154#define BUFCNT_START(bufsz)             ((bufsz) / 2)           /* STARTを送る基準文字数 */
     155
     156/*
     157 *  シリアルポート初期化ブロック
    162158 */
    163159typedef struct serial_port_initialization_block {
    164         ID              rcv_semid;              /* ŽóMƒoƒbƒtƒ@ŠÇ——pƒZƒ}ƒtƒH‚ÌID */
    165         ID              snd_semid;              /* ‘—Mƒoƒbƒtƒ@ŠÇ——pƒZƒ}ƒtƒH‚ÌID */
    166         uint_t  rcv_bufsz;              /* ŽóMƒoƒbƒtƒ@ƒTƒCƒY */
    167         char    *rcv_buffer;    /* ŽóMƒoƒbƒtƒ@ */
    168         uint_t  snd_bufsz;              /* ‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
    169         char    *snd_buffer;    /* ‘—Mƒoƒbƒtƒ@ */
     160        ID              rcv_semid;              /* 受信バッファ管理用セマフォのID */
     161        ID              snd_semid;              /* 送信バッファ管理用セマフォのID */
     162        uint_t  rcv_bufsz;              /* 受信バッファサイズ */
     163        char    *rcv_buffer;    /* 受信バッファ */
     164        uint_t  snd_bufsz;              /* 送信バッファサイズ */
     165        char    *snd_buffer;    /* 送信バッファ */
    170166} SPINIB;
    171167
     
    192188
    193189/*
    194  *  ƒVƒŠƒAƒ‹ƒ|[ƒgŠÇ—ƒuƒƒbƒN
     190 *  シリアルポート管理ブロック
    195191 */
    196192typedef struct serial_port_control_block {
    197         const SPINIB *p_spinib;         /* ƒVƒŠƒAƒ‹ƒ|[ƒg‰Šú‰»ƒuƒƒbƒN */
    198         SIOPCB  *p_siopcb;                      /* ƒVƒŠƒAƒ‹I/Oƒ|[ƒgŠÇ—ƒuƒƒbƒN */
    199         bool_t  openflag;                       /* ƒI[ƒvƒ“Ï‚݃tƒ‰ƒO */
    200         bool_t  errorflag;                      /* ƒGƒ‰[ƒtƒ‰ƒO */
    201         uint_t  ioctl;                          /* “®ì§Œä‚̐ݒè’l */
    202 
    203         uint_t  rcv_read_ptr;           /* ŽóMƒoƒbƒtƒ@“Ǐo‚µƒ|ƒCƒ“ƒ^ */
    204         uint_t  rcv_write_ptr;          /* ŽóMƒoƒbƒtƒ@‘ž‚݃|ƒCƒ“ƒ^ */
    205         uint_t  rcv_count;                      /* ŽóMƒoƒbƒtƒ@’†‚Ì•¶Žš” */
    206         char    rcv_fc_chr;                     /* ‘—‚é‚ׂ«START/STOP */
    207         bool_t  rcv_stopped;            /* STOP‚ð‘—‚Á‚½ó‘Ô‚©H */
    208 
    209         uint_t  snd_read_ptr;           /* ‘—Mƒoƒbƒtƒ@“Ǐo‚µƒ|ƒCƒ“ƒ^ */
    210         uint_t  snd_write_ptr;          /* ‘—Mƒoƒbƒtƒ@‘ž‚݃|ƒCƒ“ƒ^ */
    211         uint_t  snd_count;                      /* ‘—Mƒoƒbƒtƒ@’†‚Ì•¶Žš” */
    212         bool_t  snd_stopped;            /* STOP‚ðŽó‚¯Žæ‚Á‚½ó‘Ô‚©H */
     193        const SPINIB *p_spinib;         /* シリアルポート初期化ブロック */
     194        SIOPCB  *p_siopcb;                      /* シリアルI/Oポート管理ブロック */
     195        bool_t  openflag;                       /* オープン済みフラグ */
     196        bool_t  errorflag;                      /* エラーフラグ */
     197        uint_t  ioctl;                          /* 動作制御の設定値 */
     198
     199        uint_t  rcv_read_ptr;           /* 受信バッファ読出しポインタ */
     200        uint_t  rcv_write_ptr;          /* 受信バッファ書込みポインタ */
     201        uint_t  rcv_count;                      /* 受信バッファ中の文字数 */
     202        char    rcv_fc_chr;                     /* 送るべきSTART/STOP */
     203        bool_t  rcv_stopped;            /* STOPを送った状態か? */
     204
     205        uint_t  snd_read_ptr;           /* 送信バッファ読出しポインタ */
     206        uint_t  snd_write_ptr;          /* 送信バッファ書込みポインタ */
     207        uint_t  snd_count;                      /* 送信バッファ中の文字数 */
     208        bool_t  snd_stopped;            /* STOPを受け取った状態か? */
    213209} SPCB;
    214210
     
    216212
    217213/*
    218  *  ƒVƒŠƒAƒ‹ƒ|[ƒgID‚©‚çƒVƒŠƒAƒ‹ƒ|[ƒgŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
     214 *  シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ
    219215 */
    220216#define INDEX_PORT(portid)      ((uint_t)((portid) - 1))
     
    222218
    223219/*
    224  *  ƒ|ƒCƒ“ƒ^‚̃Cƒ“ƒNƒŠƒƒ“ƒg
     220 *  ポインタのインクリメント
    225221 */
    226222#define INC_PTR(ptr, bufsz) do {        \
     
    231227
    232228/*
    233  *  ƒT[ƒrƒXƒR[ƒ‹ŒÄo‚µƒ}ƒNƒ
     229 *  サービスコール呼出しマクロ
    234230 *
    235  *  ƒT[ƒrƒXƒR[ƒ‹ŒÄo‚µ‚ðŠÜ‚ÞŽ®exp‚ð•]‰¿‚µC•Ô’l‚ªƒGƒ‰[i•‰‚Ì’lj‚̏ê
    236  *  ‡‚ɂ́Cerc‚Éercd_exp‚ð•]‰¿‚µ‚½’l‚ð‘ã“ü‚µCerror_exit‚Égoto‚·‚éD
     231 *  サービスコール呼出しを含む式expを評価し,返値がエラー(負の値)の場
     232 *  合には,ercにercd_expを評価した値を代入し,error_exitにgotoする.
    237233 */
    238234#define SVC(exp, ercd_exp) do {         \
     
    244240
    245241/*
    246  *  E_SYSƒGƒ‰[‚̐¶¬
     242 *  E_SYSエラーの生成
    247243 */
    248244static ER
     
    254250
    255251/*
    256  *  ‘Ò‚¿‚É“ü‚éƒT[ƒrƒXƒR[ƒ‹‚©‚ç‚̃Gƒ‰[‚Ì•ÏŠ·
     252 *  待ちに入るサービスコールからのエラーの変換
    257253 */
    258254static ER
     
    270266
    271267/*
    272  *  ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo‚̏‰Šú‰»ƒ‹[ƒ`ƒ“
     268 *  シリアルインタフェースドライバの初期化ルーチン
    273269 */
    274270void
     
    286282
    287283/*
    288  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚̃I[ƒvƒ“iƒT[ƒrƒXƒR[ƒ‹j
     284 *  シリアルポートのオープン(サービスコール)
    289285 */
    290286ER
     
    294290        ER              ercd;
    295291
    296         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     292        if (sns_dpn()) {                                /* コンテキストのチェック */
    297293                return(E_CTX);
    298294        }
    299295        if (!(1 <= portid && portid <= TNUM_PORT)) {
    300                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     296                return(E_ID);                           /* ポート番号のチェック */
    301297        }
    302298        p_spcb = get_spcb(portid);
    303299
    304300        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    305         if (p_spcb->openflag) {                 /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     301        if (p_spcb->openflag) {                 /* オープン済みかのチェック */
    306302                ercd = E_OBJ;
    307303        }
    308304        else {
    309305                /*
    310                  *  •Ï”‚̏‰Šú‰»
     306                 *  変数の初期化
    311307                 */
    312308                p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
     
    324320
    325321                /*
    326                  *  ‚±‚êˆÈ~CŠ„ž‚Ý‚ð‹ÖŽ~‚·‚éD
     322                 *  これ以降,割込みを禁止する.
    327323                 */
    328324                if (loc_cpu() < 0) {
     
    332328
    333329                /*
    334                  *  ƒn[ƒhƒEƒFƒAˆË‘¶‚̃I[ƒvƒ“ˆ—
     330                 *  ハードウェア依存のオープン処理
    335331                 */
    336332                p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb);
    337333
    338334                /*
    339                  *  ŽóM’Ê’mƒR[ƒ‹ƒoƒbƒN‚ð‹–‰Â‚·‚éD
     335                 *  受信通知コールバックを許可する.
    340336                 */
    341337                sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV);
     
    359355
    360356/*
    361  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚̃Nƒ[ƒYiƒT[ƒrƒXƒR[ƒ‹j
     357 *  シリアルポートのクローズ(サービスコール)
    362358 */
    363359ER
     
    368364        bool_t  eflag = false;
    369365
    370         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     366        if (sns_dpn()) {                                /* コンテキストのチェック */
    371367                return(E_CTX);
    372368        }
    373369        if (!(1 <= portid && portid <= TNUM_PORT)) {
    374                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     370                return(E_ID);                           /* ポート番号のチェック */
    375371        }
    376372        p_spcb = get_spcb(portid);
    377373
    378374        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    379         if (!(p_spcb->openflag)) {              /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     375        if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    380376                ercd = E_OBJ;
    381377        }
    382378        else {
    383379                /*
    384                  *  ƒn[ƒhƒEƒFƒAˆË‘¶‚̃Nƒ[ƒYˆ—
     380                 *  ハードウェア依存のクローズ処理
    385381                 */
    386382                if (loc_cpu() < 0) {
     
    394390
    395391                /*
    396                  *  ƒZƒ}ƒtƒH‚̏‰Šú‰»
     392                 *  セマフォの初期化
    397393                 */
    398394                if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) {
     
    404400
    405401                /*
    406                  *  ƒGƒ‰[ƒR[ƒh‚̐ݒè
     402                 *  エラーコードの設定
    407403                 */
    408404                if (eflag) {
     
    420416
    421417/*
    422  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì•¶Žš‘—M
     418 *  シリアルポートへの文字送信
    423419 *
    424  *  p_spcb‚ÅŽw’肳‚ê‚éƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚ɑ΂µ‚āC•¶Žšc‚𑗐M‚·‚éD•¶Žš
    425  *  ‚𑗐MƒŒƒWƒXƒ^‚É‚¢‚ꂽê‡‚É‚Ítrue‚ð•Ô‚·D‚»‚¤‚Å‚È‚¢ê‡‚ɂ́C‘—M
    426  *  ƒŒƒWƒXƒ^‚ª‹ó‚¢‚½‚±‚Æ‚ð’Ê’m‚·‚éƒR[ƒ‹ƒoƒbƒNŠÖ”‚ð‹–‰Â‚µCfalse‚ð•Ô‚·D
    427  *  ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԂŌĂяo‚³‚ê‚éD
     420 *  p_spcbで指定されるシリアルI/Oポートに対して,文字cを送信する.文字
     421 *  を送信レジスタにいれた場合にはtrueを返す.そうでない場合には,送信
     422 *  レジスタが空いたことを通知するコールバック関数を許可し,falseを返す.
     423 *  この関数は,CPUロック状態で呼び出される.
    428424 */
    429425Inline bool_t
     
    440436
    441437/*
    442  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì1•¶Žš‘—M
     438 *  シリアルポートへの1文字送信
    443439 */
    444440static ER_BOOL
     
    449445
    450446        /*
    451          *  LF‚Ì‘O‚ÉCR‚𑗐M‚·‚éD
     447         *  LFの前にCRを送信する.
    452448         */
    453449        if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) {
    454450                /*
    455                  *  ˆÈ‰º‚̃R[ƒh‚͍ċAŒÄo‚µ‚É‚È‚Á‚Ä‚¢‚邪Cˆø”c‚ª'\n'‚̏ꍇ‚É
    456                  *  ˆø”c‚ð'\r'‚Æ‚µ‚ČĂяo‚·‚±‚Æ‚©‚çC‚±‚̍ċAŒÄo‚µ‚Í2‰ñ–Ú‚Ì
    457                  *  ŒÄ‚яo‚µ‚Å•K‚¸Ž~‚Ü‚éD
     451                 *  以下のコードは再帰呼出しになっているが,引数cが'\n'の場合に
     452                 *  引数cを'\r'として呼び出すことから,この再帰呼出しは2回目の
     453                 *  呼び出しで必ず止まる.
    458454                 */
    459455                SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd);
     
    468464                                                                && serial_snd_chr(p_spcb, c)) {
    469465                /*
    470                  *  ƒVƒŠƒAƒ‹I/OƒfƒoƒCƒX‚Ì‘—MƒŒƒWƒXƒ^‚É•¶Žš‚ð“ü‚ê‚邱‚Ƃɐ¬Œ÷‚µ
    471                  *  ‚½ê‡D
     466                 *  シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し
     467                 *  た場合.
    472468                 */
    473469                buffer_full = false;
     
    475471        else {
    476472                /*
    477                  *  ‘—Mƒoƒbƒtƒ@‚É•¶Žš‚ð“ü‚ê‚éD
     473                 *  送信バッファに文字を入れる.
    478474                 */
    479475                p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c;
     
    491487
    492488/*
    493  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì•¶Žš—ñ‘—MiƒT[ƒrƒXƒR[ƒ‹j
     489 *  シリアルポートへの文字列送信(サービスコール)
    494490 */
    495491ER_UINT
     
    501497        ER              ercd, rercd;
    502498
    503         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     499        if (sns_dpn()) {                                /* コンテキストのチェック */
    504500                return(E_CTX);
    505501        }
    506502        if (!(1 <= portid && portid <= TNUM_PORT)) {
    507                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     503                return(E_ID);                           /* ポート番号のチェック */
    508504        }
    509505
    510506        p_spcb = get_spcb(portid);
    511         if (!(p_spcb->openflag)) {              /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     507        if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    512508                return(E_OBJ);
    513509        }
    514         if (p_spcb->errorflag) {                /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
     510        if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    515511                return(E_SYS);
    516512        }
    517513
    518         buffer_full = true;                             /* ƒ‹[ƒv‚Ì1‰ñ‚ß‚Íwai_sem‚·‚é */
     514        buffer_full = true;                             /* ループの1回めはwai_semする */
    519515        while (wricnt < len) {
    520516                if (buffer_full) {
     
    536532
    537533/*
    538  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì1•¶ŽšŽóM
     534 *  シリアルポートからの1文字受信
    539535 */
    540536static bool_t
     
    547543
    548544        /*
    549          *  ŽóMƒoƒbƒtƒ@‚©‚當Žš‚ðŽæ‚èo‚·D
     545         *  受信バッファから文字を取り出す.
    550546         */
    551547        *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr];
     
    555551
    556552        /*
    557          *  START‚𑗐M‚·‚éD
     553         *  STARTを送信する.
    558554         */
    559555        if (p_spcb->rcv_stopped && p_spcb->rcv_count
     
    573569
    574570/*
    575  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì•¶Žš—ñŽóMiƒT[ƒrƒXƒR[ƒ‹j
     571 *  シリアルポートからの文字列受信(サービスコール)
    576572 */
    577573ER_UINT
     
    581577        bool_t  buffer_empty;
    582578        uint_t  reacnt = 0U;
    583         char    c = '\0';               /* ƒRƒ“ƒpƒCƒ‰‚ÌŒx‚ð—}Ž~‚·‚邽‚߂ɏ‰Šú‰»‚·‚é */
     579        char    c = '\0';               /* コンパイラの警告を抑止するために初期化する */
    584580        ER              ercd, rercd;
    585581
    586         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     582        if (sns_dpn()) {                                /* コンテキストのチェック */
    587583                return(E_CTX);
    588584        }
    589585        if (!(1 <= portid && portid <= TNUM_PORT)) {
    590                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     586                return(E_ID);                           /* ポート番号のチェック */
    591587        }
    592588
    593589        p_spcb = get_spcb(portid);
    594         if (!(p_spcb->openflag)) {              /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     590        if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    595591                return(E_OBJ);
    596592        }
    597         if (p_spcb->errorflag) {                /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
     593        if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    598594                return(E_SYS);
    599595        }
    600596
    601         buffer_empty = true;                    /* ƒ‹[ƒv‚Ì1‰ñ‚ß‚Íwai_sem‚·‚é */
     597        buffer_empty = true;                    /* ループの1回めはwai_semする */
    602598        while (reacnt < len) {
    603599                if (buffer_empty) {
     
    611607
    612608                /*
    613                  *  ƒGƒR[ƒoƒbƒNˆ—D
     609                 *  エコーバック処理.
    614610                 */
    615611                if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) {
     
    633629
    634630/*
    635  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚̐§ŒäiƒT[ƒrƒXƒR[ƒ‹j
     631 *  シリアルポートの制御(サービスコール)
    636632 */
    637633ER
     
    640636        SPCB    *p_spcb;
    641637
    642         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     638        if (sns_dpn()) {                                /* コンテキストのチェック */
    643639                return(E_CTX);
    644640        }
    645641        if (!(1 <= portid && portid <= TNUM_PORT)) {
    646                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     642                return(E_ID);                           /* ポート番号のチェック */
    647643        }
    648644
    649645        p_spcb = get_spcb(portid);
    650         if (!(p_spcb->openflag)) {              /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     646        if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    651647                return(E_OBJ);
    652648        }
    653         if (p_spcb->errorflag) {                /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
     649        if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    654650                return(E_SYS);
    655651        }
     
    660656
    661657/*
    662  *  ƒVƒŠƒAƒ‹ƒ|[ƒgó‘Ô‚ÌŽQÆiƒT[ƒrƒXƒR[ƒ‹j
     658 *  シリアルポート状態の参照(サービスコール)
    663659 */
    664660ER
     
    667663        SPCB    *p_spcb;
    668664
    669         if (sns_dpn()) {                                /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
     665        if (sns_dpn()) {                                /* コンテキストのチェック */
    670666                return(E_CTX);
    671667        }
    672668        if (!(1 <= portid && portid <= TNUM_PORT)) {
    673                 return(E_ID);                           /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     669                return(E_ID);                           /* ポート番号のチェック */
    674670        }
    675671
    676672        p_spcb = get_spcb(portid);
    677         if (!(p_spcb->openflag)) {              /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     673        if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    678674                return(E_OBJ);
    679675        }
    680         if (p_spcb->errorflag) {                /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
     676        if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    681677                return(E_SYS);
    682678        }
     
    688684
    689685/*
    690  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì‘—M‰Â”\ƒR[ƒ‹ƒoƒbƒN
     686 *  シリアルポートからの送信可能コールバック
    691687 */
    692688void
     
    698694        if (p_spcb->rcv_fc_chr != '\0') {
    699695                /*
    700                  *  START/STOP ‚𑗐M‚·‚éD
     696                 *  START/STOP を送信する.
    701697                 */
    702698                (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr);
     
    705701        else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
    706702                /*
    707                  *  ‘—Mƒoƒbƒtƒ@’†‚©‚當Žš‚ðŽæ‚èo‚µ‚Ä‘—M‚·‚éD
     703                 *  送信バッファ中から文字を取り出して送信する.
    708704                 */
    709705                (void) sio_snd_chr(p_spcb->p_siopcb,
     
    719715        else {
    720716                /*
    721                  *  ‘—M‚·‚ׂ«•¶Žš‚ª‚È‚¢ê‡‚́C‘—M‰Â”\ƒR[ƒ‹ƒoƒbƒN‚ð‹ÖŽ~‚·‚éD
     717                 *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
    722718                 */
    723719                sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
     
    726722
    727723/*
    728  *  ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚ÌŽóM’Ê’mƒR[ƒ‹ƒoƒbƒN
     724 *  シリアルポートからの受信通知コールバック
    729725 */
    730726void
     
    738734        if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
    739735                /*
    740                  *  ‘—M‚ðˆêŽž’âŽ~‚·‚éD‘—M’†‚Ì•¶Žš‚Í‚»‚Ì‚Ü‚Ü‘—M‚·‚éD
     736                 *  送信を一時停止する.送信中の文字はそのまま送信する.
    741737                 */
    742738                p_spcb->snd_stopped = true;
     
    745741                                || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
    746742                /*
    747                  *  ‘—M‚ðÄŠJ‚·‚éD
     743                 *  送信を再開する.
    748744                 */
    749745                p_spcb->snd_stopped = false;
     
    763759        else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
    764760                /*
    765                  *  ‘—M‚ɑ΂µ‚ătƒ[§Œä‚µ‚Ä‚¢‚éê‡CSTART ‚ÍŽÌ‚Ä‚éD
     761                 *  送信に対してフロー制御している場合,START は捨てる.
    766762                 */
    767763        }
    768764        else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
    769765                /*
    770                  *  ƒoƒbƒtƒ@ƒtƒ‹‚̏ꍇCŽóM‚µ‚½•¶Žš‚ðŽÌ‚Ä‚éD
     766                 *  バッファフルの場合,受信した文字を捨てる.
    771767                 */
    772768        }
    773769        else {
    774770                /*
    775                  *  ŽóM‚µ‚½•¶Žš‚ðŽóMƒoƒbƒtƒ@‚É“ü‚ê‚éD
     771                 *  受信した文字を受信バッファに入れる.
    776772                 */
    777773                p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
     
    785781
    786782                /*
    787                  *  STOP‚𑗐M‚·‚éD
     783                 *  STOPを送信する.
    788784                 */
    789785                if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
     
    799795
    800796/*
    801  *  ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo‚©‚ç‚Ì–¢‘—M•¶Žš‚ÌŽæo‚µ
     797 *  シリアルインタフェースドライバからの未送信文字の取出し
    802798 */
    803799bool_t
     
    806802        SPCB    *p_spcb;
    807803
    808         if (1 <= portid && portid <= TNUM_PORT) {       /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
     804        if (1 <= portid && portid <= TNUM_PORT) {       /* ポート番号のチェック */
    809805                p_spcb = get_spcb(portid);
    810                 if (p_spcb->openflag) {                                 /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
     806                if (p_spcb->openflag) {                                 /* オープン済みかのチェック */
    811807                        if (p_spcb->snd_count > 0U) {
    812808                                *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
Note: See TracChangeset for help on using the changeset viewer.