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
This commit is contained in:
		
							parent
							
								
									dd8b04dce2
								
							
						
					
					
						commit
						0365d517fe
					
				
					 4 changed files with 22 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -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" )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue