source: avrstuff/kbd/pcw2hid/bootloader/BootloaderDFU.txt

main
Last change on this file was cde4666, checked in by PulkoMandy <pulkomandy@…>, 13 months ago

pcw2hid: Add bootloader

Forked from LUFA DFU bootloader.

Flash fuses: lfuse 0xEF, hfuse 0xD8 (enable BOOTRST) efuse 0xF7

This means the boot always goes to the bootloader first. The bootloader
wait for a while to see if there is any activity on the keyboard pins,
in that case, it jumps to the main app. Otherwise, the device enters DFU
mode and can be upgraded with a newer firmware using dfu-programmer or
Atmel FLIP.

  • Property mode set to 100644
File size: 10.9 KB
Line 
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
Note: See TracBrowser for help on using the repository browser.