From 083d3615d327a90aeaed9adc74eb997315daaafd Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 19 Aug 2009 05:40:05 +0000 Subject: [PATCH] Corrections to the unfinished AVRISP Programmer project to allow AVRStudio to connect to it. --- LUFA/ManPages/ChangeLog.txt | 1 + Projects/Unfinished/AVRISP/AVRISP.c | 5 -- Projects/Unfinished/AVRISP/AVRISP.h | 3 +- Projects/Unfinished/AVRISP/Descriptors.c | 18 +++---- Projects/Unfinished/AVRISP/Lib/V2Protocol.c | 59 +++++++++------------ Projects/Unfinished/AVRISP/Lib/V2Protocol.h | 6 +-- Projects/Unfinished/AVRISP/makefile | 2 +- 7 files changed, 39 insertions(+), 55 deletions(-) diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index e2f6841ea4..bd2c7d0247 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -32,6 +32,7 @@ * - Fixed USBtoSerial demos not reading in UDR1 when the USART receives data but the USB interface is not enumerated, * causing continuous USART receive interrupts * - Fixed misspelt event name in the Class driver USBtoSerial demo, preventing correct operation + * - Fixed invalid data being returned when a GetStatus request is issued in Device mode with an unhandled data recipient * * * \section Sec_ChangeLog090810 Version 090810 diff --git a/Projects/Unfinished/AVRISP/AVRISP.c b/Projects/Unfinished/AVRISP/AVRISP.c index 0491102b41..1e5f55d0a9 100644 --- a/Projects/Unfinished/AVRISP/AVRISP.c +++ b/Projects/Unfinished/AVRISP/AVRISP.c @@ -97,11 +97,6 @@ void EVENT_USB_Device_ConfigurationChanged(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); } } - -void EVENT_USB_Device_UnhandledControlRequest(void) -{ - printf("CONTROL REQUEST\r\n"); -} void Process_AVRISP_Commands(void) { diff --git a/Projects/Unfinished/AVRISP/AVRISP.h b/Projects/Unfinished/AVRISP/AVRISP.h index e52c1a66b7..94e19a3f60 100644 --- a/Projects/Unfinished/AVRISP/AVRISP.h +++ b/Projects/Unfinished/AVRISP/AVRISP.h @@ -69,8 +69,7 @@ void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); - void EVENT_USB_Device_ConfigurationChanged(void); - void EVENT_USB_Device_UnhandledControlRequest(void); + void EVENT_USB_Device_ConfigurationChanged(void); void Process_AVRISP_Commands(void); diff --git a/Projects/Unfinished/AVRISP/Descriptors.c b/Projects/Unfinished/AVRISP/Descriptors.c index a6fefeaa59..a2765d3002 100644 --- a/Projects/Unfinished/AVRISP/Descriptors.c +++ b/Projects/Unfinished/AVRISP/Descriptors.c @@ -109,7 +109,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | AVRISP_DATA_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = AVRISP_DATA_EPSIZE, - .PollingIntervalMS = 0x0A + .PollingIntervalMS = 0x00 }, .DataOutEndpoint = @@ -119,7 +119,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | AVRISP_DATA_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = AVRISP_DATA_EPSIZE, - .PollingIntervalMS = 0x0A + .PollingIntervalMS = 0x00 }, }; @@ -140,9 +140,9 @@ USB_Descriptor_String_t PROGMEM LanguageString = */ USB_Descriptor_String_t PROGMEM ManufacturerString = { - .Header = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String}, + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - .UnicodeString = L"ATMEL" + .UnicodeString = L"Dean Camera" }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, @@ -151,16 +151,16 @@ USB_Descriptor_String_t PROGMEM ManufacturerString = */ USB_Descriptor_String_t PROGMEM ProductString = { - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + .Header = {.Size = USB_STRING_LEN(33), .Type = DTYPE_String}, - .UnicodeString = L"AVRISP mkII" + .UnicodeString = L"LUFA AVRISP MkII Clone Programmer" }; USB_Descriptor_String_t PROGMEM SerialString = { - .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, + .Header = {.Size = USB_STRING_LEN(13), .Type = DTYPE_String}, - .UnicodeString = L"0000A0011794" + .UnicodeString = L"0000A00128255" }; /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" @@ -176,7 +176,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - + switch (DescriptorType) { case DTYPE_Device: diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c index 304eef4711..2679ce7f73 100644 --- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c +++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c @@ -64,27 +64,34 @@ void V2Protocol_ProcessCommand(void) { uint8_t V2Command = Endpoint_Read_Byte(); - printf("COMMAND %d\r\n", V2Command); - switch (V2Command) { case CMD_SIGN_ON: V2Protocol_ProcessCmdSignOn(); break; case CMD_SET_PARAMETER: - V2Protocol_ProcessCmdSetParam(); - break; case CMD_GET_PARAMETER: - V2Protocol_ProcessCmdGetParam(); + V2Protocol_ProcessCmdGetSetParam(V2Command); break; default: + while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE) + { + Endpoint_ClearOUT(); + while (!(Endpoint_IsOUTReceived())); + } + Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + Endpoint_Write_Byte(STATUS_CMD_UNKNOWN); Endpoint_ClearIN(); break; } + printf("COMMAND 0x%02x\r\n", V2Command); + + Endpoint_WaitUntilReady(); + /* Reset Endpoint direction to OUT ready for next command */ Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT); } @@ -104,7 +111,8 @@ static void V2Protocol_ProcessCmdSignOn(void) { Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - + Endpoint_WaitUntilReady(); + Endpoint_Write_Byte(CMD_SIGN_ON); Endpoint_Write_Byte(STATUS_CMD_OK); Endpoint_Write_Byte(PROGRAMMER_ID_LEN); @@ -112,50 +120,31 @@ static void V2Protocol_ProcessCmdSignOn(void) Endpoint_ClearIN(); } -static void V2Protocol_ProcessCmdSetParam(void) +static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command) { uint8_t ParamID = Endpoint_Read_Byte(); uint8_t ParamValue = Endpoint_Read_Byte(); - ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID); - Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - - if (ParameterItem != NULL) - { - eeprom_write_byte(&ParameterItem->ParameterValue, ParamValue); - - Endpoint_Write_Byte(CMD_SET_PARAMETER); - Endpoint_Write_Byte(STATUS_CMD_OK); - } - else - { - Endpoint_Write_Byte(STATUS_CMD_FAILED); - } - - Endpoint_ClearIN(); -} - -static void V2Protocol_ProcessCmdGetParam(void) -{ - uint8_t ParamID = Endpoint_Read_Byte(); - + Endpoint_WaitUntilReady(); + ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID); - Endpoint_ClearOUT(); - Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - if (ParameterItem != NULL) { - Endpoint_Write_Byte(CMD_GET_PARAMETER); + Endpoint_Write_Byte(V2Command); Endpoint_Write_Byte(STATUS_CMD_OK); - Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue)); + + if (V2Command == CMD_SET_PARAMETER) + eeprom_write_byte(&ParameterItem->ParameterValue, ParamValue); + else + Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue)); } else { Endpoint_Write_Byte(STATUS_CMD_FAILED); } - Endpoint_ClearIN(); + Endpoint_ClearIN(); } diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h index c9d39cb717..5e8335963f 100644 --- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h +++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h @@ -40,7 +40,8 @@ #include #include - + + #include "../Descriptors.h" #include "V2ProtocolConstants.h" /* Macros: */ @@ -60,8 +61,7 @@ #if defined(INCLUDE_FROM_V2PROTOCOL_C) static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID); static void V2Protocol_ProcessCmdSignOn(void); - static void V2Protocol_ProcessCmdSetParam(void); - static void V2Protocol_ProcessCmdGetParam(void); + static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command); #endif #endif diff --git a/Projects/Unfinished/AVRISP/makefile b/Projects/Unfinished/AVRISP/makefile index 22fef8b726..5f76575876 100644 --- a/Projects/Unfinished/AVRISP/makefile +++ b/Projects/Unfinished/AVRISP/makefile @@ -119,7 +119,7 @@ OBJDIR = . # Path to the LUFA library -LUFA_PATH = ../../ +LUFA_PATH = ../../../ # LUFA library compile-time options