From bbcdaaa6dc6024911a280e5fda6b4a43f71fb98e Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 18 Aug 2009 07:22:51 +0000 Subject: Enhancements to the AVRISP Programmer project to attempt to get AVRStudio to communicate with the device. --- Projects/AVRISP/Lib/V2Protocol.c | 121 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 112 insertions(+), 9 deletions(-) (limited to 'Projects/AVRISP/Lib/V2Protocol.c') diff --git a/Projects/AVRISP/Lib/V2Protocol.c b/Projects/AVRISP/Lib/V2Protocol.c index 3532c5ec6..304eef471 100644 --- a/Projects/AVRISP/Lib/V2Protocol.c +++ b/Projects/AVRISP/Lib/V2Protocol.c @@ -33,26 +33,129 @@ * V2Protocol handler, to process V2 Protocol commands used in Atmel programmer devices. */ -char ProgrammerID[] = "AVRISP_MK2"; - +#define INCLUDE_FROM_V2PROTOCOL_C #include "V2Protocol.h" + +ParameterItem_t ParameterTable[] EEMEM = + { + { .ParameterID = PARAM_BUILD_NUMBER_LOW, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_BUILD_NUMBER_HIGH, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_HW_VER, + .ParameterValue = 0x01 }, + { .ParameterID = PARAM_SW_MAJOR, + .ParameterValue = 0x01 }, + { .ParameterID = PARAM_SW_MINOR, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_VTARGET, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_SCK_DURATION, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_RESET_POLARITY, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_STATUS_TGT_CONN, + .ParameterValue = 0x00 }, + { .ParameterID = PARAM_DISCHARGEDELAY, + .ParameterValue = 0x00 }, + }; 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(); + break; + default: Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - - Endpoint_Write_Byte(CMD_SIGN_ON); - Endpoint_Write_Byte(STATUS_CMD_OK); - Endpoint_Write_Byte((sizeof(ProgrammerID) - 1)); - Endpoint_Write_Stream_LE(ProgrammerID, (sizeof(ProgrammerID) - 1)); + Endpoint_Write_Byte(STATUS_CMD_UNKNOWN); Endpoint_ClearIN(); break; - } + } + + /* Reset Endpoint direction to OUT ready for next command */ + Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT); +} + +static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID) +{ + for (uint8_t TableIndex = 0; TableIndex < (sizeof(ParameterTable) / sizeof(ParameterTable[0])); TableIndex++) + { + if (ParamID == eeprom_read_byte(&ParameterTable[TableIndex].ParameterID)) + return &ParameterTable[TableIndex]; + } + + return NULL; } +static void V2Protocol_ProcessCmdSignOn(void) +{ + Endpoint_ClearOUT(); + Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + + Endpoint_Write_Byte(CMD_SIGN_ON); + Endpoint_Write_Byte(STATUS_CMD_OK); + Endpoint_Write_Byte(PROGRAMMER_ID_LEN); + Endpoint_Write_Stream_LE(PROGRAMMER_ID, PROGRAMMER_ID_LEN); + Endpoint_ClearIN(); +} + +static void V2Protocol_ProcessCmdSetParam(void) +{ + 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(); + + 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(STATUS_CMD_OK); + Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue)); + } + else + { + Endpoint_Write_Byte(STATUS_CMD_FAILED); + } + + Endpoint_ClearIN(); +} -- cgit v1.2.3