Add human readable definitions for the AVR109 protocol commands in the CDC class bootloader.

pull/1469/head
Dean Camera 12 years ago
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…
Cancel
Save