From a447ae134f416ab45dcfe3dfe5dd1222bb908be2 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 2 Oct 2010 10:02:24 +0000 Subject: Fixed broken lock byte programming in the AVRISP-MKII clone project for some XMEGA targets. --- LUFA/ManPages/ChangeLog.txt | 1 + Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c | 11 ++++++++++- Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c | 2 -- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 805b3e165..23ef75c5c 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -68,6 +68,7 @@ * - Fixed incorrect LEDs_ChangeLEDs() function in the Benito board LED driver * - Fixed incorrect USB_DeviceState value when unconfiguring the device without an address set * - Fixed broken FLASH/EEPROM programming in the AVRISP-MKII clone project when writing in non-paged mode and the polling byte cannot be used + * - Fixed broken lock byte programming in the AVRISP-MKII clone project for some XMEGA targets * * \section Sec_ChangeLog100807 Version 100807 * New: diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c index 93419d00d..537441fc0 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c @@ -216,10 +216,19 @@ bool XMEGANVM_WriteByteMemory(const uint8_t WriteCommand, const uint32_t WriteAd XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_CMD); XPROGTarget_SendByte(WriteCommand); - /* Send new memory byte to the memory to the target */ + /* Send new memory byte to the memory of the target */ XPROGTarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2)); XMEGANVM_SendAddress(WriteAddress); XPROGTarget_SendByte(Byte); + + /* Lock bytes need a special confirmation sequence for the write to complete */ + if (WriteCommand == XMEGA_NVM_CMD_WRITELOCK) + { + /* Set CMDEX bit in NVM CTRLA register to start the Lock Byte write sequence */ + XPROGTarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2)); + XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_CTRLA); + XPROGTarget_SendByte(1 << 0); + } return true; } diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 0f5269db9..85820fd31 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -324,8 +324,6 @@ static void XPROGProtocol_WriteMemory(void) EraseBuffCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF; break; case 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; break; case XPRG_MEM_TYPE_FUSE: -- cgit v1.2.3