Index: asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_sakura_gcc/target_serial.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_sakura_gcc/target_serial.c	(revision 337)
+++ asp3_tinet_ecnl_rx/trunk/asp3_dcre/target/gr_sakura_gcc/target_serial.c	(revision 374)
@@ -3,5 +3,5 @@
  *      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
@@ -12,5 +12,5 @@
  *  Copyright (C) 2008-2010 by Witz Corporation, JAPAN
  *  Copyright (C) 2013      by Mitsuhiro Matsuura
- * 
+ *
  *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
  *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
@@ -35,5 +35,5 @@
  *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
  *      免責すること．
- * 
+ *
  *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
  *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
@@ -41,5 +41,5 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
  *  の責任を負わない．
- * 
+ *
  *  @(#) $Id$
  */
@@ -51,4 +51,62 @@
 #include <sil.h>
 #include "target_serial.h"
+#include "hal/serial_api.h"
+#include "target_syssvc.h"
+#include "syssvc/serial.h"
+
+/*
+ *  シリアルI/Oポート初期化ブロックの定義
+ */
+typedef struct sio_port_initialization_block {
+	PinName tx;
+	PinName rx;
+} SIOPINIB;
+
+/*
+ *  シリアルI/Oポート管理ブロックの定義
+ */
+struct sio_port_control_block {
+	const SIOPINIB *p_siopinib;
+	intptr_t exinf;
+	bool_t openflag;
+	serial_t serial;
+};
+
+/*
+ *  シリアルI/Oポート管理ブロックのエリア
+ */
+SIOPCB siopcb_table[TNUM_PORT];
+
+static const SIOPINIB siopinib_table[TNUM_SIOP] =
+{
+	{ P20, P21 },
+#if TNUM_SIOP > 1
+	{ P32, P33 },
+#endif
+#if TNUM_SIOP > 2
+	{ P50, P52 },
+#endif
+#if TNUM_SIOP > 3
+	{ P23, P25 },
+#endif
+#if TNUM_SIOP > 4
+	{ PC3, PC2 },
+#endif
+#if TNUM_SIOP > 5
+	{ PC7, PC6 },
+#endif
+#if TNUM_SIOP > 6
+	{ P26, P30 },
+#endif
+};
+
+/*
+ *  シリアル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);
 
 /*
@@ -58,5 +116,14 @@
 sio_initialize(intptr_t exinf)
 {
-	rx630_uart_initialize();
+	SIOPCB	*p_siopcb;
+	uint_t	i;
+
+	/*
+	 *  シリアルI/Oポート管理ブロックの初期化
+	 */
+	for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
+		p_siopcb->p_siopinib = &(siopinib_table[i]);
+		p_siopcb->openflag = false;
+	}
 }
 
@@ -69,31 +136,23 @@
 	SIOPCB  *p_siopcb = NULL;
 	ER      ercd;
-	INTNO	intno_sio_tx, intno_sio_rx;
-	
-	/*
-	 *  シリアルI/O割込みをマスクする．
-	 *  (dis_int関数は、"\kernel\interrupt.c"に記述)
-	 */
-	p_siopcb = rx630_uart_get_siopcb(siopid);
-	intno_sio_tx = rx630_uart_intno_tx(p_siopcb);
-	intno_sio_rx = rx630_uart_intno_rx(p_siopcb);
-	ercd = dis_int(intno_sio_tx);
-	assert(ercd == E_OK);
-	ercd = dis_int(intno_sio_rx);
-	assert(ercd == E_OK);
-	
-	p_siopcb = 
-		rx630_uart_opn_por(siopid , exinf , UART_BAUDRATE , UART_CLKSRC);
-
-	/*
-	 *  シリアルI/O割込みをマスク解除する．
-	 *  (ena_int関数は、"\kernel\interrupt.c"に記述)
-	 */
-	ercd = ena_int(intno_sio_tx);
-	assert(ercd == E_OK);
-	ercd = ena_int(intno_sio_rx);
-	assert(ercd == E_OK);
-
-	return(p_siopcb);
+	serial_t *serial;
+
+	if ((siopid <= 0) || (siopid > (sizeof(siopcb_table) / sizeof(siopcb_table[0]))))
+		return NULL;
+	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;
 }
 
@@ -105,20 +164,90 @@
 {
 	ER        ercd;
-	INTNO	intno_sio_tx, intno_sio_rx;
+	serial_t *serial = &p_siopcb->serial;
 
 	/*
 	 *  デバイス依存のクローズ処理．
 	 */
-	rx630_uart_cls_por(p_siopcb);
-	
-	/*
-	 *  シリアルI/O割込みをマスクする．
-	 */
-	intno_sio_tx = rx630_uart_intno_tx(p_siopcb);
-	intno_sio_rx = rx630_uart_intno_rx(p_siopcb);
-	ercd = dis_int(intno_sio_tx);
-	assert(ercd == E_OK);
-	ercd = dis_int(intno_sio_rx);
-	assert(ercd == E_OK);
+	serial_free(serial);
+	p_siopcb->openflag = false;
+}
+
+/*
+ *  シリアルI/Oポートへの文字送信
+ */
+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
+sio_rcv_chr(SIOPCB *p_siopcb)
+{
+	serial_t *serial = &p_siopcb->serial;
+	if (!serial_readable(serial))
+		return -1;
+	return serial_getc(serial);
+}
+
+/*
+ *  シリアルI/Oポートからのコールバックの許可
+ */
+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);
+		break;
+	case SIO_RDY_RCV:
+		serial_irq_set(serial, RxIrq, true);
+		break;
+	}
+}
+
+/*
+ *  シリアルI/Oポートからのコールバックの禁止
+ */
+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);
+		break;
+	case SIO_RDY_RCV:
+		serial_irq_set(serial, RxIrq, 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);
 }
 
@@ -126,71 +255,23 @@
  *  SIOの割込みハンドラ
  */
-void sio_tx_isr(intptr_t exinf)
-{
-	rx630_uart_tx_isr(exinf);
-}
-
-/*
- *  SIOの割込みハンドラ
- */
-void sio_rx_isr(intptr_t exinf)
-{
-	rx630_uart_rx_isr(exinf);
-}
-
-/*
- *  シリアルI/Oポートへの文字送信
- */
-bool_t
-sio_snd_chr(SIOPCB *siopcb, char c)
-{
-	return(rx630_uart_snd_chr(siopcb, c));
-}
-
-/*
- *  シリアルI/Oポートからの文字受信
- */
-int_t
-sio_rcv_chr(SIOPCB *siopcb)
-{
-	return(rx630_uart_rcv_chr(siopcb));
-}
-
-/*
- *  シリアルI/Oポートからのコールバックの許可
- */
-void
-sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
-	rx630_uart_ena_cbr(siopcb, cbrtn);
-}
-
-/*
- *  シリアルI/Oポートからのコールバックの禁止
- */
-void
-sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
-	rx630_uart_dis_cbr(siopcb, cbrtn);
-}
-
-/*
- *  シリアルI/Oポートからの送信可能コールバック
- */
-void
-rx630_uart_irdy_snd(intptr_t exinf)
-{
-	/* 共通部（syssvc\serial.c）にあるsio_irdy_snd関数を呼び出し*/
-	sio_irdy_snd(exinf);
-}
-
-/*
- *  シリアルI/Oポートからの受信通知コールバック
- */
-void
-rx630_uart_irdy_rcv(intptr_t exinf)
-{
-	/* 共通部（syssvc\serial.c）にあるsio_irdy_rcv関数を呼び出し*/
-	sio_irdy_rcv(exinf);
-}
-
+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;
+	}
+}
