예제 #1
0
파일: consdrv.c 프로젝트: Plemling138/REI-N
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;
}
예제 #2
0
int serial_send_byte(int index, unsigned char b)
{
	volatile struct h8_3048f_sci *sci = regs[index].sci;

	while (!serial_is_send_enable(index));

	sci->tdr = b;
	sci->ssr &= ~H8_3048F_SCI_SSR_TDRE;
	return 0;
}
예제 #3
0
파일: serial.c 프로젝트: Plemling138/REI-N
//send 1 char
int serial_send_byte(int index, unsigned char c){
  volatile struct h8_3069f_sci *sci = regs[index].sci;

  //wait for send enable
  while(!serial_is_send_enable(index));
  sci->tdr = c;
  sci->ssr &= ~H8_3069F_SCI_SSR_TDRE;

  return 0;
}
예제 #4
0
파일: serial.c 프로젝트: forest1040/kozos
/* 1文字送信 */
int serial_send_byte(int index, unsigned char c)
{
  volatile struct h8_3069f_sci *sci = regs[index].sci;

  /* 送信可能になるまで待つ */
  while (!serial_is_send_enable(index))
    ;
  sci->tdr = c;
  sci->ssr &= ~H8_3069F_SCI_SSR_TDRE; /* 送信開始 */

  return 0;
}
예제 #5
0
파일: serial.c 프로젝트: nekogigi/kozos
/* 」アハクサ愠ョ */
int serial_send_byte(int index, unsigned char c)
{
  volatile struct h8_3069f_sci *sci = regs[index].sci;

  /* チョイトヌス、ヒ、ハ、�゙、ヌツヤ、ト */
  while (!serial_is_send_enable(index))
    ;
  sci->tdr = c;
  sci->ssr &= ~H8_3069F_SCI_SSR_TDRE; /* チョウォサマ */

  return 0;
}
예제 #6
0
파일: consdrv.c 프로젝트: Plemling138/REI-N
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);
    }
  }
}
예제 #7
0
파일: serial.c 프로젝트: tkokamo/takos
int serial_send_byte(int index, unsigned char c)
{
  volatile struct h8_3069f_sci *sci = regs[index].sci;

  /*wait until send enable*/
  while (!serial_is_send_enable(index))
    ;
  sci->tdr = c;
  sci->ssr &= ~H8_3069F_SCI_SSR_TDRE; /*start sending*/

  return 0; 

}
예제 #8
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;
}