/*
LUFA Library
- Copyright (C) Dean Camera, 2014.
+ Copyright (C) Dean Camera, 2018.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
- Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2018 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
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))
CDC_Task();
USB_USBTask();
}
-
+
/* Wait a short time to end all USB transactions and then disconnect */
_delay_us(1000);
/* 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)
uint32_t PageStartAddress = CurrAddress;
if (MemoryType == MEMORY_TYPE_FLASH)
- {
- boot_page_erase(PageStartAddress);
- boot_spm_busy_wait();
- }
+ BootloaderAPI_ErasePage(PageStartAddress);
while (BlockSize--)
{
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;
else
{
/* Write the next EEPROM byte from the endpoint */
- eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
+ eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
/* Increment the address counter after use */
CurrAddress += 2;
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 */
{
/* 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');
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');
#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)
{
- WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS));
+ WriteNextResponseByte(BootloaderAPI_ReadFuse(GET_LOW_FUSE_BITS));
}
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)
{
- 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)
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');
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;
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');
else if (Command == AVR109_COMMAND_WriteEEPROM)
{
/* Read the byte from the endpoint and write it to the EEPROM */
- eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
+ eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
/* Increment the address after use */
CurrAddress += 2;
/* Acknowledge the command from the host */
Endpoint_ClearOUT();
}
-