提交 22139e66 编写于 作者: C chenjh

[serial_v2] Serial_v2 support device ops feature

上级 f8cf8341
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
#include <dfs_posix.h> #include <dfs_posix.h>
#include <dfs_poll.h> #include <dfs_poll.h>
#include <sys/ioctl.h>
#ifdef getc #ifdef getc
#undef getc #undef getc
...@@ -609,7 +610,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, ...@@ -609,7 +610,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
return -RT_EINVAL; return -RT_EINVAL;
} }
#ifndef RT_USING_DEVICE_OPS
dev->write = _serial_poll_tx; dev->write = _serial_poll_tx;
#endif
dev->open_flag |= RT_SERIAL_TX_BLOCKING; dev->open_flag |= RT_SERIAL_TX_BLOCKING;
return RT_EOK; return RT_EOK;
} }
...@@ -637,7 +641,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, ...@@ -637,7 +641,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
tx_fifo->buffer, tx_fifo->buffer,
serial->config.tx_bufsz); serial->config.tx_bufsz);
serial->serial_tx = tx_fifo; serial->serial_tx = tx_fifo;
#ifndef RT_USING_DEVICE_OPS
dev->write = _serial_fifo_tx_blocking_buf; dev->write = _serial_fifo_tx_blocking_buf;
#endif
} }
else else
{ {
...@@ -648,7 +655,11 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, ...@@ -648,7 +655,11 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
RT_ASSERT(tx_fifo != RT_NULL); RT_ASSERT(tx_fifo != RT_NULL);
serial->serial_tx = tx_fifo; serial->serial_tx = tx_fifo;
#ifndef RT_USING_DEVICE_OPS
dev->write = _serial_fifo_tx_blocking_nbuf; dev->write = _serial_fifo_tx_blocking_nbuf;
#endif
/* Call the control() API to configure the serial device by RT_SERIAL_TX_BLOCKING*/ /* Call the control() API to configure the serial device by RT_SERIAL_TX_BLOCKING*/
serial->ops->control(serial, serial->ops->control(serial,
RT_DEVICE_CTRL_CONFIG, RT_DEVICE_CTRL_CONFIG,
...@@ -676,7 +687,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, ...@@ -676,7 +687,10 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
serial->config.tx_bufsz); serial->config.tx_bufsz);
serial->serial_tx = tx_fifo; serial->serial_tx = tx_fifo;
#ifndef RT_USING_DEVICE_OPS
dev->write = _serial_fifo_tx_nonblocking; dev->write = _serial_fifo_tx_nonblocking;
#endif
dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING; dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING;
/* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/ /* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/
serial->ops->control(serial, serial->ops->control(serial,
...@@ -712,7 +726,10 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev, ...@@ -712,7 +726,10 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
return -RT_EINVAL; return -RT_EINVAL;
} }
#ifndef RT_USING_DEVICE_OPS
dev->read = _serial_poll_rx; dev->read = _serial_poll_rx;
#endif
dev->open_flag |= RT_SERIAL_RX_BLOCKING; dev->open_flag |= RT_SERIAL_RX_BLOCKING;
return RT_EOK; return RT_EOK;
} }
...@@ -727,7 +744,10 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev, ...@@ -727,7 +744,10 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
rt_ringbuffer_init(&(rx_fifo->rb), rx_fifo->buffer, serial->config.rx_bufsz); rt_ringbuffer_init(&(rx_fifo->rb), rx_fifo->buffer, serial->config.rx_bufsz);
serial->serial_rx = rx_fifo; serial->serial_rx = rx_fifo;
#ifndef RT_USING_DEVICE_OPS
dev->read = _serial_fifo_rx; dev->read = _serial_fifo_rx;
#endif
if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING) if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
{ {
...@@ -766,7 +786,10 @@ static rt_err_t rt_serial_rx_disable(struct rt_device *dev, ...@@ -766,7 +786,10 @@ static rt_err_t rt_serial_rx_disable(struct rt_device *dev,
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
serial = (struct rt_serial_device *)dev; serial = (struct rt_serial_device *)dev;
#ifndef RT_USING_DEVICE_OPS
dev->read = RT_NULL; dev->read = RT_NULL;
#endif
if (serial->serial_rx == RT_NULL) return RT_EOK; if (serial->serial_rx == RT_NULL) return RT_EOK;
do do
...@@ -809,7 +832,10 @@ static rt_err_t rt_serial_tx_disable(struct rt_device *dev, ...@@ -809,7 +832,10 @@ static rt_err_t rt_serial_tx_disable(struct rt_device *dev,
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
serial = (struct rt_serial_device *)dev; serial = (struct rt_serial_device *)dev;
#ifndef RT_USING_DEVICE_OPS
dev->write = RT_NULL; dev->write = RT_NULL;
#endif
if (serial->serial_tx == RT_NULL) return RT_EOK; if (serial->serial_tx == RT_NULL) return RT_EOK;
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx; tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
...@@ -1006,6 +1032,60 @@ static rt_err_t rt_serial_control(struct rt_device *dev, ...@@ -1006,6 +1032,60 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
} }
#ifdef RT_USING_DEVICE_OPS #ifdef RT_USING_DEVICE_OPS
static rt_size_t rt_serial_read(struct rt_device *dev,
rt_off_t pos,
void *buffer,
rt_size_t size)
{
struct rt_serial_device *serial;
RT_ASSERT(dev != RT_NULL);
if (size == 0) return 0;
serial = (struct rt_serial_device *)dev;
if (serial->config.rx_bufsz)
{
return _serial_fifo_rx(dev, pos, buffer, size);
}
return _serial_poll_rx(dev, pos, buffer, size);
}
static rt_size_t rt_serial_write(struct rt_device *dev,
rt_off_t pos,
const void *buffer,
rt_size_t size)
{
struct rt_serial_device *serial;
struct rt_serial_tx_fifo *tx_fifo;
RT_ASSERT(dev != RT_NULL);
if (size == 0) return 0;
serial = (struct rt_serial_device *)dev;
RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
if (serial->config.tx_bufsz == 0)
{
return _serial_poll_tx(dev, pos, buffer, size);
}
if (dev->open_flag | RT_SERIAL_TX_BLOCKING)
{
if ((tx_fifo->rb.buffer_ptr) == RT_NULL)
{
return _serial_fifo_tx_blocking_nbuf(dev, pos, buffer, size);
}
return _serial_fifo_tx_blocking_buf(dev, pos, buffer, size);
}
return _serial_fifo_tx_nonblocking(dev, pos, buffer, size);
}
const static struct rt_device_ops serial_ops = const static struct rt_device_ops serial_ops =
{ {
rt_serial_init, rt_serial_init,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册