From b8a5ae2fcd8c027e94f0a3f56f7a9115eab6ee0a Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Fri, 3 Jan 2020 16:46:14 +0100 Subject: [PATCH] keyboard: Fix ring buffer for printer packet forwarding --- keyboard/avr/main.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/keyboard/avr/main.c b/keyboard/avr/main.c index d7487d7..bef0488 100644 --- a/keyboard/avr/main.c +++ b/keyboard/avr/main.c @@ -14,7 +14,7 @@ #define BAUDRATE 19200 -#define PRINTER_PACKET_SIZE 4 +#define PRINTER_PACKET_SIZE 6 /* Keycode from include/linux/input.h */ #define KEY_RESERVED 0 @@ -214,7 +214,8 @@ void uart_putc(char c) ISR(USART_RXC_vect) { if (UCSRA & (1 << RXC)) { - ring_buffer[ring_buffer_wr++] = UDR;// WARNING: No overflow protection + ring_buffer[ring_buffer_wr] = UDR; + ring_buffer_wr++; // WARNING: No overflow protection // Will auto wrap at 256; print_buffer_wr = print_buffer_wr % PRINT_BUFFER_SIZE; } } @@ -229,11 +230,20 @@ void uart_forward_packets() else size = ring_buffer_rd - ring_buffer_wr; - if (size > PRINTER_PACKET_SIZE) { - uart_putc(0xFF); - uart_putc(0xAA); + if (size >= PRINTER_PACKET_SIZE) { + /* check sync */ + if (ring_buffer[ring_buffer_rd] != ((char)0xFF)) { + ring_buffer_rd++; /* Drop wrong sync header */ + return; + } + if (ring_buffer[ring_buffer_rd + 1] != ((char)0xAA)) { + ring_buffer_rd += 1; /* Drop wrong app header */ + return; + } + for (i = 0; i < PRINTER_PACKET_SIZE; ++i) { - uart_putc(ring_buffer[ring_buffer_rd++]); // Will auto wrap at 256 + uart_putc(ring_buffer[ring_buffer_rd]); // Will auto wrap at 256 + ring_buffer_rd++; } } }