Be doubly-certain that the incomming CDC class driver's endpoint/pipe is flushed...
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / XPROG / TINYNVM.c
index 41e6852..9dac31c 100644 (file)
@@ -1,13 +1,13 @@
 /*\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
+  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
@@ -40,7 +40,7 @@
 #warning TPI Protocol support is currently incomplete and is not suitable for general use.\r
 \r
 /** Sends the given pointer address to the target's TPI pointer register */\r
-void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress)\r
+static void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress)\r
 {\r
        /* Send the given 16-bit address to the target, LSB first */\r
        XPROGTarget_SendByte(TPI_CMD_SSTPR | 0);\r
@@ -49,6 +49,28 @@ void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress)
        XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[1]);\r
 }\r
 \r
+/** Sends a SIN command to the target with the specified I/O address, ready for the data byte to be written.\r
+ *\r
+ *  \param[in] Address  6-bit I/O address to write to in the target's I/O memory space\r
+ */\r
+static void TINYNVM_SendReadNVMRegister(uint8_t Address)\r
+{\r
+       /* The TPI command for reading from the I/O space uses wierd addressing, where the I/O address's upper\r
+        * two bits of the 6-bit address are shifted left once */\r
+       XPROGTarget_SendByte(TPI_CMD_SIN | ((Address & 0x30) << 1) | (Address & 0x0F));\r
+}\r
+\r
+/** Sends a SOUT command to the target with the specified I/O address, ready for the data byte to be read.\r
+ *\r
+ *  \param[in] Address  6-bit I/O address to read from in the target's I/O memory space\r
+ */\r
+static void TINYNVM_SendWriteNVMRegister(uint8_t Address)\r
+{\r
+       /* The TPI command for writing to the I/O space uses wierd addressing, where the I/O address's upper\r
+        * two bits of the 6-bit address are shifted left once */\r
+       XPROGTarget_SendByte(TPI_CMD_SOUT | ((Address & 0x30) << 1) | (Address & 0x0F));\r
+}\r
+\r
 /** Busy-waits while the NVM controller is busy performing a NVM operation, such as a FLASH page read.\r
  *\r
  *  \return Boolean true if the NVM controller became ready within the timeout period, false otherwise\r
@@ -78,7 +100,7 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void)
        while (TimeoutMSRemaining)\r
        {\r
                /* Send the SIN command to read the TPI STATUS register to see the NVM bus is active */\r
-               XPROGTarget_SendByte(TPI_CMD_SIN | XPROG_Param_NVMCSRRegAddr);\r
+               TINYNVM_SendReadNVMRegister(XPROG_Param_NVMCSRRegAddr);\r
                if (XPROGTarget_ReceiveByte() & (1 << 7))\r
                  return true;\r
        }\r
@@ -101,7 +123,7 @@ bool TINYNVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_
          return false;\r
 \r
        /* Set the NVM control register to the NO OP command for memory reading */\r
-       XPROGTarget_SendByte(TPI_CMD_SOUT | XPROG_Param_NVMCMDRegAddr);\r
+       TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);\r
        XPROGTarget_SendByte(TINY_NVM_CMD_NOOP);\r
        \r
        /* Send the address of the location to read from */\r
@@ -132,7 +154,7 @@ bool TINYNVM_WriteMemory(const uint32_t WriteAddress, const uint8_t* WriteBuffer
          return false;\r
 \r
        /* Set the NVM control register to the WORD WRITE command for memory reading */\r
-       XPROGTarget_SendByte(TPI_CMD_SOUT | XPROG_Param_NVMCMDRegAddr);\r
+       TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);\r
        XPROGTarget_SendByte(TINY_NVM_CMD_WORDWRITE);\r
        \r
        /* Send the address of the location to write to */\r
@@ -159,7 +181,7 @@ bool TINYNVM_EraseMemory(void)
          return false;\r
 \r
        /* Set the NVM control register to the CHIP ERASE command to erase the target */\r
-       XPROGTarget_SendByte(TPI_CMD_SOUT | XPROG_Param_NVMCMDRegAddr);\r
+       TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);\r
        XPROGTarget_SendByte(TINY_NVM_CMD_CHIPERASE);   \r
 \r
        /* Wait until the NVM bus is ready again */\r