|  |  | @ -60,6 +60,24 @@ ParameterItem_t ParameterTable[] EEMEM = | 
			
		
	
		
		
			
				
					
					|  |  |  | 		  .ParameterValue = 0x00                    }, |  |  |  | 		  .ParameterValue = 0x00                    }, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	}; |  |  |  | 	}; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void V2Protocol_ConfigureHardware(void) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #if F_CPU == 8000000 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	                                    SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128}; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	                                    SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128}; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t SCKDuration = eeprom_read_byte(&V2Protocol_GetParameterItem(PARAM_SCK_DURATION)->ParameterValue); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if (SCKDuration > sizeof(SPIMaskFromSCKDuration)) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	  SCKDuration = SPIMaskFromSCKDuration; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	   | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	SPI_Init(SPIMaskFromSCKDuration[SCKDuration], true);	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void V2Protocol_ProcessCommand(void) |  |  |  | void V2Protocol_ProcessCommand(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	uint8_t V2Command = Endpoint_Read_Byte(); |  |  |  | 	uint8_t V2Command = Endpoint_Read_Byte(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -73,6 +91,9 @@ void V2Protocol_ProcessCommand(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		case CMD_GET_PARAMETER: |  |  |  | 		case CMD_GET_PARAMETER: | 
			
		
	
		
		
			
				
					
					|  |  |  | 			V2Protocol_ProcessCmdGetSetParam(V2Command); |  |  |  | 			V2Protocol_ProcessCmdGetSetParam(V2Command); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			break; |  |  |  | 			break; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		case CMD_SPI_MULTI: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			V2Protocol_ProcessCmdSPIMulti(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			break;		 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		default: |  |  |  | 		default: | 
			
		
	
		
		
			
				
					
					|  |  |  | 			while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE) |  |  |  | 			while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 			{ | 
			
		
	
	
		
		
			
				
					|  |  | @ -83,6 +104,7 @@ void V2Protocol_ProcessCommand(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Endpoint_ClearOUT(); |  |  |  | 			Endpoint_ClearOUT(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); |  |  |  | 			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			Endpoint_Write_Byte(V2Command); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Endpoint_Write_Byte(STATUS_CMD_UNKNOWN); |  |  |  | 			Endpoint_Write_Byte(STATUS_CMD_UNKNOWN); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Endpoint_ClearIN(); |  |  |  | 			Endpoint_ClearIN(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			break; |  |  |  | 			break; | 
			
		
	
	
		
		
			
				
					|  |  | @ -91,8 +113,6 @@ void V2Protocol_ProcessCommand(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	printf("COMMAND 0x%02x\r\n", V2Command); |  |  |  | 	printf("COMMAND 0x%02x\r\n", V2Command); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_WaitUntilReady();	 |  |  |  | 	Endpoint_WaitUntilReady();	 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/* Reset Endpoint direction to OUT ready for next command */ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);	 |  |  |  | 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);	 | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -113,6 +133,8 @@ static void V2Protocol_ProcessCmdSignOn(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); |  |  |  | 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_WaitUntilReady(); |  |  |  | 	Endpoint_WaitUntilReady(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	V2Protocol_ConfigureHardware(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_Write_Byte(CMD_SIGN_ON); |  |  |  | 	Endpoint_Write_Byte(CMD_SIGN_ON); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_Write_Byte(STATUS_CMD_OK); |  |  |  | 	Endpoint_Write_Byte(STATUS_CMD_OK); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_Write_Byte(PROGRAMMER_ID_LEN); |  |  |  | 	Endpoint_Write_Byte(PROGRAMMER_ID_LEN); | 
			
		
	
	
		
		
			
				
					|  |  | @ -131,9 +153,10 @@ static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID); |  |  |  | 	ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_Write_Byte(V2Command); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (ParameterItem != NULL) |  |  |  | 	if (ParameterItem != NULL) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Endpoint_Write_Byte(V2Command); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Endpoint_Write_Byte(STATUS_CMD_OK); |  |  |  | 		Endpoint_Write_Byte(STATUS_CMD_OK); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (V2Command == CMD_SET_PARAMETER) |  |  |  | 		if (V2Command == CMD_SET_PARAMETER) | 
			
		
	
	
		
		
			
				
					|  |  | @ -148,3 +171,51 @@ static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	Endpoint_ClearIN(); |  |  |  | 	Endpoint_ClearIN(); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static void V2Protocol_ProcessCmdSPIMulti(void) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t TxBytes = Endpoint_Read_Byte(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t RxBytes = Endpoint_Read_Byte(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t RxStartAddr = Endpoint_Read_Byte(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t TxData[255]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_Read_Stream_LE(TxData, TxBytes); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_ClearOUT(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_WaitUntilReady(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_Write_Byte(CMD_SPI_MULTI); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_Write_Byte(STATUS_CMD_OK); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t CurrTxPos = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	uint8_t CurrRxPos = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	while (CurrTxPos < RxStartAddr) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (CurrTxPos < TxBytes) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		  SPI_SendByte(TxData[CurrTxPos]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		  SPI_SendByte(0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		CurrTxPos++; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	while (CurrRxPos < RxBytes) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (CurrTxPos < TxBytes) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			Endpoint_Write_Byte(SPI_TransferByte(TxData[CurrTxPos])); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			CurrTxPos++; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			Endpoint_Write_Byte(SPI_ReceiveByte()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		CurrRxPos++; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	}	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_Write_Byte(STATUS_CMD_OK); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	Endpoint_ClearIN();	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |