Commit 4da2ba9f authored by Dean Camera's avatar Dean Camera
Browse files

Modify CDC and DFU bootloaders so that the various BootloaderAPI components...

Modify CDC and DFU bootloaders so that the various BootloaderAPI components are in unique sections and mapped explicitly - this will ensure the API and signature entries are always linked at the correct explicit address.
parent c4ebddd2
......@@ -28,41 +28,44 @@
this software.
*/
; Bootloader API Jump Table
.section .apitable, "ax"
; Trampolines to actual API implementations if the target address is outside the
; range of a rjmp instruction (can happen with large bootloader sections)
.org 0
BootloaderAPI_ErasePage_Trampoline:
jmp BootloaderAPI_ErasePage
BootloaderAPI_WritePage_Trampoline:
jmp BootloaderAPI_WritePage
BootloaderAPI_FillWord_Trampoline:
jmp BootloaderAPI_FillWord
BootloaderAPI_ReadSignature_Trampoline:
jmp BootloaderAPI_ReadSignature
BootloaderAPI_ReadFuse_Trampoline:
jmp BootloaderAPI_ReadFuse
BootloaderAPI_ReadLock_Trampoline:
jmp BootloaderAPI_ReadLock
BootloaderAPI_WriteLock_Trampoline:
jmp BootloaderAPI_WriteLock
BootloaderAPU_UNUSED1:
ret
BootloaderAPU_UNUSED2:
ret
BootloaderAPU_UNUSED3:
ret
BootloaderAPU_UNUSED4:
ret
BootloaderAPU_UNUSED5:
ret
.section .apitable_trampolines, "ax"
.global BootloaderAPI_Trampolines
BootloaderAPI_Trampolines:
BootloaderAPI_ErasePage_Trampoline:
jmp BootloaderAPI_ErasePage
BootloaderAPI_WritePage_Trampoline:
jmp BootloaderAPI_WritePage
BootloaderAPI_FillWord_Trampoline:
jmp BootloaderAPI_FillWord
BootloaderAPI_ReadSignature_Trampoline:
jmp BootloaderAPI_ReadSignature
BootloaderAPI_ReadFuse_Trampoline:
jmp BootloaderAPI_ReadFuse
BootloaderAPI_ReadLock_Trampoline:
jmp BootloaderAPI_ReadLock
BootloaderAPI_WriteLock_Trampoline:
jmp BootloaderAPI_WriteLock
BootloaderAPU_UNUSED1:
ret
BootloaderAPU_UNUSED2:
ret
BootloaderAPU_UNUSED3:
ret
BootloaderAPU_UNUSED4:
ret
BootloaderAPU_UNUSED5:
ret
; API function jump table
.org (96 - 32)
.section .apitable_jumptable, "ax"
.global BootloaderAPI_JumpTable
BootloaderAPI_JumpTable:
rjmp BootloaderAPI_ErasePage_Trampoline
rjmp BootloaderAPI_WritePage_Trampoline
rjmp BootloaderAPI_FillWord_Trampoline
......@@ -76,10 +79,13 @@ BootloaderAPI_JumpTable:
rjmp BootloaderAPU_UNUSED4 ; UNUSED ENTRY 4
rjmp BootloaderAPU_UNUSED5 ; UNUSED ENTRY 5
; Bootloader table signatures and information
.org (96 - 8)
BootloaderAPI_Signatures:
.section .apitable_signatures, "ax"
.global BootloaderAPI_Signatures
BootloaderAPI_Signatures:
.long BOOT_START_ADDR ; Start address of the bootloader
.word 0xCDC1 ; Signature for the CDC class bootloader, V1
.word 0xDFB1 ; Signature for the DFU class bootloader, V1
.word 0xDCFB ; Signature for a LUFA class bootloader
......@@ -15,10 +15,15 @@
FLASH_SIZE_KB := 128
BOOT_SECTION_SIZE_KB := 8
# Bootloader address calculations (requires the "bc" unix utility) - do
# not modify these calculations, but rather modify the depedant values above.
# Bootloader address calculations (requires the "bc" unix utility) and
# API section start directives - do not modify these macros, but rather
# modify the depedant values above.
BOOT_START := 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc)
BOOT_API_TABLESTART := 0x$(shell echo "obase=16; (($(FLASH_SIZE_KB) * 1024) - 96)" | bc)
BOOT_SEC_OFFSET = 0x$(shell echo "obase=16; (($(FLASH_SIZE_KB) * 1024) - $(strip $(1)))" | bc)
BOOT_SECTION_LD_FLAG = -Wl,--section-start=.apitable_$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=BootloaderAPI_$(strip $(2))
BOOT_API_LD_FLAGS := $(call BOOT_SECTION_LD_FLAG, trampolines, Trampolines, (48 + 32 + 8))
BOOT_API_LD_FLAGS += $(call BOOT_SECTION_LD_FLAG, jumptable, JumpTable, (32 + 8))
BOOT_API_LD_FLAGS += $(call BOOT_SECTION_LD_FLAG, signatures, Signatures, 8)
MCU = at90usb1287
ARCH = AVR8
......@@ -30,7 +35,7 @@ TARGET = BootloaderCDC
SRC = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB)
LUFA_PATH = ../../LUFA/
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START)
LD_FLAGS = -Wl,--section-start=.text=$(BOOT_START) -Wl,--section-start=.apitable=$(BOOT_API_TABLESTART) -Wl,--undefined=BootloaderAPI_JumpTable
LD_FLAGS = -Wl,--section-start=.text=$(BOOT_START) $(BOOT_API_LD_FLAGS)
# Default target
all:
......
......@@ -28,41 +28,44 @@
this software.
*/
; Bootloader API Jump Table
.section .apitable, "ax"
; Trampolines to actual API implementations if the target address is outside the
; range of a rjmp instruction (can happen with large bootloader sections)
.org 0
BootloaderAPI_ErasePage_Trampoline:
jmp BootloaderAPI_ErasePage
BootloaderAPI_WritePage_Trampoline:
jmp BootloaderAPI_WritePage
BootloaderAPI_FillWord_Trampoline:
jmp BootloaderAPI_FillWord
BootloaderAPI_ReadSignature_Trampoline:
jmp BootloaderAPI_ReadSignature
BootloaderAPI_ReadFuse_Trampoline:
jmp BootloaderAPI_ReadFuse
BootloaderAPI_ReadLock_Trampoline:
jmp BootloaderAPI_ReadLock
BootloaderAPI_WriteLock_Trampoline:
jmp BootloaderAPI_WriteLock
BootloaderAPU_UNUSED1:
ret
BootloaderAPU_UNUSED2:
ret
BootloaderAPU_UNUSED3:
ret
BootloaderAPU_UNUSED4:
ret
BootloaderAPU_UNUSED5:
ret
.section .apitable_trampolines, "ax"
.global BootloaderAPI_Trampolines
BootloaderAPI_Trampolines:
BootloaderAPI_ErasePage_Trampoline:
jmp BootloaderAPI_ErasePage
BootloaderAPI_WritePage_Trampoline:
jmp BootloaderAPI_WritePage
BootloaderAPI_FillWord_Trampoline:
jmp BootloaderAPI_FillWord
BootloaderAPI_ReadSignature_Trampoline:
jmp BootloaderAPI_ReadSignature
BootloaderAPI_ReadFuse_Trampoline:
jmp BootloaderAPI_ReadFuse
BootloaderAPI_ReadLock_Trampoline:
jmp BootloaderAPI_ReadLock
BootloaderAPI_WriteLock_Trampoline:
jmp BootloaderAPI_WriteLock
BootloaderAPU_UNUSED1:
ret
BootloaderAPU_UNUSED2:
ret
BootloaderAPU_UNUSED3:
ret
BootloaderAPU_UNUSED4:
ret
BootloaderAPU_UNUSED5:
ret
; API function jump table
.org (96 - 32)
.section .apitable_jumptable, "ax"
.global BootloaderAPI_JumpTable
BootloaderAPI_JumpTable:
rjmp BootloaderAPI_ErasePage_Trampoline
rjmp BootloaderAPI_WritePage_Trampoline
rjmp BootloaderAPI_FillWord_Trampoline
......@@ -76,10 +79,13 @@ BootloaderAPI_JumpTable:
rjmp BootloaderAPU_UNUSED4 ; UNUSED ENTRY 4
rjmp BootloaderAPU_UNUSED5 ; UNUSED ENTRY 5
; Bootloader table signatures and information
.org (96 - 8)
BootloaderAPI_Signatures:
.section .apitable_signatures, "ax"
.global BootloaderAPI_Signatures
BootloaderAPI_Signatures:
.long BOOT_START_ADDR ; Start address of the bootloader
.word 0xDFB1 ; Signature for the DFU class bootloader, V1
.word 0xDCFB ; Signature for a LUFA class bootloader
......@@ -15,10 +15,15 @@
FLASH_SIZE_KB := 128
BOOT_SECTION_SIZE_KB := 8
# Bootloader address calculations (requires the "bc" unix utility) - do
# not modify these calculations, but rather modify the depedant values above.
# Bootloader address calculations (requires the "bc" unix utility) and
# API section start directives - do not modify these macros, but rather
# modify the depedant values above.
BOOT_START := 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc)
BOOT_API_TABLESTART := 0x$(shell echo "obase=16; (($(FLASH_SIZE_KB) * 1024) - 96)" | bc)
BOOT_SEC_OFFSET = 0x$(shell echo "obase=16; (($(FLASH_SIZE_KB) * 1024) - $(strip $(1)))" | bc)
BOOT_SECTION_LD_FLAG = -Wl,--section-start=.apitable_$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=BootloaderAPI_$(strip $(2))
BOOT_API_LD_FLAGS := $(call BOOT_SECTION_LD_FLAG, trampolines, Trampolines, (48 + 32 + 8))
BOOT_API_LD_FLAGS += $(call BOOT_SECTION_LD_FLAG, jumptable, JumpTable, (32 + 8))
BOOT_API_LD_FLAGS += $(call BOOT_SECTION_LD_FLAG, signatures, Signatures, 8)
MCU = at90usb1287
ARCH = AVR8
......@@ -30,7 +35,7 @@ TARGET = BootloaderDFU
SRC = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB)
LUFA_PATH = ../../LUFA/
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START)
LD_FLAGS = -Wl,--section-start=.text=$(BOOT_START) -Wl,--section-start=.apitable=$(BOOT_API_TABLESTART) -Wl,--undefined=BootloaderAPI_JumpTable
LD_FLAGS = -Wl,--section-start=.text=$(BOOT_START) $(BOOT_API_LD_FLAGS)
# Default target
all:
......
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