From c3f785602db384a38e1cc9007697b934e7b0a059 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Sat, 16 Oct 2021 13:18:33 +1100 Subject: [PATCH 1/7] Add uart_puts() and uart_gets() --- paths.mk | 1 - platforms/avr/drivers/uart.c | 24 ++++++++++++++++++++++++ platforms/avr/drivers/uart.h | 6 ++++++ platforms/chibios/drivers/uart.c | 13 +++++++++++++ platforms/chibios/drivers/uart.h | 6 ++++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/paths.mk b/paths.mk index 78eaf3996768..7be1b2ce04e1 100644 --- a/paths.mk +++ b/paths.mk @@ -24,6 +24,5 @@ COMMON_VPATH += $(QUANTUM_PATH) COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras COMMON_VPATH += $(QUANTUM_PATH)/audio COMMON_VPATH += $(QUANTUM_PATH)/process_keycode -COMMON_VPATH += $(QUANTUM_PATH)/api COMMON_VPATH += $(QUANTUM_PATH)/sequencer COMMON_VPATH += $(DRIVER_PATH) diff --git a/platforms/avr/drivers/uart.c b/platforms/avr/drivers/uart.c index c6abcb6fe0d1..edea312d452d 100644 --- a/platforms/avr/drivers/uart.c +++ b/platforms/avr/drivers/uart.c @@ -28,6 +28,7 @@ #include #include "uart.h" +#include "progmem.h" #if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) # define UDRn UDR1 @@ -116,6 +117,21 @@ void uart_putchar(uint8_t c) { // sei(); } +// Transmit a string +void uart_puts(char *str) { + while (*str) { + uart_putchar(*str++); + } +} + +// Transmit a string from PROGMEM +void uart_puts_P(const char *str) { + uint8_t c; + while ((c = pgm_read_byte(str++))) { + uart_putchar(c); + } +} + // Receive a byte uint8_t uart_getchar(void) { uint8_t c, i; @@ -129,6 +145,14 @@ uint8_t uart_getchar(void) { return c; } +// Receive a string +void uart_gets(char *str) { + while (uart_available()) { + *str++ = uart_getchar(); + } + *str = '\0'; +} + // Return whether the number of bytes waiting in the receive buffer is nonzero. // Call this before uart_getchar() to check if it will need // to wait for a byte to arrive. diff --git a/platforms/avr/drivers/uart.h b/platforms/avr/drivers/uart.h index 602eb3d8b0f9..965ae8c676d1 100644 --- a/platforms/avr/drivers/uart.h +++ b/platforms/avr/drivers/uart.h @@ -30,6 +30,12 @@ void uart_init(uint32_t baud); void uart_putchar(uint8_t c); +void uart_puts(char *str); + +void uart_puts_P(const char *str); + uint8_t uart_getchar(void); +void uart_gets(char *str); + bool uart_available(void); diff --git a/platforms/chibios/drivers/uart.c b/platforms/chibios/drivers/uart.c index 0e8e0515afef..3a9e18d310ee 100644 --- a/platforms/chibios/drivers/uart.c +++ b/platforms/chibios/drivers/uart.c @@ -41,10 +41,23 @@ void uart_init(uint32_t baud) { void uart_putchar(uint8_t c) { sdPut(&SERIAL_DRIVER, c); } +void uart_puts(char *str) { + while (*str) { + uart_putchar(*str++); + } +} + uint8_t uart_getchar(void) { msg_t res = sdGet(&SERIAL_DRIVER); return (uint8_t)res; } +void uart_gets(char *str) { + while (uart_available()) { + *str++ = uart_getchar(); + } + *str = '\0'; +} + bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } diff --git a/platforms/chibios/drivers/uart.h b/platforms/chibios/drivers/uart.h index b4e20e9fd3d0..2f693a158b8a 100644 --- a/platforms/chibios/drivers/uart.h +++ b/platforms/chibios/drivers/uart.h @@ -68,10 +68,16 @@ # define SD1_CR3 0 #endif +#define uart_puts_P(str) uart_puts(str) + void uart_init(uint32_t baud); void uart_putchar(uint8_t c); +void uart_puts(char *str); + uint8_t uart_getchar(void); +void uart_gets(char *str); + bool uart_available(void); From 6190d020a51f7c822b74c9552d66990d8cd1fea2 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Sat, 16 Oct 2021 14:35:32 +1100 Subject: [PATCH 2/7] Add some docs --- docs/uart_driver.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/uart_driver.md b/docs/uart_driver.md index 4d1716975f5c..63ecb7daacae 100644 --- a/docs/uart_driver.md +++ b/docs/uart_driver.md @@ -71,6 +71,28 @@ Transmit a single byte. --- +### `void uart_puts(char *str)` + +Transmit a string. + +#### Arguments + + - `char *str` + A pointer to the string to send. + +--- + +### `void uart_puts_P(const char *str)` + +Transmit a string from PROGMEM. NOTE: On ARM devices, this is the same as `uart_puts()`. + +#### Arguments + + - `const char *str` + A pointer to the string in program memory to send. + +--- + ### `uint8_t uart_getchar(void)` Receive a single byte. @@ -81,6 +103,21 @@ The byte read from the receive buffer. --- +### `void uart_gets(char *str)` + +Receive a string. + +#### Arguments + + - `char *str` + A pointer to a location in memory to read the string into. Make sure you have allocated enough space for the string! + +#### Return Value + +The string read from the receive buffer. + +--- + ### `bool uart_available(void)` Return whether the receive buffer contains data. Call this function to determine if `uart_getchar()` will return meaningful data. From 3cf14a1684e25d78517791ccd1378b8c1c65f405 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Sun, 17 Oct 2021 23:31:32 +1100 Subject: [PATCH 3/7] Rework API --- docs/uart_driver.md | 51 ++++++++++--------------- keyboards/mschwingen/modelm/modelm.c | 2 +- keyboards/nullbitsco/common/remote_kb.c | 4 +- platforms/avr/drivers/uart.c | 43 ++++++++------------- platforms/avr/drivers/uart.h | 10 ++--- platforms/chibios/drivers/uart.c | 19 +++------ platforms/chibios/drivers/uart.h | 10 ++--- 7 files changed, 52 insertions(+), 87 deletions(-) diff --git a/docs/uart_driver.md b/docs/uart_driver.md index 63ecb7daacae..a465d75382cb 100644 --- a/docs/uart_driver.md +++ b/docs/uart_driver.md @@ -60,67 +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. --- -### `void uart_puts(char *str)` +### `uint8_t uart_read(void)` -Transmit a string. +Receive a single byte. -#### Arguments +#### Return Value - - `char *str` - A pointer to the string to send. +The byte read from the receive buffer. This function will block if the buffer is empty (ie. no data to read). --- -### `void uart_puts_P(const char *str)` +### `void uart_transmit(const uint8_t *data, uint16_t length)` -Transmit a string from PROGMEM. NOTE: On ARM devices, this is the same as `uart_puts()`. +Transmit multiple bytes. #### Arguments - - `const char *str` - A pointer to the string in program memory to send. - ---- - -### `uint8_t uart_getchar(void)` - -Receive a single byte. - -#### Return Value - -The byte read from the receive buffer. + - `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_gets(char *str)` +### `void uart_receive(char *data, uint16_t length)` -Receive a string. +Receive multiple bytes. #### Arguments - - `char *str` - A pointer to a location in memory to read the string into. Make sure you have allocated enough space for the string! - -#### Return Value - -The string read from the receive buffer. + - `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 meaningful data. #### Return Value diff --git a/keyboards/mschwingen/modelm/modelm.c b/keyboards/mschwingen/modelm/modelm.c index c1180612ad06..7dcd4ac02433 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 89cbf9a92a9d..e18e9df14e84 100644 --- a/keyboards/nullbitsco/common/remote_kb.c +++ b/keyboards/nullbitsco/common/remote_kb.c @@ -64,7 +64,7 @@ static void send_msg(uint16_t keycode, bool 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]); + } } -// Receive a string -void uart_gets(char *str) { - while (uart_available()) { - *str++ = uart_getchar(); +void uart_receive(uint8_t *data, uint16_t length) { + for (uint16_t i = 0; i < length; i++) { + data[i] = uart_read(); } - *str = '\0'; } // 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 965ae8c676d1..9cb7652b08fb 100644 --- a/platforms/avr/drivers/uart.h +++ b/platforms/avr/drivers/uart.h @@ -28,14 +28,12 @@ void uart_init(uint32_t baud); -void uart_putchar(uint8_t c); +void uart_write(uint8_t data); -void uart_puts(char *str); +uint8_t uart_read(void); -void uart_puts_P(const char *str); +void uart_transmit(const char *data, uint16_t length); -uint8_t uart_getchar(void); - -void uart_gets(char *str); +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 3a9e18d310ee..297c1892c342 100644 --- a/platforms/chibios/drivers/uart.c +++ b/platforms/chibios/drivers/uart.c @@ -39,25 +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); } -void uart_puts(char *str) { - while (*str) { - uart_putchar(*str++); - } -} - -uint8_t uart_getchar(void) { +uint8_t uart_read(void) { msg_t res = sdGet(&SERIAL_DRIVER); return (uint8_t)res; } -void uart_gets(char *str) { - while (uart_available()) { - *str++ = uart_getchar(); - } - *str = '\0'; -} +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 2f693a158b8a..5bc4875901f5 100644 --- a/platforms/chibios/drivers/uart.h +++ b/platforms/chibios/drivers/uart.h @@ -68,16 +68,14 @@ # define SD1_CR3 0 #endif -#define uart_puts_P(str) uart_puts(str) - void uart_init(uint32_t baud); -void uart_putchar(uint8_t c); +void uart_write(uint8_t data); -void uart_puts(char *str); +uint8_t uart_read(void); -uint8_t uart_getchar(void); +void uart_transmit(const uint8_t *data, uint16_t length); -void uart_gets(char *str); +void uart_receive(uint8_t *data, uint16_t length); bool uart_available(void); From a3f48ecac07e0dcb804744e622aaeff3faca1653 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Sun, 17 Oct 2021 23:34:04 +1100 Subject: [PATCH 4/7] Formatting --- platforms/avr/drivers/uart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/avr/drivers/uart.c b/platforms/avr/drivers/uart.c index 45dd0e2a41f2..6d3f6c0f479e 100644 --- a/platforms/avr/drivers/uart.c +++ b/platforms/avr/drivers/uart.c @@ -125,7 +125,7 @@ uint8_t uart_read(void) { ; // wait for character i = rx_buffer_tail + 1; if (i >= RX_BUFFER_SIZE) i = 0; - data = rx_buffer[i]; + data = rx_buffer[i]; rx_buffer_tail = i; return data; } From 739986a1dfc3868a934141285e8ab23c0a4fce99 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 18 Oct 2021 09:18:37 +1100 Subject: [PATCH 5/7] Update docs/uart_driver.md Co-authored-by: Sergey Vlasov --- docs/uart_driver.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/uart_driver.md b/docs/uart_driver.md index a465d75382cb..340b64818920 100644 --- a/docs/uart_driver.md +++ b/docs/uart_driver.md @@ -109,7 +109,7 @@ Receive multiple bytes. ### `bool uart_available(void)` -Return whether the receive buffer contains data. Call this function to determine if `uart_read()` 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 From a2e2310088d9e6c90cd73299803bbf926d17ca45 Mon Sep 17 00:00:00 2001 From: fauxpark Date: Mon, 18 Oct 2021 09:23:19 +1100 Subject: [PATCH 6/7] Simplify a uart_write() loop --- keyboards/nullbitsco/common/remote_kb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/nullbitsco/common/remote_kb.c b/keyboards/nullbitsco/common/remote_kb.c index e18e9df14e84..4dcc9f461622 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 Date: Mon, 18 Oct 2021 13:11:57 +1100 Subject: [PATCH 7/7] Update platforms/avr/drivers/uart.c Co-authored-by: Joel Challis --- platforms/avr/drivers/uart.c | 1 - 1 file changed, 1 deletion(-) diff --git a/platforms/avr/drivers/uart.c b/platforms/avr/drivers/uart.c index 6d3f6c0f479e..01cf6b1fb8db 100644 --- a/platforms/avr/drivers/uart.c +++ b/platforms/avr/drivers/uart.c @@ -28,7 +28,6 @@ #include #include "uart.h" -#include "progmem.h" #if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) # define UDRn UDR1