From 04b51e381e2ff3f4c7aba662e1c817ce5daa931d Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 14 Nov 2021 05:23:14 +1100 Subject: [PATCH] Update UART driver API (#14839) * Add uart_puts() and uart_gets() * Add some docs * Rework API * Formatting * Update docs/uart_driver.md Co-authored-by: Sergey Vlasov * Simplify a uart_write() loop * Update platforms/avr/drivers/uart.c Co-authored-by: Joel Challis Co-authored-by: Sergey Vlasov Co-authored-by: Joel Challis --- docs/uart_driver.md | 38 +++++++++++++++++++++---- keyboards/mschwingen/modelm/modelm.c | 2 +- keyboards/nullbitsco/common/remote_kb.c | 6 ++-- paths.mk | 1 - platforms/avr/drivers/uart.c | 26 ++++++++++++----- platforms/avr/drivers/uart.h | 8 ++++-- platforms/chibios/drivers/uart.c | 8 ++++-- platforms/chibios/drivers/uart.h | 8 ++++-- 8 files changed, 72 insertions(+), 25 deletions(-) diff --git a/docs/uart_driver.md b/docs/uart_driver.md index 4d1716975f5..340b6481892 100644 --- a/docs/uart_driver.md +++ b/docs/uart_driver.md @@ -60,30 +60,56 @@ Initialize the UART driver. This function must be called only once, before any o --- -### `void uart_putchar(uint8_t c)` +### `void uart_write(uint8_t data)` Transmit a single byte. #### Arguments - - `uint8_t c` - The byte (character) to send, from 0 to 255. + - `uint8_t data` + The byte to write. --- -### `uint8_t uart_getchar(void)` +### `uint8_t uart_read(void)` Receive a single byte. #### Return Value -The byte read from the receive buffer. +The byte read from the receive buffer. This function will block if the buffer is empty (ie. no data to read). + +--- + +### `void uart_transmit(const uint8_t *data, uint16_t length)` + +Transmit multiple bytes. + +#### Arguments + + - `const uint8_t *data` + A pointer to the data to write from. + - `uint16_t length` + The number of bytes to write. Take care not to overrun the length of `data`. + +--- + +### `void uart_receive(char *data, uint16_t length)` + +Receive multiple bytes. + +#### Arguments + + - `uint8_t *data` + A pointer to the buffer to read into. + - `uint16_t length` + The number of bytes to read. Take care not to overrun the length of `data`. --- ### `bool uart_available(void)` -Return whether the receive buffer contains data. Call this function to determine if `uart_getchar()` will return meaningful data. +Return whether the receive buffer contains data. Call this function to determine if `uart_read()` will return data immediately. #### Return Value diff --git a/keyboards/mschwingen/modelm/modelm.c b/keyboards/mschwingen/modelm/modelm.c index c1180612ad0..7dcd4ac0243 100644 --- a/keyboards/mschwingen/modelm/modelm.c +++ b/keyboards/mschwingen/modelm/modelm.c @@ -27,7 +27,7 @@ # undef sendchar static int8_t capture_sendchar(uint8_t c) { // sendchar(c); - uart_putchar(c); + uart_write(c); return 0; } #endif diff --git a/keyboards/nullbitsco/common/remote_kb.c b/keyboards/nullbitsco/common/remote_kb.c index 89cbf9a92a9..4dcc9f46162 100644 --- a/keyboards/nullbitsco/common/remote_kb.c +++ b/keyboards/nullbitsco/common/remote_kb.c @@ -63,9 +63,7 @@ static void send_msg(uint16_t keycode, bool pressed) { msg[IDX_PRESSED] = pressed; msg[IDX_CHECKSUM] = chksum8(msg, UART_MSG_LEN-1); - for (int i=0; i= RX_BUFFER_SIZE) i = 0; - c = rx_buffer[i]; + data = rx_buffer[i]; rx_buffer_tail = i; - return c; + return data; +} + +void uart_transmit(const uint8_t *data, uint16_t length) { + for (uint16_t i = 0; i < length; i++) { + uart_write(data[i]); + } +} + +void uart_receive(uint8_t *data, uint16_t length) { + for (uint16_t i = 0; i < length; i++) { + data[i] = uart_read(); + } } // Return whether the number of bytes waiting in the receive buffer is nonzero. -// Call this before uart_getchar() to check if it will need +// Call this before uart_read() to check if it will need // to wait for a byte to arrive. bool uart_available(void) { uint8_t head, tail; diff --git a/platforms/avr/drivers/uart.h b/platforms/avr/drivers/uart.h index 602eb3d8b0f..9cb7652b08f 100644 --- a/platforms/avr/drivers/uart.h +++ b/platforms/avr/drivers/uart.h @@ -28,8 +28,12 @@ void uart_init(uint32_t baud); -void uart_putchar(uint8_t c); +void uart_write(uint8_t data); -uint8_t uart_getchar(void); +uint8_t uart_read(void); + +void uart_transmit(const char *data, uint16_t length); + +void uart_receive(char *data, uint16_t length); bool uart_available(void); diff --git a/platforms/chibios/drivers/uart.c b/platforms/chibios/drivers/uart.c index 0e8e0515afe..297c1892c34 100644 --- a/platforms/chibios/drivers/uart.c +++ b/platforms/chibios/drivers/uart.c @@ -39,12 +39,16 @@ void uart_init(uint32_t baud) { } } -void uart_putchar(uint8_t c) { sdPut(&SERIAL_DRIVER, c); } +void uart_write(uint8_t data) { sdPut(&SERIAL_DRIVER, c); } -uint8_t uart_getchar(void) { +uint8_t uart_read(void) { msg_t res = sdGet(&SERIAL_DRIVER); return (uint8_t)res; } +void uart_transmit(const uint8_t *data, uint16_t length) { sdWrite(&SERIAL_DRIVER, data, length); } + +void uart_receive(uint8_t *data, uint16_t length) { sdRead(&SERIAL_DRIVER, data, length); } + bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } diff --git a/platforms/chibios/drivers/uart.h b/platforms/chibios/drivers/uart.h index b4e20e9fd3d..5bc4875901f 100644 --- a/platforms/chibios/drivers/uart.h +++ b/platforms/chibios/drivers/uart.h @@ -70,8 +70,12 @@ void uart_init(uint32_t baud); -void uart_putchar(uint8_t c); +void uart_write(uint8_t data); -uint8_t uart_getchar(void); +uint8_t uart_read(void); + +void uart_transmit(const uint8_t *data, uint16_t length); + +void uart_receive(uint8_t *data, uint16_t length); bool uart_available(void);