diff options
| author | Ryan <fauxpark@gmail.com> | 2021-11-14 05:23:14 +1100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-13 18:23:14 +0000 |
| commit | 04b51e381e2ff3f4c7aba662e1c817ce5daa931d (patch) | |
| tree | 3b5c4415b94184f182d11e2629b405af9b3f0c57 /platforms | |
| parent | 7e86c37962935e2f791864201b684345995f0b82 (diff) | |
| download | qmk_firmware-04b51e381e2ff3f4c7aba662e1c817ce5daa931d.tar.gz qmk_firmware-04b51e381e2ff3f4c7aba662e1c817ce5daa931d.zip | |
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 <sigprof@gmail.com>
* Simplify a uart_write() loop
* Update platforms/avr/drivers/uart.c
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Diffstat (limited to 'platforms')
| -rw-r--r-- | platforms/avr/drivers/uart.c | 26 | ||||
| -rw-r--r-- | platforms/avr/drivers/uart.h | 8 | ||||
| -rw-r--r-- | platforms/chibios/drivers/uart.c | 8 | ||||
| -rw-r--r-- | platforms/chibios/drivers/uart.h | 8 |
4 files changed, 37 insertions, 13 deletions
diff --git a/platforms/avr/drivers/uart.c b/platforms/avr/drivers/uart.c index c6abcb6fe..01cf6b1fb 100644 --- a/platforms/avr/drivers/uart.c +++ b/platforms/avr/drivers/uart.c | |||
| @@ -100,7 +100,7 @@ void uart_init(uint32_t baud) { | |||
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | // Transmit a byte | 102 | // Transmit a byte |
| 103 | void uart_putchar(uint8_t c) { | 103 | void uart_write(uint8_t data) { |
| 104 | uint8_t i; | 104 | uint8_t i; |
| 105 | 105 | ||
| 106 | i = tx_buffer_head + 1; | 106 | i = tx_buffer_head + 1; |
| @@ -110,27 +110,39 @@ void uart_putchar(uint8_t c) { | |||
| 110 | while (tx_buffer_tail == i) | 110 | while (tx_buffer_tail == i) |
| 111 | ; // wait until space in buffer | 111 | ; // wait until space in buffer |
| 112 | // cli(); | 112 | // cli(); |
| 113 | tx_buffer[i] = c; | 113 | tx_buffer[i] = data; |
| 114 | tx_buffer_head = i; | 114 | tx_buffer_head = i; |
| 115 | UCSRnB = (1 << RXENn) | (1 << TXENn) | (1 << RXCIEn) | (1 << UDRIEn); | 115 | UCSRnB = (1 << RXENn) | (1 << TXENn) | (1 << RXCIEn) | (1 << UDRIEn); |
| 116 | // sei(); | 116 | // sei(); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | // Receive a byte | 119 | // Receive a byte |
| 120 | uint8_t uart_getchar(void) { | 120 | uint8_t uart_read(void) { |
| 121 | uint8_t c, i; | 121 | uint8_t data, i; |
| 122 | 122 | ||
| 123 | while (rx_buffer_head == rx_buffer_tail) | 123 | while (rx_buffer_head == rx_buffer_tail) |
| 124 | ; // wait for character | 124 | ; // wait for character |
| 125 | i = rx_buffer_tail + 1; | 125 | i = rx_buffer_tail + 1; |
| 126 | if (i >= RX_BUFFER_SIZE) i = 0; | 126 | if (i >= RX_BUFFER_SIZE) i = 0; |
| 127 | c = rx_buffer[i]; | 127 | data = rx_buffer[i]; |
| 128 | rx_buffer_tail = i; | 128 | rx_buffer_tail = i; |
| 129 | return c; | 129 | return data; |
| 130 | } | ||
| 131 | |||
| 132 | void uart_transmit(const uint8_t *data, uint16_t length) { | ||
| 133 | for (uint16_t i = 0; i < length; i++) { | ||
| 134 | uart_write(data[i]); | ||
| 135 | } | ||
| 136 | } | ||
| 137 | |||
| 138 | void uart_receive(uint8_t *data, uint16_t length) { | ||
| 139 | for (uint16_t i = 0; i < length; i++) { | ||
| 140 | data[i] = uart_read(); | ||
| 141 | } | ||
| 130 | } | 142 | } |
| 131 | 143 | ||
| 132 | // Return whether the number of bytes waiting in the receive buffer is nonzero. | 144 | // Return whether the number of bytes waiting in the receive buffer is nonzero. |
| 133 | // Call this before uart_getchar() to check if it will need | 145 | // Call this before uart_read() to check if it will need |
| 134 | // to wait for a byte to arrive. | 146 | // to wait for a byte to arrive. |
| 135 | bool uart_available(void) { | 147 | bool uart_available(void) { |
| 136 | uint8_t head, tail; | 148 | uint8_t head, tail; |
diff --git a/platforms/avr/drivers/uart.h b/platforms/avr/drivers/uart.h index 602eb3d8b..9cb7652b0 100644 --- a/platforms/avr/drivers/uart.h +++ b/platforms/avr/drivers/uart.h | |||
| @@ -28,8 +28,12 @@ | |||
| 28 | 28 | ||
| 29 | void uart_init(uint32_t baud); | 29 | void uart_init(uint32_t baud); |
| 30 | 30 | ||
| 31 | void uart_putchar(uint8_t c); | 31 | void uart_write(uint8_t data); |
| 32 | 32 | ||
| 33 | uint8_t uart_getchar(void); | 33 | uint8_t uart_read(void); |
| 34 | |||
| 35 | void uart_transmit(const char *data, uint16_t length); | ||
| 36 | |||
| 37 | void uart_receive(char *data, uint16_t length); | ||
| 34 | 38 | ||
| 35 | bool uart_available(void); | 39 | bool uart_available(void); |
diff --git a/platforms/chibios/drivers/uart.c b/platforms/chibios/drivers/uart.c index 0e8e0515a..297c1892c 100644 --- a/platforms/chibios/drivers/uart.c +++ b/platforms/chibios/drivers/uart.c | |||
| @@ -39,12 +39,16 @@ void uart_init(uint32_t baud) { | |||
| 39 | } | 39 | } |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | void uart_putchar(uint8_t c) { sdPut(&SERIAL_DRIVER, c); } | 42 | void uart_write(uint8_t data) { sdPut(&SERIAL_DRIVER, c); } |
| 43 | 43 | ||
| 44 | uint8_t uart_getchar(void) { | 44 | uint8_t uart_read(void) { |
| 45 | msg_t res = sdGet(&SERIAL_DRIVER); | 45 | msg_t res = sdGet(&SERIAL_DRIVER); |
| 46 | 46 | ||
| 47 | return (uint8_t)res; | 47 | return (uint8_t)res; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | void uart_transmit(const uint8_t *data, uint16_t length) { sdWrite(&SERIAL_DRIVER, data, length); } | ||
| 51 | |||
| 52 | void uart_receive(uint8_t *data, uint16_t length) { sdRead(&SERIAL_DRIVER, data, length); } | ||
| 53 | |||
| 50 | bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } | 54 | bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } |
diff --git a/platforms/chibios/drivers/uart.h b/platforms/chibios/drivers/uart.h index b4e20e9fd..5bc487590 100644 --- a/platforms/chibios/drivers/uart.h +++ b/platforms/chibios/drivers/uart.h | |||
| @@ -70,8 +70,12 @@ | |||
| 70 | 70 | ||
| 71 | void uart_init(uint32_t baud); | 71 | void uart_init(uint32_t baud); |
| 72 | 72 | ||
| 73 | void uart_putchar(uint8_t c); | 73 | void uart_write(uint8_t data); |
| 74 | 74 | ||
| 75 | uint8_t uart_getchar(void); | 75 | uint8_t uart_read(void); |
| 76 | |||
| 77 | void uart_transmit(const uint8_t *data, uint16_t length); | ||
| 78 | |||
| 79 | void uart_receive(uint8_t *data, uint16_t length); | ||
| 76 | 80 | ||
| 77 | bool uart_available(void); | 81 | bool uart_available(void); |
