* 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