Corrections to the unfinished AVRISP Programmer project to allow AVRStudio to connect...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 19 Aug 2009 05:40:05 +0000 (05:40 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 19 Aug 2009 05:40:05 +0000 (05:40 +0000)
LUFA/ManPages/ChangeLog.txt
Projects/Unfinished/AVRISP/AVRISP.c
Projects/Unfinished/AVRISP/AVRISP.h
Projects/Unfinished/AVRISP/Descriptors.c
Projects/Unfinished/AVRISP/Lib/V2Protocol.c
Projects/Unfinished/AVRISP/Lib/V2Protocol.h
Projects/Unfinished/AVRISP/makefile

index e2f6841..bd2c7d0 100644 (file)
@@ -32,6 +32,7 @@
   *  - Fixed USBtoSerial demos not reading in UDR1 when the USART receives data but the USB interface is not enumerated,\r
   *    causing continuous USART receive interrupts\r
   *  - Fixed misspelt event name in the Class driver USBtoSerial demo, preventing correct operation\r
+  *  - Fixed invalid data being returned when a GetStatus request is issued in Device mode with an unhandled data recipient\r
   *\r
   *\r
   *  \section Sec_ChangeLog090810 Version 090810\r
index 0491102..1e5f55d 100644 (file)
@@ -97,11 +97,6 @@ void EVENT_USB_Device_ConfigurationChanged(void)
                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
        }\r
 }\r
-\r
-void EVENT_USB_Device_UnhandledControlRequest(void)\r
-{\r
-       printf("CONTROL REQUEST\r\n");\r
-}\r
 
 void Process_AVRISP_Commands(void)
 {
index e52c1a6..94e19a3 100644 (file)
@@ -69,8 +69,7 @@
 \r
                void EVENT_USB_Device_Connect(void);\r
                void EVENT_USB_Device_Disconnect(void);\r
-               void EVENT_USB_Device_ConfigurationChanged(void);\r
-               void EVENT_USB_Device_UnhandledControlRequest(void);
+               void EVENT_USB_Device_ConfigurationChanged(void);
 
                void Process_AVRISP_Commands(void);\r
                \r
index a6fefea..a2765d3 100644 (file)
@@ -109,7 +109,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
                        .EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | AVRISP_DATA_EPNUM),\r
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
                        .EndpointSize           = AVRISP_DATA_EPSIZE,\r
-                       .PollingIntervalMS      = 0x0A\r
+                       .PollingIntervalMS      = 0x00\r
                },\r
 
        .DataOutEndpoint =\r
@@ -119,7 +119,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
                        .EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_OUT | AVRISP_DATA_EPNUM),\r
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
                        .EndpointSize           = AVRISP_DATA_EPSIZE,\r
-                       .PollingIntervalMS      = 0x0A\r
+                       .PollingIntervalMS      = 0x00\r
                },
 };\r
 \r
@@ -140,9 +140,9 @@ USB_Descriptor_String_t PROGMEM LanguageString =
  */\r
 USB_Descriptor_String_t PROGMEM ManufacturerString =\r
 {\r
-       .Header                 = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String},\r
+       .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},\r
                \r
-       .UnicodeString          = L"ATMEL"\r
+       .UnicodeString          = L"Dean Camera"\r
 };\r
 \r
 /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,\r
@@ -151,16 +151,16 @@ USB_Descriptor_String_t PROGMEM ManufacturerString =
  */\r
 USB_Descriptor_String_t PROGMEM ProductString =\r
 {\r
-       .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},\r
+       .Header                 = {.Size = USB_STRING_LEN(33), .Type = DTYPE_String},\r
                \r
-       .UnicodeString          = L"AVRISP mkII"\r
+       .UnicodeString          = L"LUFA AVRISP MkII Clone Programmer"\r
 };\r
 \r
 USB_Descriptor_String_t PROGMEM SerialString =\r
 {\r
-       .Header                 = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String},\r
+       .Header                 = {.Size = USB_STRING_LEN(13), .Type = DTYPE_String},\r
                \r
-       .UnicodeString          = L"0000A0011794"\r
+       .UnicodeString          = L"0000A00128255"\r
 };\r
 \r
 /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"\r
@@ -176,7 +176,7 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex,
 \r
        void*    Address = NULL;\r
        uint16_t Size    = NO_DESCRIPTOR;\r
