summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorprife <[email protected]>2013-02-07 23:18:59 +0800
committerprife <[email protected]>2013-02-07 23:18:59 +0800
commit1c522be5151b0cebb7fc3b7fb35c682f243eb74c (patch)
treea71ca4d567f67ff9409d36748b92f9227be782ad
parentdc089a64445523496abfca3ceb7cec259ecd87ac (diff)
rewrite serial/uart code in simulator to support multi-uarts
-rwxr-xr-xbsp/simulator/drivers/board.c6
-rwxr-xr-xbsp/simulator/drivers/serial.c73
-rw-r--r--bsp/simulator/drivers/serial.h12
-rwxr-xr-xbsp/simulator/drivers/usart_sim.c76
4 files changed, 87 insertions, 80 deletions
diff --git a/bsp/simulator/drivers/board.c b/bsp/simulator/drivers/board.c
index dc24d39e20..669628df75 100755
--- a/bsp/simulator/drivers/board.c
+++ b/bsp/simulator/drivers/board.c
@@ -62,8 +62,6 @@ _CRTIMP void __cdecl abort(void);
#endif
#endif
-#if defined(RT_USING_FINSH)
-#include <finsh.h>
void rt_hw_exit(void)
{
rt_kprintf("RT-Thread, bye\n");
@@ -81,6 +79,9 @@ void rt_hw_exit(void)
#endif
exit(0);
}
+
+#if defined(RT_USING_FINSH)
+#include <finsh.h>
FINSH_FUNCTION_EXPORT_ALIAS(rt_hw_exit, exit, exit rt - thread);
#endif /* RT_USING_FINSH */
@@ -97,7 +98,6 @@ void rt_hw_board_init()
//#endif
#if defined(RT_USING_CONSOLE)
- rt_hw_serial_init();
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
}
diff --git a/bsp/simulator/drivers/serial.c b/bsp/simulator/drivers/serial.c
index 87de4d0498..420143aec4 100755
--- a/bsp/simulator/drivers/serial.c
+++ b/bsp/simulator/drivers/serial.c
@@ -7,20 +7,59 @@
*/
#include <rthw.h>
-#include <rtthread.h>
#define _DEBUG_SERIAL 0
#include "serial.h"
#include <stdio.h>
-struct rt_device serial_device;
-//extern struct serial_int_rx serial_rx;
-struct serial_int_rx serial_rx;
#if 0
static FILE *fp = RT_NULL;
#endif
/*@{*/
+int seial_save_byte(unsigned char ch, struct serial_device * serial)
+{
+ /* save on rx buffer */
+ rt_base_t level;
+ struct rt_device * dev = RT_DEVICE(serial);
+ /* disable interrupt */
+ //��ʱ�ر��жϣ���ΪҪ����uart���ݽṹ
+ level = rt_hw_interrupt_disable();
+
+ /* save character */
+ serial->serial_rx.rx_buffer[serial->serial_rx.save_index] = ch;
+ serial->serial_rx.save_index ++;
+ //����Ĵ�����save_index�Ƿ��Ѿ�����������β������������ת��ͷ������Ϊһ�����λ�����
+ if (serial->serial_rx.save_index >= SERIAL_RX_BUFFER_SIZE)
+ serial->serial_rx.save_index = 0;
+
+ //���������ʾ��ת���save_index׷����read_index��������read_index������һ���ɵ�����
+ /* if the next position is read index, discard this 'read char' */
+ if (serial->serial_rx.save_index == serial->serial_rx.read_index)
+ {
+ serial->serial_rx.read_index ++;
+ if (serial->serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
+ serial->serial_rx.read_index = 0;
+ }
+
+ /* enable interrupt */
+ //uart���ݽṹ�Ѿ�������ɣ�����ʹ���ж�
+ rt_hw_interrupt_enable(level);
+
+ /* invoke callback */
+ if (dev->rx_indicate != RT_NULL)
+ {
+ rt_size_t rx_length;
+
+ /* get rx length */
+ rx_length = serial->serial_rx.read_index > serial->serial_rx.save_index ?
+ SERIAL_RX_BUFFER_SIZE - serial->serial_rx.read_index + serial->serial_rx.save_index :
+ serial->serial_rx.save_index - serial->serial_rx.read_index;
+
+ dev->rx_indicate(dev, rx_length);
+ }
+ return 0;
+}
/* RT-Thread Device Interface */
/**
@@ -28,14 +67,15 @@ static FILE *fp = RT_NULL;
*/
static rt_err_t rt_serial_init(rt_device_t dev)
{
+ struct serial_device * serial = SERIAL_DEVICE(dev);
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{
- rt_memset(serial_rx.rx_buffer, 0,
- sizeof(serial_rx.rx_buffer));
- serial_rx.read_index = 0;
- serial_rx.save_index = 0;
+ rt_memset(serial->serial_rx.rx_buffer, 0,
+ sizeof(serial->serial_rx.rx_buffer));
+ serial->serial_rx.read_index = 0;
+ serial->serial_rx.save_index = 0;
}
dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
@@ -62,6 +102,7 @@ static rt_size_t rt_serial_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_
{
rt_uint8_t *ptr;
rt_err_t err_code;
+ struct serial_device * serial = SERIAL_DEVICE(dev);
ptr = buffer;
err_code = RT_EOK;
@@ -76,16 +117,16 @@ static rt_size_t rt_serial_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_
/* disable interrupt */
level = rt_hw_interrupt_disable();
- if (serial_rx.read_index != serial_rx.save_index)
+ if (serial->serial_rx.read_index != serial->serial_rx.save_index)
{
/* read a character */
- *ptr++ = serial_rx.rx_buffer[serial_rx.read_index];
+ *ptr++ = serial->serial_rx.rx_buffer[serial->serial_rx.read_index];
size--;
/* move to next position */
- serial_rx.read_index ++;
- if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
- serial_rx.read_index = 0;
+ serial->serial_rx.read_index ++;
+ if (serial->serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
+ serial->serial_rx.read_index = 0;
}
else
{
@@ -149,7 +190,7 @@ static rt_err_t rt_serial_control(rt_device_t dev, rt_uint8_t cmd, void *args)
/*
* serial register
*/
-static rt_err_t rt_hw_serial_register(rt_device_t device, const char *name, rt_uint32_t flag)
+rt_err_t rt_hw_serial_register(rt_device_t device, const char *name, rt_uint32_t flag)
{
RT_ASSERT(device != RT_NULL);
#if _DEBUG_SERIAL==1
@@ -170,8 +211,8 @@ static rt_err_t rt_hw_serial_register(rt_device_t device, const char *name, rt_u
return rt_device_register(device, name, (rt_uint16_t)(RT_DEVICE_FLAG_RDWR | flag));
}
-rt_err_t rt_hw_serial_init(void)
+rt_err_t rt_hw_serial_init(struct serial_device * serial, char * name)
{
- return rt_hw_serial_register(&serial_device, RT_CONSOLE_DEVICE_NAME,
+ return rt_hw_serial_register(RT_DEVICE(serial), name,
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM);
}
diff --git a/bsp/simulator/drivers/serial.h b/bsp/simulator/drivers/serial.h
index 010631ab32..7c554c3f45 100644
--- a/bsp/simulator/drivers/serial.h
+++ b/bsp/simulator/drivers/serial.h
@@ -11,6 +11,7 @@
#ifndef __RT_HW_SERIAL_H__
#define __RT_HW_SERIAL_H__
+#include <rtdevice.h>
#define SERIAL_RX_BUFFER_SIZE 80
struct serial_int_rx
{
@@ -18,5 +19,14 @@ struct serial_int_rx
rt_uint32_t read_index, save_index;
};
-rt_err_t rt_hw_serial_init(void);
+struct serial_device
+{
+ struct rt_device dev;
+ struct serial_int_rx serial_rx;
+};
+
+#define SERIAL_DEVICE(dev) ((struct serial_device *)(dev))
+
+int seial_save_byte(unsigned char ch, struct serial_device * serial);
+rt_err_t rt_hw_serial_init(struct serial_device * serial, char * name);
#endif
diff --git a/bsp/simulator/drivers/usart_sim.c b/bsp/simulator/drivers/usart_sim.c
index 2cbb1ed345..187ec9e012 100755
--- a/bsp/simulator/drivers/usart_sim.c
+++ b/bsp/simulator/drivers/usart_sim.c
@@ -10,9 +10,9 @@
#include <stdio.h>
#include "serial.h"
-struct serial_int_rx serial_rx;
-extern struct rt_device serial_device;
+struct serial_device serial1;
+#define SAVEKEY(key) seial_save_byte(key, &serial1)
#ifdef _WIN32
/*
* Handler for OSKey Thread
@@ -23,6 +23,7 @@ static DWORD OSKey_ThreadID;
static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam);
void rt_hw_usart_init(void)
{
+ rt_hw_serial_init(&serial1, RT_CONSOLE_DEVICE_NAME);
/*
* create serial thread that receive key input from keyboard
*/
@@ -60,7 +61,6 @@ void rt_hw_usart_init(void)
#include <termios.h> /* for tcxxxattr, ECHO, etc */
#include <unistd.h> /* for STDIN_FILENO */
-
static void * ThreadforKeyGet(void * lpParam);
static pthread_t OSKey_Thread;
void rt_hw_usart_init(void)
@@ -74,57 +74,7 @@ void rt_hw_usart_init(void)
}
}
#endif
-/*
- * �����(��)�� 0xe04b
- * �����(��)�� 0xe048
- * �����(��)�� 0xe04d
- * �����(��)�� 0xe050
- */
-static int savekey(unsigned char key)
-{
- /* save on rx buffer */
- {
- rt_base_t level;
-
- /* disable interrupt */
- //��ʱ�ر��жϣ���ΪҪ����uart���ݽṹ
- level = rt_hw_interrupt_disable();
-
- /* save character */
- serial_rx.rx_buffer[serial_rx.save_index] = key;
- serial_rx.save_index ++;
- //����Ĵ�����save_index�Ƿ��Ѿ�����������β������������ת��ͷ������Ϊһ�����λ�����
- if (serial_rx.save_index >= SERIAL_RX_BUFFER_SIZE)
- serial_rx.save_index = 0;
-
- //���������ʾ��ת���save_index׷����read_index��������read_index������һ���ɵ�����
- /* if the next position is read index, discard this 'read char' */
- if (serial_rx.save_index == serial_rx.read_index)
- {
- serial_rx.read_index ++;
- if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
- serial_rx.read_index = 0;
- }
-
- /* enable interrupt */
- //uart���ݽṹ�Ѿ�������ɣ�����ʹ���ж�
- rt_hw_interrupt_enable(level);
- }
- /* invoke callback */
- if (serial_device.rx_indicate != RT_NULL)
- {
- rt_size_t rx_length;
-
- /* get rx length */
- rx_length = serial_rx.read_index > serial_rx.save_index ?
- SERIAL_RX_BUFFER_SIZE - serial_rx.read_index + serial_rx.save_index :
- serial_rx.save_index - serial_rx.read_index;
-
- serial_device.rx_indicate(&serial_device, rx_length);
- }
- return 0;
-}
#ifdef _WIN32
static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam)
#else
@@ -153,6 +103,12 @@ void restore_stty(void)
static void * ThreadforKeyGet(void * lpParam)
#endif /* not _WIN32*/
{
+ /*
+ * �����(��)�� 0xe04b
+ * �����(��)�� 0xe048
+ * �����(��)�� 0xe04d
+ * �����(��)�� 0xe050
+ */
unsigned char key;
#ifndef _WIN32
@@ -173,20 +129,20 @@ static void * ThreadforKeyGet(void * lpParam)
if (key == 0x48) //up key , 0x1b 0x5b 0x41
{
- savekey(0x1b);
- savekey(0x5b);
- savekey(0x41);
+ SAVEKEY(0x1b);
+ SAVEKEY(0x5b);
+ SAVEKEY(0x41);
}
else if (key == 0x50)//0x1b 0x5b 0x42
{
- savekey(0x1b);
- savekey(0x5b);
- savekey(0x42);
+ SAVEKEY(0x1b);
+ SAVEKEY(0x5b);
+ SAVEKEY(0x42);
}
continue;
}
#endif
- savekey(key);
+ SAVEKEY(key);
}
} /*** ThreadforKeyGet ***/