forked from mirrors/qmk_userspace
		
	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>
This commit is contained in:
		
					parent
					
						
							
								7e86c37962
							
						
					
				
			
			
				commit
				
					
						04b51e381e
					
				
			
		
					 8 changed files with 72 additions and 25 deletions
				
			
		| 
						 | 
					@ -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.
 | 
					Transmit a single byte.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Arguments
 | 
					#### Arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - `uint8_t c`  
 | 
					 - `uint8_t data`  
 | 
				
			||||||
   The byte (character) to send, from 0 to 255.
 | 
					   The byte to write.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `uint8_t uart_getchar(void)`
 | 
					### `uint8_t uart_read(void)`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Receive a single byte.
 | 
					Receive a single byte.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Return Value
 | 
					#### 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)`
 | 
					### `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
 | 
					#### Return Value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@
 | 
				
			||||||
#    undef sendchar
 | 
					#    undef sendchar
 | 
				
			||||||
static int8_t capture_sendchar(uint8_t c) {
 | 
					static int8_t capture_sendchar(uint8_t c) {
 | 
				
			||||||
    //  sendchar(c);
 | 
					    //  sendchar(c);
 | 
				
			||||||
    uart_putchar(c);
 | 
					    uart_write(c);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,9 +63,7 @@ static void send_msg(uint16_t keycode, bool pressed) {
 | 
				
			||||||
  msg[IDX_PRESSED] = pressed;
 | 
					  msg[IDX_PRESSED] = pressed;
 | 
				
			||||||
  msg[IDX_CHECKSUM] = chksum8(msg, UART_MSG_LEN-1);
 | 
					  msg[IDX_CHECKSUM] = chksum8(msg, UART_MSG_LEN-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (int i=0; i<UART_MSG_LEN; i++) {
 | 
					  uart_transmit(msg, UART_MSG_LEN);
 | 
				
			||||||
    uart_putchar(msg[i]);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void print_message_buffer(void) {
 | 
					static void print_message_buffer(void) {
 | 
				
			||||||
| 
						 | 
					@ -103,7 +101,7 @@ static void process_uart(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void get_msg(void) {
 | 
					static void get_msg(void) {
 | 
				
			||||||
  while (uart_available()) {
 | 
					  while (uart_available()) {
 | 
				
			||||||
    msg[msg_idx] = uart_getchar();
 | 
					    msg[msg_idx] = uart_read();
 | 
				
			||||||
    dprintf("idx: %u, recv: %u\n", msg_idx, msg[msg_idx]);
 | 
					    dprintf("idx: %u, recv: %u\n", msg_idx, msg[msg_idx]);
 | 
				
			||||||
    if (msg_idx == 0 && (msg[msg_idx] != UART_PREAMBLE)) {
 | 
					    if (msg_idx == 0 && (msg[msg_idx] != UART_PREAMBLE)) {
 | 
				
			||||||
      dprintf("Byte sync error!\n");
 | 
					      dprintf("Byte sync error!\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								paths.mk
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								paths.mk
									
										
									
									
									
								
							| 
						 | 
					@ -24,6 +24,5 @@ COMMON_VPATH += $(QUANTUM_PATH)
 | 
				
			||||||
COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
 | 
					COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
 | 
				
			||||||
COMMON_VPATH += $(QUANTUM_PATH)/audio
 | 
					COMMON_VPATH += $(QUANTUM_PATH)/audio
 | 
				
			||||||
COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
 | 
					COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
 | 
				
			||||||
COMMON_VPATH += $(QUANTUM_PATH)/api
 | 
					 | 
				
			||||||
COMMON_VPATH += $(QUANTUM_PATH)/sequencer
 | 
					COMMON_VPATH += $(QUANTUM_PATH)/sequencer
 | 
				
			||||||
COMMON_VPATH += $(DRIVER_PATH)
 | 
					COMMON_VPATH += $(DRIVER_PATH)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ void uart_init(uint32_t baud) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Transmit a byte
 | 
					// Transmit a byte
 | 
				
			||||||
void uart_putchar(uint8_t c) {
 | 
					void uart_write(uint8_t data) {
 | 
				
			||||||
    uint8_t i;
 | 
					    uint8_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    i = tx_buffer_head + 1;
 | 
					    i = tx_buffer_head + 1;
 | 
				
			||||||
| 
						 | 
					@ -110,27 +110,39 @@ void uart_putchar(uint8_t c) {
 | 
				
			||||||
    while (tx_buffer_tail == i)
 | 
					    while (tx_buffer_tail == i)
 | 
				
			||||||
        ;  // wait until space in buffer
 | 
					        ;  // wait until space in buffer
 | 
				
			||||||
    // cli();
 | 
					    // cli();
 | 
				
			||||||
    tx_buffer[i]   = c;
 | 
					    tx_buffer[i]   = data;
 | 
				
			||||||
    tx_buffer_head = i;
 | 
					    tx_buffer_head = i;
 | 
				
			||||||
    UCSRnB         = (1 << RXENn) | (1 << TXENn) | (1 << RXCIEn) | (1 << UDRIEn);
 | 
					    UCSRnB         = (1 << RXENn) | (1 << TXENn) | (1 << RXCIEn) | (1 << UDRIEn);
 | 
				
			||||||
    // sei();
 | 
					    // sei();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Receive a byte
 | 
					// Receive a byte
 | 
				
			||||||
uint8_t uart_getchar(void) {
 | 
					uint8_t uart_read(void) {
 | 
				
			||||||
    uint8_t c, i;
 | 
					    uint8_t data, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (rx_buffer_head == rx_buffer_tail)
 | 
					    while (rx_buffer_head == rx_buffer_tail)
 | 
				
			||||||
        ;  // wait for character
 | 
					        ;  // wait for character
 | 
				
			||||||
    i = rx_buffer_tail + 1;
 | 
					    i = rx_buffer_tail + 1;
 | 
				
			||||||
    if (i >= RX_BUFFER_SIZE) i = 0;
 | 
					    if (i >= RX_BUFFER_SIZE) i = 0;
 | 
				
			||||||
    c              = rx_buffer[i];
 | 
					    data           = rx_buffer[i];
 | 
				
			||||||
    rx_buffer_tail = 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.
 | 
					// 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.
 | 
					// to wait for a byte to arrive.
 | 
				
			||||||
bool uart_available(void) {
 | 
					bool uart_available(void) {
 | 
				
			||||||
    uint8_t head, tail;
 | 
					    uint8_t head, tail;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,8 +28,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uart_init(uint32_t baud);
 | 
					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);
 | 
					bool uart_available(void);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
					    msg_t res = sdGet(&SERIAL_DRIVER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (uint8_t)res;
 | 
					    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); }
 | 
					bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,8 +70,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uart_init(uint32_t baud);
 | 
					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);
 | 
					bool uart_available(void);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue