X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/26017b68b0632c91e71eb29e87ca94670425e081..d4684b29b9a3a4b45b6422d0f1cf6c79639c84c8:/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c index 49d576608..df0374dea 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2011. + Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -43,9 +43,9 @@ static void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress) { /* Send the given 16-bit address to the target, LSB first */ XPROGTarget_SendByte(TPI_CMD_SSTPR | 0); - XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[0]); + XPROGTarget_SendByte(AbsoluteAddress & 0xFF); XPROGTarget_SendByte(TPI_CMD_SSTPR | 1); - XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[1]); + XPROGTarget_SendByte(AbsoluteAddress >> 8); } /** Sends a SIN command to the target with the specified I/O address, ready for the data byte to be written. @@ -85,7 +85,7 @@ bool TINYNVM_WaitWhileNVMBusBusy(void) uint8_t StatusRegister = XPROGTarget_ReceiveByte(); /* We might have timed out waiting for the status register read response, check here */ - if (TimeoutExpired) + if (!(TimeoutTicksRemaining)) return false; /* Check the status register read response to see if the NVM bus is enabled */ @@ -110,7 +110,7 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void) uint8_t StatusRegister = XPROGTarget_ReceiveByte(); /* We might have timed out waiting for the status register read response, check here */ - if (TimeoutExpired) + if (!(TimeoutTicksRemaining)) return false; /* Check to see if the BUSY flag is still set */ @@ -128,9 +128,9 @@ bool TINYNVM_EnableTPI(void) /* Enable TPI programming mode with the attached target */ XPROGTarget_EnableTargetTPI(); - /* Lower direction change guard time to 0 USART bits */ + /* Lower direction change guard time to 32 USART bits */ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_CTRL_REG); - XPROGTarget_SendByte(0x07); + XPROGTarget_SendByte(0x02); /* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */ XPROGTarget_SendByte(TPI_CMD_SKEY); @@ -146,9 +146,15 @@ void TINYNVM_DisableTPI(void) { TINYNVM_WaitWhileNVMBusBusy(); - /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */ - XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG); - XPROGTarget_SendByte(0x00); + do + { + /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */ + XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG); + XPROGTarget_SendByte(0x00); + + /* Read back the STATUS register, check to see if it took effect */ + XPROGTarget_SendByte(TPI_CMD_SLDCS | PDI_RESET_REG); + } while (XPROGTarget_ReceiveByte() != 0x00); XPROGTarget_DisableTargetTPI(); } @@ -176,14 +182,14 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, /* Send the address of the location to read from */ TINYNVM_SendPointerAddress(ReadAddress); - while (ReadSize-- && !(TimeoutExpired)) + while (ReadSize-- && TimeoutTicksRemaining) { /* Read the byte of data from the target */ XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI); *(ReadBuffer++) = XPROGTarget_ReceiveByte(); } - return (TimeoutExpired == false); + return (TimeoutTicksRemaining > 0); } /** Writes word addressed memory to the target's memory spaces. @@ -206,7 +212,7 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, if (WriteLength & 0x01) WriteBuffer[WriteLength++] = 0xFF; - /* Set the NVM control register to the WORD WRITE command for memory reading */ + /* Set the NVM control register to the WORD WRITE command for memory writing */ TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr); XPROGTarget_SendByte(TINY_NVM_CMD_WORDWRITE); @@ -227,7 +233,7 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI); XPROGTarget_SendByte(*(WriteBuffer++)); - /* Need to decrement the write length twice, since we read out a whole word */ + /* Need to decrement the write length twice, since we wrote a whole two-byte word */ WriteLength -= 2; }