projects
/
pub
/
lufa.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
544c4dc
)
Fixed bootloaders not disabling global interrupts during erase and write operations...
author
Dean Camera
<dean@fourwalledcubicle.com>
Sun, 1 Oct 2017 05:25:36 +0000
(16:25 +1100)
committer
Dean Camera
<dean@fourwalledcubicle.com>
Sun, 1 Oct 2017 05:25:36 +0000
(16:25 +1100)
17 files changed:
Bootloaders/CDC/BootloaderAPI.c
patch
|
blob
|
blame
|
history
Bootloaders/CDC/BootloaderAPI.h
patch
|
blob
|
blame
|
history
Bootloaders/CDC/BootloaderCDC.c
patch
|
blob
|
blame
|
history
Bootloaders/DFU/BootloaderAPI.c
patch
|
blob
|
blame
|
history
Bootloaders/DFU/BootloaderAPI.h
patch
|
blob
|
blame
|
history
Bootloaders/DFU/BootloaderDFU.c
patch
|
blob
|
blame
|
history
Bootloaders/HID/BootloaderHID.c
patch
|
blob
|
blame
|
history
Bootloaders/HID/BootloaderHID.h
patch
|
blob
|
blame
|
history
Bootloaders/MassStorage/BootloaderAPI.c
patch
|
blob
|
blame
|
history
Bootloaders/MassStorage/BootloaderAPI.h
patch
|
blob
|
blame
|
history
Bootloaders/MassStorage/BootloaderMassStorage.c
patch
|
blob
|
blame
|
history
Bootloaders/MassStorage/BootloaderMassStorage.h
patch
|
blob
|
blame
|
history
Bootloaders/Printer/BootloaderAPI.c
patch
|
blob
|
blame
|
history
Bootloaders/Printer/BootloaderAPI.h
patch
|
blob
|
blame
|
history
Bootloaders/Printer/BootloaderPrinter.c
patch
|
blob
|
blame
|
history
Bootloaders/Printer/BootloaderPrinter.h
patch
|
blob
|
blame
|
history
LUFA/DoxygenPages/ChangeLog.txt
patch
|
blob
|
blame
|
history
diff --git
a/Bootloaders/CDC/BootloaderAPI.c
b/Bootloaders/CDC/BootloaderAPI.c
index
2be1568
..
5198ea7
100644
(file)
--- a/
Bootloaders/CDC/BootloaderAPI.c
+++ b/
Bootloaders/CDC/BootloaderAPI.c
@@
-37,16
+37,22
@@
void BootloaderAPI_ErasePage(const uint32_t Address)
{
void BootloaderAPI_ErasePage(const uint32_t Address)
{
- boot_page_erase_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_erase_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
- boot_page_write_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_write_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@
-71,5
+77,8
@@
uint8_t BootloaderAPI_ReadLock(void)
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
- boot_lock_bits_set_safe(LockBits);
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_lock_bits_set_safe(LockBits);
+ }
}
}
diff --git
a/Bootloaders/CDC/BootloaderAPI.h
b/Bootloaders/CDC/BootloaderAPI.h
index
5169bbc
..
8f119d7
100644
(file)
--- a/
Bootloaders/CDC/BootloaderAPI.h
+++ b/
Bootloaders/CDC/BootloaderAPI.h
@@
-39,6
+39,7
@@
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
+ #include <util/atomic.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
diff --git
a/Bootloaders/CDC/BootloaderCDC.c
b/Bootloaders/CDC/BootloaderCDC.c
index
aa17bc1
..
d386aff
100644
(file)
--- a/
Bootloaders/CDC/BootloaderCDC.c
+++ b/
Bootloaders/CDC/BootloaderCDC.c
@@
-97,7
+97,7
@@
void Application_Jump_Check(void)
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
- if (
boot_lock_fuse_bits_get
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+ if (
BootloaderAPI_ReadFuse
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@
-297,9
+297,6
@@
static void ReadWriteMemoryBlock(const uint8_t Command)
/* Check if command is to read a memory block */
if (Command == AVR109_COMMAND_BlockRead)
{
/* Check if command is to read a memory block */
if (Command == AVR109_COMMAND_BlockRead)
{
- /* Re-enable RWW section */
- boot_rww_enable();
-
while (BlockSize--)
{
if (MemoryType == MEMORY_TYPE_FLASH)
while (BlockSize--)
{
if (MemoryType == MEMORY_TYPE_FLASH)
@@
-332,10
+329,7
@@
static void ReadWriteMemoryBlock(const uint8_t Command)
uint32_t PageStartAddress = CurrAddress;
if (MemoryType == MEMORY_TYPE_FLASH)
uint32_t PageStartAddress = CurrAddress;
if (MemoryType == MEMORY_TYPE_FLASH)
- {
- boot_page_erase(PageStartAddress);
- boot_spm_busy_wait();
- }
+ BootloaderAPI_ErasePage(PageStartAddress);
while (BlockSize--)
{
while (BlockSize--)
{
@@
-345,7
+339,7
@@
static void ReadWriteMemoryBlock(const uint8_t Command)
if (HighByte)
{
/* Write the next FLASH word to the current FLASH page */
if (HighByte)
{
/* Write the next FLASH word to the current FLASH page */
-
boot_page_fill
(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte));
+
BootloaderAPI_FillWord
(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte));
/* Increment the address counter after use */
CurrAddress += 2;
/* Increment the address counter after use */
CurrAddress += 2;
@@
-371,10
+365,7
@@
static void ReadWriteMemoryBlock(const uint8_t Command)
if (MemoryType == MEMORY_TYPE_FLASH)
{
/* Commit the flash page to memory */
if (MemoryType == MEMORY_TYPE_FLASH)
{
/* Commit the flash page to memory */
- boot_page_write(PageStartAddress);
-
- /* Wait until write operation has completed */
- boot_spm_busy_wait();
+ BootloaderAPI_WritePage(PageStartAddress);
}
/* Send response byte back to the host */
}
/* Send response byte back to the host */
@@
-516,12
+507,7
@@
static void CDC_Task(void)
{
/* Clear the application section of flash */
for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
{
/* Clear the application section of flash */
for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
- {
- boot_page_erase(CurrFlashAddress);
- boot_spm_busy_wait();
- boot_page_write(CurrFlashAddress);
- boot_spm_busy_wait();
- }
+ BootloaderAPI_ErasePage(CurrFlashAddress);
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
@@
-530,7
+516,7
@@
static void CDC_Task(void)
else if (Command == AVR109_COMMAND_WriteLockbits)
{
/* Set the lock bits to those given by the host */
else if (Command == AVR109_COMMAND_WriteLockbits)
{
/* Set the lock bits to those given by the host */
-
boot_lock_bits_set
(FetchNextCommandByte());
+
BootloaderAPI_WriteLock
(FetchNextCommandByte());
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
@@
-538,19
+524,19
@@
static void CDC_Task(void)
#endif
else if (Command == AVR109_COMMAND_ReadLockbits)
{
#endif
else if (Command == AVR109_COMMAND_ReadLockbits)
{
- WriteNextResponseByte(
boot_lock_fuse_bits_get(GET_LOCK_BITS
));
+ WriteNextResponseByte(
BootloaderAPI_ReadLock(
));
}
else if (Command == AVR109_COMMAND_ReadLowFuses)
{
}
else if (Command == AVR109_COMMAND_ReadLowFuses)
{
- WriteNextResponseByte(
boot_lock_fuse_bits_get
(GET_LOW_FUSE_BITS));
+ WriteNextResponseByte(
BootloaderAPI_ReadFuse
(GET_LOW_FUSE_BITS));
}
else if (Command == AVR109_COMMAND_ReadHighFuses)
{
}
else if (Command == AVR109_COMMAND_ReadHighFuses)
{
- WriteNextResponseByte(
boot_lock_fuse_bits_get
(GET_HIGH_FUSE_BITS));
+ WriteNextResponseByte(
BootloaderAPI_ReadFuse
(GET_HIGH_FUSE_BITS));
}
else if (Command == AVR109_COMMAND_ReadExtendedFuses)
{
}
else if (Command == AVR109_COMMAND_ReadExtendedFuses)
{
- WriteNextResponseByte(
boot_lock_fuse_bits_get
(GET_EXTENDED_FUSE_BITS));
+ WriteNextResponseByte(
BootloaderAPI_ReadFuse
(GET_EXTENDED_FUSE_BITS));
}
#if !defined(NO_BLOCK_SUPPORT)
else if (Command == AVR109_COMMAND_GetBlockWriteSupport)
}
#if !defined(NO_BLOCK_SUPPORT)
else if (Command == AVR109_COMMAND_GetBlockWriteSupport)
@@
-571,7
+557,7
@@
static void CDC_Task(void)
else if (Command == AVR109_COMMAND_FillFlashPageWordHigh)
{
/* Write the high byte to the current flash page */
else if (Command == AVR109_COMMAND_FillFlashPageWordHigh)
{
/* Write the high byte to the current flash page */
-
boot_page_fill
(CurrAddress, FetchNextCommandByte());
+
BootloaderAPI_FillWord
(CurrAddress, FetchNextCommandByte());
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
@@
-579,7
+565,7
@@
static void CDC_Task(void)
else if (Command == AVR109_COMMAND_FillFlashPageWordLow)
{
/* Write the low byte to the current flash page */
else if (Command == AVR109_COMMAND_FillFlashPageWordLow)
{
/* Write the low byte to the current flash page */
-
boot_page_fill
(CurrAddress | 0x01, FetchNextCommandByte());
+
BootloaderAPI_FillWord
(CurrAddress | 0x01, FetchNextCommandByte());
/* Increment the address */
CurrAddress += 2;
/* Increment the address */
CurrAddress += 2;
@@
-590,10
+576,7
@@
static void CDC_Task(void)
else if (Command == AVR109_COMMAND_WriteFlashPage)
{
/* Commit the flash page to memory */
else if (Command == AVR109_COMMAND_WriteFlashPage)
{
/* Commit the flash page to memory */
- boot_page_write(CurrAddress);
-
- /* Wait until write operation has completed */
- boot_spm_busy_wait();
+ BootloaderAPI_WritePage(CurrAddress);
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
diff --git
a/Bootloaders/DFU/BootloaderAPI.c
b/Bootloaders/DFU/BootloaderAPI.c
index
491c506
..
5198ea7
100644
(file)
--- a/
Bootloaders/DFU/BootloaderAPI.c
+++ b/
Bootloaders/DFU/BootloaderAPI.c
@@
-37,16
+37,22
@@
void BootloaderAPI_ErasePage(const uint32_t Address)
{
void BootloaderAPI_ErasePage(const uint32_t Address)
{
- boot_page_erase_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_erase_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
- boot_page_write_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_write_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@
-71,6
+77,8
@@
uint8_t BootloaderAPI_ReadLock(void)
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
- boot_lock_bits_set_safe(LockBits);
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_lock_bits_set_safe(LockBits);
+ }
}
}
-
diff --git
a/Bootloaders/DFU/BootloaderAPI.h
b/Bootloaders/DFU/BootloaderAPI.h
index
5169bbc
..
8f119d7
100644
(file)
--- a/
Bootloaders/DFU/BootloaderAPI.h
+++ b/
Bootloaders/DFU/BootloaderAPI.h
@@
-39,6
+39,7
@@
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
+ #include <util/atomic.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
diff --git
a/Bootloaders/DFU/BootloaderDFU.c
b/Bootloaders/DFU/BootloaderDFU.c
index
8da725d
..
8e8011f
100644
(file)
--- a/
Bootloaders/DFU/BootloaderDFU.c
+++ b/
Bootloaders/DFU/BootloaderDFU.c
@@
-133,7
+133,7
@@
void Application_Jump_Check(void)
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
- if (
boot_lock_fuse_bits_get
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+ if (
BootloaderAPI_ReadFuse
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@
-351,7
+351,7
@@
void EVENT_USB_Device_ControlRequest(void)
}
/* Write the next word into the current flash page */
}
/* Write the next word into the current flash page */
-
boot_page_fill
(CurrFlashAddress.Long, Endpoint_Read_16_LE());
+
BootloaderAPI_FillWord
(CurrFlashAddress.Long, Endpoint_Read_16_LE());
/* Adjust counters */
WordsInFlashPage += 1;
/* Adjust counters */
WordsInFlashPage += 1;
@@
-361,8
+361,7
@@
void EVENT_USB_Device_ControlRequest(void)
if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining))
{
/* Commit the flash page to memory */
if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining))
{
/* Commit the flash page to memory */
- boot_page_write(CurrFlashPageStartAddress);
- boot_spm_busy_wait();
+ BootloaderAPI_WritePage(CurrFlashPageStartAddress);
/* Check if programming incomplete */
if (WordsRemaining)
/* Check if programming incomplete */
if (WordsRemaining)
@@
-371,17
+370,13
@@
void EVENT_USB_Device_ControlRequest(void)
WordsInFlashPage = 0;
/* Erase next page's temp buffer */
WordsInFlashPage = 0;
/* Erase next page's temp buffer */
- boot_page_erase(CurrFlashAddress.Long);
- boot_spm_busy_wait();
+ BootloaderAPI_ErasePage(CurrFlashAddress.Long);
}
}
}
/* Once programming complete, start address equals the end address */
StartAddr = EndAddr;
}
}
}
/* Once programming complete, start address equals the end address */
StartAddr = EndAddr;
-
- /* Re-enable the RWW section of flash */
- boot_rww_enable();
}
else // Write EEPROM
{
}
else // Write EEPROM
{
@@
-691,8
+686,7
@@
static void ProcessMemProgCommand(void)
} CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
/* Erase the current page's temp buffer */
} CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
/* Erase the current page's temp buffer */
- boot_page_erase(CurrFlashAddress.Long);
- boot_spm_busy_wait();
+ BootloaderAPI_ErasePage(CurrFlashAddress.Long);
}
/* Set the state so that the next DNLOAD requests reads in the firmware */
}
/* Set the state so that the next DNLOAD requests reads in the firmware */
@@
-789,21
+783,9
@@
static void ProcessWriteCommand(void)
}
else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash
{
}
else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash
{
- uint32_t CurrFlashAddress = 0;
-
/* Clear the application section of flash */
/* Clear the application section of flash */
- while (CurrFlashAddress < (uint32_t)BOOT_START_ADDR)
- {
- boot_page_erase(CurrFlashAddress);
- boot_spm_busy_wait();
- boot_page_write(CurrFlashAddress);
- boot_spm_busy_wait();
-
- CurrFlashAddress += SPM_PAGESIZE;
- }
-
- /* Re-enable the RWW section of flash as writing to the flash locks it out */
- boot_rww_enable();
+ for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
+ BootloaderAPI_ErasePage(CurrFlashAddress);
/* Memory has been erased, reset the security bit so that programming/reading is allowed */
IsSecure = false;
/* Memory has been erased, reset the security bit so that programming/reading is allowed */
IsSecure = false;
diff --git
a/Bootloaders/HID/BootloaderHID.c
b/Bootloaders/HID/BootloaderHID.c
index
fa1dd58
..
58c9b3b
100644
(file)
--- a/
Bootloaders/HID/BootloaderHID.c
+++ b/
Bootloaders/HID/BootloaderHID.c
@@
-164,8
+164,11
@@
void EVENT_USB_Device_ControlRequest(void)
else if (PageAddress < BOOT_START_ADDR)
{
/* Erase the given FLASH page, ready to be programmed */
else if (PageAddress < BOOT_START_ADDR)
{
/* Erase the given FLASH page, ready to be programmed */
- boot_page_erase(PageAddress);
- boot_spm_busy_wait();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_erase(PageAddress);
+ boot_spm_busy_wait();
+ }
/* Write each of the FLASH page's bytes in sequence */
for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++)
/* Write each of the FLASH page's bytes in sequence */
for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++)
@@
-182,8
+185,11
@@
void EVENT_USB_Device_ControlRequest(void)
}
/* Write the filled FLASH page to memory */
}
/* Write the filled FLASH page to memory */
- boot_page_write(PageAddress);
- boot_spm_busy_wait();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_write(PageAddress);
+ boot_spm_busy_wait();
+ }
/* Re-enable RWW section */
boot_rww_enable();
/* Re-enable RWW section */
boot_rww_enable();
diff --git
a/Bootloaders/HID/BootloaderHID.h
b/Bootloaders/HID/BootloaderHID.h
index
62ee07d
..
d94ba76
100644
(file)
--- a/
Bootloaders/HID/BootloaderHID.h
+++ b/
Bootloaders/HID/BootloaderHID.h
@@
-42,6
+42,7
@@
#include <avr/boot.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <avr/boot.h>
#include <avr/power.h>
#include <avr/interrupt.h>
+ #include <util/atomic.h>
#include <stdbool.h>
#include "Descriptors.h"
#include <stdbool.h>
#include "Descriptors.h"
diff --git
a/Bootloaders/MassStorage/BootloaderAPI.c
b/Bootloaders/MassStorage/BootloaderAPI.c
index
491c506
..
5198ea7
100644
(file)
--- a/
Bootloaders/MassStorage/BootloaderAPI.c
+++ b/
Bootloaders/MassStorage/BootloaderAPI.c
@@
-37,16
+37,22
@@
void BootloaderAPI_ErasePage(const uint32_t Address)
{
void BootloaderAPI_ErasePage(const uint32_t Address)
{
- boot_page_erase_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_erase_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
- boot_page_write_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_write_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@
-71,6
+77,8
@@
uint8_t BootloaderAPI_ReadLock(void)
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
- boot_lock_bits_set_safe(LockBits);
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_lock_bits_set_safe(LockBits);
+ }
}
}
-
diff --git
a/Bootloaders/MassStorage/BootloaderAPI.h
b/Bootloaders/MassStorage/BootloaderAPI.h
index
4889b4c
..
2ae9009
100644
(file)
--- a/
Bootloaders/MassStorage/BootloaderAPI.h
+++ b/
Bootloaders/MassStorage/BootloaderAPI.h
@@
-39,6
+39,7
@@
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
+ #include <util/atomic.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
diff --git
a/Bootloaders/MassStorage/BootloaderMassStorage.c
b/Bootloaders/MassStorage/BootloaderMassStorage.c
index
6c9697b
..
04f7c1a
100644
(file)
--- a/
Bootloaders/MassStorage/BootloaderMassStorage.c
+++ b/
Bootloaders/MassStorage/BootloaderMassStorage.c
@@
-114,7
+114,7
@@
void Application_Jump_Check(void)
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
- if (
boot_lock_fuse_bits_get
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+ if (
BootloaderAPI_ReadFuse
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
diff --git
a/Bootloaders/MassStorage/BootloaderMassStorage.h
b/Bootloaders/MassStorage/BootloaderMassStorage.h
index
c9ddee4
..
872296d
100644
(file)
--- a/
Bootloaders/MassStorage/BootloaderMassStorage.h
+++ b/
Bootloaders/MassStorage/BootloaderMassStorage.h
@@
-44,6
+44,7
@@
#include <string.h>
#include "Descriptors.h"
#include <string.h>
#include "Descriptors.h"
+ #include "BootloaderAPI.h"
#include "Config/AppConfig.h"
#include "Lib/SCSI.h"
#include "Config/AppConfig.h"
#include "Lib/SCSI.h"
diff --git
a/Bootloaders/Printer/BootloaderAPI.c
b/Bootloaders/Printer/BootloaderAPI.c
index
2be1568
..
5198ea7
100644
(file)
--- a/
Bootloaders/Printer/BootloaderAPI.c
+++ b/
Bootloaders/Printer/BootloaderAPI.c
@@
-37,16
+37,22
@@
void BootloaderAPI_ErasePage(const uint32_t Address)
{
void BootloaderAPI_ErasePage(const uint32_t Address)
{
- boot_page_erase_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_erase_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
}
void BootloaderAPI_WritePage(const uint32_t Address)
{
- boot_page_write_safe(Address);
- boot_spm_busy_wait();
- boot_rww_enable();
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_page_write_safe(Address);
+ boot_spm_busy_wait();
+ boot_rww_enable();
+ }
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
}
void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@
-71,5
+77,8
@@
uint8_t BootloaderAPI_ReadLock(void)
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
void BootloaderAPI_WriteLock(const uint8_t LockBits)
{
- boot_lock_bits_set_safe(LockBits);
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ boot_lock_bits_set_safe(LockBits);
+ }
}
}
diff --git
a/Bootloaders/Printer/BootloaderAPI.h
b/Bootloaders/Printer/BootloaderAPI.h
index
c2d9b4a
..
4cef6d6
100644
(file)
--- a/
Bootloaders/Printer/BootloaderAPI.h
+++ b/
Bootloaders/Printer/BootloaderAPI.h
@@
-39,6
+39,7
@@
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
/* Includes: */
#include <avr/io.h>
#include <avr/boot.h>
+ #include <util/atomic.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
diff --git
a/Bootloaders/Printer/BootloaderPrinter.c
b/Bootloaders/Printer/BootloaderPrinter.c
index
9021f99
..
90321d4
100644
(file)
--- a/
Bootloaders/Printer/BootloaderPrinter.c
+++ b/
Bootloaders/Printer/BootloaderPrinter.c
@@
-146,7
+146,7
@@
void Application_Jump_Check(void)
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
JTAG_ENABLE();
#else
/* Check if the device's BOOTRST fuse is set */
- if (
boot_lock_fuse_bits_get
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+ if (
BootloaderAPI_ReadFuse
(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
{
/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@
-221,8
+221,7
@@
static void FlushPageIfRequired(void)
uint32_t NewPageStartAddress = (HEXParser.CurrAddress & ~(SPM_PAGESIZE - 1));
if (HEXParser.PageStartAddress != NewPageStartAddress)
{
uint32_t NewPageStartAddress = (HEXParser.CurrAddress & ~(SPM_PAGESIZE - 1));
if (HEXParser.PageStartAddress != NewPageStartAddress)
{
- boot_page_write(HEXParser.PageStartAddress);
- boot_spm_busy_wait();
+ BootloaderAPI_WritePage(HEXParser.PageStartAddress);
HEXParser.PageStartAddress = NewPageStartAddress;
HEXParser.PageStartAddress = NewPageStartAddress;
@@
-321,14
+320,13
@@
static void ParseIntelHEXByte(const char ReadCharacter)
/* If we are writing to a new page, we need to erase it first */
if (!(PageDirty))
{
/* If we are writing to a new page, we need to erase it first */
if (!(PageDirty))
{
- boot_page_erase(HEXParser.PageStartAddress);
- boot_spm_busy_wait();
+ BootloaderAPI_ErasePage(HEXParser.PageStartAddress);
PageDirty = true;
}
/* Fill the FLASH memory buffer with the new word of data */
PageDirty = true;
}
/* Fill the FLASH memory buffer with the new word of data */
-
boot_page_fill
(HEXParser.CurrAddress, NewDataWord);
+
BootloaderAPI_FillWord
(HEXParser.CurrAddress, NewDataWord);
HEXParser.CurrAddress += 2;
/* Flush the FLASH page to physical memory if we are crossing a page boundary */
HEXParser.CurrAddress += 2;
/* Flush the FLASH page to physical memory if we are crossing a page boundary */
diff --git
a/Bootloaders/Printer/BootloaderPrinter.h
b/Bootloaders/Printer/BootloaderPrinter.h
index
8bc1a68
..
7146a59
100644
(file)
--- a/
Bootloaders/Printer/BootloaderPrinter.h
+++ b/
Bootloaders/Printer/BootloaderPrinter.h
@@
-43,6
+43,7
@@
#include <avr/interrupt.h>
#include "Descriptors.h"
#include <avr/interrupt.h>
#include "Descriptors.h"
+ #include "BootloaderAPI.h"
#include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/USB/USB.h>
diff --git
a/LUFA/DoxygenPages/ChangeLog.txt
b/LUFA/DoxygenPages/ChangeLog.txt
index
7d6931d
..
da8a658
100644
(file)
--- a/
LUFA/DoxygenPages/ChangeLog.txt
+++ b/
LUFA/DoxygenPages/ChangeLog.txt
@@
-10,6
+10,8
@@
* <b>Fixed:</b>
* - Core:
* - Fixed DeviceUsesOUTPipe flag not being set correctly in the HID host class driver (thanks to Wolfgang Schnerring)
* <b>Fixed:</b>
* - Core:
* - Fixed DeviceUsesOUTPipe flag not being set correctly in the HID host class driver (thanks to Wolfgang Schnerring)
+ * - Library Applications:
+ * - Fixed bootloaders not disabling global interrupts during erase and write operations (thanks to Zoltan)
*
* \section Sec_ChangeLog170418 Version 170418
* <b>New:</b>
*
* \section Sec_ChangeLog170418 Version 170418
* <b>New:</b>