Enhancements to the AVRISP Programmer project to attempt to get AVRStudio to communic...
[pub/lufa.git] / Projects / AVRISP / Lib / V2Protocol.c
index 3532c5e..304eef4 100644 (file)
  *  V2Protocol handler, to process V2 Protocol commands used in Atmel programmer devices.\r
  */\r
 \r
-char ProgrammerID[] = "AVRISP_MK2";\r
-\r
+#define  INCLUDE_FROM_V2PROTOCOL_C\r
 #include "V2Protocol.h"\r
+\r
+ParameterItem_t ParameterTable[] EEMEM = \r
+       {\r
+               { .ParameterID    = PARAM_BUILD_NUMBER_LOW,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_BUILD_NUMBER_HIGH,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_HW_VER,\r
+                 .ParameterValue = 0x01                    },\r
+               { .ParameterID    = PARAM_SW_MAJOR,\r
+                 .ParameterValue = 0x01                    },\r
+               { .ParameterID    = PARAM_SW_MINOR,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_VTARGET,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_SCK_DURATION,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_RESET_POLARITY,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_STATUS_TGT_CONN,\r
+                 .ParameterValue = 0x00                    },\r
+               { .ParameterID    = PARAM_DISCHARGEDELAY,\r
+                 .ParameterValue = 0x00                    },\r
+       };\r
 
 void V2Protocol_ProcessCommand(void)
 {
        uint8_t V2Command = Endpoint_Read_Byte();\r
-       \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
+                       break;\r
+               default:\r
                        Endpoint_ClearOUT();\r
                        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
-                       \r
-                       Endpoint_Write_Byte(CMD_SIGN_ON);\r
-                       Endpoint_Write_Byte(STATUS_CMD_OK);\r
-                       Endpoint_Write_Byte((sizeof(ProgrammerID) - 1));\r
-                       Endpoint_Write_Stream_LE(ProgrammerID, (sizeof(ProgrammerID) - 1));                     \r
+                       Endpoint_Write_Byte(STATUS_CMD_UNKNOWN);\r
                        Endpoint_ClearIN();\r
                        break;\r
-       }
+       }\r
+       \r
+       /* Reset Endpoint direction to OUT ready for next command */\r
+       Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);        
+}\r
+\r
+static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID)\r
+{\r
+       for (uint8_t TableIndex = 0; TableIndex < (sizeof(ParameterTable) / sizeof(ParameterTable[0])); TableIndex++)\r
+       {\r
+               if (ParamID == eeprom_read_byte(&ParameterTable[TableIndex].ParameterID))\r
+                 return &ParameterTable[TableIndex];\r
+       }\r
+       \r
+       return NULL;\r
 }
 
+static void V2Protocol_ProcessCmdSignOn(void)\r
+{\r
+       Endpoint_ClearOUT();\r
+       Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
+       \r
+       Endpoint_Write_Byte(CMD_SIGN_ON);\r
+       Endpoint_Write_Byte(STATUS_CMD_OK);\r
+       Endpoint_Write_Byte(PROGRAMMER_ID_LEN);\r
+       Endpoint_Write_Stream_LE(PROGRAMMER_ID, PROGRAMMER_ID_LEN);\r
+       Endpoint_ClearIN();\r
+}\r
+\r
+static void V2Protocol_ProcessCmdSetParam(void)\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
+       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(STATUS_CMD_OK);\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
+}\r