-\r
+       \r
        switch (DescriptorType)\r
        {\r
                case DTYPE_Device: \r
index 304eef4..2679ce7 100644 (file)
@@ -64,27 +64,34 @@ void V2Protocol_ProcessCommand(void)
 {
        uint8_t V2Command = Endpoint_Read_Byte();\r
                  \r
-       printf("COMMAND %d\r\n", V2Command);\r
-\r
        switch (V2Command)\r
        {\r
                case CMD_SIGN_ON:\r
                        V2Protocol_ProcessCmdSignOn();\r
                        break;\r
                case CMD_SET_PARAMETER:\r
-                       V2Protocol_ProcessCmdSetParam();\r
-                       break;\r
                case CMD_GET_PARAMETER:\r
-                       V2Protocol_ProcessCmdGetParam();\r
+                       V2Protocol_ProcessCmdGetSetParam(V2Command);\r
                        break;\r
                default:\r
+                       while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE)\r
+                       {\r
+                               Endpoint_ClearOUT();\r
+                               while (!(Endpoint_IsOUTReceived()));\r
+                       }\r
+               \r
                        Endpoint_ClearOUT();\r
                        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
+\r
                        Endpoint_Write_Byte(STATUS_CMD_UNKNOWN);\r
                        Endpoint_ClearIN();\r
                        break;\r
        }\r
        \r
+       printf("COMMAND 0x%02x\r\n", V2Command);\r
+\r
+       Endpoint_WaitUntilReady();\r
+       \r
        /* Reset Endpoint direction to OUT ready for next command */\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);        
 }\r
@@ -104,7 +111,8 @@ static void V2Protocol_ProcessCmdSignOn(void)
 {\r
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
-       \r
+       Endpoint_WaitUntilReady();\r
+\r
        Endpoint_Write_Byte(CMD_SIGN_ON);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
        Endpoint_Write_Byte(PROGRAMMER_ID_LEN);\r
@@ -112,50 +120,31 @@ static void V2Protocol_ProcessCmdSignOn(void)
        Endpoint_ClearIN();\r
 }\r
 \r
-static void V2Protocol_ProcessCmdSetParam(void)\r
+static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command)\r
 {\r
        uint8_t ParamID    = Endpoint_Read_Byte();\r
        uint8_t ParamValue = Endpoint_Read_Byte();\r
 \r
-       ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID);\r
-       \r
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
-\r
-       if (ParameterItem != NULL)\r
-       {\r
-               eeprom_write_byte(&ParameterItem->ParameterValue, ParamValue);\r
-\r
-               Endpoint_Write_Byte(CMD_SET_PARAMETER);\r
-               Endpoint_Write_Byte(STATUS_CMD_OK);     \r
-       }\r
-       else\r
-       {\r
-               Endpoint_Write_Byte(STATUS_CMD_FAILED);\r
-       }\r
-\r
-       Endpoint_ClearIN();\r
-}\r
-\r
-static void V2Protocol_ProcessCmdGetParam(void)\r
-{\r
-       uint8_t ParamID    = Endpoint_Read_Byte();\r
-\r
+       Endpoint_WaitUntilReady();\r
+       \r
        ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID);\r
        \r
-       Endpoint_ClearOUT();\r
-       Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
-\r
        if (ParameterItem != NULL)\r
        {\r
-               Endpoint_Write_Byte(CMD_GET_PARAMETER);\r
+               Endpoint_Write_Byte(V2Command);\r
                Endpoint_Write_Byte(STATUS_CMD_OK);\r
-               Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue));  \r
+\r
+               if (V2Command == CMD_SET_PARAMETER)\r
+                 eeprom_write_byte(&ParameterItem->ParameterValue, ParamValue);\r
+               else\r
+                 Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue));                        \r
        }\r
        else\r
        {\r
                Endpoint_Write_Byte(STATUS_CMD_FAILED);\r
        }\r
 \r
-       Endpoint_ClearIN();     \r
+       Endpoint_ClearIN();\r
 }\r
index c9d39cb..5e83359 100644 (file)
@@ -40,7 +40,8 @@
                #include <avr/io.h>
 
                #include <LUFA/Drivers/USB/USB.h>
-               
+               \r
+               #include "../Descriptors.h"
                #include "V2ProtocolConstants.h"
 
        /* Macros: */
@@ -60,8 +61,7 @@
                #if defined(INCLUDE_FROM_V2PROTOCOL_C)\r
                        static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID);\r
                        static void V2Protocol_ProcessCmdSignOn(void);\r
-                       static void V2Protocol_ProcessCmdSetParam(void);\r
-                       static void V2Protocol_ProcessCmdGetParam(void);\r
+                       static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command);\r
                #endif
 
 #endif
index 22fef8b..5f76575 100644 (file)
@@ -119,7 +119,7 @@ OBJDIR = .
 \r
 \r
 # Path to the LUFA library\r
-LUFA_PATH = ../../\r
+LUFA_PATH = ../../../\r
 \r
 \r
 # LUFA library compile-time options\r