Commit 7cac5e22 authored by Dean Camera's avatar Dean Camera
Browse files

Added additional bootloader API data to expose the bootloader start address...

Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders.
parent 5e5b7cf2
......@@ -43,6 +43,10 @@ BootloaderAPI_JumpTable:
rjmp BootloaderAPI_ReadLock
rjmp BootloaderAPI_WriteLock
; Bootloader table signature
; Bootloader table signatures and information
.org 24
.long BOOT_START_ADDR ; Start address of the bootloader
.org 28
.word 0xCDC1 ; Signature for the CDC class bootloader, V1
.org 30
.word 0xDCFB
.word 0xDCFB ; Signature for a LUFA class bootloader
......@@ -95,22 +95,31 @@
* following layout:
*
* \code
* #define BOOTLOADER_API_START(Index) (void*)(((FLASHEND - 32) + (2 * Index)) / 2)
* void (*BootloaderAPI_ErasePage)(uint32_t Address) = BOOTLOADER_API_START(0);
* void (*BootloaderAPI_WritePage)(uint32_t Address) = BOOTLOADER_API_START(1);
* void (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_START(2);
* uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address) = BOOTLOADER_API_START(3);
* uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address) = BOOTLOADER_API_START(4);
* uint8_t (*BootloaderAPI_ReadLock)(void) = BOOTLOADER_API_START(5);
* void (*BootloaderAPI_WriteLock)(uint8_t LockBits) = BOOTLOADER_API_START(6);
*
* #define BOOTLOADER_SIG_START (FLASHEND - 32)
* #define BOOTLOADER_SIGNATURE 0xDCFB
* #define BOOTLOADER_API_CALL(Index) (void*)(((FLASHEND - 32) + (2 * Index)) / 2)
*
* void (*BootloaderAPI_ErasePage)(uint32_t Address) = BOOTLOADER_API_CALL(0);
* void (*BootloaderAPI_WritePage)(uint32_t Address) = BOOTLOADER_API_CALL(1);
* void (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_CALL(2);
* uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address) = BOOTLOADER_API_CALL(3);
* uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address) = BOOTLOADER_API_CALL(4);
* uint8_t (*BootloaderAPI_ReadLock)(void) = BOOTLOADER_API_CALL(5);
* void (*BootloaderAPI_WriteLock)(uint8_t LockBits) = BOOTLOADER_API_CALL(6);
*
* #define BOOTLOADER_MAGIC_SIGNATURE_START (FLASHEND - 2)
* #define BOOTLOADER_MAGIC_SIGNATURE 0xDCFB
*
* #define BOOTLOADER_CLASS_SIGNATURE_START (FLASHEND - 4)
* #define BOOTLOADER_CDC_SIGNATURE 0xCDC1
*
* #define BOOTLOADER_ADDRESS_START (FLASHEND - 8)
* #define BOOTLOADER_ADDRESS_LENGTH 4
* \endcode
*
* Bootloaders reporting a device release revision number of 1.00 or greater are bootloader API enabled. From the application
* the API support of the bootloader can be detected by reading the FLASH memory bytes located at address \c BOOTLOADER_SIG_START
* and comparing them to the value \c BOOTLOADER_SIGNATURE.
* the API support of the bootloader can be detected by reading the FLASH memory bytes located at address \c BOOTLOADER_MAGIC_SIGNATURE_START
* and comparing them to the value \c BOOTLOADER_MAGIC_SIGNATURE. The class of bootloader can be determined by reading the
* FLASH memory bytes located at address \c BOOTLOADER_CLASS_SIGNATURE_START and comparing them to the value \c BOOTLOADER_CDC_SIGNATURE.
* The start address of the bootloader can be retrieved by reading the bytes of FLASH memory starting from address \c BOOTLOADER_ADDRESS_START.
*
* \section Sec_Options Project Options
*
......
......@@ -207,7 +207,7 @@ CDEFS += $(LUFA_OPTS)
ADEFS = -DF_CPU=$(F_CPU)
ADEFS += -DF_USB=$(F_USB)UL
ADEFS += -DBOARD=BOARD_$(BOARD)
ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL
ADEFS += -DBOOT_START_ADDR=$(BOOT_START)
ADEFS += $(LUFA_OPTS)
......
......@@ -43,6 +43,10 @@ BootloaderAPI_JumpTable:
rjmp BootloaderAPI_ReadLock
rjmp BootloaderAPI_WriteLock
; Bootloader table signature
; Bootloader table signatures and information
.org 24
.long BOOT_START_ADDR ; Start address of the bootloader
.org 28
.word 0xDFB1 ; Signature for the DFU class bootloader, V1
.org 30
.word 0xDCFB
.word 0xDCFB ; Signature for a LUFA class bootloader
......@@ -100,21 +100,31 @@
* following layout:
*
* \code
* #define BOOTLOADER_API_START(Index) (void*)(((FLASHEND - 32) + (2 * Index)) / 2)
* void (*BootloaderAPI_ErasePage)(uint32_t Address) = BOOTLOADER_API_START(0);
* void (*BootloaderAPI_WritePage)(uint32_t Address) = BOOTLOADER_API_START(1);
* void (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_START(2);
* uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address) = BOOTLOADER_API_START(3);
* uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address) = BOOTLOADER_API_START(4);
* uint8_t (*BootloaderAPI_ReadLock)(void) = BOOTLOADER_API_START(5);
* void (*BootloaderAPI_WriteLock)(uint8_t LockBits) = BOOTLOADER_API_START(6);
*
* #define BOOTLOADER_SIG_START (FLASHEND - 32)
* #define BOOTLOADER_SIGNATURE 0xDCFB
* #define BOOTLOADER_API_CALL(Index) (void*)(((FLASHEND - 32) + (2 * Index)) / 2)
*
* void (*BootloaderAPI_ErasePage)(uint32_t Address) = BOOTLOADER_API_CALL(0);
* void (*BootloaderAPI_WritePage)(uint32_t Address) = BOOTLOADER_API_CALL(1);
* void (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_CALL(2);
* uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address) = BOOTLOADER_API_CALL(3);
* uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address) = BOOTLOADER_API_CALL(4);
* uint8_t (*BootloaderAPI_ReadLock)(void) = BOOTLOADER_API_CALL(5);
* void (*BootloaderAPI_WriteLock)(uint8_t LockBits) = BOOTLOADER_API_CALL(6);
*
* #define BOOTLOADER_MAGIC_SIGNATURE_START (FLASHEND - 2)
* #define BOOTLOADER_MAGIC_SIGNATURE 0xDCFB
*
* #define BOOTLOADER_CLASS_SIGNATURE_START (FLASHEND - 4)
* #define BOOTLOADER_DFU_SIGNATURE 0xDFB1
*
* #define BOOTLOADER_ADDRESS_START (FLASHEND - 8)
* #define BOOTLOADER_ADDRESS_LENGTH 4
* \endcode
*
* From the application the API support of the bootloader can be detected by reading the FLASH memory bytes located at address
* \c BOOTLOADER_SIG_START and comparing them to the value \c BOOTLOADER_SIGNATURE.
* \c BOOTLOADER_MAGIC_SIGNATURE_START and comparing them to the value \c BOOTLOADER_MAGIC_SIGNATURE. The class of bootloader
* can be determined by reading the FLASH memory bytes located at address \c BOOTLOADER_CLASS_SIGNATURE_START and comparing them
* to the value \c BOOTLOADER_CDC_SIGNATURE. The start address of the bootloader can be retrieved by reading the bytes of FLASH
* memory starting from address \c BOOTLOADER_ADDRESS_START.
*
* \section Sec_Options Project Options
*
......
......@@ -202,7 +202,7 @@ CDEFS += $(LUFA_OPTS)
ADEFS = -DF_CPU=$(F_CPU)
ADEFS += -DF_USB=$(F_USB)UL
ADEFS += -DBOARD=BOARD_$(BOARD)
ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL
ADEFS += -DBOOT_START_ADDR=$(BOOT_START)
ADEFS += $(LUFA_OPTS)
......
......@@ -33,6 +33,7 @@
* - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter)
* - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is
* defined (thanks to Steven Morehouse)
* - Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders
*
* \section Sec_ChangeLog120219 Version 120219
* <b>New:</b>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment