static void send_string(struct consreg *cons, char *str, int len) { int i; for(i=0; i < len; i++) { if(str[i] == '\n') cons->send_buf[cons->send_len++] = '\r'; cons->send_buf[cons->send_len++] = str[i]; } if(cons->send_len && !serial_intr_is_send_enable(cons->index)) { serial_intr_send_enable(cons->index); send_char(cons); } }
/* 割り込みハンドラ */ 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_intr_is_send_enable(cons->index) || serial_is_recv_enable(cons->index)) { /* 割り込みがあれば割り込み処理を呼び出す */ consdrv_intrproc(cons); } } } }
/* 文字列を送信バッファに書き込み送信開始する */ static void send_string(struct consreg *cons, char *str, int len) { int i; for (i = 0; i < len; i++) { /* 文字列を送信バッファにコピー */ if (str[i] == '\n') /* \n→\r\nに変換 */ cons->send_buf[cons->send_len++] = '\r'; cons->send_buf[cons->send_len++] = str[i]; } /* * 送信割込み無効ならば,送信開始されていないので送信開始する. * 送信割込み有効ならば送信開始されており,送信割込みの延長で * 送信バッファ内のデータが順次送信されるので,何もしなくてよい. */ if (cons->send_len && !serial_intr_is_send_enable(cons->index)) { serial_intr_send_enable(cons->index); /* 送信割込み有効化 */ send_char(cons); /* 送信開始 */ } }
/* * 以下は割り込みハンドラから呼ばれる割り込み処理であり、 * 非同期で呼ばれるので、ライブラリ関数などを呼び出す場合は注意が必要。 * 基本として、以下のいずれかに当てはまる関数しか呼び出してはいけない。 * ・再入可能である * ・スレッドから呼ばれることは無い関数である * ・スレッドから呼ばれることがあるが、割り込み禁止で呼び出している * また非コンテキスト状態でよばれるため、システムコールは利用してはいけない。 * (サービスコールを利用すること) */ 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; }
/* 文字列を送信バッファに書き込み送信開始する */ static void send_string(struct consreg *cons, char *str, int len) { int i; /* 文字列を送信バッファにコピー */ for (i = 0; i < len; i++) { /* \n => \r\n に変換 */ if (str[i] == '\n') cons->send_buf[cons->send_len++] = '\r'; cons->send_buf[cons->send_len++] = str[i]; } /* * 送信割り込み無効であれば、送信開始されていないので送信開始する。 * 送信割り込み有効であれば、送信歌詞されており、送信割り込みの延長で * 送信バッファ内のデータが順次送信されるので何もしなくていい */ if (cons->send_len && !serial_intr_is_send_enable(cons->index)) { serial_intr_send_enable(cons->index); send_char(cons); } }