/*\r
LUFA Library\r
- Copyright (C) Dean Camera, 2009.\r
+ Copyright (C) Dean Camera, 2010.\r
\r
dean [at] fourwalledcubicle [dot] com\r
www.fourwalledcubicle.com\r
*/\r
\r
/*\r
- Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, and distribute this software\r
- and its documentation for any purpose and without fee is hereby\r
- granted, provided that the above copyright notice appear in all\r
- copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting\r
- documentation, and that the name of the author not be used in\r
- advertising or publicity pertaining to distribution of the\r
+ Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+ Permission to use, copy, modify, distribute, and sell this \r
+ software and its documentation for any purpose is hereby granted\r
+ without fee, provided that the above copyright notice appear in \r
+ all copies and that both that the copyright notice and this\r
+ permission notice and warranty disclaimer appear in supporting \r
+ documentation, and that the name of the author not be used in \r
+ advertising or publicity pertaining to distribution of the \r
software without specific, written prior permission.\r
\r
The author disclaim all warranties with regard to this\r
#include "XPROGProtocol.h"\r
\r
#if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)\r
-/** Base absolute address for the target's NVM controller */\r
-uint32_t XPROG_Param_NVMBase = 0x010001C0;\r
+/** Base absolute address for the target's NVM controller for PDI programming */\r
+uint32_t XPROG_Param_NVMBase = 0x010001C0;\r
\r
/** Size in bytes of the target's EEPROM page */\r
-uint32_t XPROG_Param_EEPageSize;\r
+uint16_t XPROG_Param_EEPageSize;\r
+\r
+/** Address of the TPI device's NVMCMD register for TPI programming */\r
+uint8_t XPROG_Param_NVMCMDRegAddr;\r
+\r
+/** Address of the TPI device's NVMCSR register for TPI programming */\r
+uint8_t XPROG_Param_NVMCSRRegAddr;\r
\r
/** Currently selected XPROG programming protocol */\r
uint8_t XPROG_SelectedProtocol = XPRG_PROTOCOL_PDI;\r
uint8_t Protocol;\r
} SetMode_XPROG_Params;\r
\r
- Endpoint_Read_Stream_LE(&SetMode_XPROG_Params, sizeof(SetMode_XPROG_Params));\r
+ Endpoint_Read_Stream_LE(&SetMode_XPROG_Params, sizeof(SetMode_XPROG_Params), NO_STREAM_CALLBACK);\r
\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
void XPROGProtocol_Command(void)\r
{\r
uint8_t XPROGCommand = Endpoint_Read_Byte();\r
-\r
+ \r
switch (XPROGCommand)\r
{\r
case XPRG_CMD_ENTER_PROGMODE:\r
XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); \r
XPROGTarget_SendByte(PDI_RESET_KEY);\r
\r
+ /* Lower direction change guard time to 8 USART bits */\r
+ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_CTRL_REG); \r
+ XPROGTarget_SendByte(0x04);\r
+\r
/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */\r
XPROGTarget_SendByte(PDI_CMD_KEY); \r
for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)\r
/* Enable TPI programming mode with the attached target */\r
XPROGTarget_EnableTargetTPI();\r
\r
+ /* Lower direction change guard time to 8 USART bits */\r
+ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_CTRL_REG);\r
+ XPROGTarget_SendByte(0x04);\r
+ \r
/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */\r
XPROGTarget_SendByte(TPI_CMD_SKEY); \r
for (uint8_t i = sizeof(TPI_NVMENABLE_KEY); i > 0; i--)\r
uint32_t Address;\r
} Erase_XPROG_Params;\r
\r
- Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params));\r
+ Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params), NO_STREAM_CALLBACK);\r
Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);\r
\r
Endpoint_ClearOUT();\r
}\r
else\r
{\r
- // TODO\r
+ /* Erase the target memory, indicate timeout if ocurred */\r
+ if (!(TINYNVM_EraseMemory()))\r
+ ReturnStatus = XPRG_ERR_TIMEOUT;\r
}\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
} WriteMemory_XPROG_Params;\r
\r
Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params, (sizeof(WriteMemory_XPROG_Params) -\r
- sizeof(WriteMemory_XPROG_Params).ProgData));\r
+ sizeof(WriteMemory_XPROG_Params).ProgData), NO_STREAM_CALLBACK);\r
WriteMemory_XPROG_Params.Address = SwapEndian_32(WriteMemory_XPROG_Params.Address);\r
WriteMemory_XPROG_Params.Length = SwapEndian_16(WriteMemory_XPROG_Params.Length);\r
- Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length);\r
+ Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NO_STREAM_CALLBACK);\r
\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
- /* Assume FLASH page programming by default, as it is the common case */\r
- uint8_t WriteCommand = XMEGA_NVM_CMD_WRITEFLASHPAGE;\r
- uint8_t WriteBuffCommand = XMEGA_NVM_CMD_LOADFLASHPAGEBUFF;\r
- uint8_t EraseBuffCommand = XMEGA_NVM_CMD_ERASEFLASHPAGEBUFF;\r
- bool PagedMemory = true;\r
-\r
if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)\r
{\r
+ /* Assume FLASH page programming by default, as it is the common case */\r
+ uint8_t WriteCommand = XMEGA_NVM_CMD_WRITEFLASHPAGE;\r
+ uint8_t WriteBuffCommand = XMEGA_NVM_CMD_LOADFLASHPAGEBUFF;\r
+ uint8_t EraseBuffCommand = XMEGA_NVM_CMD_ERASEFLASHPAGEBUFF;\r
+ bool PagedMemory = true;\r
+\r
if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL)\r
{\r
WriteCommand = XMEGA_NVM_CMD_WRITEAPPSECPAGE;\r
}\r
\r
/* Send the appropriate memory write commands to the device, indicate timeout if occurred */\r
- if ((PagedMemory && !XMEGANVM_WritePageMemory(WriteBuffCommand, EraseBuffCommand, WriteCommand, \r
+ if ((PagedMemory && !(XMEGANVM_WritePageMemory(WriteBuffCommand, EraseBuffCommand, WriteCommand, \r
WriteMemory_XPROG_Params.PageMode, WriteMemory_XPROG_Params.Address,\r
- WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length)) ||\r
- (!PagedMemory && !XMEGANVM_WriteByteMemory(WriteCommand, WriteMemory_XPROG_Params.Address,\r
- WriteMemory_XPROG_Params.ProgData)))\r
+ WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length))) ||\r
+ (!PagedMemory && !(XMEGANVM_WriteByteMemory(WriteCommand, WriteMemory_XPROG_Params.Address,\r
+ WriteMemory_XPROG_Params.ProgData[0]))))\r
{\r
ReturnStatus = XPRG_ERR_TIMEOUT;\r
}\r
}\r
else\r
{\r
- // TODO\r
+ /* Send write command to the TPI device, indicate timeout if occurred */\r
+ if (!(TINYNVM_WriteMemory(WriteMemory_XPROG_Params.Address, WriteMemory_XPROG_Params.ProgData,\r
+ WriteMemory_XPROG_Params.Length)))\r
+ {\r
+ ReturnStatus = XPRG_ERR_TIMEOUT;\r
+ }\r
}\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
uint16_t Length;\r
} ReadMemory_XPROG_Params;\r
\r
- Endpoint_Read_Stream_LE(&ReadMemory_XPROG_Params, sizeof(ReadMemory_XPROG_Params));\r
+ Endpoint_Read_Stream_LE(&ReadMemory_XPROG_Params, sizeof(ReadMemory_XPROG_Params), NO_STREAM_CALLBACK);\r
ReadMemory_XPROG_Params.Address = SwapEndian_32(ReadMemory_XPROG_Params.Address);\r
ReadMemory_XPROG_Params.Length = SwapEndian_16(ReadMemory_XPROG_Params.Length);\r
\r
\r
if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)\r
{\r
- /* Read the target's memory, indicate timeout if occurred */\r
+ /* Read the PDI target's memory, indicate timeout if occurred */\r
if (!(XMEGANVM_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length)))\r
ReturnStatus = XPRG_ERR_TIMEOUT;\r
}\r
else\r
{\r
- // TODO\r
+ /* Read the TPI target's memory, indicate timeout if occurred */\r
+ if (!(TINYNVM_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length)))\r
+ ReturnStatus = XPRG_ERR_TIMEOUT;\r
}\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(ReturnStatus);\r
\r
if (ReturnStatus == XPRG_ERR_OK)\r
- Endpoint_Write_Stream_LE(ReadBuffer, ReadMemory_XPROG_Params.Length);\r
+ Endpoint_Write_Stream_LE(ReadBuffer, ReadMemory_XPROG_Params.Length, NO_STREAM_CALLBACK);\r
\r
Endpoint_ClearIN();\r
}\r
uint8_t CRCType;\r
} ReadCRC_XPROG_Params;\r
\r
- Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params));\r
+ Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NO_STREAM_CALLBACK);\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
uint8_t XPROGParam = Endpoint_Read_Byte();\r
\r
/* Determine which parameter is being set, store the new parameter value */\r
- if (XPROGParam == XPRG_PARAM_NVMBASE)\r
- XPROG_Param_NVMBase = Endpoint_Read_DWord_BE();\r
- else if (XPROGParam == XPRG_PARAM_EEPPAGESIZE)\r
- XPROG_Param_EEPageSize = Endpoint_Read_Word_BE();\r
- else\r
- ReturnStatus = XPRG_ERR_FAILED;\r
- \r
+ switch (XPROGParam)\r
+ {\r
+ case XPRG_PARAM_NVMBASE:\r
+ XPROG_Param_NVMBase = Endpoint_Read_DWord_BE();\r
+ break;\r
+ case XPRG_PARAM_EEPPAGESIZE:\r
+ XPROG_Param_EEPageSize = Endpoint_Read_Word_BE();\r
+ break;\r
+ case XPRG_PARAM_NVMCMD_REG:\r
+ XPROG_Param_NVMCMDRegAddr = Endpoint_Read_Byte();\r
+ break;\r
+ case XPRG_PARAM_NVMCSR_REG:\r
+ XPROG_Param_NVMCSRRegAddr = Endpoint_Read_Byte();\r
+ break;\r
+ default:\r
+ ReturnStatus = XPRG_ERR_FAILED;\r
+ break;\r
+ }\r
+\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r