aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/avr
diff options
context:
space:
mode:
authoryiancar <yiangosyiangou@cytanet.com.cy>2019-07-16 03:11:59 +0100
committerDrashna Jaelre <drashna@live.com>2019-07-15 19:11:59 -0700
commit3538955778c253e68779605cc67c27e15d195729 (patch)
tree3287594c4d9dbabbcf26a5a0d7461362c6509883 /tmk_core/common/avr
parent7d557a0514e2cef42a3d460f6cc78771b5df0a30 (diff)
downloadqmk_firmware-3538955778c253e68779605cc67c27e15d195729.tar.gz
qmk_firmware-3538955778c253e68779605cc67c27e15d195729.zip
Usbasploader bootloader option addition (#6304)
* Added USBasp bootloader option for USBasploader * author comment * ifdef fix :) * Add usbasp target * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com>
Diffstat (limited to 'tmk_core/common/avr')
-rw-r--r--tmk_core/common/avr/bootloader.c77
1 files changed, 43 insertions, 34 deletions
diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c
index 3cdcd2e42..29036f7c5 100644
--- a/tmk_core/common/avr/bootloader.c
+++ b/tmk_core/common/avr/bootloader.c
@@ -65,6 +65,13 @@
65#define BOOT_SIZE_1024 0b010 65#define BOOT_SIZE_1024 0b010
66#define BOOT_SIZE_2048 0b000 66#define BOOT_SIZE_2048 0b000
67 67
68//compatibility between ATMega8 and ATMega88
69#if !defined (MCUCSR)
70 #if defined (MCUSR)
71 #define MCUCSR MCUSR
72 #endif
73#endif
74
68/** \brief Entering the Bootloader via Software 75/** \brief Entering the Bootloader via Software
69 * 76 *
70 * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html 77 * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
@@ -149,6 +156,39 @@ void bootloader_jump(void) {
149 156
150 while(1) {} // wait for watchdog timer to trigger 157 while(1) {} // wait for watchdog timer to trigger
151 158
159 #elif defined(BOOTLOADER_USBASP)
160 // Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c
161 wdt_enable(WDTO_15MS);
162 wdt_reset();
163 asm volatile (
164 "cli \n\t"
165 "ldi r29 , %[ramendhi] \n\t"
166 "ldi r28 , %[ramendlo] \n\t"
167 #if (FLASHEND>131071)
168 "ldi r18 , %[bootaddrhi] \n\t"
169 "st Y+, r18 \n\t"
170 #endif
171 "ldi r18 , %[bootaddrme] \n\t"
172 "st Y+, r18 \n\t"
173 "ldi r18 , %[bootaddrlo] \n\t"
174 "st Y+, r18 \n\t"
175 "out %[mcucsrio], __zero_reg__ \n\t"
176 "bootloader_startup_loop%=: \n\t"
177 "rjmp bootloader_startup_loop%= \n\t"
178 :
179 : [mcucsrio] "I" (_SFR_IO_ADDR(MCUCSR)),
180 #if (FLASHEND>131071)
181 [ramendhi] "M" (((RAMEND - 2) >> 8) & 0xff),
182 [ramendlo] "M" (((RAMEND - 2) >> 0) & 0xff),
183 [bootaddrhi] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >>16) & 0xff),
184 #else
185 [ramendhi] "M" (((RAMEND - 1) >> 8) & 0xff),
186 [ramendlo] "M" (((RAMEND - 1) >> 0) & 0xff),
187 #endif
188 [bootaddrme] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff),
189 [bootaddrlo] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff)
190 );
191
152 #else // Assume remaining boards are DFU, even if the flag isn't set 192 #else // Assume remaining boards are DFU, even if the flag isn't set
153 193
154 #if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though? 194 #if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
@@ -172,24 +212,19 @@ void bootloader_jump(void) {
172 212
173} 213}
174 214
175#ifdef __AVR_ATmega32A__
176 // MCUSR is actually called MCUCSR in ATmega32A
177 #define MCUSR MCUCSR
178#endif
179
180/* this runs before main() */ 215/* this runs before main() */
181void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3"))); 216void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
182void bootloader_jump_after_watchdog_reset(void) 217void bootloader_jump_after_watchdog_reset(void)
183{ 218{
184 #ifndef BOOTLOADER_HALFKAY 219 #ifndef BOOTLOADER_HALFKAY
185 if ((MCUSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) { 220 if ((MCUCSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
186 reset_key = 0; 221 reset_key = 0;
187 222
188 // My custom USBasploader requires this to come up. 223 // My custom USBasploader requires this to come up.
189 MCUSR = 0; 224 MCUCSR = 0;
190 225
191 // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog. 226 // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
192 MCUSR &= ~(1<<WDRF); 227 MCUCSR &= ~(1<<WDRF);
193 wdt_disable(); 228 wdt_disable();
194 229
195 230
@@ -202,29 +237,3 @@ void bootloader_jump_after_watchdog_reset(void)
202 } 237 }
203 #endif 238 #endif
204} 239}
205
206
207#if 0
208 /*
209 * USBaspLoader - I'm not sure if this is used at all in any projects
210 * would love to support it if it is -Jack
211 */
212#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
213 // This makes custom USBasploader come up.
214 MCUSR = 0;
215
216 // initialize ports
217 PORTB = 0; PORTC= 0; PORTD = 0;
218 DDRB = 0; DDRC= 0; DDRD = 0;
219
220 // disable interrupts
221 EIMSK = 0; EECR = 0; SPCR = 0;
222 ACSR = 0; SPMCSR = 0; WDTCSR = 0; PCICR = 0;
223 TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0;
224 ADCSRA = 0; TWCR = 0; UCSR0B = 0;
225#endif
226
227 // This is compled into 'icall', address should be in word unit, not byte.
228 ((void (*)(void))(BOOTLOADER_START/2))();
229}
230#endif