Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Usbasploader bootloader option addition #6304

Merged
merged 7 commits into from
Jul 16, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions bootloader.mk
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ ifeq ($(strip $(BOOTLOADER)), bootloadHID)
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
BOOTLOADER_SIZE = 4096
endif
ifeq ($(strip $(BOOTLOADER)), USBasp)
OPT_DEFS += -DBOOTLOADER_USBASP
BOOTLOADER_SIZE = 4096
endif

ifdef BOOTLOADER_SIZE
OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
Expand Down
1 change: 1 addition & 0 deletions docs/config_options.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
* `halfkay`
* `caterina`
* `bootloadHID`
* `USBasp`

## Feature Options

Expand Down
25 changes: 25 additions & 0 deletions docs/flashing.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,31 @@ Flashing sequence:
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)

## USBasploader

USBasploader is a bootloader developed by matrixstorm. It is used in some atmega328p or similar devices which only function using the VUSB.
yiancar marked this conversation as resolved.
Show resolved Hide resolved

To ensure compatibility with the USBasploader bootloader, make sure this block is present your `rules.mk`:
yiancar marked this conversation as resolved.
Show resolved Hide resolved

# Bootloader
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This block should be triple-backticked, so it can be syntax highlighted.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I followed what the other sections followed. which is not triple-backtick

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fauxpark I think this can be put off to later. I want to do a big overhaul of the flashing docs (not just this file), once both this, and my :flash target PR get merged.

# This definition is optional, and if your keyboard supports multiple bootloaders of
# different sizes, comment this out, and the correct address will be loaded
# automatically (+60). See bootloader.mk for all options.
BOOTLOADER = USBasp

Compatible flashers:

* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [avrdude](http://www.nongnu.org/avrdude/) with usbasp
yiancar marked this conversation as resolved.
Show resolved Hide resolved
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)

Flashing sequence:

1. Press the `RESET` keycode, or keep the boot pin shorted to GND while quickly shorting RST to GND
2. Wait for the OS to detect the device
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)

## STM32

All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same.
Expand Down
4 changes: 1 addition & 3 deletions keyboards/gingham/rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# atmega32a bootloadHID
#
# This uses usbaspbootloader
# BOOTLOADER = atmel-dfu
BOOTLOADER = USBasp

# If you don't know the bootloader type, then you can specify the
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
Expand All @@ -58,8 +58,6 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
# OPT_DEFS += -DBOOTLOADER_SIZE=4096
OPT_DEFS += -DBOOTLOADER_SIZE=2048

# Flash program via avrdude, but default command is not suitable.
# You can use plaid:default:program
Expand Down
43 changes: 38 additions & 5 deletions tmk_core/common/avr/bootloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@
#define BOOT_SIZE_1024 0b010
#define BOOT_SIZE_2048 0b000

#ifndef MCUCSR
//compatibility between ATMega8 and ATMega88
#define MCUCSR MCUSR
#endif

/** \brief Entering the Bootloader via Software
*
* http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
Expand Down Expand Up @@ -149,6 +154,39 @@ void bootloader_jump(void) {

while(1) {} // wait for watchdog timer to trigger

#elif defined(BOOTLOADER_USBASP)
// Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c
wdt_enable(WDTO_15MS);
wdt_reset();
asm volatile (
"cli \n\t"
"ldi r29 , %[ramendhi] \n\t"
"ldi r28 , %[ramendlo] \n\t"
#if (FLASHEND>131071)
"ldi r18 , %[bootaddrhi] \n\t"
"st Y+, r18 \n\t"
#endif
"ldi r18 , %[bootaddrme] \n\t"
"st Y+, r18 \n\t"
"ldi r18 , %[bootaddrlo] \n\t"
"st Y+, r18 \n\t"
"out %[mcucsrio], __zero_reg__ \n\t"
"bootloader_startup_loop%=: \n\t"
"rjmp bootloader_startup_loop%= \n\t"
:
: [mcucsrio] "I" (_SFR_IO_ADDR(MCUCSR)),
#if (FLASHEND>131071)
[ramendhi] "M" (((RAMEND - 2) >> 8) & 0xff),
[ramendlo] "M" (((RAMEND - 2) >> 0) & 0xff),
[bootaddrhi] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >>16) & 0xff),
#else
[ramendhi] "M" (((RAMEND - 1) >> 8) & 0xff),
[ramendlo] "M" (((RAMEND - 1) >> 0) & 0xff),
#endif
[bootaddrme] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff),
[bootaddrlo] "M" ((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff)
);

#else // Assume remaining boards are DFU, even if the flag isn't set

#if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
Expand All @@ -172,11 +210,6 @@ void bootloader_jump(void) {

}

#ifdef __AVR_ATmega32A__
// MCUSR is actually called MCUCSR in ATmega32A
#define MCUSR MCUCSR
#endif

/* this runs before main() */
void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
void bootloader_jump_after_watchdog_reset(void)
Expand Down