serialX 更新到上游 2ee235299b9891
This commit is contained in:
parent
c137034490
commit
5b5fce1f39
|
@ -14,6 +14,8 @@ if GetDepend(['RT_USING_PIN']):
|
||||||
if GetDepend(['RT_USING_SERIAL']):
|
if GetDepend(['RT_USING_SERIAL']):
|
||||||
if GetDepend(['RT_USING_SERIAL_V2']):
|
if GetDepend(['RT_USING_SERIAL_V2']):
|
||||||
src += ['drv_usart_v2.c']
|
src += ['drv_usart_v2.c']
|
||||||
|
elif GetDepend(['RT_USING_SERIAL_X']):
|
||||||
|
src += ['drv_usartX.c']
|
||||||
else:
|
else:
|
||||||
src += ['drv_usart.c']
|
src += ['drv_usart.c']
|
||||||
|
|
||||||
|
|
|
@ -720,7 +720,7 @@ static void stm32_dma_rx_config(struct rt_serial_device *serial)
|
||||||
/* Transfer error in reception process */
|
/* Transfer error in reception process */
|
||||||
RT_ASSERT(0);
|
RT_ASSERT(0);
|
||||||
}
|
}
|
||||||
CLEAR_BIT(uart->handle.Instance->CR3, USART_CR3_EIE);
|
// CLEAR_BIT(uart->handle.Instance->CR3, USART_CR3_EIE);
|
||||||
__HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE);
|
__HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE);
|
||||||
|
|
||||||
/* DMA irq should set in DMA TX mode, or HAL_UART_TxCpltCallback function will not be called */
|
/* DMA irq should set in DMA TX mode, or HAL_UART_TxCpltCallback function will not be called */
|
|
@ -67,6 +67,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if RT_SERIAL_FIFO_BUFSZ < (RT_SERIAL_DMA_BUFSZ*2)
|
#if RT_SERIAL_FIFO_BUFSZ < (RT_SERIAL_DMA_BUFSZ*2)
|
||||||
|
#undef RT_SERIAL_FIFO_BUFSZ
|
||||||
#define RT_SERIAL_FIFO_BUFSZ RT_SERIAL_DMA_BUFSZ*2
|
#define RT_SERIAL_FIFO_BUFSZ RT_SERIAL_DMA_BUFSZ*2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -152,6 +153,7 @@ struct rt_serial_device
|
||||||
const struct rt_uart_ops *ops;
|
const struct rt_uart_ops *ops;
|
||||||
struct serial_configure config;
|
struct serial_configure config;
|
||||||
rt_uint32_t bufsz;
|
rt_uint32_t bufsz;
|
||||||
|
rt_tick_t timeout_tick; /**< timeout tick */
|
||||||
|
|
||||||
void *serial_rx;
|
void *serial_rx;
|
||||||
void *serial_tx;
|
void *serial_tx;
|
||||||
|
|
|
@ -12,6 +12,10 @@ menuconfig RT_USING_SERIAL
|
||||||
bool "RT_USING_SERIAL_V1"
|
bool "RT_USING_SERIAL_V1"
|
||||||
config RT_USING_SERIAL_V2
|
config RT_USING_SERIAL_V2
|
||||||
bool "RT_USING_SERIAL_V2"
|
bool "RT_USING_SERIAL_V2"
|
||||||
|
config RT_USING_SERIAL_X
|
||||||
|
bool "RT_USING_SERIAL"
|
||||||
|
help
|
||||||
|
A serial driver that supporting True NonBlock
|
||||||
endchoice
|
endchoice
|
||||||
config RT_SERIAL_USING_DMA
|
config RT_SERIAL_USING_DMA
|
||||||
bool "Enable serial DMA mode"
|
bool "Enable serial DMA mode"
|
||||||
|
@ -19,6 +23,34 @@ menuconfig RT_USING_SERIAL
|
||||||
|
|
||||||
config RT_SERIAL_RB_BUFSZ
|
config RT_SERIAL_RB_BUFSZ
|
||||||
int "Set RX buffer size"
|
int "Set RX buffer size"
|
||||||
depends on !RT_USING_SERIAL_V2
|
depends on !(RT_USING_SERIAL_V2 || RT_USING_SERIAL_X)
|
||||||
default 64
|
default 64
|
||||||
|
|
||||||
|
if RT_USING_SERIAL_X
|
||||||
|
config RT_SERIAL_FIFO_BUFSZ
|
||||||
|
int "Set SerialX FIFO buffer size"
|
||||||
|
default 128
|
||||||
|
help
|
||||||
|
suggestion: RT_SERIAL_FIFO_BUFSZ == 2^N
|
||||||
|
and RT_SERIAL_FIFO_BUFSZ >= 2*RT_SERIAL_DMA_BUFSZ
|
||||||
|
|
||||||
|
config RT_SERIAL_DMA_BUFSZ
|
||||||
|
int "Set SerialX DMA buffer size"
|
||||||
|
depends on RT_SERIAL_USING_DMA
|
||||||
|
default 64
|
||||||
|
help
|
||||||
|
suggestion: RT_SERIAL_DMA_BUFSZ == 2^N
|
||||||
|
and RT_SERIAL_FIFO_BUFSZ >= 2*RT_SERIAL_DMA_BUFSZ
|
||||||
|
|
||||||
|
config RT_SERIAL_HARD_FIFO
|
||||||
|
bool "Using Hard FIFO"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Useful only if the chip supported
|
||||||
|
eg: NUC970 N9H30 serial chips
|
||||||
|
The UART1/2/4/6/8/10 is built-in with a 64-byte transmitter FIFO (TX_FIFO)
|
||||||
|
and a 64-byte receiver FIFO (RX_FIFO),
|
||||||
|
and the UART0/3/5/7/9 are equipped 16-byte transmitter FIFO (TX_FIFO)
|
||||||
|
and 16-byte receiver FIFO (RX_FIFO).
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
* 2022-04-10 THEWON serialX first version
|
* 2022-04-10 THEWON serialX first version
|
||||||
* 2022-06-08 THEWON add No TX Empty interrupt support
|
* 2022-06-08 THEWON add No TX Empty interrupt support
|
||||||
* 2023-02-15 THEWON add init ops
|
* 2023-02-15 THEWON add init ops
|
||||||
|
* 2023-08-19 THEWON blocking timeout
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rthw.h>
|
#include <rthw.h>
|
||||||
|
@ -385,11 +386,13 @@ rt_inline int _serial_fifo_rx(struct rt_serial_device *serial, rt_uint8_t *data,
|
||||||
// serial->ops->enable_interrupt(serial);
|
// serial->ops->enable_interrupt(serial);
|
||||||
|
|
||||||
#ifndef RT_SERIAL_USE_EVENT
|
#ifndef RT_SERIAL_USE_EVENT
|
||||||
ret = rt_completion_wait(&(serial->completion_rx), RT_WAITING_FOREVER);
|
ret = rt_completion_wait(&(serial->completion_rx), serial->timeout_tick);
|
||||||
#else
|
#else
|
||||||
ret = rt_event_recv(serial->rx_done, RT_SERIAL_EVENT_RXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL);
|
ret = rt_event_recv(serial->rx_done, RT_SERIAL_EVENT_RXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, serial->timeout_tick, RT_NULL);
|
||||||
#endif
|
#endif
|
||||||
if (ret == RT_EOK || ret == -RT_ETIMEOUT) {
|
if (ret == RT_EOK) {
|
||||||
|
} else if (ret == -RT_ETIMEOUT) {
|
||||||
|
return -RT_ETIMEOUT;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -460,12 +463,14 @@ rt_inline int _serial_int_tx(struct rt_serial_device *serial, const rt_uint8_t *
|
||||||
rt_hw_interrupt_enable(level);
|
rt_hw_interrupt_enable(level);
|
||||||
// serial->ops->enable_interrupt(serial);
|
// serial->ops->enable_interrupt(serial);
|
||||||
#ifndef RT_SERIAL_USE_EVENT
|
#ifndef RT_SERIAL_USE_EVENT
|
||||||
ret = rt_completion_wait(&(serial->completion_tx), RT_WAITING_FOREVER);
|
ret = rt_completion_wait(&(serial->completion_tx), serial->timeout_tick);
|
||||||
#else
|
#else
|
||||||
ret = rt_event_recv(serial->tx_done, RT_SERIAL_EVENT_TXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL);
|
ret = rt_event_recv(serial->tx_done, RT_SERIAL_EVENT_TXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, serial->timeout_tick, RT_NULL);
|
||||||
#endif
|
#endif
|
||||||
if (ret == RT_EOK || ret == -RT_ETIMEOUT) {
|
if (ret == RT_EOK) {
|
||||||
continue;
|
continue;
|
||||||
|
} else if (ret == -RT_ETIMEOUT) {
|
||||||
|
return -RT_ETIMEOUT;
|
||||||
} else {
|
} else {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -568,12 +573,14 @@ rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t *
|
||||||
// serial->ops->enable_interrupt(serial);
|
// serial->ops->enable_interrupt(serial);
|
||||||
|
|
||||||
#ifndef RT_SERIAL_USE_EVENT
|
#ifndef RT_SERIAL_USE_EVENT
|
||||||
ret = rt_completion_wait(&(serial->completion_tx), RT_WAITING_FOREVER);
|
ret = rt_completion_wait(&(serial->completion_tx), serial->timeout_tick);
|
||||||
#else
|
#else
|
||||||
ret = rt_event_recv(serial->tx_done, RT_SERIAL_EVENT_TXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL);
|
ret = rt_event_recv(serial->tx_done, RT_SERIAL_EVENT_TXDONE, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, serial->timeout_tick, RT_NULL);
|
||||||
#endif
|
#endif
|
||||||
if (ret == RT_EOK || ret == -RT_ETIMEOUT) {
|
if (ret == RT_EOK) {
|
||||||
continue;
|
continue;
|
||||||
|
} else if (ret == -RT_ETIMEOUT) {
|
||||||
|
return -RT_ETIMEOUT;
|
||||||
} else {
|
} else {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -838,6 +845,8 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
|
||||||
|
|
||||||
serial->ops->control(serial, RT_DEVICE_CTRL_OPEN, (void *)0);
|
serial->ops->control(serial, RT_DEVICE_CTRL_OPEN, (void *)0);
|
||||||
|
|
||||||
|
serial->timeout_tick = RT_WAITING_FOREVER;
|
||||||
|
|
||||||
/* set stream flag */
|
/* set stream flag */
|
||||||
dev->open_flag |= stream_flag;
|
dev->open_flag |= stream_flag;
|
||||||
|
|
||||||
|
@ -940,7 +949,11 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 0)
|
||||||
static rt_ssize_t rt_serial_read(struct rt_device *dev,
|
static rt_ssize_t rt_serial_read(struct rt_device *dev,
|
||||||
|
#else
|
||||||
|
static rt_size_t rt_serial_read(struct rt_device *dev,
|
||||||
|
#endif
|
||||||
rt_off_t pos,
|
rt_off_t pos,
|
||||||
void *buffer,
|
void *buffer,
|
||||||
rt_size_t size)
|
rt_size_t size)
|
||||||
|
@ -955,7 +968,11 @@ static rt_ssize_t rt_serial_read(struct rt_device *dev,
|
||||||
return serial->_cb_rx(serial, (rt_uint8_t *)buffer, size);
|
return serial->_cb_rx(serial, (rt_uint8_t *)buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 0)
|
||||||
static rt_ssize_t rt_serial_write(struct rt_device *dev,
|
static rt_ssize_t rt_serial_write(struct rt_device *dev,
|
||||||
|
#else
|
||||||
|
static rt_size_t rt_serial_write(struct rt_device *dev,
|
||||||
|
#endif
|
||||||
rt_off_t pos,
|
rt_off_t pos,
|
||||||
const void *buffer,
|
const void *buffer,
|
||||||
rt_size_t size)
|
rt_size_t size)
|
||||||
|
@ -1174,6 +1191,12 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case RT_DEVICE_CTRL_TIMEOUT:
|
||||||
|
{
|
||||||
|
rt_tick_t timeout_tick = (rt_tick_t)args;
|
||||||
|
serial->timeout_tick = timeout_tick;
|
||||||
|
}
|
||||||
|
break;
|
||||||
#ifdef RT_USING_POSIX_STDIO
|
#ifdef RT_USING_POSIX_STDIO
|
||||||
#ifdef RT_USING_POSIX_TERMIOS
|
#ifdef RT_USING_POSIX_TERMIOS
|
||||||
case TCGETA:
|
case TCGETA:
|
||||||
|
@ -1406,7 +1429,7 @@ rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
|
||||||
struct serial_configure uart_conf = RT_SERIAL_CONFIG_DEFAULT;
|
struct serial_configure uart_conf = RT_SERIAL_CONFIG_DEFAULT;
|
||||||
|
|
||||||
rt_memcpy(&serial->config, &uart_conf, sizeof(uart_conf));
|
rt_memcpy(&serial->config, &uart_conf, sizeof(uart_conf));
|
||||||
serial->bufsz = uart_conf.bufsz;
|
serial->bufsz = RT_SERIAL_FIFO_BUFSZ;
|
||||||
|
|
||||||
device = &(serial->parent);
|
device = &(serial->parent);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue