static int consdrv_intrproc(struct consreg *cons) { unsigned char c; char *p; if(serial_is_recv_enable(cons->index)) { c = serial_recv_byte(cons->index); if(c == '\r') c = '\n'; send_string(cons, &c, 1); if(cons->id) { if(c != '\n') cons->recv_buf[cons->recv_len++] = c; else { p = svc_memalloc(CONS_BUF_SIZE); memcpy(p, cons->recv_buf, cons->recv_len); svc_send(MLBOX_ID_CONSINPUT, cons->recv_len, p); cons->recv_len = 0; } } } if(serial_is_send_enable(cons->index)) { if(!cons->id || !cons->send_len) serial_intr_send_disable(cons->index); else send_char(cons); } return 0; }
unsigned char serial_recv_byte(int index) { volatile struct h8_3048f_sci *sci = regs[index].sci; unsigned char c; /* 受信文字が来るまで待つ */ while (!serial_is_recv_enable(index)); c = sci->rdr; sci->ssr &= ~H8_3048F_SCI_SSR_RDRF; /* 受信完了 */ return c; }
static int xmodem_wait(void) { long cnt = 0; while (!serial_is_recv_enable(SERIAL_DEFAULT_DEVICE)) { if (++cnt >= 2000000) { cnt = 0; serial_send_byte(SERIAL_DEFAULT_DEVICE, XMODEM_NAK); } } return 0; }
//recv 1 char unsigned char serial_recv_byte(int index){ volatile struct h8_3069f_sci *sci = regs[index].sci; unsigned char c; //wait for recv enable while(!serial_is_recv_enable(index)); c = sci -> rdr; sci -> ssr &= ~H8_3069F_SCI_SSR_RDRF; //complete receiving return c; }
unsigned char serial_recv_byte(int index){ volatile struct h8_3069f_sci *sci = regs[index].sci; unsigned char c; while(!serial_is_recv_enable(index)) ; c = sci->rdr; sci->ssr &= ~H8_3069F_SCI_SSR_RDRF; return c; }
static void consdrv_intr(void) { int i; struct consreg *cons; for(i=0; i < CONSDRV_DEVICE_NUM; i++) { cons = &consreg[i]; if(cons->id) { if(serial_is_send_enable(cons->index) || serial_is_recv_enable(cons->index)) consdrv_intrproc(cons); } } }
/* 」アハクサ恝ョ */ unsigned char serial_recv_byte(int index) { volatile struct h8_3069f_sci *sci = regs[index].sci; unsigned char c; /* ショハクサ妤ャヘ隍�゙、ヌツヤ、ト */ while (!serial_is_recv_enable(index)) ; c = sci->rdr; sci->ssr &= ~H8_3069F_SCI_SSR_RDRF; /* ショエーホサ */ return c; }
/* * 以下は割込みハンドラから呼ばれる割込み処理であり,非同期で * 呼ばれるので,ライブラリ関数などを呼び出す場合には注意が必要. * 基本として,以下のいずれかに当てはまる関数しか呼び出してはいけない. * ・再入可能である. * ・スレッドから呼ばれることは無い関数である. * ・スレッドから呼ばれることがあるが,割込み禁止で呼び出している. * また非コンテキスト状態で呼ばれるため,システム・コールは利用してはいけない. * (サービス・コールを利用すること) */ static int consdrv_intrproc(struct consreg *cons) { unsigned char c; char *p; if (serial_is_recv_enable(cons->index)) { /* 受信割込み */ c = serial_recv_byte(cons->index); if (c == 0x03) { force_break(); return 0; } if (c == '\r') /* 改行コード変換(\r→\n) */ c = '\n'; send_string(cons, &c, 1); /* エコーバック処理 */ if (cons->id) { if (c != '\n') { /* 改行でないなら,受信バッファにバッファリングする */ cons->recv_buf[cons->recv_len++] = c; } else { /* * Enterが押されたら,バッファの内容を * コマンド処理スレッドに通知する. * (割込みハンドラなので,サービス・コールを利用する) */ p = kx_kmalloc(CONS_BUFFER_SIZE); memcpy(p, cons->recv_buf, cons->recv_len); kx_send(MSGBOX_ID_CONSINPUT, cons->recv_len, p); cons->recv_len = 0; } } } if (serial_is_send_enable(cons->index)) { /* 送信割込み */ if (!cons->id || !cons->send_len) { /* 送信データが無いならば,送信処理終了 */ serial_intr_send_disable(cons->index); } else { /* 送信データがあるならば,引続き送信する */ send_char(cons); } } return 0; }
/* * 以下は割り込みハンドラから呼ばれる割り込み処理であり、 * 非同期で呼ばれるので、ライブラリ関数などを呼び出す場合は注意が必要。 * 基本として、以下のいずれかに当てはまる関数しか呼び出してはいけない。 * ・再入可能である * ・スレッドから呼ばれることは無い関数である * ・スレッドから呼ばれることがあるが、割り込み禁止で呼び出している * また非コンテキスト状態でよばれるため、システムコールは利用してはいけない。 * (サービスコールを利用すること) */ static int consdrv_intrproc(struct consreg *cons) { unsigned char c; char *p; /* 受信割り込みが発生している場合 */ if (serial_is_recv_enable(cons->index)) { c = serial_recv_byte(cons->index); if (c == '\r') c = '\n'; /* エコーバック */ send_string(cons, &c, 1); if (cons->id) { if (c != '\n') { /* 改行でなければ受信バッファにバッファリングする */ cons->recv_buf[cons->recv_len++] = c; } else { /* Enterが押されたら、バッファの内容をコマンド処理スレッドに通知 */ p = kx_kmalloc(CONS_BUFFER_SIZE); memcpy(p, cons->recv_buf, cons->recv_len); kx_send(MSGBOX_ID_CONSINPUT, cons->recv_len, p); cons->recv_len = 0; } } } /* 送信割り込みが発生している場合 */ if (serial_intr_is_send_enable(cons->index)) { if (!cons->id || !cons->send_len) { /* 送信データがないなら送信処理終了 */ serial_intr_send_disable(cons->index); } else { /* 送信データあるなら引き続き送信 */ send_char(cons); } } return 0; }