X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/423d4018f0be89a703832669c3d65b162fc437f3..6e7fc21a94f29e09b4bdce7c17cade5b1322bc7d:/Projects/XPLAINBridge/XPLAINBridge.c diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c index 7c824ec93..41ebabd13 100644 --- a/Projects/XPLAINBridge/XPLAINBridge.c +++ b/Projects/XPLAINBridge/XPLAINBridge.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. + Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -64,10 +64,16 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = }; /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ -RingBuff_t USBtoUART_Buffer; +RingBuffer_t USBtoUART_Buffer; + +/** Underlying data buffer for \ref USBtoUART_Buffer, where the stored bytes are located. */ +static uint8_t USBtoUART_Buffer_Data[128]; /** Circular buffer to hold data from the serial port before it is sent to the host. */ -RingBuff_t UARTtoUSB_Buffer; +RingBuffer_t UARTtoUSB_Buffer; + +/** Underlying data buffer for \ref UARTtoUSB_Buffer, where the stored bytes are located. */ +static uint8_t UARTtoUSB_Buffer_Data[128]; /** Main program entry point. This routine contains the overall program flow, including initial @@ -130,15 +136,25 @@ void UARTBridge_Task(void) } /* Check if the UART receive buffer flush timer has expired or buffer is nearly full */ - RingBuff_Count_t BufferCount = RingBuffer_GetCount(&UARTtoUSB_Buffer); + uint16_t BufferCount = RingBuffer_GetCount(&UARTtoUSB_Buffer); if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200)) { /* Clear flush timer expiry flag */ TIFR0 |= (1 << TOV0); - /* Read bytes from the UART receive buffer into the USB IN endpoint */ + /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BufferCount--) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer)); + { + /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */ + if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface, + RingBuffer_Peek(&UARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError) + { + break; + } + + /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ + RingBuffer_Remove(&UARTtoUSB_Buffer); + } } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); @@ -165,7 +181,7 @@ void SetupHardware(void) /* Enable pull-up on the JTAG TDI pin so we can use it to select the mode */ PORTF |= (1 << 7); - _delay_ms(10); + Delay_MS(10); /* Select the firmware mode based on the JTD pin's value */ CurrentFirmwareMode = (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER; @@ -189,8 +205,8 @@ void EVENT_USB_Device_ConfigurationChanged(void) TCCR0B = ((1 << CS02) | (1 << CS00)); /* Initialize ring buffers used to hold serial data between USB and software UART interfaces */ - RingBuffer_InitBuffer(&USBtoUART_Buffer); - RingBuffer_InitBuffer(&UARTtoUSB_Buffer); + RingBuffer_InitBuffer(&USBtoUART_Buffer, USBtoUART_Buffer_Data, sizeof(USBtoUART_Buffer_Data)); + RingBuffer_InitBuffer(&UARTtoUSB_Buffer, UARTtoUSB_Buffer_Data, sizeof(UARTtoUSB_Buffer_Data)); /* Start the software USART */ SoftUART_Init();