From 7a7399a602f6a7b7b1ecda128031eaf1fb31326c Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Fri, 27 Dec 2019 23:13:51 +0100 Subject: [PATCH] keyboard: avr: Forward printer UART packets --- keyboard/avr/main.c | 47 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/keyboard/avr/main.c b/keyboard/avr/main.c index 20b4bdf..d7487d7 100644 --- a/keyboard/avr/main.c +++ b/keyboard/avr/main.c @@ -1,5 +1,6 @@ #include #include +#include #define MATRIX_X(t) t##B #define MATRIX_Y1(t) t##C @@ -13,6 +14,8 @@ #define BAUDRATE 19200 +#define PRINTER_PACKET_SIZE 4 + /* Keycode from include/linux/input.h */ #define KEY_RESERVED 0 #define KEY_ESC 1 @@ -193,15 +196,48 @@ uint8_t matrix_state_last_vector[9] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - uint8_t fn_active = 0; +/* UART forwarding */ +#define RING_BUFFER_SIZE 256 // Important: must be 256 atm, when changed, you need to change code handling print_buffer_*. +volatile char ring_buffer[RING_BUFFER_SIZE]; +volatile uint8_t ring_buffer_wr = 0; +volatile uint8_t ring_buffer_rd = 0; +#define UART_BYTE_READY (UCSRA & (1 << RXC)) + void uart_putc(char c) { while (!(UCSRA & (1 << UDRE))); UDR = c; } +ISR(USART_RXC_vect) +{ + if (UCSRA & (1 << RXC)) { + ring_buffer[ring_buffer_wr++] = UDR;// WARNING: No overflow protection + // Will auto wrap at 256; print_buffer_wr = print_buffer_wr % PRINT_BUFFER_SIZE; + } +} + +void uart_forward_packets() +{ + uint8_t size; + uint8_t i; + + if (ring_buffer_wr > ring_buffer_rd) + size = ring_buffer_wr - ring_buffer_rd; + else + size = ring_buffer_rd - ring_buffer_wr; + + if (size > PRINTER_PACKET_SIZE) { + uart_putc(0xFF); + uart_putc(0xAA); + for (i = 0; i < PRINTER_PACKET_SIZE; ++i) { + uart_putc(ring_buffer[ring_buffer_rd++]); // Will auto wrap at 256 + } + } +} + void process_key_event(uint8_t col, uint8_t row, uint8_t state) { char c; @@ -269,16 +305,23 @@ int main() MATRIX_Y2(DDR) &= ~MASK_Y2; /* Disable rows */ MATRIX_Y1(PORT) &= ~MASK_Y1; /* Pull row low when selected */ MATRIX_Y2(PORT) &= ~MASK_Y2; /* Pull row low when selected */ - UCSRB = (1 << TXEN); + + /* Set up UART */ + UCSRA = 0; + UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE); + UCSRC = 0; UBRRH = ((((F_CPU / BAUDRATE) / 16) - 1) >> 8); UBRRL = (((F_CPU / BAUDRATE) / 16) - 1); fn_active = 0; + sei(); + /* Continuously scan matrix */ while (1) { for (col = 0; col < 9; ++col) { matrix_scan_col(col); } + uart_forward_packets(); } }