示例#1
0
文件: netdrv.c 项目: nekogigi/kozos
/* 割込みハンドラ */
static void netdrv_intr(void)
{
  struct netbuf *pkt;
  if (rtl8019_checkintr(0)) {
    while (1) {
      pkt = kx_kmalloc(DEFAULT_NETBUF_SIZE);
      memset(pkt, 0, DEFAULT_NETBUF_SIZE);
      pkt->cmd  = ETHERNET_CMD_RECV;

      /*
        * ethernetフレームが14バイトで4の倍数でないので,ethernetフレーム以降が
        * 4バイトアラインメントされるように,データの先頭を2バイト空ける.
      */
      pkt->top  = pkt->data + 2;

      pkt->size = rtl8019_recv(0, pkt->top);
      if (pkt->size > 0) {
	kx_send(MSGBOX_ID_ETHPROC, 0, (char *)pkt);
      } else {
	kx_kmfree(pkt);
	break;
      }
    }
    rtl8019_clearintr(0);
  }
}
示例#2
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 == 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;
}
示例#3
0
文件: consdrv.c 项目: bobchin/kozos
 /*
  * 以下は割り込みハンドラから呼ばれる割り込み処理であり、
  * 非同期で呼ばれるので、ライブラリ関数などを呼び出す場合は注意が必要。
  * 基本として、以下のいずれかに当てはまる関数しか呼び出してはいけない。
  * ・再入可能である
  * ・スレッドから呼ばれることは無い関数である
  * ・スレッドから呼ばれることがあるが、割り込み禁止で呼び出している
  * また非コンテキスト状態でよばれるため、システムコールは利用してはいけない。
  * (サービスコールを利用すること)
  */
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;
}