Beispiel #1
0
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);
  }
}
Beispiel #2
0
/* 割り込みハンドラ */
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);
      }
    }
  }
}
Beispiel #3
0
/* 文字列を送信バッファに書き込み送信開始する */
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); /* 送信開始 */
  }
}
Beispiel #4
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;
}
Beispiel #5
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);
    }
 }