データ構造 | |
struct | T_SERIAL_RPOR |
マクロ定義 | |
#define | IOCTL_NULL 0U |
#define | IOCTL_ECHO 0x0001U |
#define | IOCTL_CRLF 0x0010U |
#define | IOCTL_FCSND 0x0100U |
#define | IOCTL_FCANY 0x0200U |
#define | IOCTL_FCRCV 0x0400U |
関数 | |
void | serial_initialize (intptr_t exinf) throw () |
bool_t | serial_get_chr (ID portid, char_t *p_c) throw () |
ER | serial_opn_por (ID portid) throw () |
ER | serial_cls_por (ID portid) throw () |
ER_UINT | serial_rea_dat (ID portid, char_t *buf, uint_t len) throw () |
ER_UINT | serial_wri_dat (ID portid, char_t *buf, uint_t len) throw () |
ER | serial_ctl_por (ID portid, uint_t ioctl) throw () |
ER | serial_ref_por (ID portid, T_SERIAL_RPOR *pk_rpor) throw () |
#define IOCTL_CRLF 0x0010U |
#define IOCTL_ECHO 0x0001U |
#define IOCTL_FCANY 0x0200U |
#define IOCTL_FCRCV 0x0400U |
#define IOCTL_FCSND 0x0100U |
参照先 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 | ) | throw () |
参照先 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 }
参照先 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 | |||
) | throw () |
参照先 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 }
参照先 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 }
Copyright © 2008 by Kijineko Inc.