1.系统api更新。
This commit is contained in:
@@ -37,27 +37,6 @@ static void err_io_serial_stop_tx(mr_serial_t serial)
|
||||
|
||||
}
|
||||
|
||||
static mr_err_t mr_serial_set_fifo(mr_rb_t rb, mr_size_t fifo_size)
|
||||
{
|
||||
mr_uint8_t *pool = MR_NULL;
|
||||
|
||||
/* Free old buffer */
|
||||
if (rb->size != 0)
|
||||
{
|
||||
mr_free(rb->buffer);
|
||||
}
|
||||
|
||||
/* Allocate new buffer */
|
||||
pool = mr_malloc(fifo_size);
|
||||
if (pool == MR_NULL && fifo_size != 0)
|
||||
{
|
||||
return -MR_ERR_NO_MEMORY;
|
||||
}
|
||||
mr_rb_init(rb, pool, fifo_size);
|
||||
|
||||
return MR_ERR_OK;
|
||||
}
|
||||
|
||||
static mr_err_t mr_serial_open(mr_device_t device)
|
||||
{
|
||||
mr_serial_t serial = (mr_serial_t)device;
|
||||
@@ -69,6 +48,16 @@ static mr_err_t mr_serial_open(mr_device_t device)
|
||||
serial->config = default_config;
|
||||
}
|
||||
|
||||
/* Allocate fifo using configuration size */
|
||||
if(serial->rx_fifo.size == 0)
|
||||
{
|
||||
mr_rb_allocate_buffer(&serial->rx_fifo, MR_CFG_SERIAL_RX_BUFSZ);
|
||||
}
|
||||
if(serial->tx_fifo.size == 0)
|
||||
{
|
||||
mr_rb_allocate_buffer(&serial->tx_fifo, MR_CFG_SERIAL_TX_BUFSZ);
|
||||
}
|
||||
|
||||
return serial->ops->configure(serial, &serial->config);
|
||||
}
|
||||
|
||||
@@ -78,8 +67,8 @@ static mr_err_t mr_serial_close(mr_device_t device)
|
||||
|
||||
/* Disable serial */
|
||||
serial->config.baud_rate = 0;
|
||||
mr_serial_set_fifo(&serial->rx_fifo, 0);
|
||||
mr_serial_set_fifo(&serial->tx_fifo, 0);
|
||||
mr_rb_allocate_buffer(&serial->rx_fifo, 0);
|
||||
mr_rb_allocate_buffer(&serial->tx_fifo, 0);
|
||||
|
||||
return serial->ops->configure(serial, &serial->config);
|
||||
}
|
||||
@@ -89,9 +78,9 @@ static mr_err_t mr_serial_ioctl(mr_device_t device, int cmd, void *args)
|
||||
mr_serial_t serial = (mr_serial_t)device;
|
||||
mr_err_t ret = MR_ERR_OK;
|
||||
|
||||
switch (cmd & MR_CTRL_FLAG_MASK)
|
||||
switch (cmd)
|
||||
{
|
||||
case MR_CTRL_SET_CONFIG:
|
||||
case MR_DEVICE_CTRL_SET_CONFIG:
|
||||
{
|
||||
if (args)
|
||||
{
|
||||
@@ -106,7 +95,7 @@ static mr_err_t mr_serial_ioctl(mr_device_t device, int cmd, void *args)
|
||||
return -MR_ERR_INVALID;
|
||||
}
|
||||
|
||||
case MR_CTRL_GET_CONFIG:
|
||||
case MR_DEVICE_CTRL_GET_CONFIG:
|
||||
{
|
||||
if (args)
|
||||
{
|
||||
@@ -117,34 +106,34 @@ static mr_err_t mr_serial_ioctl(mr_device_t device, int cmd, void *args)
|
||||
return -MR_ERR_INVALID;
|
||||
}
|
||||
|
||||
case MR_CTRL_SET_RX_CB:
|
||||
case MR_DEVICE_CTRL_SET_RX_CB:
|
||||
{
|
||||
device->rx_cb = args;
|
||||
return MR_ERR_OK;
|
||||
}
|
||||
|
||||
case MR_CTRL_SET_TX_CB:
|
||||
case MR_DEVICE_CTRL_SET_TX_CB:
|
||||
{
|
||||
device->tx_cb = args;
|
||||
return MR_ERR_OK;
|
||||
}
|
||||
|
||||
case MR_CTRL_SET_RX_BUFSZ:
|
||||
case MR_DEVICE_CTRL_SET_RX_BUFSZ:
|
||||
{
|
||||
if (args)
|
||||
{
|
||||
mr_size_t bufsz = *((mr_size_t *)args);
|
||||
return mr_serial_set_fifo(&serial->rx_fifo, bufsz);
|
||||
return mr_rb_allocate_buffer(&serial->rx_fifo, bufsz);
|
||||
}
|
||||
return -MR_ERR_INVALID;
|
||||
}
|
||||
|
||||
case MR_CTRL_SET_TX_BUFSZ:
|
||||
case MR_DEVICE_CTRL_SET_TX_BUFSZ:
|
||||
{
|
||||
if (args)
|
||||
{
|
||||
mr_size_t bufsz = *((mr_size_t *)args);
|
||||
return mr_serial_set_fifo(&serial->tx_fifo, bufsz);
|
||||
return mr_rb_allocate_buffer(&serial->tx_fifo, bufsz);
|
||||
}
|
||||
return -MR_ERR_INVALID;
|
||||
}
|
||||
@@ -154,7 +143,7 @@ static mr_err_t mr_serial_ioctl(mr_device_t device, int cmd, void *args)
|
||||
}
|
||||
}
|
||||
|
||||
static mr_ssize_t mr_serial_read(mr_device_t device, mr_pos_t pos, void *buffer, mr_size_t size)
|
||||
static mr_ssize_t mr_serial_read(mr_device_t device, mr_off_t pos, void *buffer, mr_size_t size)
|
||||
{
|
||||
mr_serial_t serial = (mr_serial_t)device;
|
||||
mr_uint8_t *read_buffer = (mr_uint8_t *)buffer;
|
||||
@@ -177,13 +166,13 @@ static mr_ssize_t mr_serial_read(mr_device_t device, mr_pos_t pos, void *buffer,
|
||||
return (mr_ssize_t)read_size;
|
||||
}
|
||||
|
||||
static mr_ssize_t mr_serial_write(mr_device_t device, mr_pos_t pos, const void *buffer, mr_size_t size)
|
||||
static mr_ssize_t mr_serial_write(mr_device_t device, mr_off_t pos, const void *buffer, mr_size_t size)
|
||||
{
|
||||
mr_serial_t serial = (mr_serial_t)device;
|
||||
mr_uint8_t *write_buffer = (mr_uint8_t *)buffer;
|
||||
mr_size_t write_size = 0;
|
||||
|
||||
if (serial->tx_fifo.size == 0 || ((device->open_flag & MR_OPEN_NONBLOCKING) == MR_FALSE))
|
||||
if (serial->tx_fifo.size == 0 || ((device->oflags & MR_DEVICE_OPEN_FLAG_NONBLOCKING) == MR_FALSE))
|
||||
{
|
||||
/* Blocking write */
|
||||
while ((write_size += sizeof(*write_buffer)) <= size)
|
||||
@@ -229,7 +218,7 @@ mr_err_t mr_serial_device_add(mr_serial_t serial, const char *name, struct mr_se
|
||||
mr_serial_read,
|
||||
mr_serial_write,
|
||||
};
|
||||
mr_uint16_t support_flag = MR_OPEN_RDWR;
|
||||
mr_uint16_t support_flag = MR_DEVICE_OPEN_FLAG_RDWR;
|
||||
|
||||
MR_ASSERT(serial != MR_NULL);
|
||||
MR_ASSERT(name != MR_NULL);
|
||||
@@ -238,7 +227,7 @@ mr_err_t mr_serial_device_add(mr_serial_t serial, const char *name, struct mr_se
|
||||
/* Non-blocking mode */
|
||||
if (ops->start_tx != MR_NULL && ops->stop_tx != MR_NULL)
|
||||
{
|
||||
support_flag |= MR_OPEN_NONBLOCKING;
|
||||
support_flag |= MR_DEVICE_OPEN_FLAG_NONBLOCKING;
|
||||
}
|
||||
|
||||
/* Initialize the private fields */
|
||||
@@ -272,15 +261,15 @@ void mr_serial_device_isr(mr_serial_t serial, mr_uint32_t event)
|
||||
{
|
||||
case MR_SERIAL_EVENT_RX_INT:
|
||||
{
|
||||
/* Read data into the fifo */
|
||||
/* Save data to the fifo */
|
||||
mr_uint8_t data = serial->ops->read(serial);
|
||||
mr_rb_put_force(&serial->rx_fifo, data);
|
||||
|
||||
/* Call the receiving completion function */
|
||||
if (serial->device.rx_cb != MR_NULL)
|
||||
{
|
||||
mr_size_t length = mr_rb_get_data_size(&serial->rx_fifo);
|
||||
serial->device.rx_cb(&serial->device, &length);
|
||||
mr_size_t size = mr_rb_get_data_size(&serial->rx_fifo);
|
||||
serial->device.rx_cb(&serial->device, &size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -300,8 +289,8 @@ void mr_serial_device_isr(mr_serial_t serial, mr_uint32_t event)
|
||||
/* Call the sending completion function */
|
||||
if (serial->device.tx_cb != MR_NULL)
|
||||
{
|
||||
mr_size_t length = 0;
|
||||
serial->device.tx_cb(&serial->device, &length);
|
||||
mr_size_t size = 0;
|
||||
serial->device.tx_cb(&serial->device, &size);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -11,22 +11,30 @@
|
||||
#ifndef _SERIAL_H_
|
||||
#define _SERIAL_H_
|
||||
|
||||
#include "mrlib.h"
|
||||
#include "mrapi.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if (MR_CFG_SERIAL == MR_CFG_ENABLE)
|
||||
|
||||
/**
|
||||
* @def Serial device data bits
|
||||
*/
|
||||
#define MR_SERIAL_DATA_BITS_8 0
|
||||
#define MR_SERIAL_DATA_BITS_9 1
|
||||
#define MR_SERIAL_DATA_BITS_5 5
|
||||
#define MR_SERIAL_DATA_BITS_6 6
|
||||
#define MR_SERIAL_DATA_BITS_7 7
|
||||
#define MR_SERIAL_DATA_BITS_8 8
|
||||
#define MR_SERIAL_DATA_BITS_9 9
|
||||
|
||||
/**
|
||||
* @def Serial device stop bits
|
||||
*/
|
||||
#define MR_SERIAL_STOP_BITS_1 0
|
||||
#define MR_SERIAL_STOP_BITS_1_5 1
|
||||
#define MR_SERIAL_STOP_BITS_1 1
|
||||
#define MR_SERIAL_STOP_BITS_2 2
|
||||
#define MR_SERIAL_STOP_BITS_3 3
|
||||
#define MR_SERIAL_STOP_BITS_4 4
|
||||
|
||||
/**
|
||||
* @def Serial device parity
|
||||
@@ -73,11 +81,12 @@
|
||||
struct mr_serial_config
|
||||
{
|
||||
mr_uint32_t baud_rate;
|
||||
mr_uint8_t data_bits: 2;
|
||||
mr_uint8_t stop_bits: 2;
|
||||
mr_uint8_t parity: 2;
|
||||
mr_uint8_t bit_order: 1;
|
||||
mr_uint8_t invert: 1;
|
||||
mr_uint32_t data_bits: 4;
|
||||
mr_uint32_t stop_bits: 3;
|
||||
mr_uint32_t parity: 2;
|
||||
mr_uint32_t bit_order: 1;
|
||||
mr_uint32_t invert: 1;
|
||||
mr_uint32_t reserved: 21;
|
||||
};
|
||||
typedef struct mr_serial_config *mr_serial_config_t;
|
||||
|
||||
@@ -121,4 +130,8 @@ void mr_serial_device_isr(mr_serial_t serial, mr_uint32_t event);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SERIAL_H_ */
|
||||
Reference in New Issue
Block a user