Changeset 315 for rubycfg_asp/trunk/asp_dcre/syssvc/serial.c
- Timestamp:
- Jul 23, 2017, 2:29:40 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rubycfg_asp/trunk/asp_dcre/syssvc/serial.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=UTF-8
r313 r315 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ä¸è¨èä½æ¨©è 12 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 13 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 14 * å¤ã»åé 15 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 16 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 17 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 18 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 19 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 20 * ç¨ã§ããå½¢ã§åé 21 å¸ããå ´åã«ã¯ï¼åé 22 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 23 * è 24 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 25 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 26 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 27 * ç¨ã§ããªãå½¢ã§åé 28 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 29 * ã¨ï¼ 30 * (a) åé 31 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 32 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 33 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 34 * (b) åé 35 å¸ã®å½¢æ 36 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 37 * å ±åãããã¨ï¼ 38 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 39 * 害ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ããå 41 責ãããã¨ï¼ 42 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 43 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 44 ããã³TOPPERSããã¸ã§ã¯ãã 45 * å 46 責ãããã¨ï¼ 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 * 免責すること. 47 33 * 48 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 49 ã 50 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 51 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 52 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 53 * ã®è²¬ä»»ãè² ããªãï¼ 34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 54 39 * 55 40 * @(#) $Id$ … … 57 42 58 43 /* 59 * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ã44 * シリアルインタフェースドライバ 60 45 */ 61 46 … … 68 53 69 54 /* 70 * ãããã¡ãµã¤ãºã®ããã©ã«ãå¤ã¨ãããã¡ã®å®ç¾©55 * バッファサイズのデフォルト値とバッファの定義 71 56 */ 72 57 #ifndef SERIAL_RCV_BUFSZ1 73 #define SERIAL_RCV_BUFSZ1 256 /* ãã¼ã1ã®åä¿¡ãããã¡ãµã¤ãº*/58 #define SERIAL_RCV_BUFSZ1 256 /* ポート1の受信バッファサイズ */ 74 59 #endif /* SERIAL_RCV_BUFSZ1 */ 75 60 76 61 #ifndef SERIAL_SND_BUFSZ1 77 #define SERIAL_SND_BUFSZ1 256 /* ãã¼ã1ã®éä¿¡ãããã¡ãµã¤ãº*/62 #define SERIAL_SND_BUFSZ1 256 /* ポート1の送信バッファサイズ */ 78 63 #endif /* SERIAL_SND_BUFSZ1 */ 79 64 … … 81 66 static char snd_buffer1[SERIAL_SND_BUFSZ1]; 82 67 83 #if TNUM_PORT >= 2 /* ãã¼ã2ã«é¢ããå®ç¾©*/68 #if TNUM_PORT >= 2 /* ポート2に関する定義 */ 84 69 85 70 #ifndef SERIAL_RCV_BUFSZ2 86 #define SERIAL_RCV_BUFSZ2 256 /* ãã¼ã2ã®åä¿¡ãããã¡ãµã¤ãº*/71 #define SERIAL_RCV_BUFSZ2 256 /* ポート2の受信バッファサイズ */ 87 72 #endif /* SERIAL_RCV_BUFSZ2 */ 88 73 89 74 #ifndef SERIAL_SND_BUFSZ2 90 #define SERIAL_SND_BUFSZ2 256 /* ãã¼ã2ã®éä¿¡ãããã¡ãµã¤ãº*/75 #define SERIAL_SND_BUFSZ2 256 /* ポート2の送信バッファサイズ */ 91 76 #endif /* SERIAL_SND_BUFSZ2 */ 92 77 … … 96 81 #endif /* TNUM_PORT >= 2 */ 97 82 98 #if TNUM_PORT >= 3 /* ãã¼ã3ã«é¢ããå®ç¾©*/83 #if TNUM_PORT >= 3 /* ポート3に関する定義 */ 99 84 100 85 #ifndef SERIAL_RCV_BUFSZ3 101 #define SERIAL_RCV_BUFSZ3 256 /* ãã¼ã3ã®åä¿¡ãããã¡ãµã¤ãº*/86 #define SERIAL_RCV_BUFSZ3 256 /* ポート3の受信バッファサイズ */ 102 87 #endif /* SERIAL_RCV_BUFSZ3 */ 103 88 104 89 #ifndef SERIAL_SND_BUFSZ3 105 #define SERIAL_SND_BUFSZ3 256 /* ãã¼ã3ã®éä¿¡ãããã¡ãµã¤ãº*/90 #define SERIAL_SND_BUFSZ3 256 /* ポート3の送信バッファサイズ */ 106 91 #endif /* SERIAL_SND_BUFSZ3 */ 107 92 … … 111 96 #endif /* TNUM_PORT >= 3 */ 112 97 113 #if TNUM_PORT >= 4 /* ãã¼ã4ã«é¢ããå®ç¾©*/98 #if TNUM_PORT >= 4 /* ポート4に関する定義 */ 114 99 115 100 #ifndef SERIAL_RCV_BUFSZ4 116 #define SERIAL_RCV_BUFSZ4 256 /* ãã¼ã4ã®åä¿¡ãããã¡ãµã¤ãº*/101 #define SERIAL_RCV_BUFSZ4 256 /* ポート4の受信バッファサイズ */ 117 102 #endif /* SERIAL_RCV_BUFSZ4 */ 118 103 119 104 #ifndef SERIAL_SND_BUFSZ4 120 #define SERIAL_SND_BUFSZ4 256 /* ãã¼ã4ã®éä¿¡ãããã¡ãµã¤ãº*/105 #define SERIAL_SND_BUFSZ4 256 /* ポート4の送信バッファサイズ */ 121 106 #endif /* SERIAL_SND_BUFSZ4 */ 122 107 … … 131 116 132 117 /* 133 * ããã¼å¶å¾¡ã«é¢é£ããå®æ°ã¨ãã¯ã134 */ 135 #define FC_STOP '\023' /* ã³ã³ããã¼ã«-S */136 #define FC_START '\021' /* ã³ã³ããã¼ã«-Q */137 138 #define BUFCNT_STOP(bufsz) ((bufsz) * 3 / 4) /* STOP ãéãåºæºæåæ°*/139 #define BUFCNT_START(bufsz) ((bufsz) / 2) /* START ãéãåºæºæåæ°*/140 141 /* 142 * ã·ãªã¢ã«ãã¼ãåæåãããã¯118 * フロー制御に関連する定数とマクロ 119 */ 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を送る基準文字数 */ 125 126 /* 127 * シリアルポート初期化ブロック 143 128 */ 144 129 typedef struct serial_port_initialization_block { 145 ID rcv_semid; /* åä¿¡ãããã¡ç®¡çç¨ã»ããã©ã®ID */146 ID snd_semid; /* éä¿¡ãããã¡ç®¡çç¨ã»ããã©ã®ID */147 uint_t rcv_bufsz; /* åä¿¡ãããã¡ãµã¤ãº*/148 char *rcv_buffer; /* åä¿¡ãããã¡*/149 uint_t snd_bufsz; /* éä¿¡ãããã¡ãµã¤ãº*/150 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; /* 送信バッファ */ 151 136 } SPINIB; 152 137 … … 173 158 174 159 /* 175 * ã·ãªã¢ã«ãã¼ã管çãããã¯160 * シリアルポート管理ブロック 176 161 */ 177 162 typedef struct serial_port_control_block { 178 const SPINIB *p_spinib; /* ã·ãªã¢ã«ãã¼ãåæåããã㯠*/ 179 SIOPCB *p_siopcb; /* ã·ãªã¢ã«I/Oãã¼ã管çããã㯠*/ 180 bool_t openflag; /* ãªã¼ãã³æ¸ã¿ãã©ã° */ 181 bool_t errorflag; /* ã¨ã©ã¼ãã©ã° */ 182 uint_t ioctl; /* åä½å¶å¾¡ã®è¨å®å¤ */ 183 184 uint_t rcv_read_ptr; /* åä¿¡ãããã¡èªåºããã¤ã³ã¿ */ 185 uint_t rcv_write_ptr; /* åä¿¡ãããã¡æ¸è¾¼ã¿ãã¤ã³ã¿ */ 186 uint_t rcv_count; /* åä¿¡ãããã¡ä¸ã®æåæ° */ 187 char rcv_fc_chr; /* éãã¹ãSTART/STOP */ 188 bool_t rcv_stopped; /* STOPãéã£ãç¶æ 189 ãï¼ */ 190 191 uint_t snd_read_ptr; /* éä¿¡ãããã¡èªåºããã¤ã³ã¿ */ 192 uint_t snd_write_ptr; /* éä¿¡ãããã¡æ¸è¾¼ã¿ãã¤ã³ã¿ */ 193 uint_t snd_count; /* éä¿¡ãããã¡ä¸ã®æåæ° */ 194 bool_t snd_stopped; /* STOPãåãåã£ãç¶æ 195 ãï¼ */ 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を受け取った状態か? */ 196 179 } SPCB; 197 180 … … 199 182 200 183 /* 201 * ã·ãªã¢ã«ãã¼ãIDããã·ãªã¢ã«ãã¼ã管çãããã¯ãåãåºãããã®ãã¯ã184 * シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ 202 185 */ 203 186 #define INDEX_PORT(portid) ((uint_t)((portid) - 1)) … … 205 188 206 189 /* 207 * ãã¤ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã190 * ポインタのインクリメント 208 191 */ 209 192 #define INC_PTR(ptr, bufsz) do { \ … … 214 197 215 198 /* 216 * ãµã¼ãã¹ã³ã¼ã«å¼åºããã¯ã199 * サービスコール呼出しマクロ 217 200 * 218 * ãµã¼ãã¹ã³ã¼ã«å¼åºããå«ãå¼expãè©ä¾¡ãï¼è¿å¤ãã¨ã©ã¼ï¼è² ã®å¤ï¼ã®å ´ 219 * åã«ã¯ï¼ercã«ercd_expãè©ä¾¡ããå¤ã代å 220 ¥ãï¼error_exitã«gotoããï¼ 201 * サービスコール呼出しを含む式expを評価し,返値がエラー(負の値)の場 202 * 合には,ercにercd_expを評価した値を代入し,error_exitにgotoする. 221 203 */ 222 204 #define SVC(exp, ercd_exp) do { \ … … 228 210 229 211 /* 230 * E_SYS ã¨ã©ã¼ã®çæ212 * E_SYSエラーの生成 231 213 */ 232 214 static ER … … 238 220 239 221 /* 240 * å¾ 241 ã¡ã«å 242 ¥ããµã¼ãã¹ã³ã¼ã«ããã®ã¨ã©ã¼ã®å¤æ 222 * 待ちに入るサービスコールからのエラーの変換 243 223 */ 244 224 static ER … … 256 236 257 237 /* 258 * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®åæåã«ã¼ãã³238 * シリアルインタフェースドライバの初期化ルーチン 259 239 */ 260 240 void … … 272 252 273 253 /* 274 * ã·ãªã¢ã«ãã¼ãã®ãªã¼ãã³ï¼ãµã¼ãã¹ã³ã¼ã«ï¼254 * シリアルポートのオープン(サービスコール) 275 255 */ 276 256 ER … … 280 260 ER ercd; 281 261 282 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/262 if (sns_dpn()) { /* コンテキストのチェック */ 283 263 return(E_CTX); 284 264 } 285 265 if (!(1 <= portid && portid <= TNUM_PORT)) { 286 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/266 return(E_ID); /* ポート番号のチェック */ 287 267 } 288 268 p_spcb = get_spcb(portid); 289 269 290 270 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 291 if (p_spcb->openflag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/271 if (p_spcb->openflag) { /* オープン済みかのチェック */ 292 272 ercd = E_OBJ; 293 273 } 294 274 else { 295 275 /* 296 * å¤æ°ã®åæå276 * 変数の初期化 297 277 */ 298 278 p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); … … 310 290 311 291 /* 312 * ãã以éï¼å²è¾¼ã¿ãç¦æ¢ããï¼292 * これ以降,割込みを禁止する. 313 293 */ 314 294 if (loc_cpu() < 0) { … … 318 298 319 299 /* 320 * ãã¼ãã¦ã§ã¢ä¾åã®ãªã¼ãã³å¦ç300 * ハードウェア依存のオープン処理 321 301 */ 322 302 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb); 323 303 324 304 /* 325 * åä¿¡éç¥ã³ã¼ã«ããã¯ã許å¯ããï¼305 * 受信通知コールバックを許可する. 326 306 */ 327 307 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV); … … 345 325 346 326 /* 347 * ã·ãªã¢ã«ãã¼ãã®ã¯ãã¼ãºï¼ãµã¼ãã¹ã³ã¼ã«ï¼327 * シリアルポートのクローズ(サービスコール) 348 328 */ 349 329 ER … … 354 334 bool_t eflag = false; 355 335 356 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/336 if (sns_dpn()) { /* コンテキストのチェック */ 357 337 return(E_CTX); 358 338 } 359 339 if (!(1 <= portid && portid <= TNUM_PORT)) { 360 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/340 return(E_ID); /* ポート番号のチェック */ 361 341 } 362 342 p_spcb = get_spcb(portid); 363 343 364 344 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 365 if (!(p_spcb->openflag)) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/345 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 366 346 ercd = E_OBJ; 367 347 } 368 348 else { 369 349 /* 370 * ãã¼ãã¦ã§ã¢ä¾åã®ã¯ãã¼ãºå¦ç350 * ハードウェア依存のクローズ処理 371 351 */ 372 352 if (loc_cpu() < 0) { … … 380 360 381 361 /* 382 * ã»ããã©ã®åæå362 * セマフォの初期化 383 363 */ 384 364 if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) { … … 390 370 391 371 /* 392 * ã¨ã©ã¼ã³ã¼ãã®è¨å®372 * エラーコードの設定 393 373 */ 394 374 if (eflag) { … … 406 386 407 387 /* 408 * ã·ãªã¢ã«ãã¼ãã¸ã®æåéä¿¡388 * シリアルポートへの文字送信 409 389 * 410 * p_spcbã§æå®ãããã·ãªã¢ã«I/Oãã¼ãã«å¯¾ãã¦ï¼æåcãéä¿¡ããï¼æå 411 * ãéä¿¡ã¬ã¸ã¹ã¿ã«ãããå ´åã«ã¯trueãè¿ãï¼ããã§ãªãå ´åã«ã¯ï¼éä¿¡ 412 * ã¬ã¸ã¹ã¿ã空ãããã¨ãéç¥ããã³ã¼ã«ããã¯é¢æ°ã許å¯ãï¼falseãè¿ãï¼ 413 * ãã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 414 ã§å¼ã³åºãããï¼ 390 * p_spcbで指定されるシリアルI/Oポートに対して,文字cを送信する.文字 391 * を送信レジスタにいれた場合にはtrueを返す.そうでない場合には,送信 392 * レジスタが空いたことを通知するコールバック関数を許可し,falseを返す. 393 * この関数は,CPUロック状態で呼び出される. 415 394 */ 416 395 Inline bool_t … … 427 406 428 407 /* 429 * ã·ãªã¢ã«ãã¼ãã¸ã®1æåéä¿¡408 * シリアルポートへの1文字送信 430 409 */ 431 410 static ER_BOOL … … 436 415 437 416 /* 438 * LF ã®åã«CRãéä¿¡ããï¼417 * LFの前にCRを送信する. 439 418 */ 440 419 if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) { 441 420 /* 442 * 以ä¸ã®ã³ã¼ãã¯å帰å¼åºãã«ãªã£ã¦ãããï¼å¼æ°cã'\n'ã®å ´åã« 443 * å¼æ°cã'\r'ã¨ãã¦å¼ã³åºããã¨ããï¼ãã®å帰å¼åºãã¯2åç®ã® 444 * å¼ã³åºãã§å¿ 445 ãæ¢ã¾ãï¼ 421 * 以下のコードは再帰呼出しになっているが,引数cが'\n'の場合に 422 * 引数cを'\r'として呼び出すことから,この再帰呼出しは2回目の 423 * 呼び出しで必ず止まる. 446 424 */ 447 425 SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd); … … 456 434 && serial_snd_chr(p_spcb, c)) { 457 435 /* 458 * ã·ãªã¢ã«I/Oããã¤ã¹ã®éä¿¡ã¬ã¸ã¹ã¿ã«æåãå 459 ¥ãããã¨ã«æåã 460 * ãå ´åï¼ 436 * シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し 437 * た場合. 461 438 */ 462 439 buffer_full = false; … … 464 441 else { 465 442 /* 466 * éä¿¡ãããã¡ã«æåãå 467 ¥ããï¼ 443 * 送信バッファに文字を入れる. 468 444 */ 469 445 p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c; … … 481 457 482 458 /* 483 * ã·ãªã¢ã«ãã¼ãã¸ã®æååéä¿¡ï¼ãµã¼ãã¹ã³ã¼ã«ï¼459 * シリアルポートへの文字列送信(サービスコール) 484 460 */ 485 461 ER_UINT … … 491 467 ER ercd, rercd; 492 468 493 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/469 if (sns_dpn()) { /* コンテキストのチェック */ 494 470 return(E_CTX); 495 471 } 496 472 if (!(1 <= portid && portid <= TNUM_PORT)) { 497 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/473 return(E_ID); /* ポート番号のチェック */ 498 474 } 499 475 500 476 p_spcb = get_spcb(portid); 501 if (!(p_spcb->openflag)) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/477 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 502 478 return(E_OBJ); 503 479 } 504 if (p_spcb->errorflag) { /* ã¨ã©ã¼ç¶æ 505 ãã®ãã§ã㯠*/ 480 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 506 481 return(E_SYS); 507 482 } 508 483 509 buffer_full = true; /* ã«ã¼ãã®1åãã¯wai_semãã*/484 buffer_full = true; /* ループの1回めはwai_semする */ 510 485 while (wricnt < len) { 511 486 if (buffer_full) { … … 527 502 528 503 /* 529 * ã·ãªã¢ã«ãã¼ãããã®1æååä¿¡504 * シリアルポートからの1文字受信 530 505 */ 531 506 static bool_t … … 538 513 539 514 /* 540 * åä¿¡ãããã¡ããæåãåãåºãï¼515 * 受信バッファから文字を取り出す. 541 516 */ 542 517 *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr]; … … 546 521 547 522 /* 548 * START ãéä¿¡ããï¼523 * STARTを送信する. 549 524 */ 550 525 if (p_spcb->rcv_stopped && p_spcb->rcv_count … … 564 539 565 540 /* 566 * ã·ãªã¢ã«ãã¼ãããã®æåååä¿¡ï¼ãµã¼ãã¹ã³ã¼ã«ï¼541 * シリアルポートからの文字列受信(サービスコール) 567 542 */ 568 543 ER_UINT … … 572 547 bool_t buffer_empty; 573 548 uint_t reacnt = 0U; 574 char c = '\0'; /* ã³ã³ãã¤ã©ã®è¦åãææ¢ããããã«åæåãã*/549 char c = '\0'; /* コンパイラの警告を抑止するために初期化する */ 575 550 ER ercd, rercd; 576 551 577 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/552 if (sns_dpn()) { /* コンテキストのチェック */ 578 553 return(E_CTX); 579 554 } 580 555 if (!(1 <= portid && portid <= TNUM_PORT)) { 581 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/556 return(E_ID); /* ポート番号のチェック */ 582 557 } 583 558 584 559 p_spcb = get_spcb(portid); 585 if (!(p_spcb->openflag)) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/560 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 586 561 return(E_OBJ); 587 562 } 588 if (p_spcb->errorflag) { /* ã¨ã©ã¼ç¶æ 589 ãã®ãã§ã㯠*/ 563 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 590 564 return(E_SYS); 591 565 } 592 566 593 buffer_empty = true; /* ã«ã¼ãã®1åãã¯wai_semãã*/567 buffer_empty = true; /* ループの1回めはwai_semする */ 594 568 while (reacnt < len) { 595 569 if (buffer_empty) { … … 603 577 604 578 /* 605 * ã¨ã³ã¼ããã¯å¦çï¼579 * エコーバック処理. 606 580 */ 607 581 if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) { … … 625 599 626 600 /* 627 * ã·ãªã¢ã«ãã¼ãã®å¶å¾¡ï¼ãµã¼ãã¹ã³ã¼ã«ï¼601 * シリアルポートの制御(サービスコール) 628 602 */ 629 603 ER … … 632 606 SPCB *p_spcb; 633 607 634 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/608 if (sns_dpn()) { /* コンテキストのチェック */ 635 609 return(E_CTX); 636 610 } 637 611 if (!(1 <= portid && portid <= TNUM_PORT)) { 638 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/612 return(E_ID); /* ポート番号のチェック */ 639 613 } 640 614 641 615 p_spcb = get_spcb(portid); 642 if (!(p_spcb->openflag)) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/616 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 643 617 return(E_OBJ); 644 618 } 645 if (p_spcb->errorflag) { /* ã¨ã©ã¼ç¶æ 646 ãã®ãã§ã㯠*/ 619 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 647 620 return(E_SYS); 648 621 } … … 653 626 654 627 /* 655 * ã·ãªã¢ã«ãã¼ãç¶æ 656 ã®åç 657 §ï¼ãµã¼ãã¹ã³ã¼ã«ï¼ 628 * シリアルポート状態の参照(サービスコール) 658 629 */ 659 630 ER … … 662 633 SPCB *p_spcb; 663 634 664 if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ãã¯*/635 if (sns_dpn()) { /* コンテキストのチェック */ 665 636 return(E_CTX); 666 637 } 667 638 if (!(1 <= portid && portid <= TNUM_PORT)) { 668 return(E_ID); /* ãã¼ãçªå·ã®ãã§ãã¯*/639 return(E_ID); /* ポート番号のチェック */ 669 640 } 670 641 671 642 p_spcb = get_spcb(portid); 672 if (!(p_spcb->openflag)) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/643 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 673 644 return(E_OBJ); 674 645 } 675 if (p_spcb->errorflag) { /* ã¨ã©ã¼ç¶æ 676 ãã®ãã§ã㯠*/ 646 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 677 647 return(E_SYS); 678 648 } … … 684 654 685 655 /* 686 * ã·ãªã¢ã«ãã¼ãããã®éä¿¡å¯è½ã³ã¼ã«ããã¯656 * シリアルポートからの送信可能コールバック 687 657 */ 688 658 void … … 694 664 if (p_spcb->rcv_fc_chr != '\0') { 695 665 /* 696 * START/STOP ãéä¿¡ããï¼666 * START/STOP を送信する. 697 667 */ 698 668 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr); … … 701 671 else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) { 702 672 /* 703 * éä¿¡ãããã¡ä¸ããæåãåãåºãã¦éä¿¡ããï¼673 * 送信バッファ中から文字を取り出して送信する. 704 674 */ 705 675 (void) sio_snd_chr(p_spcb->p_siopcb, … … 715 685 else { 716 686 /* 717 * éä¿¡ãã¹ãæåããªãå ´åã¯ï¼éä¿¡å¯è½ã³ã¼ã«ããã¯ãç¦æ¢ããï¼687 * 送信すべき文字がない場合は,送信可能コールバックを禁止する. 718 688 */ 719 689 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND); … … 722 692 723 693 /* 724 * ã·ãªã¢ã«ãã¼ãããã®åä¿¡éç¥ã³ã¼ã«ããã¯694 * シリアルポートからの受信通知コールバック 725 695 */ 726 696 void … … 734 704 if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) { 735 705 /* 736 * éä¿¡ãä¸æåæ¢ããï¼éä¿¡ä¸ã®æåã¯ãã®ã¾ã¾éä¿¡ããï¼706 * 送信を一時停止する.送信中の文字はそのまま送信する. 737 707 */ 738 708 p_spcb->snd_stopped = true; … … 741 711 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) { 742 712 /* 743 * éä¿¡ãåéããï¼713 * 送信を再開する. 744 714 */ 745 715 p_spcb->snd_stopped = false; … … 759 729 else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) { 760 730 /* 761 * éä¿¡ã«å¯¾ãã¦ããã¼å¶å¾¡ãã¦ããå ´åï¼START ã¯æ¨ã¦ãï¼731 * 送信に対してフロー制御している場合,START は捨てる. 762 732 */ 763 733 } 764 734 else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) { 765 735 /* 766 * ãããã¡ãã«ã®å ´åï¼åä¿¡ããæåãæ¨ã¦ãï¼736 * バッファフルの場合,受信した文字を捨てる. 767 737 */ 768 738 } 769 739 else { 770 740 /* 771 * åä¿¡ããæåãåä¿¡ãããã¡ã«å 772 ¥ããï¼ 741 * 受信した文字を受信バッファに入れる. 773 742 */ 774 743 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c; … … 782 751 783 752 /* 784 * STOP ãéä¿¡ããï¼753 * STOPを送信する. 785 754 */ 786 755 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped) … … 796 765 797 766 /* 798 * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãããã®æªéä¿¡æåã®ååºã767 * シリアルインタフェースドライバからの未送信文字の取出し 799 768 */ 800 769 bool_t … … 803 772 SPCB *p_spcb; 804 773 805 if (1 <= portid && portid <= TNUM_PORT) { /* ãã¼ãçªå·ã®ãã§ãã¯*/774 if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */ 806 775 p_spcb = get_spcb(portid); 807 if (p_spcb->openflag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ãã¯*/776 if (p_spcb->openflag) { /* オープン済みかのチェック */ 808 777 if (p_spcb->snd_count > 0U) { 809 778 *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.