Index: asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_citrus_gcc/target_serial.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_citrus_gcc/target_serial.c	(revision 374)
+++ asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_citrus_gcc/target_serial.c	(revision 387)
@@ -3,14 +3,8 @@
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
- *
- *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
- *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2003-2004 by Naoki Saito
- *             Nagoya Municipal Industrial Research Institute, JAPAN
- *  Copyright (C) 2003-2004 by Platform Development Center
- *                                          RICOH COMPANY,LTD. JAPAN
- *  Copyright (C) 2008-2010 by Witz Corporation, JAPAN
- *  Copyright (C) 2013      by Mitsuhiro Matsuura
- *
+ * 
+ *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
  *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
  *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
@@ -35,5 +29,5 @@
  *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
  *      免責すること．
- *
+ * 
  *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
  *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
@@ -41,72 +35,66 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
  *  の責任を負わない．
- *
+ * 
  *  @(#) $Id$
  */
 
 /*
- *	RX630 UART用シリアルI/Oモジュール
- */
-#include "kernel_impl.h"
-#include <sil.h>
+ *		シリアルインタフェースドライバのターゲット依存部（GR-CITRUS用）
+ */
+
+#include "gr_citrus.h"
+#include <t_stddef.h>
+#include <t_syslog.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
 #include "target_serial.h"
-#include "hal/serial_api.h"
-#include "target_syssvc.h"
-#include "syssvc/serial.h"
-
-/*
- *  シリアルI/Oポート初期化ブロックの定義
+#include "syssvc/siofd.h"
+
+/*
+ *  SIOポート初期化ブロックの定義
  */
 typedef struct sio_port_initialization_block {
-	PinName tx;
-	PinName rx;
+	char		*path;			/* ファイルのパス名 */
 } SIOPINIB;
 
 /*
- *  シリアルI/Oポート管理ブロックの定義
+ *  SIOポート管理ブロックの定義
  */
 struct sio_port_control_block {
-	const SIOPINIB *p_siopinib;
-	intptr_t exinf;
-	bool_t openflag;
-	serial_t serial;
+	const SIOPINIB *p_siopinib;	/* SIOポート初期化ブロック */
+	intptr_t	exinf;			/* 拡張情報 */
+	bool_t		opened;		/* オープン済みフラグ */
+	struct termios saved_term;	/* 元の端末制御情報 */
+
+	int_t		read_fd;		/* 読出し用ファイルディスクリプタ */
+	bool_t		rcv_flag;		/* 受信文字バッファ有効フラグ */
+	char		rcv_buf;		/* 受信文字バッファ */
+	bool_t		rcv_rdy;		/* 受信通知コールバック許可フラグ */
+
+	int_t		write_fd;		/* 書込み用ファイルディスクリプタ */
+	bool_t		snd_flag;		/* 送信文字バッファ有効フラグ */
+	char		snd_buf;		/* 送信文字バッファ */
+	bool_t		snd_rdy;		/* 送信通知コールバック許可フラグ */
 };
 
 /*
- *  シリアルI/Oポート管理ブロックのエリア
- */
-SIOPCB siopcb_table[TNUM_PORT];
-
-static const SIOPINIB siopinib_table[TNUM_SIOP] =
-{
-	{ P20, P21 },
-#if TNUM_SIOP > 1
-	{ P50, P52 },
-#endif
-#if TNUM_SIOP > 2
-	{ P32, P33 },
-#endif
-#if TNUM_SIOP > 3
-	{ PC7, PC6 },
-#endif
-#if TNUM_SIOP > 4
-	{ P26, P30 },
-#endif
-#if TNUM_SIOP > 5
-	{ PB5, P25 },
-#endif
-#if TNUM_SIOP > 6
-	{ PA0, PC2 },
-#endif
+ *  SIOポート初期化ブロック
+ */
+const SIOPINIB siopinib_table[TNUM_SIOP] = {
+	{ NULL }
 };
 
 /*
- *  シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
- */
-#define INDEX_SIOP(siopid)	 ((uint_t)((siopid) - 1))
-#define get_siopcb(siopid)	 (&(siopcb_table[INDEX_SIOP(siopid)]))
-#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOP(siopid)]))
-
-static void mbed_serial_irq_handler(uint32_t id, SerialIrq event);
+ *  SIOポート管理ブロックのエリア
+ */
+SIOPCB	siopcb_table[TNUM_SIOP];
+
+/*
+ *  SIOポートIDから管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_SIOP(siopid)	((uint_t)((siopid) - 1))
+#define get_siopcb(siopid)	(&(siopcb_table[INDEX_SIOP(siopid)]))
 
 /*
@@ -120,95 +108,194 @@
 
 	/*
-	 *  シリアルI/Oポート管理ブロックの初期化
+	 *  SIOポート管理ブロックの初期化
 	 */
-	for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
+	for (i = 0; i < TNUM_SIOP; i++) {
+		p_siopcb = &(siopcb_table[i]);
 		p_siopcb->p_siopinib = &(siopinib_table[i]);
-		p_siopcb->openflag = false;
-	}
-}
-
-/*
- *  シリアルI/Oポートのオープン
+		p_siopcb->opened = false;
+	}
+}
+
+/*
+ *  SIOドライバの終了処理
+ */
+void
+sio_terminate(intptr_t exinf)
+{
+	uint_t	i;
+
+	/*
+	 *  オープンされているSIOポートのクローズ
+	 */
+	for (i = 0; i < TNUM_SIOP; i++) {
+		sio_cls_por(&(siopcb_table[i]));
+	}
+}
+
+/*
+ *  SIOポートのオープン
  */
 SIOPCB *
 sio_opn_por(ID siopid, intptr_t exinf)
 {
-	SIOPCB  *p_siopcb = NULL;
-	ER      ercd;
-	serial_t *serial;
-
-	if ((siopid <= 0) || (siopid > (sizeof(siopcb_table) / sizeof(siopcb_table[0]))))
-		return NULL;
+	SIOPCB			*p_siopcb;
+	const SIOPINIB	*p_siopinib;
+	int_t			fd;
+	struct termios	term;
+
 	p_siopcb = get_siopcb(siopid);
-
-	if (p_siopcb->openflag)
-		return NULL;
-	p_siopcb->openflag = true;
-	p_siopcb->exinf = exinf;
-
-	serial = &p_siopcb->serial;
-	serial_init(serial, p_siopcb->p_siopinib->tx, p_siopcb->p_siopinib->rx);
-	serial_baud(serial, UART_BAUDRATE);
-	serial_format(serial, 8, ParityNone, 1);
-
-	serial_irq_handler(serial, mbed_serial_irq_handler, siopid);
-
-	return p_siopcb;
-}
-
-/*
- *  シリアルI/Oポートのクローズ
+	p_siopinib = p_siopcb->p_siopinib;
+
+	if (!(p_siopcb->opened)) {
+		if (p_siopinib->path != NULL) {
+			fd = siofd_open(p_siopinib->path, O_RDWR, 0777);
+			assert(fd >= 0);
+			p_siopcb->read_fd = fd;
+			p_siopcb->write_fd = fd;
+		}
+		else {
+			fd = STDIN_FILENO;					/* 標準入出力を使う */
+			p_siopcb->read_fd = STDIN_FILENO;
+			p_siopcb->write_fd = STDOUT_FILENO;
+		}
+		siofd_fcntl(fd, F_SETOWN, getpid());
+		siofd_fcntl(fd, F_SETFL, (O_NONBLOCK | O_ASYNC));
+
+		siofd_tcgetattr(fd, &(p_siopcb->saved_term));
+		term = p_siopcb->saved_term;
+		term.c_lflag &= ~(ECHO | ICANON);
+		siofd_tcsetattr(fd, TCSAFLUSH, &term);
+
+		p_siopcb->exinf = exinf;
+		p_siopcb->rcv_flag = false;
+		p_siopcb->rcv_rdy = false;
+		p_siopcb->snd_flag = false;
+		p_siopcb->snd_rdy = false;
+		p_siopcb->opened = true;
+	}
+	return(p_siopcb);
+}
+
+/*
+ *  SIOポートのクローズ
  */
 void
 sio_cls_por(SIOPCB *p_siopcb)
 {
-	ER        ercd;
-	serial_t *serial = &p_siopcb->serial;
-
-	/*
-	 *  デバイス依存のクローズ処理．
-	 */
-	serial_free(serial);
-	p_siopcb->openflag = false;
-}
-
-/*
- *  シリアルI/Oポートへの文字送信
+	int_t	fd;
+
+	if (p_siopcb->opened) {
+		fd = p_siopcb->read_fd;
+		siofd_tcsetattr(fd, TCSAFLUSH, &(p_siopcb->saved_term));
+		siofd_fcntl(fd, F_SETFL, 0);
+
+		if (p_siopcb->p_siopinib->path != NULL) {
+			siofd_close(p_siopcb->read_fd);
+		}
+
+		p_siopcb->opened = false;
+	}
+}
+
+/*
+ *  SIOの割込みサービスルーチン
+ */
+bool_t
+sio_isr_snd(ID siopid)
+{
+	SIOPCB	*p_siopcb = get_siopcb(siopid);
+	int_t	n;
+
+	if (p_siopcb->snd_flag) {
+		if ((n = siofd_write(p_siopcb->write_fd, &(p_siopcb->snd_buf), 1)) > 0) {
+			p_siopcb->snd_flag = false;
+			if (p_siopcb->snd_rdy) {
+				sio_irdy_snd(p_siopcb->exinf);
+				return p_siopcb->snd_rdy;
+			}
+		}
+	}
+
+	return false;
+}
+
+/*
+ *  SIOの割込みサービスルーチン
+ */
+bool_t
+sio_isr_rcv(ID siopid, char c)
+{
+	SIOPCB	*p_siopcb = get_siopcb(siopid);
+
+	if (!p_siopcb->rcv_flag) {
+		p_siopcb->rcv_buf = c;
+		p_siopcb->rcv_flag = true;
+		if (p_siopcb->rcv_rdy) {
+			sio_irdy_rcv(p_siopcb->exinf);
+			return p_siopcb->rcv_rdy;
+		}
+	}
+
+	return false;
+}
+
+/*
+ *  SIOポートへの文字送信
  */
 bool_t
 sio_snd_chr(SIOPCB *p_siopcb, char c)
 {
-	serial_t *serial = &p_siopcb->serial;
-	if (!serial_writable(serial))
-		return false;
-	serial_putc(serial, c);
-	return true;
-}
-
-/*
- *  シリアルI/Oポートからの文字受信
+	int_t	n;
+
+	if (!p_siopcb->snd_flag) {
+		if ((n = siofd_write(p_siopcb->write_fd, &c, 1)) > 0) {
+			return(true);
+		}
+		else {
+			assert(n < 0 && errno == EAGAIN);
+			p_siopcb->snd_flag = true;
+			p_siopcb->snd_buf = c;
+			return(true);
+		}
+	}
+	else {
+		return(false);
+	}
+}
+
+/*
+ *  SIOポートからの文字受信
  */
 int_t
 sio_rcv_chr(SIOPCB *p_siopcb)
 {
-	serial_t *serial = &p_siopcb->serial;
-	if (!serial_readable(serial))
-		return -1;
-	return serial_getc(serial);
-}
-
-/*
- *  シリアルI/Oポートからのコールバックの許可
+	char	c;
+	int_t	n;
+
+	if (p_siopcb->rcv_flag) {
+		p_siopcb->rcv_flag = false;
+		return((int_t)(uint8_t)(p_siopcb->rcv_buf));
+	}
+	else if ((n = siofd_read(p_siopcb->read_fd, &c, 1)) > 0) {
+		return((int_t)(uint8_t) c);
+	}
+	else {
+		assert(n < 0 && errno == EAGAIN);
+		return(-1);
+	}
+}
+
+/*
+ *  SIOポートからのコールバックの許可
  */
 void
 sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
 {
-	serial_t *serial = &p_siopcb->serial;
 	switch (cbrtn) {
 	case SIO_RDY_SND:
-		serial_irq_set(serial, TxIrq, true);
+		p_siopcb->snd_rdy = true;
 		break;
 	case SIO_RDY_RCV:
-		serial_irq_set(serial, RxIrq, true);
+		p_siopcb->rcv_rdy = true;
 		break;
 	}
@@ -216,62 +303,16 @@
 
 /*
- *  シリアルI/Oポートからのコールバックの禁止
+ *  SIOポートからのコールバックの禁止
  */
 void
 sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
 {
-	serial_t *serial = &p_siopcb->serial;
 	switch (cbrtn) {
 	case SIO_RDY_SND:
-		serial_irq_set(serial, TxIrq, false);
+		p_siopcb->snd_rdy = false;
 		break;
 	case SIO_RDY_RCV:
-		serial_irq_set(serial, RxIrq, false);
+		p_siopcb->rcv_rdy = false;
 		break;
 	}
 }
-
-/*
- *  シリアルI/Oポートからの送信可能コールバック
- */
-void
-serial_irdy_snd(SIOPCB  *p_siopcb)
-{
-	/* 共通部（syssvc\serial.c）にあるsio_irdy_snd関数を呼び出し*/
-	sio_irdy_snd(p_siopcb->exinf);
-}
-
-/*
- *  シリアルI/Oポートからの受信通知コールバック
- */
-void
-serial_irdy_rcv(SIOPCB  *p_siopcb)
-{
-	/* 共通部（syssvc\serial.c）にあるsio_irdy_rcv関数を呼び出し*/
-	sio_irdy_rcv(p_siopcb->exinf);
-}
-
-/*
- *  SIOの割込みハンドラ
- */
-void
-mbed_serial_irq_handler(uint32_t siopid, SerialIrq event)
-{
-	SIOPCB  *p_siopcb;
-
-	if ((siopid <= 0) || (siopid > (sizeof(siopcb_table) / sizeof(siopcb_table[0]))))
-		return;
-	p_siopcb = get_siopcb(siopid);
-
-	if (!p_siopcb->openflag)
-		return;
-
-	switch (event) {
-	case TxIrq:
-		serial_irdy_snd(p_siopcb);
-		break;
-	case RxIrq:
-		serial_irdy_rcv(p_siopcb);
-		break;
-	}
-}
