summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/drivers/include/drivers/serial.h33
-rw-r--r--components/drivers/serial/serial.c52
2 files changed, 49 insertions, 36 deletions
diff --git a/components/drivers/include/drivers/serial.h b/components/drivers/include/drivers/serial.h
index c966f5459b..41132ed916 100644
--- a/components/drivers/include/drivers/serial.h
+++ b/components/drivers/include/drivers/serial.h
@@ -29,7 +29,6 @@
#define __SERIAL_H__
#include <rtthread.h>
-#include <rtdevice.h>
#define BAUD_RATE_4800 4800
#define BAUD_RATE_9600 9600
@@ -56,11 +55,6 @@
#define NRZ_NORMAL 0 /* Non Return to Zero : normal mode */
#define NRZ_INVERTED 1 /* Non Return to Zero : inverted mode */
-#define HW_CONTROL_NONE 0
-#define HW_CONTROL_RTS 1
-#define HW_CONTROL_CTS 2
-#define HW_CONTROL_RTS_CTS 3
-
#ifndef RT_SERIAL_RB_BUFSZ
#define RT_SERIAL_RB_BUFSZ 64
#endif
@@ -81,23 +75,21 @@
#define RT_SERIAL_TX_DATAQUEUE_LWM 30
/* Default config for serial_configure structure */
-#define RT_SERIAL_CONFIG_DEFAULT \
-{ \
- BAUD_RATE_115200, /* 115200 bits/s */ \
- DATA_BITS_8, /* 8 databits */ \
- STOP_BITS_1, /* 1 stopbit */ \
- PARITY_NONE, /* No parity */ \
- BIT_ORDER_LSB, /* LSB first sent */ \
- NRZ_NORMAL, /* Normal mode */ \
- HW_CONTROL_NONE, /* Hardware control */\
- 0 \
+#define RT_SERIAL_CONFIG_DEFAULT \
+{ \
+ BAUD_RATE_115200, /* 115200 bits/s */ \
+ DATA_BITS_8, /* 8 databits */ \
+ STOP_BITS_1, /* 1 stopbit */ \
+ PARITY_NONE, /* No parity */ \
+ BIT_ORDER_LSB, /* LSB first sent */ \
+ NRZ_NORMAL, /* Normal mode */ \
+ 0 \
}
struct serial_ringbuffer
{
- struct rt_ringbuffer rb;
- rt_uint8_t *pool;
- rt_uint16_t size;
+ rt_uint8_t buffer[RT_SERIAL_RB_BUFSZ];
+ rt_uint16_t put_index, get_index;
};
struct serial_configure
@@ -108,8 +100,7 @@ struct serial_configure
rt_uint32_t parity :2;
rt_uint32_t bit_order :1;
rt_uint32_t invert :1;
- rt_uint32_t hw_control :2;
- rt_uint32_t reserved :18;
+ rt_uint32_t reserved :20;
};
struct rt_serial_device
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c
index 9a356b6f0c..622d2cd68c 100644
--- a/components/drivers/serial/serial.c
+++ b/components/drivers/serial/serial.c
@@ -25,9 +25,6 @@
* 2012-11-23 bernard fix compiler warning.
* 2013-02-20 bernard use RT_SERIAL_RB_BUFSZ to define
* the size of ring buffer.
- * 2014-02-26 bright use DeviceDriver ringbuffer.
- * add hardware flow support.
- * use new struct serial_ringbuffer.
*/
#include <rthw.h>
@@ -36,7 +33,9 @@
rt_inline void serial_ringbuffer_init(struct serial_ringbuffer *rbuffer)
{
- rt_ringbuffer_init(&rbuffer->rb, rbuffer->pool, rbuffer->size);
+ rt_memset(rbuffer->buffer, 0, sizeof(rbuffer->buffer));
+ rbuffer->put_index = 0;
+ rbuffer->get_index = 0;
}
rt_inline void serial_ringbuffer_putc(struct serial_ringbuffer *rbuffer,
@@ -46,8 +45,17 @@ rt_inline void serial_ringbuffer_putc(struct serial_ringbuffer *rbuffer,
/* disable interrupt */
level = rt_hw_interrupt_disable();
- rt_ringbuffer_putchar(&rbuffer->rb, ch);
- // enable interrupt
+
+ rbuffer->buffer[rbuffer->put_index] = ch;
+ rbuffer->put_index = (rbuffer->put_index + 1) & (RT_SERIAL_RB_BUFSZ - 1);
+
+ /* if the next position is read index, discard this 'read char' */
+ if (rbuffer->put_index == rbuffer->get_index)
+ {
+ rbuffer->get_index = (rbuffer->get_index + 1) & (RT_SERIAL_RB_BUFSZ - 1);
+ }
+
+ /* enable interrupt */
rt_hw_interrupt_enable(level);
}
@@ -55,11 +63,25 @@ rt_inline int serial_ringbuffer_putchar(struct serial_ringbuffer *rbuffer,
char ch)
{
rt_base_t level;
- //rt_uint16_t next_index;
+ rt_uint16_t next_index;
/* disable interrupt */
level = rt_hw_interrupt_disable();
- rt_ringbuffer_putchar(&rbuffer->rb, ch);
+
+ next_index = (rbuffer->put_index + 1) & (RT_SERIAL_RB_BUFSZ - 1);
+ if (next_index != rbuffer->get_index)
+ {
+ rbuffer->buffer[rbuffer->put_index] = ch;
+ rbuffer->put_index = next_index;
+ }
+ else
+ {
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+
+ return -1;
+ }
+
/* enable interrupt */
rt_hw_interrupt_enable(level);
@@ -68,14 +90,17 @@ rt_inline int serial_ringbuffer_putchar(struct serial_ringbuffer *rbuffer,
rt_inline int serial_ringbuffer_getc(struct serial_ringbuffer *rbuffer)
{
- int ch = 0;
+ int ch;
rt_base_t level;
+ ch = -1;
/* disable interrupt */
level = rt_hw_interrupt_disable();
- /* get char */
- if (!rt_ringbuffer_getchar(&rbuffer->rb, (rt_uint8_t *)&ch))
- ch = -1;
+ if (rbuffer->get_index != rbuffer->put_index)
+ {
+ ch = rbuffer->buffer[rbuffer->get_index];
+ rbuffer->get_index = (rbuffer->get_index + 1) & (RT_SERIAL_RB_BUFSZ - 1);
+ }
/* enable interrupt */
rt_hw_interrupt_enable(level);
@@ -88,10 +113,7 @@ rt_inline rt_uint32_t serial_ringbuffer_size(struct serial_ringbuffer *rbuffer)
rt_base_t level;
level = rt_hw_interrupt_disable();
- size = rt_ringbuffer_space_len(&rbuffer->rb);
- /*
size = (rbuffer->put_index - rbuffer->get_index) & (RT_SERIAL_RB_BUFSZ - 1);
- */
rt_hw_interrupt_enable(level);
return size;