Remove non-functional maintenance link check.
[pub/USBasp.git] / Projects / XPLAINBridge / XPLAINBridge.c
index 15cb87d..071c13e 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  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
@@ -31,7 +31,7 @@
 /** \file
  *
  *  Main source file for the XPLAINBridge project. This file contains the main tasks of
- *  the demo and is responsible for the initial application hardware configuration.
+ *  the project and is responsible for the initial application hardware configuration.
  */
 
 #include "XPLAINBridge.h"
@@ -48,26 +48,38 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
                .Config =
                        {
                                .ControlInterfaceNumber         = 0,
-
-                               .DataINEndpointNumber           = CDC_TX_EPNUM,
-                               .DataINEndpointSize             = CDC_TXRX_EPSIZE,
-                               .DataINEndpointDoubleBank       = true,
-
-                               .DataOUTEndpointNumber          = CDC_RX_EPNUM,
-                               .DataOUTEndpointSize            = CDC_TXRX_EPSIZE,
-                               .DataOUTEndpointDoubleBank      = true,
-
-                               .NotificationEndpointNumber     = CDC_NOTIFICATION_EPNUM,
-                               .NotificationEndpointSize       = CDC_NOTIFICATION_EPSIZE,
-                               .NotificationEndpointDoubleBank = false,
+                               .DataINEndpoint                 =
+                                       {
+                                               .Address                = CDC_TX_EPADDR,
+                                               .Size                   = CDC_TXRX_EPSIZE,
+                                               .Banks                  = 1,
+                                       },
+                               .DataOUTEndpoint                =
+                                       {
+                                               .Address                = CDC_RX_EPADDR,
+                                               .Size                   = CDC_TXRX_EPSIZE,
+                                               .Banks                  = 1,
+                                       },
+                               .NotificationEndpoint           =
+                                       {
+                                               .Address                = CDC_NOTIFICATION_EPADDR,
+                                               .Size                   = CDC_NOTIFICATION_EPSIZE,
+                                               .Banks                  = 1,
+                                       },
                        },
        };
 
 /** 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
@@ -99,7 +111,7 @@ void AVRISP_Task(void)
 
        V2Params_UpdateParamValues();
 
-       Endpoint_SelectEndpoint(AVRISP_DATA_OUT_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_OUT_EPADDR);
 
        /* Check to see if a V2 Protocol command has been received */
        if (Endpoint_IsOUTReceived())
@@ -128,17 +140,27 @@ void UARTBridge_Task(void)
                if (!(ReceivedByte < 0))
                  RingBuffer_Insert(&USBtoUART_Buffer, ReceivedByte);
        }
-       
+
        /* 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 +187,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,20 +211,18 @@ 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();
        }
        else
        {
-               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
-                                                           AVRISP_DATA_EPSIZE, ENDPOINT_BANK_SINGLE);
+               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_OUT_EPADDR, EP_TYPE_BULK, AVRISP_DATA_EPSIZE, 1);
 
                #if defined(LIBUSB_DRIVER_COMPAT)
-               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_IN_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
-                                                           AVRISP_DATA_EPSIZE, ENDPOINT_BANK_SINGLE);
+               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_IN_EPADDR, EP_TYPE_BULK, AVRISP_DATA_EPSIZE, 1);
                #endif
 
                /* Configure the V2 protocol packet handler */