3      Copyright (C) Dean Camera, 2011. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this 
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in 
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  33  *  Header file for XMEGANVM.c. 
  41                 #include <avr/interrupt.h> 
  44                 #include <LUFA/Common/Common.h> 
  46                 #include "XPROGProtocol.h" 
  47                 #include "XPROGTarget.h" 
  49         /* Preprocessor Checks: */ 
  50                 #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) 
  51                         #undef ENABLE_ISP_PROTOCOL 
  53                         #if !defined(ENABLE_XPROG_PROTOCOL) 
  54                                 #define ENABLE_XPROG_PROTOCOL 
  59                 #define XMEGA_CRC_LENGTH                     3 
  61                 #define XMEGA_NVM_REG_ADDR0                  0x00 
  62                 #define XMEGA_NVM_REG_ADDR1                  0x01 
  63                 #define XMEGA_NVM_REG_ADDR2                  0x02 
  64                 #define XMEGA_NVM_REG_DAT0                   0x04 
  65                 #define XMEGA_NVM_REG_DAT1                   0x05 
  66                 #define XMEGA_NVM_REG_DAT2                   0x06 
  67                 #define XMEGA_NVM_REG_CMD                    0x0A 
  68                 #define XMEGA_NVM_REG_CTRLA                  0x0B 
  69                 #define XMEGA_NVM_REG_CTRLB                  0x0C 
  70                 #define XMEGA_NVM_REG_INTCTRL                0x0D 
  71                 #define XMEGA_NVM_REG_STATUS                 0x0F 
  72                 #define XMEGA_NVM_REG_LOCKBITS               0x10 
  74                 #define XMEGA_NVM_CMD_NOOP                   0x00 
  75                 #define XMEGA_NVM_CMD_CHIPERASE              0x40 
  76                 #define XMEGA_NVM_CMD_READNVM                0x43 
  77                 #define XMEGA_NVM_CMD_LOADFLASHPAGEBUFF      0x23 
  78                 #define XMEGA_NVM_CMD_ERASEFLASHPAGEBUFF     0x26 
  79                 #define XMEGA_NVM_CMD_ERASEFLASHPAGE         0x2B 
  80                 #define XMEGA_NVM_CMD_WRITEFLASHPAGE         0x2E 
  81                 #define XMEGA_NVM_CMD_ERASEWRITEFLASH        0x2F 
  82                 #define XMEGA_NVM_CMD_FLASHCRC               0x78 
  83                 #define XMEGA_NVM_CMD_ERASEAPPSEC            0x20 
  84                 #define XMEGA_NVM_CMD_ERASEAPPSECPAGE        0x22 
  85                 #define XMEGA_NVM_CMD_WRITEAPPSECPAGE        0x24 
  86                 #define XMEGA_NVM_CMD_ERASEWRITEAPPSECPAGE   0x25 
  87                 #define XMEGA_NVM_CMD_APPCRC                 0x38 
  88                 #define XMEGA_NVM_CMD_ERASEBOOTSEC           0x68 
  89                 #define XMEGA_NVM_CMD_ERASEBOOTSECPAGE       0x2A 
  90                 #define XMEGA_NVM_CMD_WRITEBOOTSECPAGE       0x2C 
  91                 #define XMEGA_NVM_CMD_ERASEWRITEBOOTSECPAGE  0x2D 
  92                 #define XMEGA_NVM_CMD_BOOTCRC                0x39 
  93                 #define XMEGA_NVM_CMD_READUSERSIG            0x03 
  94                 #define XMEGA_NVM_CMD_ERASEUSERSIG           0x18 
  95                 #define XMEGA_NVM_CMD_WRITEUSERSIG           0x1A 
  96                 #define XMEGA_NVM_CMD_READCALIBRATION        0x02 
  97                 #define XMEGA_NVM_CMD_READFUSE               0x07 
  98                 #define XMEGA_NVM_CMD_WRITEFUSE              0x4C 
  99                 #define XMEGA_NVM_CMD_WRITELOCK              0x08 
 100                 #define XMEGA_NVM_CMD_LOADEEPROMPAGEBUFF     0x33 
 101                 #define XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF    0x36 
 102                 #define XMEGA_NVM_CMD_ERASEEEPROM            0x30 
 103                 #define XMEGA_NVM_CMD_ERASEEEPROMPAGE        0x32 
 104                 #define XMEGA_NVM_CMD_WRITEEEPROMPAGE        0x34 
 105                 #define XMEGA_NVM_CMD_ERASEWRITEEEPROMPAGE   0x35 
 106                 #define XMEGA_NVM_CMD_READEEPROM             0x06 
 108         /* Function Prototypes: */ 
 109                 bool XMEGANVM_WaitWhileNVMBusBusy(void); 
 110                 bool XMEGANVM_WaitWhileNVMControllerBusy(void); 
 111                 bool XMEGANVM_EnablePDI(void); 
 112                 void XMEGANVM_DisablePDI(void); 
 113                 bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand
, uint32_t* const CRCDest
); 
 114                 bool XMEGANVM_ReadMemory(const uint32_t ReadAddress
, uint8_t* ReadBuffer
, uint16_t ReadSize
); 
 115                 bool XMEGANVM_WriteByteMemory(const uint8_t WriteCommand
, const uint32_t WriteAddress
, const uint8_t Byte
); 
 116                 bool XMEGANVM_WritePageMemory(const uint8_t WriteBuffCommand
, const uint8_t EraseBuffCommand
, 
 117                                               const uint8_t WritePageCommand
, const uint8_t PageMode
, const uint32_t WriteAddress
, 
 118                                               const uint8_t* WriteBuffer
, uint16_t WriteSize
); 
 119                 bool XMEGANVM_EraseMemory(const uint8_t EraseCommand
, const uint32_t Address
); 
 121                 #if defined(INCLUDE_FROM_XMEGANVM_C) 
 122                         static void XMEGANVM_SendNVMRegAddress(const uint8_t Register
); 
 123                         static void XMEGANVM_SendAddress(const uint32_t AbsoluteAddress
);