X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/46677b45896a955b8c62a46d624750213a00b1dd..a032d77d0e8009a3ef7e1666f144cde6f08f800e:/Projects/XPLAINBridge/XPLAINBridge.c diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c index 912e68367..7909cc45c 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, 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 @@ -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,9 +140,9 @@ 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 */ @@ -164,18 +176,13 @@ void SetupHardware(void) /* Disable clock division */ clock_prescale_set(clock_div_1); - /* Hardware Initialization */ - SoftUART_Init(); - LEDs_Init(); - USB_Init(); - /* Disable JTAG debugging */ MCUCR |= (1 << JTD); MCUCR |= (1 << JTD); /* 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; @@ -183,6 +190,16 @@ void SetupHardware(void) /* Re-enable JTAG debugging */ MCUCR &= ~(1 << JTD); MCUCR &= ~(1 << JTD); + + /* Hardware Initialization */ + SoftUART_Init(); + LEDs_Init(); + #if defined(RESET_TOGGLES_LIBUSB_COMPAT) + UpdateCurrentCompatibilityMode(); + #endif + + /* USB Stack Initialization */ + USB_Init(); } /** Event handler for the library USB Configuration Changed event. */ @@ -199,21 +216,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); - #endif + if ((AVRISP_DATA_IN_EPADDR & ENDPOINT_EPNUM_MASK) != (AVRISP_DATA_OUT_EPADDR & ENDPOINT_EPNUM_MASK)) + ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_IN_EPADDR, EP_TYPE_BULK, AVRISP_DATA_EPSIZE, 1); /* Configure the V2 protocol packet handler */ V2Protocol_Init(); @@ -257,20 +271,22 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. * - * \param[in] wValue Descriptor type and index to retrieve - * \param[in] wIndex Sub-index to retrieve (such as a localized string language) - * \param[out] DescriptorAddress Address of the retrieved descriptor + * \param[in] wValue Descriptor type and index to retrieve + * \param[in] wIndex Sub-index to retrieve (such as a localized string language) + * \param[out] DescriptorAddress Address of the retrieved descriptor + * \param[out] DescriptorMemorySpace Memory space that the descriptor is stored in * * \return Length of the retrieved descriptor in bytes, or NO_DESCRIPTOR if the descriptor was not found */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, - const void** const DescriptorAddress) + const void** const DescriptorAddress, + uint8_t* const DescriptorMemorySpace) { /* Return the correct descriptors based on the selected mode */ if (CurrentFirmwareMode == MODE_USART_BRIDGE) - return USART_GetDescriptor(wValue, wIndex, DescriptorAddress); + return USART_GetDescriptor(wValue, wIndex, DescriptorAddress, DescriptorMemorySpace); else - return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress); + return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress, DescriptorMemorySpace); }