Minor fixups to the documentation and preprocessor tokens.
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / XPROG / XPROGProtocol.c
index f3f888e..e7b57da 100644 (file)
@@ -1,13 +1,13 @@
 /*\r
              LUFA Library\r
 /*\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
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\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
 \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
 #include "XPROGProtocol.h"\r
 \r
 #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)\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
 \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
 \r
 /** Currently selected XPROG programming protocol */\r
 uint8_t  XPROG_SelectedProtocol = XPRG_PROTOCOL_PDI;\r
@@ -56,7 +62,7 @@ void XPROGProtocol_SetMode(void)
                uint8_t Protocol;\r
        } SetMode_XPROG_Params;\r
        \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
 \r
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
@@ -118,6 +124,10 @@ static void XPROGProtocol_EnterXPROGMode(void)
                XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);     \r
                XPROGTarget_SendByte(PDI_RESET_KEY);\r
 \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 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
@@ -131,6 +141,10 @@ static void XPROGProtocol_EnterXPROGMode(void)
                /* Enable TPI programming mode with the attached target */\r
                XPROGTarget_EnableTargetTPI();\r
                \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
                /* 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
@@ -188,7 +202,7 @@ static void XPROGProtocol_Erase(void)
                uint32_t Address;\r
        } Erase_XPROG_Params;\r
 \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
        Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);\r
 \r
        Endpoint_ClearOUT();\r
@@ -222,7 +236,9 @@ static void XPROGProtocol_Erase(void)
        }\r
        else\r
        {\r
        }\r
        else\r
        {\r
-               // TODO\r
+               /* Erase the target memory, indicate timeout if ocurred */\r
+               if (!(TINYNVM_EraseMemory(TINY_NVM_CMD_CHIPERASE, Erase_XPROG_Params.Address)))\r
+                 ReturnStatus = XPRG_ERR_TIMEOUT;\r
        }\r
        \r
        Endpoint_Write_Byte(CMD_XPROG);\r
        }\r
        \r
        Endpoint_Write_Byte(CMD_XPROG);\r
@@ -246,22 +262,22 @@ static void XPROGProtocol_WriteMemory(void)
        } WriteMemory_XPROG_Params;\r
        \r
        Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params, (sizeof(WriteMemory_XPROG_Params) -\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
        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
 \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
        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
                if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL)\r
                {\r
                        WriteCommand     = XMEGA_NVM_CMD_WRITEAPPSECPAGE;\r
@@ -294,18 +310,23 @@ static void XPROGProtocol_WriteMemory(void)
                }\r
                \r
                /* Send the appropriate memory write commands to the device, indicate timeout if occurred */\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.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
                {\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
        }\r
        \r
        Endpoint_Write_Byte(CMD_XPROG);\r
@@ -328,7 +349,7 @@ static void XPROGProtocol_ReadMemory(void)
                uint16_t Length;\r
        } ReadMemory_XPROG_Params;\r
        \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
        ReadMemory_XPROG_Params.Address = SwapEndian_32(ReadMemory_XPROG_Params.Address);\r
        ReadMemory_XPROG_Params.Length  = SwapEndian_16(ReadMemory_XPROG_Params.Length);\r
 \r
@@ -339,13 +360,15 @@ static void XPROGProtocol_ReadMemory(void)
        \r
        if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)\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
                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
        }\r
 \r
        Endpoint_Write_Byte(CMD_XPROG);\r
@@ -353,7 +376,7 @@ static void XPROGProtocol_ReadMemory(void)
        Endpoint_Write_Byte(ReturnStatus);\r
        \r
        if (ReturnStatus == XPRG_ERR_OK)\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
        \r
        Endpoint_ClearIN();\r
 }\r
@@ -370,7 +393,7 @@ static void XPROGProtocol_ReadCRC(void)
                uint8_t CRCType;\r
        } ReadCRC_XPROG_Params;\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
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
        \r
@@ -428,9 +451,12 @@ static void XPROGProtocol_SetParam(void)
                case XPRG_PARAM_EEPPAGESIZE:\r
                        XPROG_Param_EEPageSize = Endpoint_Read_Word_BE();\r
                        break;\r
                case XPRG_PARAM_EEPPAGESIZE:\r
                        XPROG_Param_EEPageSize = Endpoint_Read_Word_BE();\r
                        break;\r
-               case XPRG_PARAM_UNDOC_1:\r
-               case XPRG_PARAM_UNDOC_2:\r
-                       break; // Undocumented TPI parameter, just accept and discard\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
                default:\r
                        ReturnStatus = XPRG_ERR_FAILED;\r
                        break;\r