Fix Serial RX and add option for FIFO Full Threshold in Serial.begin
Fixes: https://github.com/espressif/arduino-esp32/issues/5005
This commit is contained in:
parent
425619dfea
commit
371f382db7
@ -50,7 +50,7 @@ HardwareSerial Serial2(2);
|
|||||||
|
|
||||||
HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}
|
HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}
|
||||||
|
|
||||||
void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms)
|
void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd)
|
||||||
{
|
{
|
||||||
if(0 > _uart_nr || _uart_nr > 2) {
|
if(0 > _uart_nr || _uart_nr > 2) {
|
||||||
log_e("Serial number is invalid, please use 0, 1 or 2");
|
log_e("Serial number is invalid, please use 0, 1 or 2");
|
||||||
@ -78,7 +78,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||||||
txPin = TX2;
|
txPin = TX2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
_uart = uartBegin(_uart_nr, baud ? baud : 9600, config, rxPin, txPin, 256, invert);
|
_uart = uartBegin(_uart_nr, baud ? baud : 9600, config, rxPin, txPin, 256, invert, rxfifo_full_thrhd);
|
||||||
_tx_pin = txPin;
|
_tx_pin = txPin;
|
||||||
_rx_pin = rxPin;
|
_rx_pin = rxPin;
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||||||
|
|
||||||
if(detectedBaudRate) {
|
if(detectedBaudRate) {
|
||||||
delay(100); // Give some time...
|
delay(100); // Give some time...
|
||||||
_uart = uartBegin(_uart_nr, detectedBaudRate, config, rxPin, txPin, 256, invert);
|
_uart = uartBegin(_uart_nr, detectedBaudRate, config, rxPin, txPin, 256, invert, rxfifo_full_thrhd);
|
||||||
} else {
|
} else {
|
||||||
log_e("Could not detect baudrate. Serial data at the port must be present within the timeout for detection to be possible");
|
log_e("Could not detect baudrate. Serial data at the port must be present within the timeout for detection to be possible");
|
||||||
_uart = NULL;
|
_uart = NULL;
|
||||||
|
@ -55,7 +55,7 @@ class HardwareSerial: public Stream
|
|||||||
public:
|
public:
|
||||||
HardwareSerial(int uart_nr);
|
HardwareSerial(int uart_nr);
|
||||||
|
|
||||||
void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
|
void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL, uint8_t rxfifo_full_thrhd = 112);
|
||||||
void end();
|
void end();
|
||||||
void updateBaudRate(unsigned long baud);
|
void updateBaudRate(unsigned long baud);
|
||||||
int available(void);
|
int available(void);
|
||||||
|
@ -48,8 +48,6 @@ typedef struct {
|
|||||||
bool external_phy;
|
bool external_phy;
|
||||||
} tinyusb_config_t;
|
} tinyusb_config_t;
|
||||||
|
|
||||||
static TaskHandle_t s_tusb_tskh;
|
|
||||||
|
|
||||||
static void configure_pins(usb_hal_context_t *usb)
|
static void configure_pins(usb_hal_context_t *usb)
|
||||||
{
|
{
|
||||||
for (const usb_iopin_dsc_t *iopin = usb_periph_iopins; iopin->pin != -1; ++iopin) {
|
for (const usb_iopin_dsc_t *iopin = usb_periph_iopins; iopin->pin != -1; ++iopin) {
|
||||||
@ -74,7 +72,6 @@ static void configure_pins(usb_hal_context_t *usb)
|
|||||||
|
|
||||||
esp_err_t tinyusb_driver_install(const tinyusb_config_t *config)
|
esp_err_t tinyusb_driver_install(const tinyusb_config_t *config)
|
||||||
{
|
{
|
||||||
int res;
|
|
||||||
log_i("Driver installation...");
|
log_i("Driver installation...");
|
||||||
|
|
||||||
// Hal init
|
// Hal init
|
||||||
|
@ -130,10 +130,10 @@ static void ARDUINO_ISR_ATTR _uart_isr(void *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartEnableInterrupt(uart_t* uart)
|
static void uartEnableInterrupt(uart_t* uart, uint8_t rxfifo_full_thrhd)
|
||||||
{
|
{
|
||||||
UART_MUTEX_LOCK();
|
UART_MUTEX_LOCK();
|
||||||
uart->dev->conf1.rxfifo_full_thrhd = 112;
|
uart->dev->conf1.rxfifo_full_thrhd = rxfifo_full_thrhd;
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
uart->dev->conf1.rx_tout_thrhd = 2;
|
uart->dev->conf1.rx_tout_thrhd = 2;
|
||||||
#else
|
#else
|
||||||
@ -149,7 +149,7 @@ void uartEnableInterrupt(uart_t* uart)
|
|||||||
UART_MUTEX_UNLOCK();
|
UART_MUTEX_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartDisableInterrupt(uart_t* uart)
|
static void uartDisableInterrupt(uart_t* uart)
|
||||||
{
|
{
|
||||||
UART_MUTEX_LOCK();
|
UART_MUTEX_LOCK();
|
||||||
uart->dev->conf1.val = 0;
|
uart->dev->conf1.val = 0;
|
||||||
@ -162,7 +162,7 @@ void uartDisableInterrupt(uart_t* uart)
|
|||||||
UART_MUTEX_UNLOCK();
|
UART_MUTEX_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartDetachRx(uart_t* uart, uint8_t rxPin)
|
static void uartDetachRx(uart_t* uart, uint8_t rxPin)
|
||||||
{
|
{
|
||||||
if(uart == NULL) {
|
if(uart == NULL) {
|
||||||
return;
|
return;
|
||||||
@ -171,7 +171,7 @@ void uartDetachRx(uart_t* uart, uint8_t rxPin)
|
|||||||
uartDisableInterrupt(uart);
|
uartDisableInterrupt(uart);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartDetachTx(uart_t* uart, uint8_t txPin)
|
static void uartDetachTx(uart_t* uart, uint8_t txPin)
|
||||||
{
|
{
|
||||||
if(uart == NULL) {
|
if(uart == NULL) {
|
||||||
return;
|
return;
|
||||||
@ -179,17 +179,17 @@ void uartDetachTx(uart_t* uart, uint8_t txPin)
|
|||||||
pinMatrixOutDetach(txPin, false, false);
|
pinMatrixOutDetach(txPin, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted)
|
static void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted, uint8_t rxfifo_full_thrhd)
|
||||||
{
|
{
|
||||||
if(uart == NULL || rxPin >= GPIO_PIN_COUNT) {
|
if(uart == NULL || rxPin >= GPIO_PIN_COUNT) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pinMode(rxPin, INPUT);
|
pinMode(rxPin, INPUT);
|
||||||
uartEnableInterrupt(uart);
|
uartEnableInterrupt(uart, rxfifo_full_thrhd);
|
||||||
pinMatrixInAttach(rxPin, UART_RXD_IDX(uart->num), inverted);
|
pinMatrixInAttach(rxPin, UART_RXD_IDX(uart->num), inverted);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)
|
static void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)
|
||||||
{
|
{
|
||||||
if(uart == NULL || txPin >= GPIO_PIN_COUNT) {
|
if(uart == NULL || txPin >= GPIO_PIN_COUNT) {
|
||||||
return;
|
return;
|
||||||
@ -198,7 +198,7 @@ void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)
|
|||||||
pinMatrixOutAttach(txPin, UART_TXD_IDX(uart->num), inverted, false);
|
pinMatrixOutAttach(txPin, UART_TXD_IDX(uart->num), inverted, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint16_t queueLen, bool inverted)
|
uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint16_t queueLen, bool inverted, uint8_t rxfifo_full_thrhd)
|
||||||
{
|
{
|
||||||
if(uart_nr >= UART_PORTS_NUM) {
|
if(uart_nr >= UART_PORTS_NUM) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -256,7 +256,7 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
|
|||||||
UART_MUTEX_UNLOCK();
|
UART_MUTEX_UNLOCK();
|
||||||
|
|
||||||
if(rxPin != -1) {
|
if(rxPin != -1) {
|
||||||
uartAttachRx(uart, rxPin, inverted);
|
uartAttachRx(uart, rxPin, inverted, rxfifo_full_thrhd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(txPin != -1) {
|
if(txPin != -1) {
|
||||||
@ -322,7 +322,11 @@ uint32_t uartAvailable(uart_t* uart)
|
|||||||
if(uart == NULL || uart->queue == NULL) {
|
if(uart == NULL || uart->queue == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#ifdef UART_READ_RX_FIFO
|
||||||
return (uxQueueMessagesWaiting(uart->queue) + uart->dev->status.rxfifo_cnt) ;
|
return (uxQueueMessagesWaiting(uart->queue) + uart->dev->status.rxfifo_cnt) ;
|
||||||
|
#else
|
||||||
|
return uxQueueMessagesWaiting(uart->queue);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t uartAvailableForWrite(uart_t* uart)
|
uint32_t uartAvailableForWrite(uart_t* uart)
|
||||||
@ -333,6 +337,7 @@ uint32_t uartAvailableForWrite(uart_t* uart)
|
|||||||
return 0x7f - uart->dev->status.txfifo_cnt;
|
return 0x7f - uart->dev->status.txfifo_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef UART_READ_RX_FIFO
|
||||||
void uartRxFifoToQueue(uart_t* uart)
|
void uartRxFifoToQueue(uart_t* uart)
|
||||||
{
|
{
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
@ -357,6 +362,7 @@ void uartRxFifoToQueue(uart_t* uart)
|
|||||||
uart->dev->int_clr.val = 0xffffffff;
|
uart->dev->int_clr.val = 0xffffffff;
|
||||||
UART_MUTEX_UNLOCK();
|
UART_MUTEX_UNLOCK();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t uartRead(uart_t* uart)
|
uint8_t uartRead(uart_t* uart)
|
||||||
{
|
{
|
||||||
@ -364,10 +370,12 @@ uint8_t uartRead(uart_t* uart)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
|
#ifdef UART_READ_RX_FIFO
|
||||||
if ((uxQueueMessagesWaiting(uart->queue) == 0) && (uart->dev->status.rxfifo_cnt > 0))
|
if ((uxQueueMessagesWaiting(uart->queue) == 0) && (uart->dev->status.rxfifo_cnt > 0))
|
||||||
{
|
{
|
||||||
uartRxFifoToQueue(uart);
|
uartRxFifoToQueue(uart);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if(xQueueReceive(uart->queue, &c, 0)) {
|
if(xQueueReceive(uart->queue, &c, 0)) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
@ -380,10 +388,12 @@ uint8_t uartPeek(uart_t* uart)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
|
#ifdef UART_READ_RX_FIFO
|
||||||
if ((uxQueueMessagesWaiting(uart->queue) == 0) && (uart->dev->status.rxfifo_cnt > 0))
|
if ((uxQueueMessagesWaiting(uart->queue) == 0) && (uart->dev->status.rxfifo_cnt > 0))
|
||||||
{
|
{
|
||||||
uartRxFifoToQueue(uart);
|
uartRxFifoToQueue(uart);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if(xQueuePeek(uart->queue, &c, 0)) {
|
if(xQueuePeek(uart->queue, &c, 0)) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ extern "C" {
|
|||||||
struct uart_struct_t;
|
struct uart_struct_t;
|
||||||
typedef struct uart_struct_t uart_t;
|
typedef struct uart_struct_t uart_t;
|
||||||
|
|
||||||
uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint16_t queueLen, bool inverted);
|
uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint16_t queueLen, bool inverted, uint8_t rxfifo_full_thrhd);
|
||||||
void uartEnd(uart_t* uart, uint8_t rxPin, uint8_t txPin);
|
void uartEnd(uart_t* uart, uint8_t rxPin, uint8_t txPin);
|
||||||
|
|
||||||
uint32_t uartAvailable(uart_t* uart);
|
uint32_t uartAvailable(uart_t* uart);
|
||||||
|
Loading…
Reference in New Issue
Block a user