- Timestamp:
- Sep 14, 2020, 6:36:03 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub_riscv/trunk/asp_baseplatform/syssvc/serial.c
r453 r458 56 56 */ 57 57 #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 */ 60 60 61 61 #ifndef SERIAL_SND_BUFSZ1 62 #define SERIAL_SND_BUFSZ1 256/* ポート1の送信バッファサイズ */63 #endif /* SERIAL_SND_BUFSZ1 */64 65 static char 66 static char 67 68 #if TNUM_PORT >= 2 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に関する定義 */ 69 69 70 70 #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 */ 73 73 74 74 #ifndef SERIAL_SND_BUFSZ2 75 #define SERIAL_SND_BUFSZ2 256/* ポート2の送信バッファサイズ */76 #endif /* SERIAL_SND_BUFSZ2 */77 78 static char 79 static char 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]; 80 80 81 81 #endif /* TNUM_PORT >= 2 */ 82 82 83 #if TNUM_PORT >= 3 83 #if TNUM_PORT >= 3 /* ポート3に関する定義 */ 84 84 85 85 #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 */ 88 88 89 89 #ifndef SERIAL_SND_BUFSZ3 90 #define SERIAL_SND_BUFSZ3 256/* ポート3の送信バッファサイズ */91 #endif /* SERIAL_SND_BUFSZ3 */92 93 static char 94 static char 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]; 95 95 96 96 #endif /* TNUM_PORT >= 3 */ 97 97 98 #if TNUM_PORT >= 4 98 #if TNUM_PORT >= 4 /* ポート4に関する定義 */ 99 99 100 100 #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 */ 103 103 104 104 #ifndef SERIAL_SND_BUFSZ4 105 #define SERIAL_SND_BUFSZ4 256/* ポート4の送信バッファサイズ */106 #endif /* SERIAL_SND_BUFSZ4 */107 108 static char 109 static char 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]; 110 110 111 111 #endif /* TNUM_PORT >= 4 */ … … 118 118 * フロー制御に関連する定数とマクロ 119 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を送る基準文字数 */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 125 126 126 /* … … 128 128 */ 129 129 typedef 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; /* 送信バッファ */ 136 136 } SPINIB; 137 137 138 138 static const SPINIB spinib_table[TNUM_PORT] = { 139 { 140 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}, 142 142 #if TNUM_PORT >= 2 143 { 144 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}, 146 146 #endif /* TNUM_PORT >= 2 */ 147 147 #if TNUM_PORT >= 3 148 { 149 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}, 151 151 #endif /* TNUM_PORT >= 3 */ 152 152 #if TNUM_PORT >= 4 153 { 154 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}, 156 156 #endif /* TNUM_PORT >= 4 */ 157 157 }; … … 161 161 */ 162 162 typedef 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を受け取った状態か? */ 179 179 } SPCB; 180 180 181 static SPCB 181 static SPCB spcb_table[TNUM_PORT]; 182 182 183 183 /* 184 184 * シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ 185 185 */ 186 #define INDEX_PORT(portid) ((uint_t)((portid) -1))187 #define get_spcb(portid) 186 #define INDEX_PORT(portid) ((uint_t)((portid)-1)) 187 #define get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)])) 188 188 189 189 /* 190 190 * ポインタのインクリメント 191 191 */ 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) 197 197 198 198 /* … … 202 202 * 合には,ercにercd_expを評価した値を代入し,error_exitにgotoする. 203 203 */ 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) 210 210 211 211 /* … … 216 216 { 217 217 p_spcb->errorflag = true; 218 return (E_SYS);218 return (E_SYS); 219 219 } 220 220 … … 228 228 case E_RLWAI: 229 229 case E_DLT: 230 return (rercd);230 return (rercd); 231 231 default: 232 232 p_spcb->errorflag = true; 233 return (E_SYS);233 return (E_SYS); 234 234 } 235 235 } … … 241 241 serial_initialize(intptr_t exinf) 242 242 { 243 uint_t 244 SPCB 243 uint_t i; 244 SPCB *p_spcb; 245 245 246 246 for (i = 0; i < TNUM_PORT; i++) { … … 257 257 serial_opn_por(ID portid) 258 258 { 259 SPCB 260 ER 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); 264 264 } 265 265 if (!(1 <= portid && portid <= TNUM_PORT)) { 266 return (E_ID);/* ポート番号のチェック */266 return (E_ID); /* ポート番号のチェック */ 267 267 } 268 268 p_spcb = get_spcb(portid); 269 269 270 270 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 271 if (p_spcb->openflag) { 271 if (p_spcb->openflag) { /* オープン済みかのチェック */ 272 272 ercd = E_OBJ; 273 273 } … … 292 292 * これ以降,割込みを禁止する. 293 293 */ 294 if (loc_cpu() < 0) {294 if (loc_cpu() < 0) { 295 295 ercd = E_SYS; 296 296 goto error_exit_enadsp; … … 300 300 * ハードウェア依存のオープン処理 301 301 */ 302 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) 302 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t)p_spcb); 303 303 304 304 /* … … 317 317 } 318 318 319 319 error_exit_enadsp: 320 320 SVC(ena_dsp(), gen_ercd_sys(p_spcb)); 321 321 322 323 return (ercd);322 error_exit: 323 return (ercd); 324 324 } 325 325 … … 330 330 serial_cls_por(ID portid) 331 331 { 332 SPCB 333 ER 334 bool_t 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); 338 338 } 339 339 if (!(1 <= portid && portid <= TNUM_PORT)) { 340 return (E_ID);/* ポート番号のチェック */340 return (E_ID); /* ポート番号のチェック */ 341 341 } 342 342 p_spcb = get_spcb(portid); 343 343 344 344 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 345 if (!(p_spcb->openflag)) { 345 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 346 346 ercd = E_OBJ; 347 347 } … … 381 381 SVC(ena_dsp(), gen_ercd_sys(p_spcb)); 382 382 383 384 return (ercd);383 error_exit: 384 return (ercd); 385 385 } 386 386 … … 397 397 { 398 398 if (sio_snd_chr(p_spcb->p_siopcb, c)) { 399 return (true);399 return (true); 400 400 } 401 401 else { 402 402 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND); 403 return (false);403 return (false); 404 404 } 405 405 } … … 411 411 serial_wri_chr(SPCB *p_spcb, char c) 412 412 { 413 bool_t 414 ER 413 bool_t buffer_full; 414 ER ercd, rercd; 415 415 416 416 /* … … 424 424 */ 425 425 SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd); 426 if ((bool_t) 426 if ((bool_t)rercd) { 427 427 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 428 428 gen_ercd_wait(rercd, p_spcb)); 429 429 } 430 430 } … … 432 432 SVC(loc_cpu(), gen_ercd_sys(p_spcb)); 433 433 if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped) 434 434 && serial_snd_chr(p_spcb, c)) { 435 435 /* 436 436 * シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し … … 450 450 451 451 SVC(unl_cpu(), gen_ercd_sys(p_spcb)); 452 ercd = (ER_BOOL) 453 454 455 return (ercd);452 ercd = (ER_BOOL)buffer_full; 453 454 error_exit: 455 return (ercd); 456 456 } 457 457 … … 462 462 serial_wri_dat(ID portid, const char *buf, uint_t len) 463 463 { 464 SPCB 465 bool_t 466 uint_t 467 ER 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); 471 471 } 472 472 if (!(1 <= portid && portid <= TNUM_PORT)) { 473 return (E_ID);/* ポート番号のチェック */473 return (E_ID); /* ポート番号のチェック */ 474 474 } 475 475 476 476 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; 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する */ 485 485 while (wricnt < len) { 486 486 if (buffer_full) { 487 487 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 488 488 gen_ercd_wait(rercd, p_spcb)); 489 489 } 490 490 SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd); 491 491 wricnt++; 492 buffer_full = (bool_t) 492 buffer_full = (bool_t)rercd; 493 493 } 494 494 if (!buffer_full) { … … 497 497 ercd = E_OK; 498 498 499 500 return (wricnt > 0U ? (ER_UINT)wricnt : ercd);499 error_exit: 500 return (wricnt > 0U ? (ER_UINT)wricnt : ercd); 501 501 } 502 502 … … 507 507 serial_rea_chr(SPCB *p_spcb, char *p_c) 508 508 { 509 bool_t 510 ER 509 bool_t buffer_empty; 510 ER ercd; 511 511 512 512 SVC(loc_cpu(), gen_ercd_sys(p_spcb)); … … 523 523 * STARTを送信する. 524 524 */ 525 if (p_spcb->rcv_stopped && p_spcb->rcv_count526 525 if (p_spcb->rcv_stopped 526 && p_spcb->rcv_count <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) { 527 527 if (!serial_snd_chr(p_spcb, FC_START)) { 528 528 p_spcb->rcv_fc_chr = FC_START; … … 532 532 533 533 SVC(unl_cpu(), gen_ercd_sys(p_spcb)); 534 ercd = (ER_BOOL) 535 536 537 return (ercd);534 ercd = (ER_BOOL)buffer_empty; 535 536 error_exit: 537 return (ercd); 538 538 } 539 539 … … 544 544 serial_rea_dat(ID portid, char *buf, uint_t len) 545 545 { 546 SPCB 547 bool_t 548 uint_t 549 char c = '\0';/* コンパイラの警告を抑止するために初期化する */550 ER 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); 554 554 } 555 555 if (!(1 <= portid && portid <= TNUM_PORT)) { 556 return (E_ID);/* ポート番号のチェック */556 return (E_ID); /* ポート番号のチェック */ 557 557 } 558 558 559 559 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; 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する */ 568 568 while (reacnt < len) { 569 569 if (buffer_empty) { 570 570 SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid), 571 571 gen_ercd_wait(rercd, p_spcb)); 572 572 } 573 573 SVC(rercd = serial_rea_chr(p_spcb, &c), rercd); 574 574 *buf++ = c; 575 575 reacnt++; 576 buffer_empty = (bool_t) 576 buffer_empty = (bool_t)rercd; 577 577 578 578 /* … … 581 581 if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) { 582 582 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 583 583 gen_ercd_wait(rercd, p_spcb)); 584 584 SVC(rercd = serial_wri_chr(p_spcb, c), rercd); 585 if (!((bool_t) 585 if (!((bool_t)rercd)) { 586 586 SVC(sig_sem(p_spcb->p_spinib->snd_semid), 587 587 gen_ercd_sys(p_spcb)); 588 588 } 589 589 } … … 594 594 ercd = E_OK; 595 595 596 597 return (reacnt > 0U ? (ER_UINT)reacnt : ercd);596 error_exit: 597 return (reacnt > 0U ? (ER_UINT)reacnt : ercd); 598 598 } 599 599 … … 604 604 serial_ctl_por(ID portid, uint_t ioctl) 605 605 { 606 SPCB 607 608 if (sns_dpn()) { 609 return (E_CTX);606 SPCB *p_spcb; 607 608 if (sns_dpn()) { /* コンテキストのチェック */ 609 return (E_CTX); 610 610 } 611 611 if (!(1 <= portid && portid <= TNUM_PORT)) { 612 return (E_ID);/* ポート番号のチェック */612 return (E_ID); /* ポート番号のチェック */ 613 613 } 614 614 615 615 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); 621 621 } 622 622 623 623 p_spcb->ioctl = ioctl; 624 return (E_OK);624 return (E_OK); 625 625 } 626 626 … … 631 631 serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) 632 632 { 633 SPCB 634 635 if (sns_dpn()) { 636 return (E_CTX);633 SPCB *p_spcb; 634 635 if (sns_dpn()) { /* コンテキストのチェック */ 636 return (E_CTX); 637 637 } 638 638 if (!(1 <= portid && portid <= TNUM_PORT)) { 639 return (E_ID);/* ポート番号のチェック */639 return (E_ID); /* ポート番号のチェック */ 640 640 } 641 641 642 642 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); 648 648 } 649 649 650 650 pk_rpor->reacnt = p_spcb->rcv_count; 651 651 pk_rpor->wricnt = p_spcb->snd_count; 652 return (E_OK);652 return (E_OK); 653 653 } 654 654 … … 659 659 sio_irdy_snd(intptr_t exinf) 660 660 { 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 } 681 685 } 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 } 690 695 } 691 696 } … … 697 702 sio_irdy_rcv(intptr_t exinf) 698 703 { 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 } 723 732 } 733 p_spcb->snd_count--; 724 734 } 725 p_spcb->snd_count--;726 735 } 727 736 } 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 } 748 757 } 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_count757 >= 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; 760 769 } 761 p_spcb->rcv_stopped = true;762 770 } 763 771 } … … 770 778 serial_get_chr(ID portid, char *p_c) 771 779 { 772 SPCB 773 774 if (1 <= portid && portid <= TNUM_PORT) { 780 SPCB *p_spcb; 781 782 if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */ 775 783 p_spcb = get_spcb(portid); 776 if (p_spcb->openflag) { 784 if (p_spcb->openflag) { /* オープン済みかのチェック */ 777 785 if (p_spcb->snd_count > 0U) { 778 786 *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; 779 787 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 780 788 p_spcb->snd_count--; 781 return (true);789 return (true); 782 790 } 783 791 } 784 792 } 785 return (false);786 } 793 return (false); 794 }
Note:
See TracChangeset
for help on using the changeset viewer.