diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2011-10-11 06:20:18 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2011-10-11 06:20:18 +0000 |
commit | 1a4a26271e32fba6e2430b7869ec4a8b4242e6e2 (patch) | |
tree | 42033644a25aad1d5f901a75b9363e3dec025875 /Bootloaders/DFU | |
parent | beb069b9b845da02de07e4e3e0149e84004d2445 (diff) | |
download | lufa-1a4a26271e32fba6e2430b7869ec4a8b4242e6e2.tar.gz lufa-1a4a26271e32fba6e2430b7869ec4a8b4242e6e2.tar.bz2 lufa-1a4a26271e32fba6e2430b7869ec4a8b4242e6e2.zip |
Added User Application APIs to the CDC and DFU class bootloaders.
Diffstat (limited to 'Bootloaders/DFU')
-rw-r--r-- | Bootloaders/DFU/BootloaderAPI.c | 74 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderAPI.h | 59 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderAPITable.S | 43 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.c | 5 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.h | 1 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.txt | 21 | ||||
-rw-r--r-- | Bootloaders/DFU/makefile | 6 |
7 files changed, 206 insertions, 3 deletions
diff --git a/Bootloaders/DFU/BootloaderAPI.c b/Bootloaders/DFU/BootloaderAPI.c new file mode 100644 index 000000000..0c98509aa --- /dev/null +++ b/Bootloaders/DFU/BootloaderAPI.c @@ -0,0 +1,74 @@ +/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Bootloader user application API functions.
+ */
+
+#include "BootloaderAPI.h"
+
+void BootloaderAPI_ErasePage(uint32_t Address)
+{
+ boot_page_erase_safe(Address);
+ boot_rww_enable();
+}
+
+void BootloaderAPI_WritePage(uint32_t Address)
+{
+ boot_page_write_safe(Address);
+ boot_rww_enable();
+}
+
+void BootloaderAPI_FillWord(uint32_t Address, uint16_t Word)
+{
+ boot_page_fill_safe(Address, Word);
+}
+
+uint8_t BootloaderAPI_ReadSignature(uint16_t Address)
+{
+ return boot_signature_byte_get(Address);
+}
+
+uint8_t BootloaderAPI_ReadFuse(uint16_t Address)
+{
+ return boot_lock_fuse_bits_get(Address);
+}
+
+uint8_t BootloaderAPI_ReadLock(void)
+{
+ return boot_lock_fuse_bits_get(GET_LOCK_BITS);
+}
+
+void BootloaderAPI_WriteLock(uint8_t LockBits)
+{
+ boot_lock_bits_set_safe(LockBits);
+}
+
diff --git a/Bootloaders/DFU/BootloaderAPI.h b/Bootloaders/DFU/BootloaderAPI.h new file mode 100644 index 000000000..7ab175dad --- /dev/null +++ b/Bootloaders/DFU/BootloaderAPI.h @@ -0,0 +1,59 @@ +/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Header file for BootloaderAPI.c.
+ */
+
+#ifndef _BOOTLOADER_API_H_
+#define _BOOTLOADER_API_H_
+
+ /* Includes: */
+ #include <avr/io.h>
+ #include <avr/boot.h>
+ #include <stdbool.h>
+
+ #include <LUFA/Common/Common.h>
+
+ /* External Variables: */
+ extern uint8_t* BootloaderAPI_JumpTable;
+
+ /* Function Prototypes: */
+ void BootloaderAPI_ErasePage(uint32_t Address);
+ void BootloaderAPI_WritePage(uint32_t Address);
+ void BootloaderAPI_FillWord(uint32_t Address, uint16_t Word);
+ uint8_t BootloaderAPI_ReadSignature(uint16_t Address);
+ uint8_t BootloaderAPI_ReadFuse(uint16_t Address);
+ uint8_t BootloaderAPI_ReadLock(void);
+ void BootloaderAPI_WriteLock(uint8_t LockBits);
+
+#endif
+
diff --git a/Bootloaders/DFU/BootloaderAPITable.S b/Bootloaders/DFU/BootloaderAPITable.S new file mode 100644 index 000000000..c5669617d --- /dev/null +++ b/Bootloaders/DFU/BootloaderAPITable.S @@ -0,0 +1,43 @@ +/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+; Bootloader API Jump Table
+.section .apitable, "ax"
+.org 0
+
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+ jmp BootloaderAPI_ErasePage
+ jmp BootloaderAPI_WritePage
+ jmp BootloaderAPI_FillWord
+ jmp BootloaderAPI_ReadSignature
+ jmp BootloaderAPI_ReadFuse
+ jmp BootloaderAPI_ReadLock
+ jmp BootloaderAPI_WriteLock
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c index 1dae162d2..078d59deb 100644 --- a/Bootloaders/DFU/BootloaderDFU.c +++ b/Bootloaders/DFU/BootloaderDFU.c @@ -99,6 +99,10 @@ static uint16_t EndAddr = 0x0000; */ int main(void) { + /* Force a reference to the API jump table to prevent the linker from discarding it */ + uint8_t* volatile Dummy = BootloaderAPI_JumpTable; + (void)Dummy; + /* Configure hardware required by the bootloader */ SetupHardware(); @@ -742,4 +746,3 @@ static void ProcessReadCommand(void) else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte ResponseByte = SignatureInfo[DataIndexToRead - 0x30]; } - diff --git a/Bootloaders/DFU/BootloaderDFU.h b/Bootloaders/DFU/BootloaderDFU.h index 8fbf64c7e..0c34c2c8c 100644 --- a/Bootloaders/DFU/BootloaderDFU.h +++ b/Bootloaders/DFU/BootloaderDFU.h @@ -48,6 +48,7 @@ #include <stdbool.h> #include "Descriptors.h" + #include "BootloaderAPI.h" #include <LUFA/Drivers/USB/USB.h> #include <LUFA/Drivers/Board/LEDs.h> diff --git a/Bootloaders/DFU/BootloaderDFU.txt b/Bootloaders/DFU/BootloaderDFU.txt index 858549f00..94657f355 100644 --- a/Bootloaders/DFU/BootloaderDFU.txt +++ b/Bootloaders/DFU/BootloaderDFU.txt @@ -89,6 +89,27 @@ * dfu-programmer at90usb1287 erase flash Mouse.hex * \endcode * + * \section Sec_API User Application API + * + * Several user application functions for FLASH and other special memory area manipulations are exposed by the bootloader, + * allowing the user application to call into the bootloader at runtime to read and write FLASH data. + * + * \note The APIs exposed by the DFU class bootloader are \b NOT compatible with the API exposed by the official Atmel DFU bootloader. + * + * By default, the bootloader API jump table is located 32 bytes from the end of the device's FLASH memory, and follows the + * 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); + * \endcode + * * \section Sec_Options Project Options * * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. diff --git a/Bootloaders/DFU/makefile b/Bootloaders/DFU/makefile index 32157106b..bd7120d8f 100644 --- a/Bootloaders/DFU/makefile +++ b/Bootloaders/DFU/makefile @@ -97,6 +97,7 @@ F_USB = $(F_CPU) FLASH_SIZE_KB = 128 BOOT_SECTION_SIZE_KB = 4 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) - 32)" | bc) # Output format. (can be srec, ihex, binary) @@ -137,6 +138,7 @@ include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ + BootloaderAPI.c \ Descriptors.c \ $(LUFA_SRC_USB) \ @@ -152,7 +154,7 @@ CPPSRC = # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. -ASRC = +ASRC = BootloaderAPITable.S # Optimization level, can be [0, 1, 2, 3, s]. @@ -333,7 +335,7 @@ EXTMEMOPTS = # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -Wl,--section-start=.apitable=$(BOOT_API_TABLESTART) LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) |