diff options
Diffstat (limited to 'Projects/AVRISP/Lib/XPROG')
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/PDITarget.c | 14 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/PDITarget.h | 7 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/TINYNVM.c | 2 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/TINYNVM.h | 5 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/TPITarget.c | 14 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/TPITarget.h | 5 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/XMEGANVM.c | 2 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/XMEGANVM.h | 5 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/XPROGProtocol.c | 278 | ||||
| -rw-r--r-- | Projects/AVRISP/Lib/XPROG/XPROGProtocol.h | 33 | 
10 files changed, 205 insertions, 160 deletions
| diff --git a/Projects/AVRISP/Lib/XPROG/PDITarget.c b/Projects/AVRISP/Lib/XPROG/PDITarget.c index 2c6ffd9a6..4070c0996 100644 --- a/Projects/AVRISP/Lib/XPROG/PDITarget.c +++ b/Projects/AVRISP/Lib/XPROG/PDITarget.c @@ -36,12 +36,12 @@  #define  INCLUDE_FROM_PDITARGET_C
  #include "PDITarget.h"
 -#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)
 +#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
  /** Flag to indicate if the USART is currently in Tx or Rx mode. */
  volatile bool               IsSending;
 -#if !defined(PDI_VIA_HARDWARE_USART)
 +#if !defined(XPROG_VIA_HARDWARE_USART)
  /** Software USART raw frame bits for transmission/reception. */
  volatile uint16_t           SoftUSART_Data;
 @@ -99,7 +99,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)  /** Enables the target's PDI interface, holding the target in reset until PDI mode is exited. */
  void PDITarget_EnableTargetPDI(void)
  {
 -#if defined(PDI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Set Tx and XCK as outputs, Rx as input */
  	DDRD |=  (1 << 5) | (1 << 3);
  	DDRD &= ~(1 << 2);
 @@ -142,7 +142,7 @@ void PDITarget_EnableTargetPDI(void)  /** Disables the target's PDI interface, exits programming mode and starts the target's application. */
  void PDITarget_DisableTargetPDI(void)
  {
 -#if defined(PDI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Turn off receiver and transmitter of the USART, clear settings */
  	UCSR1A |= (1 << TXC1) | (1 << RXC1);
  	UCSR1B  = 0;
 @@ -168,7 +168,7 @@ void PDITarget_DisableTargetPDI(void)   */
  void PDITarget_SendByte(const uint8_t Byte)
  {
 -#if defined(PDI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Tx mode if currently in Rx mode */
  	if (!(IsSending))
  	{
 @@ -221,7 +221,7 @@ void PDITarget_SendByte(const uint8_t Byte)   */
  uint8_t PDITarget_ReceiveByte(void)
  {
 -#if defined(PDI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Rx mode if currently in Tx mode */
  	if (IsSending)
  	{
 @@ -264,7 +264,7 @@ uint8_t PDITarget_ReceiveByte(void)  /** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */
  void PDITarget_SendBreak(void)
  {
 -#if defined(PDI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Tx mode if currently in Rx mode */
  	if (!(IsSending))
  	{
 diff --git a/Projects/AVRISP/Lib/XPROG/PDITarget.h b/Projects/AVRISP/Lib/XPROG/PDITarget.h index cf7780c17..11af7f1a0 100644 --- a/Projects/AVRISP/Lib/XPROG/PDITarget.h +++ b/Projects/AVRISP/Lib/XPROG/PDITarget.h @@ -46,16 +46,15 @@  	/* Preprocessor Checks: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
  			#undef ENABLE_ISP_PROTOCOL
 -			#undef ENABLE_TPI_PROTOCOL
 -			#if !defined(ENABLE_PDI_PROTOCOL)
 -				#define ENABLE_PDI_PROTOCOL
 +			#if !defined(ENABLE_XPROG_PROTOCOL)
 +				#define ENABLE_XPROG_PROTOCOL
  			#endif
  		#endif
  	/* Defines: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
 -			#define PDI_VIA_HARDWARE_USART
 +			#define XPROG_VIA_HARDWARE_USART
  		#else
  			#define BITBANG_PDIDATA_PORT     PORTB
  			#define BITBANG_PDIDATA_DDR      DDRB
 diff --git a/Projects/AVRISP/Lib/XPROG/TINYNVM.c b/Projects/AVRISP/Lib/XPROG/TINYNVM.c index 206ea39f2..f3b184072 100644 --- a/Projects/AVRISP/Lib/XPROG/TINYNVM.c +++ b/Projects/AVRISP/Lib/XPROG/TINYNVM.c @@ -36,7 +36,7 @@  #define  INCLUDE_FROM_TINYNVM_C
  #include "TINYNVM.h"
 -#if defined(ENABLE_TPI_PROTOCOL) || defined(__DOXYGEN__)
 +#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
  // TODO
 diff --git a/Projects/AVRISP/Lib/XPROG/TINYNVM.h b/Projects/AVRISP/Lib/XPROG/TINYNVM.h index 1cff03d92..89be3bba6 100644 --- a/Projects/AVRISP/Lib/XPROG/TINYNVM.h +++ b/Projects/AVRISP/Lib/XPROG/TINYNVM.h @@ -49,10 +49,9 @@  	/* Preprocessor Checks: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
  			#undef ENABLE_ISP_PROTOCOL
 -			#undef ENABLE_TPI_PROTOCOL
 -			#if !defined(ENABLE_PDI_PROTOCOL)
 -				#define ENABLE_PDI_PROTOCOL
 +			#if !defined(ENABLE_XPROG_PROTOCOL)
 +				#define ENABLE_XPROG_PROTOCOL
  			#endif
  		#endif
 diff --git a/Projects/AVRISP/Lib/XPROG/TPITarget.c b/Projects/AVRISP/Lib/XPROG/TPITarget.c index f7943bfa1..441f5526a 100644 --- a/Projects/AVRISP/Lib/XPROG/TPITarget.c +++ b/Projects/AVRISP/Lib/XPROG/TPITarget.c @@ -36,12 +36,12 @@  #define  INCLUDE_FROM_TPITARGET_C
  #include "TPITarget.h"
 -#if defined(ENABLE_TPI_PROTOCOL) || defined(__DOXYGEN__)
 +#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
  /** Flag to indicate if the USART is currently in Tx or Rx mode. */
  volatile bool               IsSending;
 -#if !defined(TPI_VIA_HARDWARE_USART)
 +#if !defined(XPROG_VIA_HARDWARE_USART)
  /** Software USART raw frame bits for transmission/reception. */
  volatile uint16_t           SoftUSART_Data;
 @@ -105,7 +105,7 @@ void TPITarget_EnableTargetTPI(void)  	asm volatile ("NOP"::);
  	asm volatile ("NOP"::);
 -#if defined(TPI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Set Tx and XCK as outputs, Rx as input */
  	DDRD |=  (1 << 5) | (1 << 3);
  	DDRD &= ~(1 << 2);
 @@ -141,7 +141,7 @@ void TPITarget_EnableTargetTPI(void)  /** Disables the target's TPI interface, exits programming mode and starts the target's application. */
  void TPITarget_DisableTargetTPI(void)
  {
 -#if defined(TPI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Turn off receiver and transmitter of the USART, clear settings */
  	UCSR1A |= (1 << TXC1) | (1 << RXC1);
  	UCSR1B  = 0;
 @@ -171,7 +171,7 @@ void TPITarget_DisableTargetTPI(void)   */
  void TPITarget_SendByte(const uint8_t Byte)
  {
 -#if defined(TPI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Tx mode if currently in Rx mode */
  	if (!(IsSending))
  	{
 @@ -224,7 +224,7 @@ void TPITarget_SendByte(const uint8_t Byte)   */
  uint8_t TPITarget_ReceiveByte(void)
  {
 -#if defined(TPI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Rx mode if currently in Tx mode */
  	if (IsSending)
  	{
 @@ -267,7 +267,7 @@ uint8_t TPITarget_ReceiveByte(void)  /** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */
  void TPITarget_SendBreak(void)
  {
 -#if defined(TPI_VIA_HARDWARE_USART)
 +#if defined(XPROG_VIA_HARDWARE_USART)
  	/* Switch to Tx mode if currently in Rx mode */
  	if (!(IsSending))
  	{
 diff --git a/Projects/AVRISP/Lib/XPROG/TPITarget.h b/Projects/AVRISP/Lib/XPROG/TPITarget.h index 596bdce21..8dc176b1a 100644 --- a/Projects/AVRISP/Lib/XPROG/TPITarget.h +++ b/Projects/AVRISP/Lib/XPROG/TPITarget.h @@ -46,10 +46,9 @@  	/* Preprocessor Checks: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
  			#undef ENABLE_ISP_PROTOCOL
 -			#undef ENABLE_TPI_PROTOCOL
 -			#if !defined(ENABLE_PDI_PROTOCOL)
 -				#define ENABLE_PDI_PROTOCOL
 +			#if !defined(ENABLE_XPROG_PROTOCOL)
 +				#define ENABLE_XPROG_PROTOCOL
  			#endif
  		#endif
 diff --git a/Projects/AVRISP/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP/Lib/XPROG/XMEGANVM.c index ed8719c4e..dffa62d3c 100644 --- a/Projects/AVRISP/Lib/XPROG/XMEGANVM.c +++ b/Projects/AVRISP/Lib/XPROG/XMEGANVM.c @@ -36,7 +36,7 @@  #define  INCLUDE_FROM_XMEGA_NVM_C
  #include "XMEGANVM.h"
 -#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)
 +#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
  /** Sends the given NVM register address to the target.
   *
 diff --git a/Projects/AVRISP/Lib/XPROG/XMEGANVM.h b/Projects/AVRISP/Lib/XPROG/XMEGANVM.h index c91522db1..4ae2ce4cf 100644 --- a/Projects/AVRISP/Lib/XPROG/XMEGANVM.h +++ b/Projects/AVRISP/Lib/XPROG/XMEGANVM.h @@ -49,10 +49,9 @@  	/* Preprocessor Checks: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
  			#undef ENABLE_ISP_PROTOCOL
 -			#undef ENABLE_TPI_PROTOCOL
 -			#if !defined(ENABLE_PDI_PROTOCOL)
 -				#define ENABLE_PDI_PROTOCOL
 +			#if !defined(ENABLE_XPROG_PROTOCOL)
 +				#define ENABLE_XPROG_PROTOCOL
  			#endif
  		#endif
 diff --git a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c index ed5146063..d91941307 100644 --- a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c @@ -30,23 +30,27 @@  /** \file
   *
 - *  PDI Protocol handler, to process V2 Protocol wrapped PDI commands used in Atmel programmer devices.
 + *  XPROG Protocol handler, to process V2 Protocol wrapped XPROG commands used in Atmel programmer devices.
   */
 -#define  INCLUDE_FROM_PDIPROTOCOL_C
 -#include "PDIProtocol.h"
 +#define  INCLUDE_FROM_XPROGPROTOCOL_C
 +#include "XPROGProtocol.h"
 -#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)
 +#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
  /** Base absolute address for the target's NVM controller */
  uint32_t XPROG_Param_NVMBase = 0x010001C0;
  /** Size in bytes of the target's EEPROM page */
  uint32_t XPROG_Param_EEPageSize;
 -/** Handler for the CMD_XPROG_SETMODE command, which sets the programmer-to-target protocol used for PDI
 - *  XMEGA programming (either PDI or JTAG). Only PDI programming is supported.
 +/** Currently selected XPROG programming protocol */
 +uint8_t  XPROG_SelectedProtocol;
 +
 +
 +/** Handler for the CMD_XPROG_SETMODE command, which sets the programmer-to-target protocol used for PDI/TPI
 + *  programming.
   */
 -void PDIProtocol_XPROG_SetMode(void)
 +void XPROGProtocol_SetMode(void)
  {
  	struct
  	{
 @@ -58,66 +62,75 @@ void PDIProtocol_XPROG_SetMode(void)  	Endpoint_ClearOUT();
  	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 -	Serial_TxByte(SetMode_XPROG_Params.Protocol);
 +	XPROG_SelectedProtocol = SetMode_XPROG_Params.Protocol;
  	Endpoint_Write_Byte(CMD_XPROG_SETMODE);
 -	Endpoint_Write_Byte((SetMode_XPROG_Params.Protocol == XPRG_PROTOCOL_PDI) ? STATUS_CMD_OK : STATUS_CMD_FAILED);
 +	Endpoint_Write_Byte((SetMode_XPROG_Params.Protocol != XPRG_PROTOCOL_JTAG) ? STATUS_CMD_OK : STATUS_CMD_FAILED);
  	Endpoint_ClearIN();	
  }
  /** Handler for the CMD_XPROG command, which wraps up XPROG commands in a V2 wrapper which need to be
   *  removed and processed so that the underlying XPROG command can be handled.
   */
 -void PDIProtocol_XPROG_Command(void)
 +void XPROGProtocol_Command(void)
  {
  	uint8_t XPROGCommand = Endpoint_Read_Byte();
  	switch (XPROGCommand)
  	{
  		case XPRG_CMD_ENTER_PROGMODE:
 -			PDIProtocol_EnterXPROGMode();
 +			XPROGProtocol_EnterXPROGMode();
  			break;
  		case XPRG_CMD_LEAVE_PROGMODE:
 -			PDIProtocol_LeaveXPROGMode();
 +			XPROGProtocol_LeaveXPROGMode();
  			break;
  		case XPRG_CMD_ERASE:
 -			PDIProtocol_Erase();
 +			XPROGProtocol_Erase();
  			break;
  		case XPRG_CMD_WRITE_MEM:
 -			PDIProtocol_WriteMemory();
 +			XPROGProtocol_WriteMemory();
  			break;
  		case XPRG_CMD_READ_MEM:
 -			PDIProtocol_ReadMemory();
 +			XPROGProtocol_ReadMemory();
  			break;
  		case XPRG_CMD_CRC:
 -			PDIProtocol_ReadCRC();
 +			XPROGProtocol_ReadCRC();
  			break;
  		case XPRG_CMD_SET_PARAM:
 -			PDIProtocol_SetParam();
 +			XPROGProtocol_SetParam();
  			break;
  	}
  }
 -/** Handler for the XPROG ENTER_PROGMODE command to establish a PDI connection with the attached device. */
 -static void PDIProtocol_EnterXPROGMode(void)
 +/** Handler for the XPROG ENTER_PROGMODE command to establish a connection with the attached device. */
 +static void XPROGProtocol_EnterXPROGMode(void)
  {
  	Endpoint_ClearOUT();
  	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 -	/* Enable PDI programming mode with the attached target */
 -	PDITarget_EnableTargetPDI();
 -	
 -	/* Store the RESET key into the RESET PDI register to keep the XMEGA in reset */
 -	PDITarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 -	PDITarget_SendByte(PDI_RESET_KEY);
 +	bool NVMBusEnabled;
 -	/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
 -	PDITarget_SendByte(PDI_CMD_KEY);	
 -	for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)
 -	  PDITarget_SendByte(PDI_NVMENABLE_KEY[i - 1]);
 -
 -	/* Wait until the NVM bus becomes active */
 -	bool NVMBusEnabled = PDITarget_WaitWhileNVMBusBusy();
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 +	{
 +		/* Enable PDI programming mode with the attached target */
 +		PDITarget_EnableTargetPDI();
 +		
 +		/* Store the RESET key into the RESET PDI register to keep the XMEGA in reset */
 +		PDITarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 +		PDITarget_SendByte(PDI_RESET_KEY);
 +
 +		/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
 +		PDITarget_SendByte(PDI_CMD_KEY);	
 +		for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)
 +		  PDITarget_SendByte(PDI_NVMENABLE_KEY[i - 1]);
 +
 +		/* Wait until the NVM bus becomes active */
 +		NVMBusEnabled = PDITarget_WaitWhileNVMBusBusy();
 +	}
 +	else
 +	{
 +		// TODO
 +	}
  	Endpoint_Write_Byte(CMD_XPROG);
  	Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE);
 @@ -128,17 +141,24 @@ static void PDIProtocol_EnterXPROGMode(void)  /** Handler for the XPROG LEAVE_PROGMODE command to terminate the PDI programming connection with
   *  the attached device.
   */
 -static void PDIProtocol_LeaveXPROGMode(void)
 +static void XPROGProtocol_LeaveXPROGMode(void)
  {
  	Endpoint_ClearOUT();
  	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 -	/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
 -	PDITarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 -	PDITarget_SendByte(0x00);
 -
 -	PDITarget_DisableTargetPDI();
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 +	{
 +		/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
 +		PDITarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 +		PDITarget_SendByte(0x00);
 +		PDITarget_DisableTargetPDI();
 +	}
 +	else
 +	{
 +		// TODO
 +	}
 +	
  	Endpoint_Write_Byte(CMD_XPROG);
  	Endpoint_Write_Byte(XPRG_CMD_LEAVE_PROGMODE);
  	Endpoint_Write_Byte(XPRG_ERR_OK);
 @@ -146,7 +166,7 @@ static void PDIProtocol_LeaveXPROGMode(void)  }
  /** Handler for the XPRG ERASE command to erase a specific memory address space in the attached device. */
 -static void PDIProtocol_Erase(void)
 +static void XPROGProtocol_Erase(void)
  {
  	uint8_t ReturnStatus = XPRG_ERR_OK;
 @@ -164,27 +184,34 @@ static void PDIProtocol_Erase(void)  	uint8_t EraseCommand = XMEGA_NVM_CMD_NOOP;
 -	/* Determine which NVM command to send to the device depending on the memory to erase */
 -	if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP)
 -	  EraseCommand = XMEGA_NVM_CMD_CHIPERASE;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSEC;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSEC;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROM;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP_PAGE)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSECPAGE;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT_PAGE)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSECPAGE;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM_PAGE)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGE;
 -	else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG)
 -	  EraseCommand = XMEGA_NVM_CMD_ERASEUSERSIG;
 -	
 -	/* Erase the target memory, indicate timeout if ocurred */
 -	if (!(XMEGANVM_EraseMemory(EraseCommand, Erase_XPROG_Params.Address)))
 -	  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 +	{
 +		/* Determine which NVM command to send to the device depending on the memory to erase */
 +		if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP)
 +		  EraseCommand = XMEGA_NVM_CMD_CHIPERASE;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSEC;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSEC;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROM;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP_PAGE)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSECPAGE;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT_PAGE)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSECPAGE;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM_PAGE)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGE;
 +		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG)
 +		  EraseCommand = XMEGA_NVM_CMD_ERASEUSERSIG;
 +		
 +		/* Erase the target memory, indicate timeout if ocurred */
 +		if (!(XMEGANVM_EraseMemory(EraseCommand, Erase_XPROG_Params.Address)))
 +		  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	}
 +	else
 +	{
 +		// TODO
 +	}
  	Endpoint_Write_Byte(CMD_XPROG);
  	Endpoint_Write_Byte(XPRG_CMD_ERASE);
 @@ -193,7 +220,7 @@ static void PDIProtocol_Erase(void)  }
  /** Handler for the XPROG WRITE_MEMORY command to write to a specific memory space within the attached device. */
 -static void PDIProtocol_WriteMemory(void)
 +static void XPROGProtocol_WriteMemory(void)
  {
  	uint8_t ReturnStatus = XPRG_ERR_OK;
 @@ -220,46 +247,53 @@ static void PDIProtocol_WriteMemory(void)  	uint8_t WriteBuffCommand = XMEGA_NVM_CMD_LOADFLASHPAGEBUFF;
  	uint8_t EraseBuffCommand = XMEGA_NVM_CMD_ERASEFLASHPAGEBUFF;
  	bool    PagedMemory      = true;
 -	
 -	if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL)
 -	{
 -		WriteCommand     = XMEGA_NVM_CMD_WRITEAPPSECPAGE;
 -	}
 -	else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_BOOT)
 -	{
 -		WriteCommand     = XMEGA_NVM_CMD_WRITEBOOTSECPAGE;
 -	}
 -	else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_EEPROM)
 -	{
 -		WriteCommand     = XMEGA_NVM_CMD_WRITEEEPROMPAGE;
 -		WriteBuffCommand = XMEGA_NVM_CMD_LOADEEPROMPAGEBUFF;
 -		EraseBuffCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF;
 -	}
 -	else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)
 -	{
 -		/* User signature is paged, but needs us to manually indicate the mode bits since the host doesn't set them */
 -		WriteMemory_XPROG_Params.PageMode = (XPRG_PAGEMODE_ERASE | XPRG_PAGEMODE_WRITE);
 -		WriteCommand     = XMEGA_NVM_CMD_WRITEUSERSIG;
 -	}
 -	else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_FUSE)
 -	{
 -		WriteCommand     = XMEGA_NVM_CMD_WRITEFUSE;
 -		PagedMemory      = false;
 -	}
 -	else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_LOCKBITS)
 +
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
  	{
 -		WriteCommand     = XMEGA_NVM_CMD_WRITELOCK;
 -		PagedMemory      = false;
 +		if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL)
 +		{
 +			WriteCommand     = XMEGA_NVM_CMD_WRITEAPPSECPAGE;
 +		}
 +		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_BOOT)
 +		{
 +			WriteCommand     = XMEGA_NVM_CMD_WRITEBOOTSECPAGE;
 +		}
 +		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_EEPROM)
 +		{
 +			WriteCommand     = XMEGA_NVM_CMD_WRITEEEPROMPAGE;
 +			WriteBuffCommand = XMEGA_NVM_CMD_LOADEEPROMPAGEBUFF;
 +			EraseBuffCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF;
 +		}
 +		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)
 +		{
 +			/* User signature is paged, but needs us to manually indicate the mode bits since the host doesn't set them */
 +			WriteMemory_XPROG_Params.PageMode = (XPRG_PAGEMODE_ERASE | XPRG_PAGEMODE_WRITE);
 +			WriteCommand     = XMEGA_NVM_CMD_WRITEUSERSIG;
 +		}
 +		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_FUSE)
 +		{
 +			WriteCommand     = XMEGA_NVM_CMD_WRITEFUSE;
 +			PagedMemory      = false;
 +		}
 +		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_LOCKBITS)
 +		{
 +			WriteCommand     = XMEGA_NVM_CMD_WRITELOCK;
 +			PagedMemory      = false;
 +		}
 +		
 +		/* Send the appropriate memory write commands to the device, indicate timeout if occurred */
 +		if ((PagedMemory && !XMEGANVM_WritePageMemory(WriteBuffCommand, EraseBuffCommand, WriteCommand, 
 +													   WriteMemory_XPROG_Params.PageMode, WriteMemory_XPROG_Params.Address,
 +													   WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length)) ||
 +		   (!PagedMemory && !XMEGANVM_WriteByteMemory(WriteCommand, WriteMemory_XPROG_Params.Address,
 +													   WriteMemory_XPROG_Params.ProgData)))
 +		{
 +			ReturnStatus = XPRG_ERR_TIMEOUT;
 +		}
  	}
 -	
 -	/* Send the appropriate memory write commands to the device, indicate timeout if occurred */
 -	if ((PagedMemory && !XMEGANVM_WritePageMemory(WriteBuffCommand, EraseBuffCommand, WriteCommand, 
 -		                                           WriteMemory_XPROG_Params.PageMode, WriteMemory_XPROG_Params.Address,
 -		                                           WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length)) ||
 -	   (!PagedMemory && !XMEGANVM_WriteByteMemory(WriteCommand, WriteMemory_XPROG_Params.Address,
 -	                                               WriteMemory_XPROG_Params.ProgData)))
 +	else
  	{
 -		ReturnStatus = XPRG_ERR_TIMEOUT;
 +		// TODO
  	}
  	Endpoint_Write_Byte(CMD_XPROG);
 @@ -271,7 +305,7 @@ static void PDIProtocol_WriteMemory(void)  /** Handler for the XPROG READ_MEMORY command to read data from a specific address space within the
   *  attached device.
   */
 -static void PDIProtocol_ReadMemory(void)
 +static void XPROGProtocol_ReadMemory(void)
  {
  	uint8_t ReturnStatus = XPRG_ERR_OK;
 @@ -291,9 +325,16 @@ static void PDIProtocol_ReadMemory(void)  	uint8_t ReadBuffer[256];
 -	/* Read the target's memory, indicate timeout if occurred */
 -	if (!(XMEGANVM_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length)))
 -	  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 +	{
 +		/* Read the target's memory, indicate timeout if occurred */
 +		if (!(XMEGANVM_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length)))
 +		  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	}
 +	else
 +	{
 +		// TODO
 +	}
  	Endpoint_Write_Byte(CMD_XPROG);
  	Endpoint_Write_Byte(XPRG_CMD_READ_MEM);
 @@ -308,7 +349,7 @@ static void PDIProtocol_ReadMemory(void)  /** Handler for the XPROG CRC command to read a specific memory space's CRC value for comparison between the
   *  attached device's memory and a data set on the host.
   */
 -static void PDIProtocol_ReadCRC(void)
 +static void XPROGProtocol_ReadCRC(void)
  {
  	uint8_t ReturnStatus = XPRG_ERR_OK;
 @@ -324,17 +365,24 @@ static void PDIProtocol_ReadCRC(void)  	uint8_t  CRCCommand = XMEGA_NVM_CMD_NOOP;
  	uint32_t MemoryCRC;
 -	/* Determine which NVM command to send to the device depending on the memory to CRC */
 -	if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)
 -	  CRCCommand = XMEGA_NVM_CMD_APPCRC;
 -	else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)
 -	  CRCCommand = XMEGA_NVM_CMD_BOOTCRC;
 +	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 +	{
 +		/* Determine which NVM command to send to the device depending on the memory to CRC */
 +		if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)
 +		  CRCCommand = XMEGA_NVM_CMD_APPCRC;
 +		else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)
 +		  CRCCommand = XMEGA_NVM_CMD_BOOTCRC;
 +		else
 +		  CRCCommand = XMEGA_NVM_CMD_FLASHCRC;
 +		
 +		/* Perform and retrieve the memory CRC, indicate timeout if occurred */
 +		if (!(XMEGANVM_GetMemoryCRC(CRCCommand, &MemoryCRC)))
 +		  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	}
  	else
 -	  CRCCommand = XMEGA_NVM_CMD_FLASHCRC;
 -	
 -	/* Perform and retrieve the memory CRC, indicate timeout if occurred */
 -	if (!(XMEGANVM_GetMemoryCRC(CRCCommand, &MemoryCRC)))
 -	  ReturnStatus = XPRG_ERR_TIMEOUT;
 +	{
 +		// TODO
 +	}
  	Endpoint_Write_Byte(CMD_XPROG);
  	Endpoint_Write_Byte(XPRG_CMD_CRC);
 @@ -349,10 +397,10 @@ static void PDIProtocol_ReadCRC(void)  	Endpoint_ClearIN();	
  }
 -/** Handler for the XPROG SET_PARAM command to set a PDI parameter for use when communicating with the
 +/** Handler for the XPROG SET_PARAM command to set a XPROG parameter for use when communicating with the
   *  attached device.
   */
 -static void PDIProtocol_SetParam(void)
 +static void XPROGProtocol_SetParam(void)
  {
  	uint8_t ReturnStatus = XPRG_ERR_OK;
 diff --git a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.h b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.h index 9a10abbce..847652ea8 100644 --- a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.h +++ b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.h @@ -30,11 +30,11 @@  /** \file
   *
 - *  Header file for PDIProtocol.c.
 + *  Header file for XPROGProtocol.c.
   */
 -#ifndef _PDI_PROTOCOL_
 -#define _PDI_PROTOCOL_
 +#ifndef _XPROG_PROTOCOL_
 +#define _XPROG_PROTOCOL_
  	/* Includes: */
  		#include <avr/io.h>
 @@ -46,14 +46,15 @@  		#include "../V2Protocol.h"
  		#include "PDITarget.h"
  		#include "XMEGANVM.h"
 +		#include "TPITarget.h"
 +		#include "TINYNVM.h"
  	/* Preprocessor Checks: */
  		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
  			#undef ENABLE_ISP_PROTOCOL
 -			#undef ENABLE_TPI_PROTOCOL
 -			#if !defined(ENABLE_PDI_PROTOCOL)
 -				#define ENABLE_PDI_PROTOCOL
 +			#if !defined(ENABLE_XPROG_PROTOCOL)
 +				#define ENABLE_XPROG_PROTOCOL
  			#endif
  		#endif
 @@ -109,17 +110,17 @@  		extern uint32_t XPROG_Param_NVMBase;
  	/* Function Prototypes: */
 -		void PDIProtocol_XPROG_SetMode(void);
 -		void PDIProtocol_XPROG_Command(void);
 +		void XPROGProtocol_SetMode(void);
 +		void XPROGProtocol_Command(void);
 -		#if defined(INCLUDE_FROM_PDIPROTOCOL_C)
 -			static void PDIProtocol_EnterXPROGMode(void);
 -			static void PDIProtocol_LeaveXPROGMode(void);
 -			static void PDIProtocol_SetParam(void);
 -			static void PDIProtocol_Erase(void);
 -			static void PDIProtocol_WriteMemory(void);
 -			static void PDIProtocol_ReadMemory(void);
 -			static void PDIProtocol_ReadCRC(void);
 +		#if defined(INCLUDE_FROM_XPROGPROTOCOL_C)
 +			static void XPROGProtocol_EnterXPROGMode(void);
 +			static void XPROGProtocol_LeaveXPROGMode(void);
 +			static void XPROGProtocol_SetParam(void);
 +			static void XPROGProtocol_Erase(void);
 +			static void XPROGProtocol_WriteMemory(void);
 +			static void XPROGProtocol_ReadMemory(void);
 +			static void XPROGProtocol_ReadCRC(void);
  		#endif
  #endif
 | 
