From 0365d517fe6123429a955d866879eed1956b9f44 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sat, 28 Jun 2014 14:12:56 -0700 Subject: [PATCH] Fixed bug with standalone UART CLI - Sending characters to the UART before it's ready would overflow the buffer causing it to hang - Added a check to make sure the interface is ready before starting to send characters - Removed the incorrect check for the usbMuxUart to make sure usb is ready before sending over the uart --- CMakeLists.txt | 2 +- Output/uartOut/arm/uart_serial.c | 19 +++++++++++++++++++ Output/uartOut/output_com.c | 6 ------ Output/usbMuxUart/output_com.c | 8 ++------ 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8360750..7cae1d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ set( ScanModule "MDPure" ) set( MacroModule "PartialMap" ) ##| Sends the current list of usb key codes through USB HID -set( OutputModule "usbMuxUart" ) +set( OutputModule "uartOut" ) ##| Debugging source to use, each module has it's own set of defines that it sets set( DebugModule "full" ) diff --git a/Output/uartOut/arm/uart_serial.c b/Output/uartOut/arm/uart_serial.c index 0b807c8..461ef0d 100644 --- a/Output/uartOut/arm/uart_serial.c +++ b/Output/uartOut/arm/uart_serial.c @@ -32,6 +32,9 @@ volatile uint8_t uart0_buffer_tail = 0; volatile uint8_t uart0_buffer_items = 0; volatile uint8_t uart0_buffer[uart0_buffer_size]; +volatile uint8_t uart_configured = 0; + + // ----- Interrupt Functions ----- @@ -84,10 +87,14 @@ void uart0_status_isr() } + // ----- Functions ----- void uart_serial_setup() { + // Indication that the UART is not ready yet + uart_configured = 0; + // Setup the the UART interface for keyboard data input SIM_SCGC4 |= SIM_SCGC4_UART0; // Disable clock gating @@ -133,12 +140,18 @@ void uart_serial_setup() // Add interrupt to the vector table NVIC_ENABLE_IRQ( IRQ_UART0_STATUS ); + + // UART is now ready to use + uart_configured = 1; } // Get the next character, or -1 if nothing received int uart_serial_getchar() { + if ( !uart_configured ) + return -1; + unsigned int value = -1; // Check to see if the FIFO has characters @@ -177,6 +190,9 @@ void uart_serial_flush_input() // Transmit a character. 0 returned on success, -1 on error int uart_serial_putchar( uint8_t c ) { + if ( !uart_configured ) + return -1; + while ( !( UART0_SFIFO & UART_SFIFO_TXEMPT ) ); // Wait till there is room to send UART0_D = c; @@ -186,6 +202,9 @@ int uart_serial_putchar( uint8_t c ) int uart_serial_write( const void *buffer, uint32_t size ) { + if ( !uart_configured ) + return -1; + const uint8_t *data = (const uint8_t *)buffer; uint32_t position = 0; diff --git a/Output/uartOut/output_com.c b/Output/uartOut/output_com.c index 37cadc5..16fd892 100644 --- a/Output/uartOut/output_com.c +++ b/Output/uartOut/output_com.c @@ -31,7 +31,6 @@ // USB Includes #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) -#include "avr/uart_serial.h" #elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) #include "arm/uart_serial.h" #endif @@ -118,7 +117,6 @@ inline void Output_send(void) inline void Output_firmwareReload() { #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) - uart_debug_reload(); #elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) uart_device_reload(); #endif @@ -136,8 +134,6 @@ inline unsigned int Output_availablechar() inline int Output_getchar() { #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) - // XXX Make sure to check output_availablechar() first! Information is lost with the cast (error codes) - return (int)uart_serial_getchar(); #elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) return uart_serial_getchar(); #endif @@ -155,7 +151,6 @@ inline int Output_putchar( char c ) inline int Output_putstr( char* str ) { #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR - uint16_t count = 0; #elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM uint32_t count = 0; #endif @@ -171,7 +166,6 @@ inline int Output_putstr( char* str ) inline void Output_softReset() { #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) - uart_debug_software_reset(); #elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) SOFTWARE_RESET(); #endif diff --git a/Output/usbMuxUart/output_com.c b/Output/usbMuxUart/output_com.c index daf601d..5011ece 100644 --- a/Output/usbMuxUart/output_com.c +++ b/Output/usbMuxUart/output_com.c @@ -203,12 +203,8 @@ inline int Output_putstr( char* str ) while ( str[count] != '\0' ) count++; - // Make sure USB is configured first - if ( usb_configured() ) - { - // First send to UART - uart_serial_write( str, count ); - } + // First send to UART + uart_serial_write( str, count ); // Then send to USB return usb_serial_write( str, count ); -- 2.39.5