serial.h

ソースコードを見る。

データ構造

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

serial.h89 行で定義されています。

参照元 main_task(), serial_opn_por(), と serial_wri_chr().

#define IOCTL_ECHO   0x0001U

serial.h88 行で定義されています。

参照元 serial_opn_por(), と serial_rea_dat().

#define IOCTL_FCANY   0x0200U

serial.h91 行で定義されています。

参照元 sio_irdy_rcv().

#define IOCTL_FCRCV   0x0400U

serial.h92 行で定義されています。

参照元 main_task(), serial_opn_por(), と sio_irdy_rcv().

#define IOCTL_FCSND   0x0100U

serial.h90 行で定義されています。

参照元 main_task(), serial_opn_por(), と sio_irdy_rcv().

#define IOCTL_NULL   0U

serial.h87 行で定義されています。


関数

ER serial_cls_por ( ID  portid  )  throw ()

serial.c295 行で定義されています。

参照先 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 }

ER serial_ctl_por ( ID  portid,
uint_t  ioctl 
) throw ()

serial.c564 行で定義されています。

参照先 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 }

bool_t serial_get_chr ( ID  portid,
char_t p_c 
) throw ()

serial.c730 行で定義されています。

参照先 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.c209 行で定義されています。

参照先 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 }

ER serial_opn_por ( ID  portid  )  throw ()

serial.c224 行で定義されています。

参照先 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 }

ER_UINT serial_rea_dat ( ID  portid,
char_t buf,
uint_t  len 
) throw ()

serial.c504 行で定義されています。

参照先 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 ()

serial.c591 行で定義されています。

参照先 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 }

ER_UINT serial_wri_dat ( ID  portid,
char_t buf,
uint_t  len 
) throw ()

serial.c422 行で定義されています。

参照先 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.

ホームページ制作