aboutsummaryrefslogtreecommitdiffstats
path: root/Bootloaders/CDC
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-10-11 06:20:18 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-10-11 06:20:18 +0000
commit1a4a26271e32fba6e2430b7869ec4a8b4242e6e2 (patch)
tree42033644a25aad1d5f901a75b9363e3dec025875 /Bootloaders/CDC
parentbeb069b9b845da02de07e4e3e0149e84004d2445 (diff)
downloadlufa-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/CDC')
-rw-r--r--Bootloaders/CDC/BootloaderAPI.c74
-rw-r--r--Bootloaders/CDC/BootloaderAPI.h59
-rw-r--r--Bootloaders/CDC/BootloaderAPITable.S43
-rw-r--r--Bootloaders/CDC/BootloaderCDC.c4
-rw-r--r--Bootloaders/CDC/BootloaderCDC.h1
-rw-r--r--Bootloaders/CDC/BootloaderCDC.txt19
-rw-r--r--Bootloaders/CDC/makefile6
7 files changed, 204 insertions, 2 deletions
diff --git a/Bootloaders/CDC/BootloaderAPI.c b/Bootloaders/CDC/BootloaderAPI.c
new file mode 100644
index 000000000..0c98509aa
--- /dev/null
+++ b/Bootloaders/CDC/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/CDC/BootloaderAPI.h b/Bootloaders/CDC/BootloaderAPI.h
new file mode 100644
index 000000000..7ab175dad
--- /dev/null
+++ b/Bootloaders/CDC/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/CDC/BootloaderAPITable.S b/Bootloaders/CDC/BootloaderAPITable.S
new file mode 100644
index 000000000..c5669617d
--- /dev/null
+++ b/Bootloaders/CDC/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/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index 7695e33d8..f336a1368 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -63,6 +63,10 @@ static bool RunBootloader = true;
*/
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;
+
/* Setup hardware required for the bootloader */
SetupHardware();
diff --git a/Bootloaders/CDC/BootloaderCDC.h b/Bootloaders/CDC/BootloaderCDC.h
index 72bc1e773..41280fe8f 100644
--- a/Bootloaders/CDC/BootloaderCDC.h
+++ b/Bootloaders/CDC/BootloaderCDC.h
@@ -46,6 +46,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/CDC/BootloaderCDC.txt b/Bootloaders/CDC/BootloaderCDC.txt
index 4e5b3c565..ab45ad1b8 100644
--- a/Bootloaders/CDC/BootloaderCDC.txt
+++ b/Bootloaders/CDC/BootloaderCDC.txt
@@ -86,6 +86,25 @@
*
* Refer to the AVRDude project documentation for additional usage instructions.
*
+ * \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.
+ *
+ * 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/CDC/makefile b/Bootloaders/CDC/makefile
index aab9288af..65982263e 100644
--- a/Bootloaders/CDC/makefile
+++ b/Bootloaders/CDC/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)
@@ -142,6 +143,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) \
@@ -157,7 +159,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].
@@ -338,7 +340,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)