mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-17 13:12:08 +00:00
Add human readable definitions for the AVR109 protocol commands in the CDC class bootloader.
This commit is contained in:
parent
302ec480cc
commit
603a7d86e9
@ -245,7 +245,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
|||||||
|
|
||||||
MemoryType = FetchNextCommandByte();
|
MemoryType = FetchNextCommandByte();
|
||||||
|
|
||||||
if ((MemoryType != 'E') && (MemoryType != 'F'))
|
if ((MemoryType != MEMORY_TYPE_FLASH) && (MemoryType != MEMORY_TYPE_EEPROM))
|
||||||
{
|
{
|
||||||
/* Send error byte back to the host */
|
/* Send error byte back to the host */
|
||||||
WriteNextResponseByte('?');
|
WriteNextResponseByte('?');
|
||||||
@ -253,15 +253,15 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if command is to read memory */
|
/* Check if command is to read a memory block */
|
||||||
if (Command == 'g')
|
if (Command == AVR109_COMMAND_BlockRead)
|
||||||
{
|
{
|
||||||
/* Re-enable RWW section */
|
/* Re-enable RWW section */
|
||||||
boot_rww_enable();
|
boot_rww_enable();
|
||||||
|
|
||||||
while (BlockSize--)
|
while (BlockSize--)
|
||||||
{
|
{
|
||||||
if (MemoryType == 'F')
|
if (MemoryType == MEMORY_TYPE_FLASH)
|
||||||
{
|
{
|
||||||
/* Read the next FLASH byte from the current FLASH page */
|
/* Read the next FLASH byte from the current FLASH page */
|
||||||
#if (FLASHEND > 0xFFFF)
|
#if (FLASHEND > 0xFFFF)
|
||||||
@ -290,7 +290,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
|||||||
{
|
{
|
||||||
uint32_t PageStartAddress = CurrAddress;
|
uint32_t PageStartAddress = CurrAddress;
|
||||||
|
|
||||||
if (MemoryType == 'F')
|
if (MemoryType == MEMORY_TYPE_FLASH)
|
||||||
{
|
{
|
||||||
boot_page_erase(PageStartAddress);
|
boot_page_erase(PageStartAddress);
|
||||||
boot_spm_busy_wait();
|
boot_spm_busy_wait();
|
||||||
@ -298,7 +298,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
|||||||
|
|
||||||
while (BlockSize--)
|
while (BlockSize--)
|
||||||
{
|
{
|
||||||
if (MemoryType == 'F')
|
if (MemoryType == MEMORY_TYPE_FLASH)
|
||||||
{
|
{
|
||||||
/* If both bytes in current word have been written, increment the address counter */
|
/* If both bytes in current word have been written, increment the address counter */
|
||||||
if (HighByte)
|
if (HighByte)
|
||||||
@ -327,7 +327,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If in FLASH programming mode, commit the page after writing */
|
/* If in FLASH programming mode, commit the page after writing */
|
||||||
if (MemoryType == 'F')
|
if (MemoryType == MEMORY_TYPE_FLASH)
|
||||||
{
|
{
|
||||||
/* Commit the flash page to memory */
|
/* Commit the flash page to memory */
|
||||||
boot_page_write(PageStartAddress);
|
boot_page_write(PageStartAddress);
|
||||||
@ -409,37 +409,38 @@ static void CDC_Task(void)
|
|||||||
/* Read in the bootloader command (first byte sent from host) */
|
/* Read in the bootloader command (first byte sent from host) */
|
||||||
uint8_t Command = FetchNextCommandByte();
|
uint8_t Command = FetchNextCommandByte();
|
||||||
|
|
||||||
if (Command == 'E')
|
if (Command == AVR109_COMMAND_ExitBootloader)
|
||||||
{
|
{
|
||||||
RunBootloader = false;
|
RunBootloader = false;
|
||||||
|
|
||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'T')
|
else if ((Command == AVR109_COMMAND_SetLED) || (Command == AVR109_COMMAND_ClearLED) ||
|
||||||
|
(Command == AVR109_COMMAND_SelectDeviceType))
|
||||||
{
|
{
|
||||||
FetchNextCommandByte();
|
FetchNextCommandByte();
|
||||||
|
|
||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if ((Command == 'L') || (Command == 'P'))
|
else if ((Command == AVR109_COMMAND_EnterProgrammingMode) || (Command == AVR109_COMMAND_LeaveProgrammingMode))
|
||||||
{
|
{
|
||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 't')
|
else if (Command == AVR109_COMMAND_ReadPartCode)
|
||||||
{
|
{
|
||||||
/* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */
|
/* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */
|
||||||
WriteNextResponseByte(0x44);
|
WriteNextResponseByte(0x44);
|
||||||
WriteNextResponseByte(0x00);
|
WriteNextResponseByte(0x00);
|
||||||
}
|
}
|
||||||
else if (Command == 'a')
|
else if (Command == AVR109_COMMAND_ReadAutoAddressIncrement)
|
||||||
{
|
{
|
||||||
/* Indicate auto-address increment is supported */
|
/* Indicate auto-address increment is supported */
|
||||||
WriteNextResponseByte('Y');
|
WriteNextResponseByte('Y');
|
||||||
}
|
}
|
||||||
else if (Command == 'A')
|
else if (Command == AVR109_COMMAND_SetCurrentAddress)
|
||||||
{
|
{
|
||||||
/* Set the current address to that given by the host */
|
/* Set the current address to that given by the host */
|
||||||
CurrAddress = (FetchNextCommandByte() << 9);
|
CurrAddress = (FetchNextCommandByte() << 9);
|
||||||
@ -448,29 +449,29 @@ static void CDC_Task(void)
|
|||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'p')
|
else if (Command == AVR109_COMMAND_ReadBootloaderInterface)
|
||||||
{
|
{
|
||||||
/* Indicate serial programmer back to the host */
|
/* Indicate serial programmer back to the host */
|
||||||
WriteNextResponseByte('S');
|
WriteNextResponseByte('S');
|
||||||
}
|
}
|
||||||
else if (Command == 'S')
|
else if (Command == AVR109_COMMAND_ReadBootloaderIdentifier)
|
||||||
{
|
{
|
||||||
/* Write the 7-byte software identifier to the endpoint */
|
/* Write the 7-byte software identifier to the endpoint */
|
||||||
for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++)
|
for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++)
|
||||||
WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]);
|
WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]);
|
||||||
}
|
}
|
||||||
else if (Command == 'V')
|
else if (Command == AVR109_COMMAND_ReadBootloaderVersion)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR);
|
WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR);
|
||||||
WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR);
|
WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR);
|
||||||
}
|
}
|
||||||
else if (Command == 's')
|
else if (Command == AVR109_COMMAND_ReadSignature)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte(AVR_SIGNATURE_3);
|
WriteNextResponseByte(AVR_SIGNATURE_3);
|
||||||
WriteNextResponseByte(AVR_SIGNATURE_2);
|
WriteNextResponseByte(AVR_SIGNATURE_2);
|
||||||
WriteNextResponseByte(AVR_SIGNATURE_1);
|
WriteNextResponseByte(AVR_SIGNATURE_1);
|
||||||
}
|
}
|
||||||
else if (Command == 'e')
|
else if (Command == AVR109_COMMAND_EraseFLASH)
|
||||||
{
|
{
|
||||||
/* Clear the application section of flash */
|
/* Clear the application section of flash */
|
||||||
for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
|
for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
|
||||||
@ -485,7 +486,7 @@ static void CDC_Task(void)
|
|||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
#if !defined(NO_LOCK_BYTE_WRITE_SUPPORT)
|
#if !defined(NO_LOCK_BYTE_WRITE_SUPPORT)
|
||||||
else if (Command == 'l')
|
else if (Command == AVR109_COMMAND_WriteLockbits)
|
||||||
{
|
{
|
||||||
/* Set the lock bits to those given by the host */
|
/* Set the lock bits to those given by the host */
|
||||||
boot_lock_bits_set(FetchNextCommandByte());
|
boot_lock_bits_set(FetchNextCommandByte());
|
||||||
@ -494,24 +495,24 @@ static void CDC_Task(void)
|
|||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (Command == 'r')
|
else if (Command == AVR109_COMMAND_ReadLockbits)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS));
|
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS));
|
||||||
}
|
}
|
||||||
else if (Command == 'F')
|
else if (Command == AVR109_COMMAND_ReadLowFuses)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS));
|
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS));
|
||||||
}
|
}
|
||||||
else if (Command == 'N')
|
else if (Command == AVR109_COMMAND_ReadHighFuses)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS));
|
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS));
|
||||||
}
|
}
|
||||||
else if (Command == 'Q')
|
else if (Command == AVR109_COMMAND_ReadExtendedFuses)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS));
|
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS));
|
||||||
}
|
}
|
||||||
#if !defined(NO_BLOCK_SUPPORT)
|
#if !defined(NO_BLOCK_SUPPORT)
|
||||||
else if (Command == 'b')
|
else if (Command == AVR109_COMMAND_GetBlockWriteSupport)
|
||||||
{
|
{
|
||||||
WriteNextResponseByte('Y');
|
WriteNextResponseByte('Y');
|
||||||
|
|
||||||
@ -519,14 +520,14 @@ static void CDC_Task(void)
|
|||||||
WriteNextResponseByte(SPM_PAGESIZE >> 8);
|
WriteNextResponseByte(SPM_PAGESIZE >> 8);
|
||||||
WriteNextResponseByte(SPM_PAGESIZE & 0xFF);
|
WriteNextResponseByte(SPM_PAGESIZE & 0xFF);
|
||||||
}
|
}
|
||||||
else if ((Command == 'B') || (Command == 'g'))
|
else if ((Command == AVR109_COMMAND_BlockWrite) || (Command == AVR109_COMMAND_BlockRead))
|
||||||
{
|
{
|
||||||
/* Delegate the block write/read to a separate function for clarity */
|
/* Delegate the block write/read to a separate function for clarity */
|
||||||
ReadWriteMemoryBlock(Command);
|
ReadWriteMemoryBlock(Command);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NO_FLASH_BYTE_SUPPORT)
|
#if !defined(NO_FLASH_BYTE_SUPPORT)
|
||||||
else if (Command == 'C')
|
else if (Command == AVR109_COMMAND_FillFlashPageWordHigh)
|
||||||
{
|
{
|
||||||
/* Write the high byte to the current flash page */
|
/* Write the high byte to the current flash page */
|
||||||
boot_page_fill(CurrAddress, FetchNextCommandByte());
|
boot_page_fill(CurrAddress, FetchNextCommandByte());
|
||||||
@ -534,7 +535,7 @@ static void CDC_Task(void)
|
|||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'c')
|
else if (Command == AVR109_COMMAND_FillFlashPageWordLow)
|
||||||
{
|
{
|
||||||
/* Write the low byte to the current flash page */
|
/* Write the low byte to the current flash page */
|
||||||
boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte());
|
boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte());
|
||||||
@ -545,7 +546,7 @@ static void CDC_Task(void)
|
|||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'm')
|
else if (Command == AVR109_COMMAND_WriteFlashPage)
|
||||||
{
|
{
|
||||||
/* Commit the flash page to memory */
|
/* Commit the flash page to memory */
|
||||||
boot_page_write(CurrAddress);
|
boot_page_write(CurrAddress);
|
||||||
@ -556,7 +557,7 @@ static void CDC_Task(void)
|
|||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'R')
|
else if (Command == AVR109_COMMAND_ReadFLASHWord)
|
||||||
{
|
{
|
||||||
#if (FLASHEND > 0xFFFF)
|
#if (FLASHEND > 0xFFFF)
|
||||||
uint16_t ProgramWord = pgm_read_word_far(CurrAddress);
|
uint16_t ProgramWord = pgm_read_word_far(CurrAddress);
|
||||||
@ -569,7 +570,7 @@ static void CDC_Task(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NO_EEPROM_BYTE_SUPPORT)
|
#if !defined(NO_EEPROM_BYTE_SUPPORT)
|
||||||
else if (Command == 'D')
|
else if (Command == AVR109_COMMAND_WriteEEPROM)
|
||||||
{
|
{
|
||||||
/* Read the byte from the endpoint and write it to the EEPROM */
|
/* Read the byte from the endpoint and write it to the EEPROM */
|
||||||
eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
|
eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
|
||||||
@ -580,7 +581,7 @@ static void CDC_Task(void)
|
|||||||
/* Send confirmation byte back to the host */
|
/* Send confirmation byte back to the host */
|
||||||
WriteNextResponseByte('\r');
|
WriteNextResponseByte('\r');
|
||||||
}
|
}
|
||||||
else if (Command == 'd')
|
else if (Command == AVR109_COMMAND_ReadEEPROM)
|
||||||
{
|
{
|
||||||
/* Read the EEPROM byte and write it to the endpoint */
|
/* Read the EEPROM byte and write it to the endpoint */
|
||||||
WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1))));
|
WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1))));
|
||||||
@ -589,7 +590,7 @@ static void CDC_Task(void)
|
|||||||
CurrAddress += 2;
|
CurrAddress += 2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (Command != 27)
|
else if (Command != AVR109_COMMAND_Sync)
|
||||||
{
|
{
|
||||||
/* Unknown (non-sync) command, return fail code */
|
/* Unknown (non-sync) command, return fail code */
|
||||||
WriteNextResponseByte('?');
|
WriteNextResponseByte('?');
|
||||||
|
@ -65,11 +65,53 @@
|
|||||||
/** Hardware version minor of the CDC bootloader. */
|
/** Hardware version minor of the CDC bootloader. */
|
||||||
#define BOOTLOADER_HWVERSION_MINOR 0x00
|
#define BOOTLOADER_HWVERSION_MINOR 0x00
|
||||||
|
|
||||||
/** Eight character bootloader firmware identifier reported to the host when requested */
|
/** Eight character bootloader firmware identifier reported to the host when requested. */
|
||||||
#define SOFTWARE_IDENTIFIER "LUFACDC"
|
#define SOFTWARE_IDENTIFIER "LUFACDC"
|
||||||
|
|
||||||
/** Magic bootloader key to unlock forced application start mode. */
|
/** Magic bootloader key to unlock forced application start mode. */
|
||||||
#define MAGIC_BOOT_KEY 0xDC42
|
#define MAGIC_BOOT_KEY 0xDC42
|
||||||
|
|
||||||
|
/* Enums: */
|
||||||
|
/** Possible memory types that can be addressed via the bootloader. */
|
||||||
|
enum AVR109_Memories
|
||||||
|
{
|
||||||
|
MEMORY_TYPE_FLASH = 'F',
|
||||||
|
MEMORY_TYPE_EEPROM = 'E',
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Possible commands that can be issued to the bootloader. */
|
||||||
|
enum AVR109_Commands
|
||||||
|
{
|
||||||
|
AVR109_COMMAND_Sync = 27,
|
||||||
|
AVR109_COMMAND_ReadEEPROM = 'd',
|
||||||
|
AVR109_COMMAND_WriteEEPROM = 'D',
|
||||||
|
AVR109_COMMAND_ReadFLASHWord = 'R',
|
||||||
|
AVR109_COMMAND_WriteFlashPage = 'm',
|
||||||
|
AVR109_COMMAND_FillFlashPageWordLow = 'c',
|
||||||
|
AVR109_COMMAND_FillFlashPageWordHigh = 'C',
|
||||||
|
AVR109_COMMAND_GetBlockWriteSupport = 'b',
|
||||||
|
AVR109_COMMAND_BlockWrite = 'B',
|
||||||
|
AVR109_COMMAND_BlockRead = 'g',
|
||||||
|
AVR109_COMMAND_ReadExtendedFuses = 'Q',
|
||||||
|
AVR109_COMMAND_ReadHighFuses = 'N',
|
||||||
|
AVR109_COMMAND_ReadLowFuses = 'F',
|
||||||
|
AVR109_COMMAND_ReadLockbits = 'r',
|
||||||
|
AVR109_COMMAND_WriteLockbits = 'l',
|
||||||
|
AVR109_COMMAND_EraseFLASH = 'e',
|
||||||
|
AVR109_COMMAND_ReadSignature = 's',
|
||||||
|
AVR109_COMMAND_ReadBootloaderVersion = 'V',
|
||||||
|
AVR109_COMMAND_ReadBootloaderIdentifier = 'S',
|
||||||
|
AVR109_COMMAND_ReadBootloaderInterface = 'p',
|
||||||
|
AVR109_COMMAND_SetCurrentAddress = 'A',
|
||||||
|
AVR109_COMMAND_ReadAutoAddressIncrement = 'a',
|
||||||
|
AVR109_COMMAND_ReadPartCode = 't',
|
||||||
|
AVR109_COMMAND_EnterProgrammingMode = 'P',
|
||||||
|
AVR109_COMMAND_LeaveProgrammingMode = 'L',
|
||||||
|
AVR109_COMMAND_SelectDeviceType = 'T',
|
||||||
|
AVR109_COMMAND_SetLED = 'x',
|
||||||
|
AVR109_COMMAND_ClearLED = 'y',
|
||||||
|
AVR109_COMMAND_ExitBootloader = 'E',
|
||||||
|
};
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for a non-returning pointer to the start of the loaded application in flash memory. */
|
/** Type define for a non-returning pointer to the start of the loaded application in flash memory. */
|
||||||
|
Loading…
Reference in New Issue
Block a user