aboutsummaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
authorRyan <fauxpark@gmail.com>2021-11-14 05:23:14 +1100
committerGitHub <noreply@github.com>2021-11-13 18:23:14 +0000
commit04b51e381e2ff3f4c7aba662e1c817ce5daa931d (patch)
tree3b5c4415b94184f182d11e2629b405af9b3f0c57 /platforms
parent7e86c37962935e2f791864201b684345995f0b82 (diff)
downloadqmk_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.c26
-rw-r--r--platforms/avr/drivers/uart.h8
-rw-r--r--platforms/chibios/drivers/uart.c8
-rw-r--r--platforms/chibios/drivers/uart.h8
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
103void uart_putchar(uint8_t c) { 103void 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
120uint8_t uart_getchar(void) { 120uint8_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
132void 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
138void 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.
135bool uart_available(void) { 147bool 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
29void uart_init(uint32_t baud); 29void uart_init(uint32_t baud);
30 30
31void uart_putchar(uint8_t c); 31void uart_write(uint8_t data);
32 32
33uint8_t uart_getchar(void); 33uint8_t uart_read(void);
34
35void uart_transmit(const char *data, uint16_t length);
36
37void uart_receive(char *data, uint16_t length);
34 38
35bool uart_available(void); 39bool 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
42void uart_putchar(uint8_t c) { sdPut(&SERIAL_DRIVER, c); } 42void uart_write(uint8_t data) { sdPut(&SERIAL_DRIVER, c); }
43 43
44uint8_t uart_getchar(void) { 44uint8_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
50void uart_transmit(const uint8_t *data, uint16_t length) { sdWrite(&SERIAL_DRIVER, data, length); }
51
52void uart_receive(uint8_t *data, uint16_t length) { sdRead(&SERIAL_DRIVER, data, length); }
53
50bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } 54bool 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
71void uart_init(uint32_t baud); 71void uart_init(uint32_t baud);
72 72
73void uart_putchar(uint8_t c); 73void uart_write(uint8_t data);
74 74
75uint8_t uart_getchar(void); 75uint8_t uart_read(void);
76
77void uart_transmit(const uint8_t *data, uint16_t length);
78
79void uart_receive(uint8_t *data, uint16_t length);
76 80
77bool uart_available(void); 81bool uart_available(void);