Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
603a7d86
Commit
603a7d86
authored
Aug 27, 2012
by
Dean Camera
Browse files
Add human readable definitions for the AVR109 protocol commands in the CDC class bootloader.
parent
302ec480
Changes
2
Show whitespace changes
Inline
Side-by-side
Bootloaders/CDC/BootloaderCDC.c
View file @
603a7d86
...
...
@@ -245,7 +245,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
MemoryType
=
FetchNextCommandByte
();
if
((
MemoryType
!=
'E'
)
&&
(
MemoryType
!=
'F'
))
if
((
MemoryType
!=
MEMORY_TYPE_FLASH
)
&&
(
MemoryType
!=
MEMORY_TYPE_EEPROM
))
{
/* Send error byte back to the host */
WriteNextResponseByte
(
'?'
);
...
...
@@ -253,15 +253,15 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
return
;
}
/* Check if command is to read memory */
if
(
Command
==
'g'
)
/* 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
==
'F'
)
if
(
MemoryType
==
MEMORY_TYPE_FLASH
)
{
/* Read the next FLASH byte from the current FLASH page */
#if (FLASHEND > 0xFFFF)
...
...
@@ -290,7 +290,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
{
uint32_t
PageStartAddress
=
CurrAddress
;
if
(
MemoryType
==
'F'
)
if
(
MemoryType
==
MEMORY_TYPE_FLASH
)
{
boot_page_erase
(
PageStartAddress
);
boot_spm_busy_wait
();
...
...
@@ -298,7 +298,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
while
(
BlockSize
--
)
{
if
(
MemoryType
==
'F'
)
if
(
MemoryType
==
MEMORY_TYPE_FLASH
)
{
/* If both bytes in current word have been written, increment the address counter */
if
(
HighByte
)
...
...
@@ -327,7 +327,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
}
/* If in FLASH programming mode, commit the page after writing */
if
(
MemoryType
==
'F'
)
if
(
MemoryType
==
MEMORY_TYPE_FLASH
)
{
/* Commit the flash page to memory */
boot_page_write
(
PageStartAddress
);
...
...
@@ -409,37 +409,38 @@ static void CDC_Task(void)
/* Read in the bootloader command (first byte sent from host) */
uint8_t
Command
=
FetchNextCommandByte
();
if
(
Command
==
'E'
)
if
(
Command
==
AVR109_COMMAND_ExitBootloader
)
{
RunBootloader
=
false
;
/* Send confirmation byte back to the host */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'T'
)
else
if
((
Command
==
AVR109_COMMAND_SetLED
)
||
(
Command
==
AVR109_COMMAND_ClearLED
)
||
(
Command
==
AVR109_COMMAND_SelectDeviceType
))
{
FetchNextCommandByte
();
/* Send confirmation byte back to the host */
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 */
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 */
WriteNextResponseByte
(
0x44
);
WriteNextResponseByte
(
0x00
);
}
else
if
(
Command
==
'a'
)
else
if
(
Command
==
AVR109_COMMAND_ReadAutoAddressIncrement
)
{
/* Indicate auto-address increment is supported */
WriteNextResponseByte
(
'Y'
);
}
else
if
(
Command
==
'A'
)
else
if
(
Command
==
AVR109_COMMAND_SetCurrentAddress
)
{
/* Set the current address to that given by the host */
CurrAddress
=
(
FetchNextCommandByte
()
<<
9
);
...
...
@@ -448,29 +449,29 @@ static void CDC_Task(void)
/* Send confirmation byte back to the host */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'p'
)
else
if
(
Command
==
AVR109_COMMAND_ReadBootloaderInterface
)
{
/* Indicate serial programmer back to the host */
WriteNextResponseByte
(
'S'
);
}
else
if
(
Command
==
'S'
)
else
if
(
Command
==
AVR109_COMMAND_ReadBootloaderIdentifier
)
{
/* Write the 7-byte software identifier to the endpoint */
for
(
uint8_t
CurrByte
=
0
;
CurrByte
<
7
;
CurrByte
++
)
WriteNextResponseByte
(
SOFTWARE_IDENTIFIER
[
CurrByte
]);
}
else
if
(
Command
==
'V'
)
else
if
(
Command
==
AVR109_COMMAND_ReadBootloaderVersion
)
{
WriteNextResponseByte
(
'0'
+
BOOTLOADER_VERSION_MAJOR
);
WriteNextResponseByte
(
'0'
+
BOOTLOADER_VERSION_MINOR
);
}
else
if
(
Command
==
's'
)
else
if
(
Command
==
AVR109_COMMAND_ReadSignature
)
{
WriteNextResponseByte
(
AVR_SIGNATURE_3
);
WriteNextResponseByte
(
AVR_SIGNATURE_2
);
WriteNextResponseByte
(
AVR_SIGNATURE_1
);
}
else
if
(
Command
==
'e'
)
else
if
(
Command
==
AVR109_COMMAND_EraseFLASH
)
{
/* Clear the application section of flash */
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'
);
}
#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 */
boot_lock_bits_set
(
FetchNextCommandByte
());
...
...
@@ -494,24 +495,24 @@ static void CDC_Task(void)
WriteNextResponseByte
(
'\r'
);
}
#endif
else
if
(
Command
==
'r'
)
else
if
(
Command
==
AVR109_COMMAND_ReadLockbits
)
{
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
));
}
else
if
(
Command
==
'N'
)
else
if
(
Command
==
AVR109_COMMAND_ReadHighFuses
)
{
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
));
}
#if !defined(NO_BLOCK_SUPPORT)
else
if
(
Command
==
'b'
)
else
if
(
Command
==
AVR109_COMMAND_GetBlockWriteSupport
)
{
WriteNextResponseByte
(
'Y'
);
...
...
@@ -519,14 +520,14 @@ static void CDC_Task(void)
WriteNextResponseByte
(
SPM_PAGESIZE
>>
8
);
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 */
ReadWriteMemoryBlock
(
Command
);
}
#endif
#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 */
boot_page_fill
(
CurrAddress
,
FetchNextCommandByte
());
...
...
@@ -534,7 +535,7 @@ static void CDC_Task(void)
/* Send confirmation byte back to the host */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'c'
)
else
if
(
Command
==
AVR109_COMMAND_FillFlashPageWordLow
)
{
/* Write the low byte to the current flash page */
boot_page_fill
(
CurrAddress
|
0x01
,
FetchNextCommandByte
());
...
...
@@ -545,7 +546,7 @@ static void CDC_Task(void)
/* Send confirmation byte back to the host */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'm'
)
else
if
(
Command
==
AVR109_COMMAND_WriteFlashPage
)
{
/* Commit the flash page to memory */
boot_page_write
(
CurrAddress
);
...
...
@@ -556,7 +557,7 @@ static void CDC_Task(void)
/* Send confirmation byte back to the host */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'R'
)
else
if
(
Command
==
AVR109_COMMAND_ReadFLASHWord
)
{
#if (FLASHEND > 0xFFFF)
uint16_t
ProgramWord
=
pgm_read_word_far
(
CurrAddress
);
...
...
@@ -569,7 +570,7 @@ static void CDC_Task(void)
}
#endif
#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 */
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 */
WriteNextResponseByte
(
'\r'
);
}
else
if
(
Command
==
'd'
)
else
if
(
Command
==
AVR109_COMMAND_ReadEEPROM
)
{
/* Read the EEPROM byte and write it to the endpoint */
WriteNextResponseByte
(
eeprom_read_byte
((
uint8_t
*
)((
intptr_t
)(
CurrAddress
>>
1
))));
...
...
@@ -589,7 +590,7 @@ static void CDC_Task(void)
CurrAddress
+=
2
;
}
#endif
else
if
(
Command
!=
27
)
else
if
(
Command
!=
AVR109_COMMAND_Sync
)
{
/* Unknown (non-sync) command, return fail code */
WriteNextResponseByte
(
'?'
);
...
...
Bootloaders/CDC/BootloaderCDC.h
View file @
603a7d86
...
...
@@ -65,12 +65,54 @@
/** Hardware version minor of the CDC bootloader. */
#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"
/** Magic bootloader key to unlock forced application start mode. */
#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 define for a non-returning pointer to the start of the loaded application in flash memory. */
typedef
void
(
*
AppPtr_t
)(
void
)
ATTR_NO_RETURN
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment