Rev 1193 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1141 | - | 1 | |
2 | ====================================================== |
||
3 | |||
4 | ATMEL AVR UART Bootloader for AVR-GCC/avr-libc |
||
5 | |||
6 | by Martin Thomas, Kaiserslautern, Germany |
||
7 | mthomas@rhrk.uni-kl.de |
||
8 | eversmith@heizung-thomas.de |
||
9 | http://www.siwawi.arubi.uni-kl.de/avr_projects |
||
10 | |||
11 | ** Addtional code and improvements contributed ** |
||
12 | ** by Uwe Bonnes, Bjoern Riemer and Olaf Rempel. ** |
||
13 | |||
14 | Eearly versions of this bootloader-code have been |
||
15 | based on the AVR Butterfly bootloader-source REV02 |
||
16 | which has been available from atmel.com. |
||
17 | |||
18 | ====================================================== |
||
19 | |||
20 | |||
21 | Programming-Software (on the "PC-Side"): |
||
22 | |||
23 | * AVRProg (included in AVRStudio) available at www.atmel.com. |
||
24 | MS-Windows only. AVRProg can be used as stand-alone application. |
||
25 | (avrprog.exe) |
||
26 | |||
27 | * avrdude available at http://savannah.nongnu.org/projects/avrdude/ |
||
28 | "Multiplattform" |
||
29 | |||
30 | * Installation instructions at the end of this file. |
||
31 | |||
32 | |||
33 | 3. Dec. 2008 - Version 0.85 |
||
34 | |||
35 | * disable U2X before jump to app as suggested be Alexander Döller |
||
36 | * moved UBRR-macros to main.c and changed them. Inspired by code from avr-libc setbaud. |
||
37 | (macros which are commented out (//) are from Pavel Fertser) |
||
38 | |||
39 | 6. Nov. 2008 - Version 0.84 |
||
40 | |||
41 | * Added definitions for ATmega64 provided by Pavel Fertser - Thanks. |
||
42 | |||
43 | 12. Apr. 2008 - Version 0.83 |
||
44 | |||
45 | * Added definitions for ATmega644P and ATmega324P |
||
46 | * Tested with ATmega324P, gcc 4.2.2, avr-libc 1.4.6 |
||
47 | * Added testapp to verify "exit bootloader" with |
||
48 | watchdog (n.b.: watchdog-disable called early in testapp) |
||
49 | |||
50 | 27. Jan. 2007 - Version 0.82 |
||
51 | |||
52 | * Added definitions for ATmega644. |
||
53 | * Using avr-lib's eeprom-functions (old "direct-access"-code |
||
54 | has not been compatible with ATmega644). |
||
55 | * Watchdog-disable at startup (configurable): avoids problems with |
||
56 | repeated login to bootloader. Not needed if the bootloader is |
||
57 | never re-entered again between an "exit programming" and |
||
58 | a system-reset/power-toogle. |
||
59 | * Additional watchdog disable-function for ATmega644. |
||
60 | * Made watchdog-enable time at exit-programming a configuration-value |
||
61 | (define). |
||
62 | * Bootloader read-protection: if enabled the bootloader fakes |
||
63 | an empty boot-section (configurable by define) |
||
64 | Since more of the avr-libc functions's are used this version |
||
65 | should be more portable for other AVRs but the size of the |
||
66 | binary increases a little bit. |
||
67 | Make sure to disable the watchdog early in the user-application |
||
68 | esp. when using a "modern" AVR (i.e. ATmega48/88/168/644/324P/644P). |
||
69 | |||
70 | 3. Dec. 2006 - Version 0.81 |
||
71 | |||
72 | * Added definitions for ATmega162. |
||
73 | * Fixed init for double-speed (bitmask). Thanks to Bernhard Roth |
||
74 | |||
75 | 28. May 2006 - Version 0.8beta3 |
||
76 | |||
77 | * Supports discarding of interrupt-vectors which saves some space |
||
78 | if no interrupts are needed in the bootloader. Added option |
||
79 | in makefile to enable this feature, modified LDFLAGS, |
||
80 | additional code in main.c for a pseudo default_interrupt ISR. |
||
81 | The modified linker-scripts have been contributed by |
||
82 | Olaf Rempel (basicly just the .vector-section is not linked). |
||
83 | * Reverted the order of signatur-byte-numbers in part- |
||
84 | configurations to the usual order in the datasheet, |
||
85 | also reverted in main.c for sending the signature. |
||
86 | * Definitions for lock/fuse-readout. |
||
87 | * Updated installation-instruction at the end of this file. |
||
88 | * Added DEVTYPE_ISP/DEVTYPE_BOOT to part-configurations, |
||
89 | added configuration-option for this in main.c. |
||
90 | * A remark about the DEVTYPE: Usualy there are two |
||
91 | Part-Codes/Device-Codes. One is for ISP: AVRProg shows |
||
92 | the type of the AVR. The other code is for bootloading: |
||
93 | AVRprog shows the type plus "BOOT". When a boot-device-code |
||
94 | gets detected by AVRprog it "knows" how do handle the |
||
95 | limited functionality of bootloaders. (When receiving the |
||
96 | ISP-code AVRProg expects an AVR910-type programmer.) |
||
97 | The offset between the codes is usualy 0x01 where the |
||
98 | ISP-code is the smaller value, i.e. ATmega32 ISP-code |
||
99 | is 0x72->"ATmega32" and boot-code is 0x73->"ATmega32 BOOT". |
||
100 | When using avrdude the bootloader's device-code must match |
||
101 | the device-code in the avrdude.conf. Check the avrdude- |
||
102 | code to see if both codes (AVR910 and AVR109) are supported. |
||
103 | -- I have got some e-mails from users which have been |
||
104 | confused by this. Hopefully this explanation is good enough. |
||
105 | * This bootloader lets the watchdog do a reset when the |
||
106 | user selects "Exit programmer" (i.e. in AVRProg) after an |
||
107 | update. Make sure to disable or reset the watchdog early in |
||
108 | your application. |
||
109 | |||
110 | 27. May 2006 - Version 0.8beta2 |
||
111 | |||
112 | * More very well done improvements contributed by Olaf Rempel. |
||
113 | * Olaf Rempel also modified the STARTUP_WAIT method. |
||
114 | |||
115 | 21. May 2006 - Version 0.8beta |
||
116 | |||
117 | * Version contributed by Olaf Rempel. He has done a lot of modifications. |
||
118 | -> "cleaner code", smaller binaries. |
||
119 | |||
120 | 09. Feb. 2006 - Version 0.75 |
||
121 | |||
122 | * additional STARTUP_WAIT support contributed by Bjoern Riemer |
||
123 | |||
124 | 18. Aug. 2005 - Version 0.74 |
||
125 | |||
126 | * AT90CAN128 support contributed by Uwe Bonnes |
||
127 | * Makefile modifications contributed by Uwe Bonnes |
||
128 | |||
129 | 23. Feb. 2005 - Version 0.7 |
||
130 | |||
131 | * (Version 0.6 has never been available on the web-page) |
||
132 | * ATmega128 support |
||
133 | * code cleanup |
||
134 | * This version has been tested with ATmega8, ATmega32 and |
||
135 | ATmega128 |
||
136 | |||
137 | 7. Apr. 2004 - Version 0.5 |
||
138 | |||
139 | * added different startup-methods |
||
140 | * compatible with ATmega8 now |
||
141 | * included makefile adapted to ATmega8 now |
||
142 | (ATmega16 options still available) |
||
143 | * fixed jump to application which did not work |
||
144 | reliably before |
||
145 | * tested with ATmega8 |
||
146 | * minimal options and startup-code result in |
||
147 | bootloader-size < 512 words |
||
148 | |||
149 | 6. Apr. 2004 - Version 0.4 |
||
150 | |||
151 | * Buffered read of chars from UART during programming |
||
152 | since eeprom-write is too slow for unbuffered |
||
153 | operation. So EEPROM-upload does work now. |
||
154 | * Added BOOTICE-mode to flash JTAGICE-compatible |
||
155 | hardware (ATmega16@7,3Mhz) (if you know about BOOTICE, |
||
156 | you may unterstand why this has been added, if not |
||
157 | just keep the option disabled) |
||
158 | * small changes in (my)boot.h (lock-bit-mask) found |
||
159 | out during the development of the STK-500-compatible |
||
160 | bootloader. But setting lock-bits still does not |
||
161 | work with this bootloader. |
||
162 | * read of the low-fuse byte works (high byte still TODO) |
||
163 | * read of the lock-byte works (write still TODO) |
||
164 | |||
165 | 27. Mar 2004 - Version 0.3 |
||
166 | |||
167 | Felt that as much functions from avr-libc's boot.h |
||
168 | as possible should be used without modifications. |
||
169 | Latest CVS-version of boot.h is included. |
||
170 | Only the read-routine is still "self-made" based |
||
171 | on ATMELs assembler-code. |
||
172 | EEPROM write on Mega16 does not work (and did not |
||
173 | work with V0.2 too). May be caused by my old Mega16 |
||
174 | chip. Needs testing. Flash read/write and EEPROM |
||
175 | read works. Still only tested with ATmega16. |
||
176 | This version may not work with the ATmega169 any |
||
177 | more. |
||
178 | |||
179 | 24. Mar 2004 - Version 0.2 |
||
180 | |||
181 | During the development of a data-logger application |
||
182 | with the AVR-Butterfly there was a need to make |
||
183 | some changes in the bootloader. The same problem |
||
184 | again: no IAR compiler. The same way to solve the |
||
185 | problem: a port of the code to avr-gcc/avr-libc. |
||
186 | So this code is based on the ATMEL Butterfly |
||
187 | bootloader source code Rev 0.2 for IAR. |
||
188 | |||
189 | The bootloader-port for the Butterfly which mimics |
||
190 | the complete functionality of the original |
||
191 | BF-bootloader is availabe at: |
||
192 | www.siwawi.arubi.uni-kl.de/avr_projects |
||
193 | |||
194 | Atmel used a separate "lib" written in "pure" |
||
195 | assembly to access the low-level functions |
||
196 | for flash read/write. Well, so far I |
||
197 | don't know how to use "mixed language sources" |
||
198 | with the avr-gcc toolchain, so the low-level |
||
199 | routines have been implemented as inline assembler. |
||
200 | The avr-libc boot.h module written by Eric |
||
201 | Weddington served as a template Three of the four |
||
202 | low-level routines found in lowlevel.c come from |
||
203 | boot.h with minimal changes. The read routine has |
||
204 | been developed based on the ATMEL assembler code. |
||
205 | |||
206 | Ignore the fuse and lock-bit readout. Read and Set is |
||
207 | not enabled (TODO). |
||
208 | |||
209 | |||
210 | --------------- Installation ----------------- |
||
211 | |||
212 | - Change the MCU type in the makefile. |
||
213 | |||
214 | - Change the boot(loader)-size in Makefile. The needed |
||
215 | space depends on the features selected in main.c |
||
216 | |||
217 | - Set baudrate in main.c, a doublespeed configuration-option |
||
218 | is available too. |
||
219 | |||
220 | - Change the F_CPU in main.c to the clock-frequency |
||
221 | of your board. See the datasheet for frequencies |
||
222 | with minimum error at the selected baudrate. |
||
223 | |||
224 | - Select the start-condition in main.c. |
||
225 | |||
226 | - Please use at least avr-gcc 3.3.1/avr-libc 1.0 |
||
227 | or WINAVR Sept. 2003 or later to compile and link |
||
228 | this bootloader. |
||
229 | |||
230 | - Upload the hex-File to the AVR (STK500, STK200, SP12 |
||
231 | evertool, AVR910 etc.) |
||
232 | |||
233 | - Program the "Boot Flash section size" (BOOTSZ fuses) |
||
234 | according to the boot-size selected in the makefile |
||
235 | i.e. BOOTSZ=00 for boot-size 1024 words (2048 bytes) |
||
236 | on ATmega16 |
||
237 | |||
238 | - enable the BOOT Reset Vector fuse (BOOTRST=0) |
||
239 | |||
240 | - Set the lock bits to protect the bootloader from |
||
241 | SPM-writes (Boot Loader Protection Mode 2 in STK500- |
||
242 | plugin) so that it can not overwrite itself. |
||
243 | |||
244 | - Connect the AVR UART Pins via level-shifter/inverter |
||
245 | (i.e. MAX232) to your PCs COM-Port. |
||
246 | |||
247 | - Reset the AVR while fullfilling the bootloader start- |
||
248 | condition. (Default: selected pin connected to GND). |
||
249 | The condition must be "true" until you see the |
||
250 | AVRPROG dialog or avrdude connects. |
||
251 | |||
252 | - Start AVRPROG (AVRStudio/Tools or stand-alone avrprog.exe) |
||
253 | AVRDUDE is supported too, check it's manual |
||
254 | for command-line options. Read the text above for |
||
255 | information about Device-Types and AVRDUDE |
||
256 | |||
257 | - AVRPROG or AVRDUDE should detect the bootloader. |
||
258 | |||
259 | - see AVRStudio's online-help for more information how |
||
260 | to use AVRPROG |
||
261 | |||
262 | - make sure to EXIT from AVRPROG (button) to start |
||
263 | your main-application or toogle power/reset. |
||
264 | |||
265 | |||
266 | Feedback welcome, Good luck. |
||
267 | Martin |