1 | /** \file
|
---|
2 | *
|
---|
3 | * This file contains special DoxyGen information for the generation of the main page and other special
|
---|
4 | * documentation pages. It is not a project source file.
|
---|
5 | */
|
---|
6 |
|
---|
7 | /** \mainpage DFU Class USB AVR Bootloader
|
---|
8 | *
|
---|
9 | * \section Sec_Compat Demo Compatibility:
|
---|
10 | *
|
---|
11 | * The following list indicates what microcontrollers are compatible with this demo.
|
---|
12 | *
|
---|
13 | * \li Series 7 USB AVRs (AT90USBxxx7)
|
---|
14 | * \li Series 6 USB AVRs (AT90USBxxx6)
|
---|
15 | * \li Series 4 USB AVRs (ATMEGAxxU4) - <i>See \ref SSec_Aux_Space</i>
|
---|
16 | * \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) - <i>See \ref SSec_Aux_Space</i>
|
---|
17 | *
|
---|
18 | * \section Sec_Info USB Information:
|
---|
19 | *
|
---|
20 | * The following table gives a rundown of the USB utilization of this demo.
|
---|
21 | *
|
---|
22 | * <table>
|
---|
23 | * <tr>
|
---|
24 | * <td><b>USB Mode:</b></td>
|
---|
25 | * <td>Device</td>
|
---|
26 | * </tr>
|
---|
27 | * <tr>
|
---|
28 | * <td><b>USB Class:</b></td>
|
---|
29 | * <td>Device Firmware Update Class (DFU)</td>
|
---|
30 | * </tr>
|
---|
31 | * <tr>
|
---|
32 | * <td><b>USB Subclass:</b></td>
|
---|
33 | * <td>None</td>
|
---|
34 | * </tr>
|
---|
35 | * <tr>
|
---|
36 | * <td><b>Relevant Standards:</b></td>
|
---|
37 | * <td>USBIF DFU Class Standard, Atmel USB Bootloader Datasheet</td>
|
---|
38 | * </tr>
|
---|
39 | * <tr>
|
---|
40 | * <td><b>Supported USB Speeds:</b></td>
|
---|
41 | * <td>Low Speed Mode \n
|
---|
42 | * Full Speed Mode</td>
|
---|
43 | * </tr>
|
---|
44 | * </table>
|
---|
45 | *
|
---|
46 | * \section Sec_Description Project Description:
|
---|
47 | *
|
---|
48 | * This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming
|
---|
49 | * software to load firmware onto the AVR.
|
---|
50 | *
|
---|
51 | * Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit
|
---|
52 | * into 4KB of bootloader space. If you wish to alter this size and/or change the AVR model, you will need to
|
---|
53 | * edit the MCU, FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile.
|
---|
54 | *
|
---|
55 | * When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the
|
---|
56 | * bootloader from the normal user application.
|
---|
57 | *
|
---|
58 | * \section Sec_Running Running the Bootloader
|
---|
59 | *
|
---|
60 | * On the USB AVR8 devices, setting the \c HWBE device fuse will cause the bootloader to run if the \c HWB pin of
|
---|
61 | * the AVR is grounded when the device is reset.
|
---|
62 | *
|
---|
63 | * The are two behaviours of this bootloader, depending on the device's fuses:
|
---|
64 | *
|
---|
65 | * <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from
|
---|
66 | * the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
|
---|
67 | * device's external reset pin should be grounded momentarily.
|
---|
68 | *
|
---|
69 | * <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
|
---|
70 | * jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
|
---|
71 | *
|
---|
72 | * For board specific exceptions to the above, see below.
|
---|
73 | *
|
---|
74 | * \subsection SSec_XPLAIN Atmel Xplain Board
|
---|
75 | * Ground the USB AVR JTAG's \c TCK pin to ground when powering on the board to start the bootloader. This assumes the
|
---|
76 | * \c HWBE fuse is cleared and the \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
|
---|
77 | *
|
---|
78 | * \subsection SSec_Leonardo Arduino Leonardo Board
|
---|
79 | * Ground \c IO13 when powering the board to start the bootloader. This assumes the \c HWBE fuse is cleared and the
|
---|
80 | * \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
|
---|
81 | *
|
---|
82 | * \section Sec_Installation Driver Installation
|
---|
83 | *
|
---|
84 | * This bootloader is designed to be compatible with Atmel's provided Windows DFU class drivers. You will need to
|
---|
85 | * install Atmel's DFU drivers prior to using this bootloader on Windows platforms. If you are using a 64 bit Windows
|
---|
86 | * OS, you will need to either disable the driver signing requirement (see online tutorials for details) or use a
|
---|
87 | * digitally signed version of the official Atmel driver provided by a third party AVR user at
|
---|
88 | * <a>http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=2196&item_type=project</a>.
|
---|
89 | *
|
---|
90 | * \note This device spoofs Atmel's DFU Bootloader USB VID and PID so that the Atmel DFU bootloader
|
---|
91 | * drivers included with FLIP will work. If you do not wish to use Atmel's ID codes, please
|
---|
92 | * manually change them in Descriptors.c and alter your driver's INF file accordingly.
|
---|
93 | *
|
---|
94 | * \section Sec_HostApp Host Controller Application
|
---|
95 | *
|
---|
96 | * This bootloader is compatible with Atmel's FLIP utility on Windows machines, and dfu-programmer on Linux machines.
|
---|
97 | *
|
---|
98 | * \subsection SSec_FLIP FLIP (Windows)
|
---|
99 | *
|
---|
100 | * FLIP (Flexible In-System Programmer) is a utility written by Atmel, and distributed for free on the Atmel website.
|
---|
101 | * The FLIP utility is designed to assist in the bootloader programming of a range of Atmel devices, through several
|
---|
102 | * popular physical interfaces including USB. It is written in Java, however makes use of native extensions for USB
|
---|
103 | * support and thus is only offered on Windows.
|
---|
104 | *
|
---|
105 | * To program a device using FLIP, refer to the Atmel FLIP documentation.
|
---|
106 | *
|
---|
107 | * \subsection SSec_DFUProgrammer dfu-programmer (Linux)
|
---|
108 | *
|
---|
109 | * dfu-programmer is an open-source command line solution for the bootloader programming of Atmel devices through a
|
---|
110 | * USB connection, using the DFU protocol, available for download at <a>http://sourceforge.net/projects/dfu-programmer/</a>.
|
---|
111 | *
|
---|
112 | * The following example loads a HEX file into the AVR's FLASH memory using dfu-programmer:
|
---|
113 | * \code
|
---|
114 | * dfu-programmer at90usb1287 erase flash Mouse.hex
|
---|
115 | * \endcode
|
---|
116 | *
|
---|
117 | * \section Sec_API User Application API
|
---|
118 | *
|
---|
119 | * Several user application functions for FLASH and other special memory area manipulations are exposed by the bootloader,
|
---|
120 | * allowing the user application to call into the bootloader at runtime to read and write FLASH data.
|
---|
121 | *
|
---|
122 | * \warning The APIs exposed by the DFU class bootloader are \b NOT compatible with the API exposed by the official Atmel DFU bootloader.
|
---|
123 | *
|
---|
124 | * By default, the bootloader API jump table is located 32 bytes from the end of the device's FLASH memory, and follows the
|
---|
125 | * following layout:
|
---|
126 | *
|
---|
127 | * \code
|
---|
128 | * #define BOOTLOADER_API_TABLE_SIZE 32
|
---|
129 | * #define BOOTLOADER_API_TABLE_START ((FLASHEND + 1UL) - BOOTLOADER_API_TABLE_SIZE)
|
---|
130 | * #define BOOTLOADER_API_CALL(Index) (void*)((BOOTLOADER_API_TABLE_START + (Index * 2)) / 2)
|
---|
131 | *
|
---|
132 | * void (*BootloaderAPI_ErasePage)(uint32_t Address) = BOOTLOADER_API_CALL(0);
|
---|
133 | * void (*BootloaderAPI_WritePage)(uint32_t Address) = BOOTLOADER_API_CALL(1);
|
---|
134 | * void (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_CALL(2);
|
---|
135 | * uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address) = BOOTLOADER_API_CALL(3);
|
---|
136 | * uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address) = BOOTLOADER_API_CALL(4);
|
---|
137 | * uint8_t (*BootloaderAPI_ReadLock)(void) = BOOTLOADER_API_CALL(5);
|
---|
138 | * void (*BootloaderAPI_WriteLock)(uint8_t LockBits) = BOOTLOADER_API_CALL(6);
|
---|
139 | *
|
---|
140 | * #define BOOTLOADER_MAGIC_SIGNATURE_START (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 2))
|
---|
141 | * #define BOOTLOADER_MAGIC_SIGNATURE 0xDCFB
|
---|
142 | *
|
---|
143 | * #define BOOTLOADER_CLASS_SIGNATURE_START (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 4))
|
---|
144 | * #define BOOTLOADER_DFU_SIGNATURE 0xDF10
|
---|
145 | *
|
---|
146 | * #define BOOTLOADER_ADDRESS_START (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 8))
|
---|
147 | * #define BOOTLOADER_ADDRESS_LENGTH 4
|
---|
148 | * \endcode
|
---|
149 | *
|
---|
150 | * From the application the API support of the bootloader can be detected by reading the FLASH memory bytes located at address
|
---|
151 | * \c BOOTLOADER_MAGIC_SIGNATURE_START and comparing them to the value \c BOOTLOADER_MAGIC_SIGNATURE. The class of bootloader
|
---|
152 | * can be determined by reading the FLASH memory bytes located at address \c BOOTLOADER_CLASS_SIGNATURE_START and comparing them
|
---|
153 | * to the value \c BOOTLOADER_DFU_SIGNATURE. The start address of the bootloader can be retrieved by reading the bytes of FLASH
|
---|
154 | * memory starting from address \c BOOTLOADER_ADDRESS_START.
|
---|
155 | *
|
---|
156 | * \subsection SSec_API_MemLayout Device Memory Map
|
---|
157 | * The following illustration indicates the final memory map of the device when loaded with the bootloader.
|
---|
158 | *
|
---|
159 | * \verbatim
|
---|
160 | * +----------------------------+ 0x0000
|
---|
161 | * | |
|
---|
162 | * | |
|
---|
163 | * | |
|
---|
164 | * | |
|
---|
165 | * | |
|
---|
166 | * | |
|
---|
167 | * | |
|
---|
168 | * | |
|
---|
169 | * | User Application |
|
---|
170 | * | |
|
---|
171 | * | |
|
---|
172 | * | |
|
---|
173 | * | |
|
---|
174 | * | |
|
---|
175 | * | |
|
---|
176 | * | |
|
---|
177 | * | |
|
---|
178 | * +----------------------------+ FLASHEND - BOOT_AUX_SECTION_SIZE
|
---|
179 | * | Booloader Start Trampoline |
|
---|
180 | * | (Not User App. Accessible) |
|
---|
181 | * +----------------------------+ FLASHEND - (BOOT_AUX_SECTION_SIZE - 4)
|
---|
182 | * | |
|
---|
183 | * | Auxillery Bootloader |
|
---|
184 | * | Space for Smaller Devices |
|
---|
185 | * | (Not User App. Accessible) |
|
---|
186 | * | |
|
---|
187 | * +----------------------------+ FLASHEND - BOOT_SECTION_SIZE
|
---|
188 | * | |
|
---|
189 | * | Bootloader Application |
|
---|
190 | * | (Not User App. Accessible) |
|
---|
191 | * | |
|
---|
192 | * +----------------------------+ FLASHEND - 96
|
---|
193 | * | API Table Trampolines |
|
---|
194 | * | (Not User App. Accessible) |
|
---|
195 | * +----------------------------+ FLASHEND - 32
|
---|
196 | * | Bootloader API Table |
|
---|
197 | * | (User App. Accessible) |
|
---|
198 | * +----------------------------+ FLASHEND - 8
|
---|
199 | * | Bootloader ID Constants |
|
---|
200 | * | (User App. Accessible) |
|
---|
201 | * +----------------------------+ FLASHEND
|
---|
202 | * \endverbatim
|
---|
203 | *
|
---|
204 | * \subsection SSec_Aux_Space Auxiliary Bootloader Section
|
---|
205 | * To make the bootloader function on smaller devices (those with a physical
|
---|
206 | * bootloader section of smaller than 6KB)
|
---|
207 | *
|
---|
208 | * \section Sec_KnownIssues Known Issues:
|
---|
209 | *
|
---|
210 | * \par On Linux machines, the DFU bootloader is inaccessible.
|
---|
211 | * On many Linux systems, non-root users do not have automatic access to newly
|
---|
212 | * inserted DFU devices. Root privileges or a UDEV rule is required to gain
|
---|
213 | * access.
|
---|
214 | * See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps.
|
---|
215 | *
|
---|
216 | * \section Sec_Options Project Options
|
---|
217 | *
|
---|
218 | * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
---|
219 | *
|
---|
220 | * <table>
|
---|
221 | * <tr>
|
---|
222 | * <th><b>Define Name:</b></th>
|
---|
223 | * <th><b>Location:</b></th>
|
---|
224 | * <th><b>Description:</b></th>
|
---|
225 | * </tr>
|
---|
226 | * <tr>
|
---|
227 | * <td>SECURE_MODE</td>
|
---|
228 | * <td>AppConfig.h</td>
|
---|
229 | * <td>If defined to \c true, the bootloader will not accept any memory commands other than a chip erase on start-up, until an
|
---|
230 | * erase has been performed. This can be used in conjunction with the AVR's lockbits to prevent the AVRs firmware from
|
---|
231 | * being dumped by unauthorized persons. When false, all memory operations are allowed at any time.</td>
|
---|
232 | * </tr>
|
---|
233 | * </table>
|
---|
234 | */
|
---|
235 |
|
---|