projects
/
pub
/
USBasp.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c8942ef
)
Fixed broken FLASH/EEPROM programming in the AVRISP-MKII clone project when writing...
author
Dean Camera
<dean@fourwalledcubicle.com>
Sat, 2 Oct 2010 08:41:08 +0000
(08:41 +0000)
committer
Dean Camera
<dean@fourwalledcubicle.com>
Sat, 2 Oct 2010 08:41:08 +0000
(08:41 +0000)
LUFA/ManPages/ChangeLog.txt
patch
|
blob
|
blame
|
history
Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
patch
|
blob
|
blame
|
history
Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
patch
|
blob
|
blame
|
history
diff --git
a/LUFA/ManPages/ChangeLog.txt
b/LUFA/ManPages/ChangeLog.txt
index
9570054
..
805b3e1
100644
(file)
--- a/
LUFA/ManPages/ChangeLog.txt
+++ b/
LUFA/ManPages/ChangeLog.txt
@@
-67,6
+67,7
@@
* - Fixed BootloaderCDC project failing on some operating systems due to removed Line Encoding options (thanks to Alexey Belyaev)
* - 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 BootloaderCDC project failing on some operating systems due to removed Line Encoding options (thanks to Alexey Belyaev)
* - 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
*
* \section Sec_ChangeLog100807 Version 100807
* <b>New:</b>
*
* \section Sec_ChangeLog100807 Version 100807
* <b>New:</b>
diff --git
a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
index
105a701
..
aff84a9
100644
(file)
--- a/
Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
+++ b/
Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
@@
-184,7
+184,7
@@
void ISPProtocol_ProgramMemory(uint8_t V2Command)
uint16_t PollAddress = 0;
uint8_t PollValue = (V2Command == CMD_PROGRAM_FLASH_ISP) ? Write_Memory_Params.PollValue1 :
Write_Memory_Params.PollValue2;
uint16_t PollAddress = 0;
uint8_t PollValue = (V2Command == CMD_PROGRAM_FLASH_ISP) ? Write_Memory_Params.PollValue1 :
Write_Memory_Params.PollValue2;
- uint8_t* NextWriteByte = Write_Memory_Params.ProgData;
+ uint8_t* NextWriteByte
= Write_Memory_Params.ProgData;
/* Check the programming mode desired by the host, either Paged or Word memory writes */
if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)
/* Check the programming mode desired by the host, either Paged or Word memory writes */
if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)
@@
-236,8
+236,8
@@
void ISPProtocol_ProgramMemory(uint8_t V2Command)
ISPTarget_SendByte(StartAddress & 0xFF);
ISPTarget_SendByte(0x00);
ISPTarget_SendByte(StartAddress & 0xFF);
ISPTarget_SendByte(0x00);
- /* Check if polling is possible, if not switch to timed delay mode */
- if (!(PollAddress))
+ /* Check if polling is possible
and enabled
, if not switch to timed delay mode */
+ if (!(PollAddress)
&& (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_VALUE_MASK)
)
{
Write_Memory_Params.ProgrammingMode &= ~PROG_MODE_PAGED_VALUE_MASK;
Write_Memory_Params.ProgrammingMode |= PROG_MODE_PAGED_TIMEDELAY_MASK;
{
Write_Memory_Params.ProgrammingMode &= ~PROG_MODE_PAGED_VALUE_MASK;
Write_Memory_Params.ProgrammingMode |= PROG_MODE_PAGED_TIMEDELAY_MASK;
@@
-275,6
+275,9
@@
void ISPProtocol_ProgramMemory(uint8_t V2Command)
* or low byte at the current word address */
if (V2Command == CMD_PROGRAM_FLASH_ISP)
Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK;
* or low byte at the current word address */
if (V2Command == CMD_PROGRAM_FLASH_ISP)
Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK;
+
+ /* Save previous programming mode in case we modify it for the current word */
+ uint8_t PreviousProgrammingMode = Write_Memory_Params.ProgrammingMode;
if (ByteToWrite != PollValue)
{
if (ByteToWrite != PollValue)
{
@@
-283,10
+286,18
@@
void ISPProtocol_ProgramMemory(uint8_t V2Command)
PollAddress = (CurrentAddress & 0xFFFF);
}
PollAddress = (CurrentAddress & 0xFFFF);
}
+ else if (!(Write_Memory_Params.ProgrammingMode & PROG_MODE_WORD_READYBUSY_MASK))
+ {
+ Write_Memory_Params.ProgrammingMode &= ~PROG_MODE_WORD_VALUE_MASK;
+ Write_Memory_Params.ProgrammingMode |= PROG_MODE_WORD_TIMEDELAY_MASK;
+ }
ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]);
ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]);
+ /* Restore previous programming mode mask in case the current word needed to change it */
+ Write_Memory_Params.ProgrammingMode = PreviousProgrammingMode;
+
/* Abort the programming loop early if the byte/word programming failed */
if (ProgrammingStatus != STATUS_CMD_OK)
break;
/* Abort the programming loop early if the byte/word programming failed */
if (ProgrammingStatus != STATUS_CMD_OK)
break;
diff --git
a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
index
294edce
..
6fea244
100644
(file)
--- a/
Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
+++ b/
Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
@@
-275,7
+275,7
@@
uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode,
const uint8_t DelayMS,
const uint8_t ReadMemCommand)
{
const uint8_t DelayMS,
const uint8_t ReadMemCommand)
{
- uint8_t ProgrammingStatus
= STATUS_CMD_OK;
+ uint8_t ProgrammingStatus = STATUS_CMD_OK;
/* Determine method of Programming Complete check */
switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK))
/* Determine method of Programming Complete check */
switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK))