Changeset 167 for UsbWattMeter/trunk/asp_dcre/syssvc/serial.c
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/asp_dcre/syssvc/serial.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=SHIFT_JIS
r164 r167 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 12 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 13 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 14 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 15 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 16 * XR[hÉÜÜêĢ鱯D 17 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 18 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 19 gip 20 * Ò}j 21 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 22 * Ì³ÛØKèðfÚ·é±ÆD 23 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 24 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 25 * ÆD 26 * (a) Äzzɺ¤hL 27 gipÒ}j 28 AÈÇjÉCãLÌ 29 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 30 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 31 * ñ·é±ÆD 32 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 33 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 34 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 35 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 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 * 免責すること. 37 33 * 38 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨39 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI40 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF41 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»42 * ÌÓCðíÈ¢D34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 43 39 * 44 40 * @(#) $Id$ … … 46 42 47 43 /* 48 * VAC^tF[XhCo44 * シリアルインタフェースドライバ 49 45 */ 50 46 … … 57 53 58 54 /* 59 * obt@TCYÌftHglÆobt@Ìè`55 * バッファサイズのデフォルト値とバッファの定義 60 56 */ 61 57 #ifndef SERIAL_RCV_BUFSZ1 62 #define SERIAL_RCV_BUFSZ1 256 /* |[g1ÌóMobt@TCY*/58 #define SERIAL_RCV_BUFSZ1 256 /* ポート1の受信バッファサイズ */ 63 59 #endif /* SERIAL_RCV_BUFSZ1 */ 64 60 65 61 #ifndef SERIAL_SND_BUFSZ1 66 #define SERIAL_SND_BUFSZ1 256 /* |[g1ÌMobt@TCY*/62 #define SERIAL_SND_BUFSZ1 256 /* ポート1の送信バッファサイズ */ 67 63 #endif /* SERIAL_SND_BUFSZ1 */ 68 64 … … 70 66 static char snd_buffer1[SERIAL_SND_BUFSZ1]; 71 67 72 #if TNUM_PORT >= 2 /* |[g2ÉÖ·éè`*/68 #if TNUM_PORT >= 2 /* ポート2に関する定義 */ 73 69 74 70 #ifndef SERIAL_RCV_BUFSZ2 75 #define SERIAL_RCV_BUFSZ2 256 /* |[g2ÌóMobt@TCY*/71 #define SERIAL_RCV_BUFSZ2 256 /* ポート2の受信バッファサイズ */ 76 72 #endif /* SERIAL_RCV_BUFSZ2 */ 77 73 78 74 #ifndef SERIAL_SND_BUFSZ2 79 #define SERIAL_SND_BUFSZ2 256 /* |[g2ÌMobt@TCY*/75 #define SERIAL_SND_BUFSZ2 256 /* ポート2の送信バッファサイズ */ 80 76 #endif /* SERIAL_SND_BUFSZ2 */ 81 77 … … 85 81 #endif /* TNUM_PORT >= 2 */ 86 82 87 #if TNUM_PORT >= 3 /* |[g3ÉÖ·éè`*/83 #if TNUM_PORT >= 3 /* ポート3に関する定義 */ 88 84 89 85 #ifndef SERIAL_RCV_BUFSZ3 90 #define SERIAL_RCV_BUFSZ3 256 /* |[g3ÌóMobt@TCY*/86 #define SERIAL_RCV_BUFSZ3 256 /* ポート3の受信バッファサイズ */ 91 87 #endif /* SERIAL_RCV_BUFSZ3 */ 92 88 93 89 #ifndef SERIAL_SND_BUFSZ3 94 #define SERIAL_SND_BUFSZ3 256 /* |[g3ÌMobt@TCY*/90 #define SERIAL_SND_BUFSZ3 256 /* ポート3の送信バッファサイズ */ 95 91 #endif /* SERIAL_SND_BUFSZ3 */ 96 92 … … 100 96 #endif /* TNUM_PORT >= 3 */ 101 97 102 #if TNUM_PORT >= 4 /* |[g4ÉÖ·éè`*/98 #if TNUM_PORT >= 4 /* ポート4に関する定義 */ 103 99 104 100 #ifndef SERIAL_RCV_BUFSZ4 105 #define SERIAL_RCV_BUFSZ4 256 /* |[g4ÌóMobt@TCY*/101 #define SERIAL_RCV_BUFSZ4 256 /* ポート4の受信バッファサイズ */ 106 102 #endif /* SERIAL_RCV_BUFSZ4 */ 107 103 108 104 #ifndef SERIAL_SND_BUFSZ4 109 #define SERIAL_SND_BUFSZ4 256 /* |[g4ÌMobt@TCY*/105 #define SERIAL_SND_BUFSZ4 256 /* ポート4の送信バッファサイズ */ 110 106 #endif /* SERIAL_SND_BUFSZ4 */ 111 107 … … 115 111 #endif /* TNUM_PORT >= 4 */ 116 112 117 #if TNUM_PORT >= 5 /* |[g5ÉÖ·éè`*/113 #if TNUM_PORT >= 5 /* ポート5に関する定義 */ 118 114 119 115 #ifndef SERIAL_RCV_BUFSZ5 120 #define SERIAL_RCV_BUFSZ5 256 /* |[g5ÌóMobt@TCY*/116 #define SERIAL_RCV_BUFSZ5 256 /* ポート5の受信バッファサイズ */ 121 117 #endif /* SERIAL_RCV_BUFSZ5 */ 122 118 123 119 #ifndef SERIAL_SND_BUFSZ5 124 #define SERIAL_SND_BUFSZ5 256 /* |[g5ÌMobt@TCY*/120 #define SERIAL_SND_BUFSZ5 256 /* ポート5の送信バッファサイズ */ 125 121 #endif /* SERIAL_SND_BUFSZ5 */ 126 122 … … 130 126 #endif /* TNUM_PORT >= 5 */ 131 127 132 #if TNUM_PORT >= 6 /* |[g6ÉÖ·éè`*/128 #if TNUM_PORT >= 6 /* ポート6に関する定義 */ 133 129 134 130 #ifndef SERIAL_RCV_BUFSZ6 135 #define SERIAL_RCV_BUFSZ6 256 /* |[g6ÌóMobt@TCY*/131 #define SERIAL_RCV_BUFSZ6 256 /* ポート6の受信バッファサイズ */ 136 132 #endif /* SERIAL_RCV_BUFSZ6 */ 137 133 138 134 #ifndef SERIAL_SND_BUFSZ6 139 #define SERIAL_SND_BUFSZ6 256 /* |[g6ÌMobt@TCY*/135 #define SERIAL_SND_BUFSZ6 256 /* ポート6の送信バッファサイズ */ 140 136 #endif /* SERIAL_SND_BUFSZ6 */ 141 137 … … 150 146 151 147 /* 152 * t[§äÉÖA·éèÆ}N153 */ 154 #define FC_STOP '\023' /* Rg[-S */155 #define FC_START '\021' /* Rg[-Q */156 157 #define BUFCNT_STOP(bufsz) ((bufsz) * 3 / 4) /* STOP ðéî¶*/158 #define BUFCNT_START(bufsz) ((bufsz) / 2) /* START ðéî¶*/159 160 /* 161 * VA|[gú»ubN148 * フロー制御に関連する定数とマクロ 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 * シリアルポート初期化ブロック 162 158 */ 163 159 typedef struct serial_port_initialization_block { 164 ID rcv_semid; /* óMobt@ÇpZ}tHÌID */165 ID snd_semid; /* Mobt@ÇpZ}tHÌID */166 uint_t rcv_bufsz; /* óMobt@TCY*/167 char *rcv_buffer; /* óMobt@*/168 uint_t snd_bufsz; /* Mobt@TCY*/169 char *snd_buffer; /* Mobt@*/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; /* 送信バッファ */ 170 166 } SPINIB; 171 167 … … 192 188 193 189 /* 194 * VA|[gÇubN190 * シリアルポート管理ブロック 195 191 */ 196 192 typedef struct serial_port_control_block { 197 const SPINIB *p_spinib; /* VA|[gú»ubN*/198 SIOPCB *p_siopcb; /* VAI/O|[gÇubN*/199 bool_t openflag; /* I[vÏÝtO*/200 bool_t errorflag; /* G[tO*/201 uint_t ioctl; /* ®ì§äÌÝèl*/202 203 uint_t rcv_read_ptr; /* óMobt@Çoµ|C^*/204 uint_t rcv_write_ptr; /* óMobt@Ý|C^*/205 uint_t rcv_count; /* óMobt@̶*/206 char rcv_fc_chr; /* é׫START/STOP */207 bool_t rcv_stopped; /* STOP ðÁ½óÔ©H*/208 209 uint_t snd_read_ptr; /* Mobt@Çoµ|C^*/210 uint_t snd_write_ptr; /* Mobt@Ý|C^*/211 uint_t snd_count; /* Mobt@̶*/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を受け取った状態か? */ 213 209 } SPCB; 214 210 … … 216 212 217 213 /* 218 * VA|[gID©çVA|[gÇubNðæèo·½ßÌ}N214 * シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ 219 215 */ 220 216 #define INDEX_PORT(portid) ((uint_t)((portid) - 1)) … … 222 218 223 219 /* 224 * |C^ÌCNg220 * ポインタのインクリメント 225 221 */ 226 222 #define INC_PTR(ptr, bufsz) do { \ … … 231 227 232 228 /* 233 * T[rXR[Äoµ}N229 * サービスコール呼出しマクロ 234 230 * 235 * T[rXR[ÄoµðÜÞ®expð]¿µCÔlªG[iÌljÌê236 * ÉÍCercÉercd_expð]¿µ½lðãüµCerror_exitÉgoto·éD231 * サービスコール呼出しを含む式expを評価し,返値がエラー(負の値)の場 232 * 合には,ercにercd_expを評価した値を代入し,error_exitにgotoする. 237 233 */ 238 234 #define SVC(exp, ercd_exp) do { \ … … 244 240 245 241 /* 246 * E_SYS G[̶¬242 * E_SYSエラーの生成 247 243 */ 248 244 static ER … … 254 250 255 251 /* 256 * Ò¿ÉüéT[rXR[©çÌG[ÌÏ·252 * 待ちに入るサービスコールからのエラーの変換 257 253 */ 258 254 static ER … … 270 266 271 267 /* 272 * VAC^tF[XhCoÌú»[`268 * シリアルインタフェースドライバの初期化ルーチン 273 269 */ 274 270 void … … 286 282 287 283 /* 288 * VA|[gÌI[viT[rXR[j284 * シリアルポートのオープン(サービスコール) 289 285 */ 290 286 ER … … 294 290 ER ercd; 295 291 296 if (sns_dpn()) { /* ReLXgÌ`FbN*/292 if (sns_dpn()) { /* コンテキストのチェック */ 297 293 return(E_CTX); 298 294 } 299 295 if (!(1 <= portid && portid <= TNUM_PORT)) { 300 return(E_ID); /* |[gÔÌ`FbN*/296 return(E_ID); /* ポート番号のチェック */ 301 297 } 302 298 p_spcb = get_spcb(portid); 303 299 304 300 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 305 if (p_spcb->openflag) { /* I[vÏÝ©Ì`FbN*/301 if (p_spcb->openflag) { /* オープン済みかのチェック */ 306 302 ercd = E_OBJ; 307 303 } 308 304 else { 309 305 /* 310 * ÏÌú»306 * 変数の初期化 311 307 */ 312 308 p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); … … 324 320 325 321 /* 326 * ±êÈ~CÝðÖ~·éD322 * これ以降,割込みを禁止する. 327 323 */ 328 324 if (loc_cpu() < 0) { … … 332 328 333 329 /* 334 * n[hEFA˶ÌI[v330 * ハードウェア依存のオープン処理 335 331 */ 336 332 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb); 337 333 338 334 /* 339 * óMÊmR[obNð·éD335 * 受信通知コールバックを許可する. 340 336 */ 341 337 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV); … … 359 355 360 356 /* 361 * VA|[gÌN[YiT[rXR[j357 * シリアルポートのクローズ(サービスコール) 362 358 */ 363 359 ER … … 368 364 bool_t eflag = false; 369 365 370 if (sns_dpn()) { /* ReLXgÌ`FbN*/366 if (sns_dpn()) { /* コンテキストのチェック */ 371 367 return(E_CTX); 372 368 } 373 369 if (!(1 <= portid && portid <= TNUM_PORT)) { 374 return(E_ID); /* |[gÔÌ`FbN*/370 return(E_ID); /* ポート番号のチェック */ 375 371 } 376 372 p_spcb = get_spcb(portid); 377 373 378 374 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 379 if (!(p_spcb->openflag)) { /* I[vÏÝ©Ì`FbN*/375 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 380 376 ercd = E_OBJ; 381 377 } 382 378 else { 383 379 /* 384 * n[hEFA˶ÌN[Y380 * ハードウェア依存のクローズ処理 385 381 */ 386 382 if (loc_cpu() < 0) { … … 394 390 395 391 /* 396 * Z}tHÌú»392 * セマフォの初期化 397 393 */ 398 394 if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) { … … 404 400 405 401 /* 406 * G[R[hÌÝè402 * エラーコードの設定 407 403 */ 408 404 if (eflag) { … … 420 416 421 417 /* 422 * VA|[gÖ̶M418 * シリアルポートへの文字送信 423 419 * 424 * p_spcb Åwè³êéVAI/O|[gÉεÄC¶cðM·éD¶425 * ðMWX^É¢ê½êÉÍtrueðÔ·D»¤ÅÈ¢êÉÍCM426 * WX^ªó¢½±ÆðÊm·éR[obNÖðµCfalseðÔ·D427 * ±ÌÖÍCCPUbNóÔÅÄÑo³êéD420 * p_spcbで指定されるシリアルI/Oポートに対して,文字cを送信する.文字 421 * を送信レジスタにいれた場合にはtrueを返す.そうでない場合には,送信 422 * レジスタが空いたことを通知するコールバック関数を許可し,falseを返す. 423 * この関数は,CPUロック状態で呼び出される. 428 424 */ 429 425 Inline bool_t … … 440 436 441 437 /* 442 * VA|[gÖÌ1¶M438 * シリアルポートへの1文字送信 443 439 */ 444 440 static ER_BOOL … … 449 445 450 446 /* 451 * LF ÌOÉCRðM·éD447 * LFの前にCRを送信する. 452 448 */ 453 449 if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) { 454 450 /* 455 * ȺÌR[hÍÄAÄoµÉÈÁÄ¢éªCøcª'\n'ÌêÉ456 * øcð'\r'ƵÄÄÑo·±Æ©çC±ÌÄAÄoµÍ2ñÚÌ457 * ÄÑoµÅK¸~ÜéD451 * 以下のコードは再帰呼出しになっているが,引数cが'\n'の場合に 452 * 引数cを'\r'として呼び出すことから,この再帰呼出しは2回目の 453 * 呼び出しで必ず止まる. 458 454 */ 459 455 SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd); … … 468 464 && serial_snd_chr(p_spcb, c)) { 469 465 /* 470 * VAI/OfoCXÌMWX^ɶðüê鱯ɬ÷µ471 * ½êD466 * シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し 467 * た場合. 472 468 */ 473 469 buffer_full = false; … … 475 471 else { 476 472 /* 477 * Mobt@ɶðüêéD473 * 送信バッファに文字を入れる. 478 474 */ 479 475 p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c; … … 491 487 492 488 /* 493 * VA|[gÖ̶ñMiT[rXR[j489 * シリアルポートへの文字列送信(サービスコール) 494 490 */ 495 491 ER_UINT … … 501 497 ER ercd, rercd; 502 498 503 if (sns_dpn()) { /* ReLXgÌ`FbN*/499 if (sns_dpn()) { /* コンテキストのチェック */ 504 500 return(E_CTX); 505 501 } 506 502 if (!(1 <= portid && portid <= TNUM_PORT)) { 507 return(E_ID); /* |[gÔÌ`FbN*/503 return(E_ID); /* ポート番号のチェック */ 508 504 } 509 505 510 506 p_spcb = get_spcb(portid); 511 if (!(p_spcb->openflag)) { /* I[vÏÝ©Ì`FbN*/507 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 512 508 return(E_OBJ); 513 509 } 514 if (p_spcb->errorflag) { /* G[óÔ©Ì`FbN*/510 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 515 511 return(E_SYS); 516 512 } 517 513 518 buffer_full = true; /* [vÌ1ñßÍwai_sem·é*/514 buffer_full = true; /* ループの1回めはwai_semする */ 519 515 while (wricnt < len) { 520 516 if (buffer_full) { … … 536 532 537 533 /* 538 * VA|[g©çÌ1¶óM534 * シリアルポートからの1文字受信 539 535 */ 540 536 static bool_t … … 547 543 548 544 /* 549 * óMobt@©ç¶ðæèo·D545 * 受信バッファから文字を取り出す. 550 546 */ 551 547 *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr]; … … 555 551 556 552 /* 557 * START ðM·éD553 * STARTを送信する. 558 554 */ 559 555 if (p_spcb->rcv_stopped && p_spcb->rcv_count … … 573 569 574 570 /* 575 * VA|[g©ç̶ñóMiT[rXR[j571 * シリアルポートからの文字列受信(サービスコール) 576 572 */ 577 573 ER_UINT … … 581 577 bool_t buffer_empty; 582 578 uint_t reacnt = 0U; 583 char c = '\0'; /* RpCÌxð}~·é½ßÉú»·é*/579 char c = '\0'; /* コンパイラの警告を抑止するために初期化する */ 584 580 ER ercd, rercd; 585 581 586 if (sns_dpn()) { /* ReLXgÌ`FbN*/582 if (sns_dpn()) { /* コンテキストのチェック */ 587 583 return(E_CTX); 588 584 } 589 585 if (!(1 <= portid && portid <= TNUM_PORT)) { 590 return(E_ID); /* |[gÔÌ`FbN*/586 return(E_ID); /* ポート番号のチェック */ 591 587 } 592 588 593 589 p_spcb = get_spcb(portid); 594 if (!(p_spcb->openflag)) { /* I[vÏÝ©Ì`FbN*/590 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 595 591 return(E_OBJ); 596 592 } 597 if (p_spcb->errorflag) { /* G[óÔ©Ì`FbN*/593 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 598 594 return(E_SYS); 599 595 } 600 596 601 buffer_empty = true; /* [vÌ1ñßÍwai_sem·é*/597 buffer_empty = true; /* ループの1回めはwai_semする */ 602 598 while (reacnt < len) { 603 599 if (buffer_empty) { … … 611 607 612 608 /* 613 * GR[obND609 * エコーバック処理. 614 610 */ 615 611 if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) { … … 633 629 634 630 /* 635 * VA|[ģäiT[rXR[j631 * シリアルポートの制御(サービスコール) 636 632 */ 637 633 ER … … 640 636 SPCB *p_spcb; 641 637 642 if (sns_dpn()) { /* ReLXgÌ`FbN*/638 if (sns_dpn()) { /* コンテキストのチェック */ 643 639 return(E_CTX); 644 640 } 645 641 if (!(1 <= portid && portid <= TNUM_PORT)) { 646 return(E_ID); /* |[gÔÌ`FbN*/642 return(E_ID); /* ポート番号のチェック */ 647 643 } 648 644 649 645 p_spcb = get_spcb(portid); 650 if (!(p_spcb->openflag)) { /* I[vÏÝ©Ì`FbN*/646 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 651 647 return(E_OBJ); 652 648 } 653 if (p_spcb->errorflag) { /* G[óÔ©Ì`FbN*/649 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 654 650 return(E_SYS); 655 651 } … … 660 656 661 657 /* 662 * VA|[góÔÌQÆiT[rXR[j658 * シリアルポート状態の参照(サービスコール) 663 659 */ 664 660 ER … … 667 663 SPCB *p_spcb; 668 664 669 if (sns_dpn()) { /* ReLXgÌ`FbN*/665 if (sns_dpn()) { /* コンテキストのチェック */ 670 666 return(E_CTX); 671 667 } 672 668 if (!(1 <= portid && portid <= TNUM_PORT)) { 673 return(E_ID); /* |[gÔÌ`FbN*/669 return(E_ID); /* ポート番号のチェック */ 674 670 } 675 671 676 672 p_spcb = get_spcb(portid); 677 if (!(p_spcb->openflag)) { /* I[vÏÝ©Ì`FbN*/673 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 678 674 return(E_OBJ); 679 675 } 680 if (p_spcb->errorflag) { /* G[óÔ©Ì`FbN*/676 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 681 677 return(E_SYS); 682 678 } … … 688 684 689 685 /* 690 * VA|[g©çÌMÂ\R[obN686 * シリアルポートからの送信可能コールバック 691 687 */ 692 688 void … … 698 694 if (p_spcb->rcv_fc_chr != '\0') { 699 695 /* 700 * START/STOP ðM·éD696 * START/STOP を送信する. 701 697 */ 702 698 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr); … … 705 701 else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) { 706 702 /* 707 * Mobt@©ç¶ðæèoµÄM·éD703 * 送信バッファ中から文字を取り出して送信する. 708 704 */ 709 705 (void) sio_snd_chr(p_spcb->p_siopcb, … … 719 715 else { 720 716 /* 721 * M·×«¶ªÈ¢êÍCMÂ\R[obNðÖ~·éD717 * 送信すべき文字がない場合は,送信可能コールバックを禁止する. 722 718 */ 723 719 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND); … … 726 722 727 723 /* 728 * VA|[g©çÌóMÊmR[obN724 * シリアルポートからの受信通知コールバック 729 725 */ 730 726 void … … 738 734 if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) { 739 735 /* 740 * Mðêâ~·éDM̶ͻÌÜÜM·éD736 * 送信を一時停止する.送信中の文字はそのまま送信する. 741 737 */ 742 738 p_spcb->snd_stopped = true; … … 745 741 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) { 746 742 /* 747 * MðÄJ·éD743 * 送信を再開する. 748 744 */ 749 745 p_spcb->snd_stopped = false; … … 763 759 else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) { 764 760 /* 765 * MÉεÄt[§äµÄ¢éêCSTART ÍÌÄéD761 * 送信に対してフロー制御している場合,START は捨てる. 766 762 */ 767 763 } 768 764 else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) { 769 765 /* 770 * obt@tÌêCóMµ½¶ðÌÄéD766 * バッファフルの場合,受信した文字を捨てる. 771 767 */ 772 768 } 773 769 else { 774 770 /* 775 * óMµ½¶ðóMobt@ÉüêéD771 * 受信した文字を受信バッファに入れる. 776 772 */ 777 773 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c; … … 785 781 786 782 /* 787 * STOP ðM·éD783 * STOPを送信する. 788 784 */ 789 785 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped) … … 799 795 800 796 /* 801 * VAC^tF[XhCo©çÌ¢M¶Ìæoµ797 * シリアルインタフェースドライバからの未送信文字の取出し 802 798 */ 803 799 bool_t … … 806 802 SPCB *p_spcb; 807 803 808 if (1 <= portid && portid <= TNUM_PORT) { /* |[gÔÌ`FbN*/804 if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */ 809 805 p_spcb = get_spcb(portid); 810 if (p_spcb->openflag) { /* I[vÏÝ©Ì`FbN*/806 if (p_spcb->openflag) { /* オープン済みかのチェック */ 811 807 if (p_spcb->snd_count > 0U) { 812 808 *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.