aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-05-14 10:11:40 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-05-14 10:11:40 +0000
commit80d85090baa9b5c6abf4c3e550a63486d4252839 (patch)
treeb2ef0a6fee94b52fcd6d4f10c1002a0f6d521d3a /Projects/AVRISP-MKII
parent6b7770ef2b7f0a7210d8a69ca2edaca1b468815d (diff)
downloadlufa-80d85090baa9b5c6abf4c3e550a63486d4252839.tar.gz
lufa-80d85090baa9b5c6abf4c3e550a63486d4252839.tar.bz2
lufa-80d85090baa9b5c6abf4c3e550a63486d4252839.zip
Fixed AVRISP project sending a LOAD EXTENDED ADDRESS command to 128KB AVRs after programming or reading from the last page of FLASH.
Diffstat (limited to 'Projects/AVRISP-MKII')
-rw-r--r--Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c65
-rw-r--r--Projects/AVRISP-MKII/Lib/V2Protocol.c7
-rw-r--r--Projects/AVRISP-MKII/Lib/V2Protocol.h2
-rw-r--r--Projects/AVRISP-MKII/Lib/V2ProtocolParams.c9
4 files changed, 39 insertions, 44 deletions
diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
index e49f590d4..2ce11a8ee 100644
--- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
@@ -186,22 +186,18 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
Write_Memory_Params.PollValue2;
uint8_t* NextWriteByte = Write_Memory_Params.ProgData;
- /* Check to see if the host has issued a SET ADDRESS command and we haven't sent a
- * LOAD EXTENDED ADDRESS command (if needed, used when operating beyond the 128KB
- * FLASH barrier) */
- if (MustSetAddress)
- {
- if (CurrentAddress & (1UL << 31))
- ISPTarget_LoadExtendedAddress();
-
- MustSetAddress = false;
- }
-
/* Check the programming mode desired by the host, either Paged or Word memory writes */
if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)
{
uint16_t StartAddress = (CurrentAddress & 0xFFFF);
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
/* Paged mode memory programming */
for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++)
{
@@ -252,7 +248,7 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
/* Check to see if the FLASH address has crossed the extended address boundary */
if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = true;
}
}
else
@@ -263,6 +259,13 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
bool IsOddByte = (CurrentByte & 0x01);
uint8_t ByteToWrite = *(NextWriteByte++);
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]);
SPI_SendByte(CurrentAddress >> 8);
SPI_SendByte(CurrentAddress & 0xFF);
@@ -291,14 +294,12 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
/* EEPROM just increments the address each byte, flash needs to increment on each word and
* also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
* address boundary has been crossed */
- if (V2Command == CMD_PROGRAM_EEPROM_ISP)
+ if ((CurrentByte & 0x01) || (V2Command == CMD_PROGRAM_EEPROM_ISP))
{
CurrentAddress++;
- }
- else if (IsOddByte)
- {
- if (!(++CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
+
+ if ((V2Command != CMD_PROGRAM_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+ MustLoadExtendedAddress = true;
}
}
}
@@ -330,21 +331,17 @@ void ISPProtocol_ReadMemory(uint8_t V2Command)
Endpoint_Write_Byte(V2Command);
Endpoint_Write_Byte(STATUS_CMD_OK);
-
- /* Check to see if the host has issued a SET ADDRESS command and we haven't sent a
- * LOAD EXTENDED ADDRESS command (if needed, used when operating beyond the 128KB
- * FLASH barrier) */
- if (MustSetAddress)
- {
- if (CurrentAddress & (1UL << 31))
- ISPTarget_LoadExtendedAddress();
-
- MustSetAddress = false;
- }
/* Read each byte from the device and write them to the packet for the host */
for (uint16_t CurrentByte = 0; CurrentByte < Read_Memory_Params.BytesToRead; CurrentByte++)
{
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
/* Read the next byte from the desired memory space in the device */
SPI_SendByte(Read_Memory_Params.ReadMemoryCommand);
SPI_SendByte(CurrentAddress >> 8);
@@ -366,14 +363,12 @@ void ISPProtocol_ReadMemory(uint8_t V2Command)
/* EEPROM just increments the address each byte, flash needs to increment on each word and
* also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
* address boundary has been crossed */
- if (V2Command == CMD_READ_EEPROM_ISP)
+ if ((CurrentByte & 0x01) || (V2Command == CMD_READ_EEPROM_ISP))
{
CurrentAddress++;
- }
- else if (CurrentByte & 0x01)
- {
- if (!(++CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
+
+ if ((V2Command != CMD_READ_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+ MustLoadExtendedAddress = true;
}
}
diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.c b/Projects/AVRISP-MKII/Lib/V2Protocol.c
index 3e12bdc11..d6bb32a14 100644
--- a/Projects/AVRISP-MKII/Lib/V2Protocol.c
+++ b/Projects/AVRISP-MKII/Lib/V2Protocol.c
@@ -39,8 +39,8 @@
/** Current memory address for FLASH/EEPROM memory read/write commands */
uint32_t CurrentAddress;
-/** Flag to indicate that the next read/write operation must update the device's current address */
-bool MustSetAddress;
+/** Flag to indicate that the next read/write operation must update the device's current extended FLASH address */
+bool MustLoadExtendedAddress;
/** ISR to manage timeouts whilst processing a V2Protocol command */
@@ -251,7 +251,8 @@ static void V2Protocol_LoadAddress(void)
Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
- MustSetAddress = true;
+ if (CurrentAddress & (1UL << 31))
+ MustLoadExtendedAddress = true;
Endpoint_Write_Byte(CMD_LOAD_ADDRESS);
Endpoint_Write_Byte(STATUS_CMD_OK);
diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.h b/Projects/AVRISP-MKII/Lib/V2Protocol.h
index 0f0794b5c..d5602a0d4 100644
--- a/Projects/AVRISP-MKII/Lib/V2Protocol.h
+++ b/Projects/AVRISP-MKII/Lib/V2Protocol.h
@@ -84,7 +84,7 @@
/* External Variables: */
#if !defined(__ASSEMBLER__)
extern uint32_t CurrentAddress;
- extern bool MustSetAddress;
+ extern bool MustLoadExtendedAddress;
#endif
/* Function Prototypes: */
diff --git a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c
index b8c5930a0..e12fa2d24 100644
--- a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c
+++ b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c
@@ -44,11 +44,11 @@ static ParameterItem_t ParameterTable[] =
{
{ .ParamID = PARAM_BUILD_NUMBER_LOW,
.ParamPrivileges = PARAM_PRIV_READ,
- .ParamValue = (LUFA_VERSION_INTEGER >> 8) },
+ .ParamValue = 0 },
{ .ParamID = PARAM_BUILD_NUMBER_HIGH,
.ParamPrivileges = PARAM_PRIV_READ,
- .ParamValue = (LUFA_VERSION_INTEGER & 0xFF), },
+ .ParamValue = 0 },
{ .ParamID = PARAM_HW_VER,
.ParamPrivileges = PARAM_PRIV_READ,
@@ -87,8 +87,7 @@ static ParameterItem_t ParameterTable[] =
/** Loads saved non-volatile parameter values from the EEPROM into the parameter table, as needed. */
void V2Params_LoadNonVolatileParamValues(void)
{
- /* Target RESET line polarity is a non-volatile value, retrieve current parameter value from EEPROM -
- * NB: Cannot call V2Protocol_SetParameterValue() here, as that will cause another EEPROM write! */
+ /* Target RESET line polarity is a non-volatile value, retrieve current parameter value from EEPROM */
V2Params_GetParamFromTable(PARAM_RESET_POLARITY)->ParamValue = eeprom_read_byte(&EEPROM_Rest_Polarity);
}
@@ -154,7 +153,7 @@ void V2Params_SetParameterValue(const uint8_t ParamID, const uint8_t Value)
ParamInfo->ParamValue = Value;
/* The target RESET line polarity is a non-volatile parameter, save to EEPROM when changed */
- if (ParamID == PARAM_RESET_POLARITY)
+ if ((ParamID == PARAM_RESET_POLARITY) && (eeprom_read_byte(&EEPROM_Rest_Polarity) != Value))
eeprom_write_byte(&EEPROM_Rest_Polarity, Value);
}