#include <kernel.h>
#include <t_syslog.h>
#include "target_syssvc.h"
#include "target_serial.h"
#include "serial.h"
#include "kernel_cfg.h"
データ構造 | |
struct | serial_port_initialization_block |
struct | serial_port_control_block |
マクロ定義 | |
#define | SERIAL_RCV_BUFSZ1 256 |
#define | SERIAL_SND_BUFSZ1 256 |
#define | FC_STOP '\023' |
#define | FC_START '\021' |
#define | BUFCNT_STOP(bufsz) ((bufsz) * 3 / 4) |
#define | BUFCNT_START(bufsz) ((bufsz) / 2) |
#define | INDEX_PORT(portid) ((uint_t)((portid) - 1)) |
#define | get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)])) |
#define | INC_PTR(ptr, bufsz) { if (++(ptr) == (bufsz)) { (ptr) = 0; }} |
#define | SVC(exp, ercd_exp) { if ((exp) < 0) { ercd = (ercd_exp); goto error_exit; }} |
型定義 | |
typedef struct serial_port_initialization_block | SPINIB |
typedef struct serial_port_control_block | SPCB |
関数 | |
static ER | gen_ercd_sys (SPCB *p_spcb) |
static ER | gen_ercd_wait (ER rercd, SPCB *p_spcb) |
void | serial_initialize (intptr_t exinf) |
ER | serial_opn_por (ID portid) |
ER | serial_cls_por (ID portid) |
Inline bool_t | serial_snd_chr (SPCB *p_spcb, char_t c) |
static ER_BOOL | serial_wri_chr (SPCB *p_spcb, char_t c) |
ER_UINT | serial_wri_dat (ID portid, char_t *buf, uint_t len) |
static bool_t | serial_rea_chr (SPCB *p_spcb, char_t *p_c) |
ER_UINT | serial_rea_dat (ID portid, char_t *buf, uint_t len) |
ER | serial_ctl_por (ID portid, uint_t ioctl) |
ER | serial_ref_por (ID portid, T_SERIAL_RPOR *pk_rpor) |
void | sio_irdy_snd (intptr_t exinf) |
void | sio_irdy_rcv (intptr_t exinf) |
bool_t | serial_get_chr (ID portid, char_t *p_c) |
変数 | |
static char_t | rcv_buffer1 [SERIAL_RCV_BUFSZ1] |
static char_t | snd_buffer1 [SERIAL_SND_BUFSZ1] |
static const SPINIB | spinib_table [TNUM_PORT] |
static SPCB | spcb_table [TNUM_PORT] |
#define BUFCNT_START | ( | bufsz | ) | ((bufsz) / 2) |
#define BUFCNT_STOP | ( | bufsz | ) | ((bufsz) * 3 / 4) |
#define FC_START '\021' |
#define FC_STOP '\023' |
#define get_spcb | ( | portid | ) | (&(spcb_table[INDEX_PORT(portid)])) |
#define INC_PTR | ( | ptr, | |||
bufsz | ) | { if (++(ptr) == (bufsz)) { (ptr) = 0; }} |
#define SVC | ( | exp, | |||
ercd_exp | ) | { if ((exp) < 0) { ercd = (ercd_exp); goto error_exit; }} |
typedef struct serial_port_control_block SPCB |
typedef struct serial_port_initialization_block SPINIB |
参照先 E_DLT, E_RLWAI, E_SYS, serial_port_control_block::errorflag, と MERCD.
参照元 serial_rea_dat(), serial_wri_chr(), と serial_wri_dat().
00194 { 00195 switch (MERCD(rercd)) { 00196 case E_RLWAI: 00197 case E_DLT: 00198 return(rercd); 00199 default: 00200 p_spcb->errorflag = true; 00201 return(E_SYS); 00202 } 00203 }
参照先 dis_dsp(), E_CTX, E_ID, E_OBJ, E_OK, ena_dsp(), gen_ercd_sys(), get_spcb, ini_sem(), loc_cpu(), serial_port_control_block::openflag, serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_semid, sio_cls_por(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と unl_cpu().
00296 { 00297 SPCB *p_spcb; 00298 ER ercd; 00299 bool_t eflag = false; 00300 00301 if (sns_dpn()) { /* コンテキストのチェック */ 00302 return(E_CTX); 00303 } 00304 if (!(1 <= portid && portid <= TNUM_PORT)) { 00305 return(E_ID); /* ポート番号のチェック */ 00306 } 00307 p_spcb = get_spcb(portid); 00308 00309 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 00310 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 00311 ercd = E_OBJ; 00312 } 00313 else { 00314 /* 00315 * ハードウェア依存のクローズ処理 00316 */ 00317 if (loc_cpu() < 0) { 00318 eflag = true; 00319 } 00320 sio_cls_por(p_spcb->p_siopcb); 00321 p_spcb->openflag = false; 00322 if (unl_cpu() < 0) { 00323 eflag = true; 00324 } 00325 00326 /* 00327 * セマフォの初期化 00328 */ 00329 if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) { 00330 eflag = true; 00331 } 00332 if (ini_sem(p_spcb->p_spinib->rcv_semid) < 0) { 00333 eflag = true; 00334 } 00335 00336 /* 00337 * エラーコードの設定 00338 */ 00339 if (eflag) { 00340 ercd = gen_ercd_sys(p_spcb); 00341 } 00342 else { 00343 ercd = E_OK; 00344 } 00345 } 00346 SVC(ena_dsp(), gen_ercd_sys(p_spcb)); 00347 00348 error_exit: 00349 return(ercd); 00350 }
参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, get_spcb, serial_port_control_block::ioctl, serial_port_control_block::openflag, sns_dpn(), と TNUM_PORT.
参照元 main_task().
00565 { 00566 SPCB *p_spcb; 00567 00568 if (sns_dpn()) { /* コンテキストのチェック */ 00569 return(E_CTX); 00570 } 00571 if (!(1 <= portid && portid <= TNUM_PORT)) { 00572 return(E_ID); /* ポート番号のチェック */ 00573 } 00574 00575 p_spcb = get_spcb(portid); 00576 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 00577 return(E_OBJ); 00578 } 00579 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 00580 return(E_SYS); 00581 } 00582 00583 p_spcb->ioctl = ioctl; 00584 return(E_OK); 00585 }
参照先 get_spcb, INC_PTR, serial_port_control_block::openflag, serial_port_control_block::p_spinib, serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, と TNUM_PORT.
参照元 logtask_terminate().
00731 { 00732 SPCB *p_spcb; 00733 00734 if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */ 00735 p_spcb = get_spcb(portid); 00736 if (p_spcb->openflag) { /* オープン済みかのチェック */ 00737 if (p_spcb->snd_count > 0U) { 00738 *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; 00739 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 00740 p_spcb->snd_count--; 00741 return(true); 00742 } 00743 } 00744 } 00745 return(false); 00746 }
void serial_initialize | ( | intptr_t | exinf | ) |
参照先 serial_port_control_block::openflag, serial_port_control_block::p_spinib, と TNUM_PORT.
00210 { 00211 uint_t i; 00212 SPCB *p_spcb; 00213 00214 for (p_spcb = spcb_table, i = 0; i < TNUM_PORT; p_spcb++, i++) { 00215 p_spcb->p_spinib = &(spinib_table[i]); 00216 p_spcb->openflag = false; 00217 } 00218 }
参照先 dis_dsp(), E_CTX, E_ID, E_OBJ, E_OK, E_SYS, ena_dsp(), gen_ercd_sys(), get_spcb, serial_port_control_block::ioctl, IOCTL_CRLF, IOCTL_ECHO, IOCTL_FCRCV, IOCTL_FCSND, loc_cpu(), serial_port_control_block::openflag, serial_port_control_block::p_siopcb, serial_port_control_block::rcv_count, serial_port_control_block::rcv_fc_chr, serial_port_control_block::rcv_read_ptr, serial_port_control_block::rcv_stopped, serial_port_control_block::rcv_write_ptr, sio_ena_cbr(), sio_opn_por(), SIO_RDY_RCV, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_control_block::snd_stopped, serial_port_control_block::snd_write_ptr, sns_dpn(), SVC, TNUM_PORT, と unl_cpu().
参照元 logtask_main(), と main_task().
00225 { 00226 SPCB *p_spcb; 00227 ER ercd; 00228 00229 if (sns_dpn()) { /* コンテキストのチェック */ 00230 return(E_CTX); 00231 } 00232 if (!(1 <= portid && portid <= TNUM_PORT)) { 00233 return(E_ID); /* ポート番号のチェック */ 00234 } 00235 p_spcb = get_spcb(portid); 00236 00237 SVC(dis_dsp(), gen_ercd_sys(p_spcb)); 00238 if (p_spcb->openflag) { /* オープン済みかのチェック */ 00239 ercd = E_OBJ; 00240 } 00241 else { 00242 /* 00243 * 変数の初期化 00244 */ 00245 p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); 00246 00247 p_spcb->rcv_read_ptr = p_spcb->rcv_write_ptr = 0U; 00248 p_spcb->rcv_count = 0U; 00249 p_spcb->rcv_fc_chr = '\0'; 00250 p_spcb->rcv_stopped = false; 00251 00252 p_spcb->snd_read_ptr = p_spcb->snd_write_ptr = 0U; 00253 p_spcb->snd_count = 0U; 00254 p_spcb->snd_stopped = false; 00255 00256 /* 00257 * これ以降,割込みを禁止する. 00258 */ 00259 if (loc_cpu() < 0) { 00260 ercd = E_SYS; 00261 goto error_exit_enadsp; 00262 } 00263 00264 /* 00265 * ハードウェア依存のオープン処理 00266 */ 00267 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb); 00268 00269 /* 00270 * 受信通知コールバックを許可する. 00271 */ 00272 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV); 00273 p_spcb->openflag = true; 00274 p_spcb->errorflag = false; 00275 00276 if (unl_cpu() < 0) { 00277 p_spcb->errorflag = true; 00278 ercd = E_SYS; 00279 goto error_exit_enadsp; 00280 } 00281 ercd = E_OK; 00282 } 00283 00284 error_exit_enadsp: 00285 SVC(ena_dsp(), gen_ercd_sys(p_spcb)); 00286 00287 error_exit: 00288 return(ercd); 00289 }
参照先 BUFCNT_START, FC_START, gen_ercd_sys(), INC_PTR, loc_cpu(), serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_buffer, serial_port_initialization_block::rcv_bufsz, serial_port_control_block::rcv_count, serial_port_control_block::rcv_fc_chr, serial_port_control_block::rcv_read_ptr, serial_port_control_block::rcv_stopped, serial_snd_chr(), SVC, と unl_cpu().
参照元 serial_rea_dat().
00468 { 00469 bool_t buffer_empty; 00470 ER ercd; 00471 00472 SVC(loc_cpu(), gen_ercd_sys(p_spcb)); 00473 00474 /* 00475 * 受信バッファから文字を取り出す. 00476 */ 00477 *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr]; 00478 INC_PTR(p_spcb->rcv_read_ptr, p_spcb->p_spinib->rcv_bufsz); 00479 p_spcb->rcv_count--; 00480 buffer_empty = (p_spcb->rcv_count == 0U); 00481 00482 /* 00483 * STARTを送信する. 00484 */ 00485 if (p_spcb->rcv_stopped && p_spcb->rcv_count 00486 <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) { 00487 if (!serial_snd_chr(p_spcb, FC_START)) { 00488 p_spcb->rcv_fc_chr = FC_START; 00489 } 00490 p_spcb->rcv_stopped = false; 00491 } 00492 00493 SVC(unl_cpu(), gen_ercd_sys(p_spcb)); 00494 ercd = (ER_BOOL) buffer_empty; 00495 00496 error_exit: 00497 return(ercd); 00498 }
参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, gen_ercd_sys(), gen_ercd_wait(), get_spcb, serial_port_control_block::ioctl, IOCTL_ECHO, serial_port_control_block::openflag, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_semid, serial_rea_chr(), serial_wri_chr(), sig_sem(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と wai_sem().
参照元 main_task().
00505 { 00506 SPCB *p_spcb; 00507 bool_t buffer_empty; 00508 uint_t reacnt = 0U; 00509 char_t c = '\0'; /* コンパイラの警告を抑止するために初期化する */ 00510 ER ercd, rercd; 00511 00512 if (sns_dpn()) { /* コンテキストのチェック */ 00513 return(E_CTX); 00514 } 00515 if (!(1 <= portid && portid <= TNUM_PORT)) { 00516 return(E_ID); /* ポート番号のチェック */ 00517 } 00518 00519 p_spcb = get_spcb(portid); 00520 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 00521 return(E_OBJ); 00522 } 00523 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 00524 return(E_SYS); 00525 } 00526 00527 buffer_empty = true; /* ループの1回めはwai_semする */ 00528 while (reacnt < len) { 00529 if (buffer_empty) { 00530 SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid), 00531 gen_ercd_wait(rercd, p_spcb)); 00532 } 00533 SVC(rercd = serial_rea_chr(p_spcb, &c), rercd); 00534 *buf++ = c; 00535 reacnt++; 00536 buffer_empty = (bool_t) rercd; 00537 00538 /* 00539 * エコーバック処理. 00540 */ 00541 if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) { 00542 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 00543 gen_ercd_wait(rercd, p_spcb)); 00544 SVC(rercd = serial_wri_chr(p_spcb, c), rercd); 00545 if (!((bool_t) rercd)) { 00546 SVC(sig_sem(p_spcb->p_spinib->snd_semid), 00547 gen_ercd_sys(p_spcb)); 00548 } 00549 } 00550 } 00551 if (!buffer_empty) { 00552 SVC(sig_sem(p_spcb->p_spinib->rcv_semid), gen_ercd_sys(p_spcb)); 00553 } 00554 ercd = E_OK; 00555 00556 error_exit: 00557 return(reacnt > 0U ? (ER_UINT) reacnt : ercd); 00558 }
ER serial_ref_por | ( | ID | portid, | |
T_SERIAL_RPOR * | pk_rpor | |||
) |
参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, get_spcb, serial_port_control_block::openflag, serial_port_control_block::rcv_count, T_SERIAL_RPOR::reacnt, serial_port_control_block::snd_count, sns_dpn(), TNUM_PORT, と T_SERIAL_RPOR::wricnt.
参照元 logtask_flush().
00592 { 00593 SPCB *p_spcb; 00594 00595 if (sns_dpn()) { /* コンテキストのチェック */ 00596 return(E_CTX); 00597 } 00598 if (!(1 <= portid && portid <= TNUM_PORT)) { 00599 return(E_ID); /* ポート番号のチェック */ 00600 } 00601 00602 p_spcb = get_spcb(portid); 00603 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 00604 return(E_OBJ); 00605 } 00606 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 00607 return(E_SYS); 00608 } 00609 00610 pk_rpor->reacnt = p_spcb->rcv_count; 00611 pk_rpor->wricnt = p_spcb->snd_count; 00612 return(E_OK); 00613 }
参照先 serial_port_control_block::p_siopcb, sio_ena_cbr(), SIO_RDY_SND, と sio_snd_chr().
参照元 serial_rea_chr(), serial_wri_chr(), と sio_irdy_rcv().
00362 { 00363 if (sio_snd_chr(p_spcb->p_siopcb, c)) { 00364 return(true); 00365 } 00366 else { 00367 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND); 00368 return(false); 00369 } 00370 }
参照先 gen_ercd_sys(), gen_ercd_wait(), INC_PTR, serial_port_control_block::ioctl, IOCTL_CRLF, loc_cpu(), serial_port_control_block::p_spinib, serial_snd_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_initialization_block::snd_semid, serial_port_control_block::snd_stopped, serial_port_control_block::snd_write_ptr, SVC, unl_cpu(), と wai_sem().
参照元 serial_rea_dat(), と serial_wri_dat().
00377 { 00378 bool_t buffer_full; 00379 ER ercd, rercd; 00380 00381 /* 00382 * LFの前にCRを送信する. 00383 */ 00384 if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) { 00385 SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd); 00386 if ((bool_t) rercd) { 00387 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 00388 gen_ercd_wait(rercd, p_spcb)); 00389 } 00390 } 00391 00392 SVC(loc_cpu(), gen_ercd_sys(p_spcb)); 00393 if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped) 00394 && serial_snd_chr(p_spcb, c)) { 00395 /* 00396 * シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し 00397 * た場合. 00398 */ 00399 buffer_full = false; 00400 } 00401 else { 00402 /* 00403 * 送信バッファに文字を入れる. 00404 */ 00405 p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c; 00406 INC_PTR(p_spcb->snd_write_ptr, p_spcb->p_spinib->snd_bufsz); 00407 p_spcb->snd_count++; 00408 buffer_full = (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz); 00409 } 00410 00411 SVC(unl_cpu(), gen_ercd_sys(p_spcb)); 00412 ercd = (ER_BOOL) buffer_full; 00413 00414 error_exit: 00415 return(ercd); 00416 }
参照先 E_CTX, E_ID, E_OBJ, E_OK, E_SYS, serial_port_control_block::errorflag, gen_ercd_sys(), gen_ercd_wait(), get_spcb, serial_port_control_block::openflag, serial_port_control_block::p_spinib, serial_wri_chr(), sig_sem(), serial_port_initialization_block::snd_semid, sns_dpn(), SVC, TNUM_PORT, と wai_sem().
参照元 logtask_putc().
00423 { 00424 SPCB *p_spcb; 00425 bool_t buffer_full; 00426 uint_t wricnt = 0U; 00427 ER ercd, rercd; 00428 00429 if (sns_dpn()) { /* コンテキストのチェック */ 00430 return(E_CTX); 00431 } 00432 if (!(1 <= portid && portid <= TNUM_PORT)) { 00433 return(E_ID); /* ポート番号のチェック */ 00434 } 00435 00436 p_spcb = get_spcb(portid); 00437 if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ 00438 return(E_OBJ); 00439 } 00440 if (p_spcb->errorflag) { /* エラー状態かのチェック */ 00441 return(E_SYS); 00442 } 00443 00444 buffer_full = true; /* ループの1回めはwai_semする */ 00445 while (wricnt < len) { 00446 if (buffer_full) { 00447 SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), 00448 gen_ercd_wait(rercd, p_spcb)); 00449 } 00450 SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd); 00451 wricnt++; 00452 buffer_full = (bool_t) rercd; 00453 } 00454 if (!buffer_full) { 00455 SVC(sig_sem(p_spcb->p_spinib->snd_semid), gen_ercd_sys(p_spcb)); 00456 } 00457 ercd = E_OK; 00458 00459 error_exit: 00460 return(wricnt > 0U ? (ER_UINT) wricnt : ercd); 00461 }
void sio_irdy_rcv | ( | intptr_t | exinf | ) |
参照先 BUFCNT_STOP, serial_port_control_block::errorflag, FC_START, FC_STOP, INC_PTR, serial_port_control_block::ioctl, IOCTL_FCANY, IOCTL_FCRCV, IOCTL_FCSND, isig_sem(), serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_initialization_block::rcv_buffer, serial_port_initialization_block::rcv_bufsz, serial_port_control_block::rcv_count, serial_port_control_block::rcv_fc_chr, serial_port_initialization_block::rcv_semid, serial_port_control_block::rcv_stopped, serial_port_control_block::rcv_write_ptr, serial_snd_chr(), sio_rcv_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_initialization_block::snd_semid, と serial_port_control_block::snd_stopped.
参照元 upd72001_irdy_rcv().
00658 { 00659 SPCB *p_spcb; 00660 char_t c; 00661 00662 p_spcb = (SPCB *) exinf; 00663 c = (char_t) sio_rcv_chr(p_spcb->p_siopcb); 00664 if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) { 00665 /* 00666 * 送信を一時停止する.送信中の文字はそのまま送信する. 00667 */ 00668 p_spcb->snd_stopped = true; 00669 } 00670 else if (p_spcb->snd_stopped && (c == FC_START 00671 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) { 00672 /* 00673 * 送信を再開する. 00674 */ 00675 p_spcb->snd_stopped = false; 00676 if (p_spcb->snd_count > 0U) { 00677 c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; 00678 if (serial_snd_chr(p_spcb, c)) { 00679 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 00680 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) { 00681 if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) { 00682 p_spcb->errorflag = true; 00683 } 00684 } 00685 p_spcb->snd_count--; 00686 } 00687 } 00688 } 00689 else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) { 00690 /* 00691 * 送信に対してフロー制御している場合,START は捨てる. 00692 */ 00693 } 00694 else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) { 00695 /* 00696 * バッファフルの場合,受信した文字を捨てる. 00697 */ 00698 } 00699 else { 00700 /* 00701 * 受信した文字を受信バッファに入れる. 00702 */ 00703 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c; 00704 INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz); 00705 if (p_spcb->rcv_count == 0U) { 00706 if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) { 00707 p_spcb->errorflag = true; 00708 } 00709 } 00710 p_spcb->rcv_count++; 00711 00712 /* 00713 * STOPを送信する. 00714 */ 00715 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped) 00716 && p_spcb->rcv_count 00717 >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) { 00718 if (!serial_snd_chr(p_spcb, FC_STOP)) { 00719 p_spcb->rcv_fc_chr = FC_STOP; 00720 } 00721 p_spcb->rcv_stopped = true; 00722 } 00723 } 00724 }
void sio_irdy_snd | ( | intptr_t | exinf | ) |
参照先 serial_port_control_block::errorflag, INC_PTR, isig_sem(), serial_port_control_block::p_siopcb, serial_port_control_block::p_spinib, serial_port_control_block::rcv_fc_chr, sio_dis_cbr(), SIO_RDY_SND, sio_snd_chr(), serial_port_initialization_block::snd_buffer, serial_port_initialization_block::snd_bufsz, serial_port_control_block::snd_count, serial_port_control_block::snd_read_ptr, serial_port_initialization_block::snd_semid, と serial_port_control_block::snd_stopped.
参照元 upd72001_irdy_snd().
00620 { 00621 SPCB *p_spcb; 00622 00623 p_spcb = (SPCB *) exinf; 00624 if (p_spcb->rcv_fc_chr != '\0') { 00625 /* 00626 * START/STOP を送信する. 00627 */ 00628 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr); 00629 p_spcb->rcv_fc_chr = '\0'; 00630 } 00631 else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) { 00632 /* 00633 * 送信バッファ中から文字を取り出して送信する. 00634 */ 00635 (void) sio_snd_chr(p_spcb->p_siopcb, 00636 p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]); 00637 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); 00638 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) { 00639 if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) { 00640 p_spcb->errorflag = true; 00641 } 00642 } 00643 p_spcb->snd_count--; 00644 } 00645 else { 00646 /* 00647 * 送信すべき文字がない場合は,送信可能コールバックを禁止する. 00648 */ 00649 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND); 00650 } 00651 }
char_t rcv_buffer1[SERIAL_RCV_BUFSZ1] [static] |
char_t snd_buffer1[SERIAL_SND_BUFSZ1] [static] |
SPCB spcb_table[TNUM_PORT] [static] |
const SPINIB spinib_table[TNUM_PORT] [static] |
初期値:
{ { SERIAL_RCV_SEM1, SERIAL_SND_SEM1, SERIAL_RCV_BUFSZ1, rcv_buffer1, SERIAL_SND_BUFSZ1, snd_buffer1 }, }
Copyright © 2008 by Kijineko Inc.