3      Copyright (C) Dean Camera, 2009. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, and distribute this software 
  13   and its documentation for any purpose and without fee is hereby 
  14   granted, provided that the above copyright notice appear in all 
  15   copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  33  *  V2Protocol handler, to process V2 Protocol commands used in Atmel programmer devices. 
  36 #define  INCLUDE_FROM_V2PROTOCOL_C 
  37 #include "V2Protocol.h" 
  39 ParameterItem_t ParameterTable
[] EEMEM 
=  
  41                 { .ParameterID    
= PARAM_BUILD_NUMBER_LOW
, 
  42                   .ParameterValue 
= 0x00                    }, 
  43                 { .ParameterID    
= PARAM_BUILD_NUMBER_HIGH
, 
  44                   .ParameterValue 
= 0x00                    }, 
  45                 { .ParameterID    
= PARAM_HW_VER
, 
  46                   .ParameterValue 
= 0x01                    }, 
  47                 { .ParameterID    
= PARAM_SW_MAJOR
, 
  48                   .ParameterValue 
= 0x01                    }, 
  49                 { .ParameterID    
= PARAM_SW_MINOR
, 
  50                   .ParameterValue 
= 0x00                    }, 
  51                 { .ParameterID    
= PARAM_VTARGET
, 
  52                   .ParameterValue 
= 0x00                    }, 
  53                 { .ParameterID    
= PARAM_SCK_DURATION
, 
  54                   .ParameterValue 
= 0x00                    }, 
  55                 { .ParameterID    
= PARAM_RESET_POLARITY
, 
  56                   .ParameterValue 
= 0x00                    }, 
  57                 { .ParameterID    
= PARAM_STATUS_TGT_CONN
, 
  58                   .ParameterValue 
= 0x00                    }, 
  59                 { .ParameterID    
= PARAM_DISCHARGEDELAY
, 
  60                   .ParameterValue 
= 0x00                    }, 
  63 void V2Protocol_ProcessCommand(void) 
  65         uint8_t V2Command 
= Endpoint_Read_Byte(); 
  67         printf("COMMAND %d\r\n", V2Command
); 
  72                         V2Protocol_ProcessCmdSignOn(); 
  74                 case CMD_SET_PARAMETER
: 
  75                         V2Protocol_ProcessCmdSetParam(); 
  77                 case CMD_GET_PARAMETER
: 
  78                         V2Protocol_ProcessCmdGetParam(); 
  82                         Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN
); 
  83                         Endpoint_Write_Byte(STATUS_CMD_UNKNOWN
); 
  88         /* Reset Endpoint direction to OUT ready for next command */ 
  89         Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT
);         
  92 static ParameterItem_t
* V2Protocol_GetParameterItem(uint8_t ParamID
) 
  94         for (uint8_t TableIndex 
= 0; TableIndex 
< (sizeof(ParameterTable
) / sizeof(ParameterTable
[0])); TableIndex
++) 
  96                 if (ParamID 
== eeprom_read_byte(&ParameterTable
[TableIndex
].ParameterID
)) 
  97                   return &ParameterTable
[TableIndex
]; 
 103 static void V2Protocol_ProcessCmdSignOn(void) 
 106         Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN
); 
 108         Endpoint_Write_Byte(CMD_SIGN_ON
); 
 109         Endpoint_Write_Byte(STATUS_CMD_OK
); 
 110         Endpoint_Write_Byte(PROGRAMMER_ID_LEN
); 
 111         Endpoint_Write_Stream_LE(PROGRAMMER_ID
, PROGRAMMER_ID_LEN
); 
 115 static void V2Protocol_ProcessCmdSetParam(void) 
 117         uint8_t ParamID    
= Endpoint_Read_Byte(); 
 118         uint8_t ParamValue 
= Endpoint_Read_Byte(); 
 120         ParameterItem_t
* ParameterItem 
= V2Protocol_GetParameterItem(ParamID
); 
 123         Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN
); 
 125         if (ParameterItem 
!= NULL
) 
 127                 eeprom_write_byte(&ParameterItem
->ParameterValue
, ParamValue
); 
 129                 Endpoint_Write_Byte(CMD_SET_PARAMETER
); 
 130                 Endpoint_Write_Byte(STATUS_CMD_OK
);      
 134                 Endpoint_Write_Byte(STATUS_CMD_FAILED
); 
 140 static void V2Protocol_ProcessCmdGetParam(void) 
 142         uint8_t ParamID    
= Endpoint_Read_Byte(); 
 144         ParameterItem_t
* ParameterItem 
= V2Protocol_GetParameterItem(ParamID
); 
 147         Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN
); 
 149         if (ParameterItem 
!= NULL
) 
 151                 Endpoint_Write_Byte(CMD_GET_PARAMETER
); 
 152                 Endpoint_Write_Byte(STATUS_CMD_OK
); 
 153                 Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem
->ParameterValue
));   
 157                 Endpoint_Write_Byte(STATUS_CMD_FAILED
);