Add mmoskal/uf2-stm32f103 bootloader support (#19594)
This commit is contained in:
parent
a92071494a
commit
0730740add
13 changed files with 276 additions and 1 deletions
|
@ -275,7 +275,11 @@ ifneq ($(findstring STM32F103, $(MCU)),)
|
|||
# Linker script to use
|
||||
# - it should exist either in <chibios>/os/common/startup/ARMCMx/compilers/GCC/ld/
|
||||
# or <keyboard_dir>/ld/
|
||||
ifeq ($(strip $(BOOTLOADER)), uf2boot)
|
||||
MCU_LDSCRIPT ?= STM32F103xB_uf2boot
|
||||
else
|
||||
MCU_LDSCRIPT ?= STM32F103x8
|
||||
endif
|
||||
|
||||
# Startup code to use
|
||||
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||
|
|
|
@ -171,6 +171,7 @@
|
|||
"stm32-dfu",
|
||||
"stm32duino",
|
||||
"tinyuf2",
|
||||
"uf2boot",
|
||||
"unknown",
|
||||
"usbasploader",
|
||||
"wb32-dfu"
|
||||
|
|
|
@ -363,6 +363,47 @@ CLI Flashing sequence:
|
|||
|
||||
* `:uf2-split-left` and `:uf2-split-right`: Flashes the firmware but also sets the handedness setting in EEPROM by generating a side specific firmware.
|
||||
|
||||
## uf2boot
|
||||
|
||||
Keyboards may opt into supporting the uf2boot bootloader. This is currently only supported on the F103 bluepill.
|
||||
|
||||
The `rules.mk` setting for this bootloader is `uf2boot`, and can be specified at the keymap or user level.
|
||||
|
||||
To ensure compatibility with the uf2boot bootloader, make sure this block is present in your `rules.mk`:
|
||||
|
||||
```make
|
||||
# Bootloader selection
|
||||
BOOTLOADER = uf2boot
|
||||
```
|
||||
|
||||
Compatible flashers:
|
||||
|
||||
* Any application able to copy a file from one place to another, such as _macOS Finder_ or _Windows Explorer_.
|
||||
|
||||
Flashing sequence:
|
||||
|
||||
1. Enter the bootloader using any of the following methods:
|
||||
* Tap the `QK_BOOT` keycode
|
||||
* Double-tap the `nRST` button on the PCB.
|
||||
2. Wait for the OS to detect the device
|
||||
3. Copy the .uf2 file to the new USB disk
|
||||
4. Wait for the keyboard to become available
|
||||
|
||||
or
|
||||
|
||||
CLI Flashing sequence:
|
||||
|
||||
1. Enter the bootloader using any of the following methods:
|
||||
* Tap the `QK_BOOT` keycode
|
||||
* Double-tap the `nRST` button on the PCB.
|
||||
2. Wait for the OS to detect the device
|
||||
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/bluepill_uf2boot --keymap default`
|
||||
4. Wait for the keyboard to become available
|
||||
|
||||
### `make` Targets
|
||||
|
||||
* `:uf2-split-left` and `:uf2-split-right`: Flashes the firmware but also sets the handedness setting in EEPROM by generating a side specific firmware.
|
||||
|
||||
## Raspberry Pi RP2040 UF2
|
||||
|
||||
The `rules.mk` setting for this bootloader is `rp2040`, and can be specified at the keymap or user level.
|
||||
|
|
26
keyboards/handwired/onekey/bluepill_uf2boot/config.h
Normal file
26
keyboards/handwired/onekey/bluepill_uf2boot/config.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
/* Copyright 2019
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
#define BACKLIGHT_PWM_DRIVER PWMD2
|
||||
#define BACKLIGHT_PWM_CHANNEL 1
|
||||
|
||||
#define ADC_PIN A0
|
||||
|
||||
#define RGB_CI_PIN A2
|
28
keyboards/handwired/onekey/bluepill_uf2boot/halconf.h
Normal file
28
keyboards/handwired/onekey/bluepill_uf2boot/halconf.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* Copyright 2020 QMK
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was auto-generated by:
|
||||
* `qmk chibios-confmigrate -i keyboards/handwired/onekey/bluepill/halconf.h -r platforms/chibios/common/configs/halconf.h`
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_ADC TRUE
|
||||
|
||||
#define HAL_USE_PWM TRUE
|
||||
|
||||
#include_next <halconf.h>
|
15
keyboards/handwired/onekey/bluepill_uf2boot/info.json
Normal file
15
keyboards/handwired/onekey/bluepill_uf2boot/info.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"keyboard_name": "Onekey Bluepill STM32F103 uf2boot",
|
||||
"development_board": "bluepill",
|
||||
"bootloader": "uf2boot",
|
||||
"matrix_pins": {
|
||||
"cols": ["B0"],
|
||||
"rows": ["A7"]
|
||||
},
|
||||
"backlight": {
|
||||
"pin": "A0"
|
||||
},
|
||||
"rgblight": {
|
||||
"pin": "A1"
|
||||
}
|
||||
}
|
33
keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h
Normal file
33
keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/* Copyright 2020 QMK
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was auto-generated by:
|
||||
* `qmk chibios-confmigrate -i keyboards/handwired/onekey/bluepill/mcuconf.h -r platforms/chibios/STM32_F103_STM32DUINO/configs/mcuconf.h`
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_ADC_USE_ADC1
|
||||
#define STM32_ADC_USE_ADC1 TRUE
|
||||
|
||||
#undef STM32_PWM_USE_TIM2
|
||||
#define STM32_PWM_USE_TIM2 TRUE
|
||||
|
||||
#undef STM32_SPI_USE_SPI2
|
||||
#define STM32_SPI_USE_SPI2 FALSE
|
7
keyboards/handwired/onekey/bluepill_uf2boot/readme.md
Normal file
7
keyboards/handwired/onekey/bluepill_uf2boot/readme.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Bluepill onekey
|
||||
|
||||
To trigger keypress, short together pins *B0* and *A7*.
|
||||
|
||||
This variant requires the uf2-stm32f103 bootloader to be installed. This can be downloaded from the [uf2-stm32f103 releases page](https://github.com/mmoskal/uf2-stm32f103/releases).
|
||||
|
||||
Double-tap reset to enter bootloader mode. Copy the built uf2 file to the device by dragging the file to the new USB disk.
|
2
keyboards/handwired/onekey/bluepill_uf2boot/rules.mk
Normal file
2
keyboards/handwired/onekey/bluepill_uf2boot/rules.mk
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Enter lower-power sleep mode when on the ChibiOS idle thread
|
||||
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
|
88
platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld
Normal file
88
platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32F103xB memory setup.
|
||||
*/
|
||||
MEMORY
|
||||
{
|
||||
flash0 (rx) : org = 0x08000000 + 16K, len = 128k - 16K
|
||||
flash1 (rx) : org = 0x00000000, len = 0
|
||||
flash2 (rx) : org = 0x00000000, len = 0
|
||||
flash3 (rx) : org = 0x00000000, len = 0
|
||||
flash4 (rx) : org = 0x00000000, len = 0
|
||||
flash5 (rx) : org = 0x00000000, len = 0
|
||||
flash6 (rx) : org = 0x00000000, len = 0
|
||||
flash7 (rx) : org = 0x00000000, len = 0
|
||||
ram0 (wx) : org = 0x20000000, len = 20k
|
||||
ram1 (wx) : org = 0x00000000, len = 0
|
||||
ram2 (wx) : org = 0x00000000, len = 0
|
||||
ram3 (wx) : org = 0x00000000, len = 0
|
||||
ram4 (wx) : org = 0x00000000, len = 0
|
||||
ram5 (wx) : org = 0x00000000, len = 0
|
||||
ram6 (wx) : org = 0x00000000, len = 0
|
||||
ram7 (wx) : org = 0x00000000, len = 0
|
||||
}
|
||||
|
||||
/* For each data/text section two region are defined, a virtual region
|
||||
and a load region (_LMA suffix).*/
|
||||
|
||||
/* Flash region to be used for exception vectors.*/
|
||||
REGION_ALIAS("VECTORS_FLASH", flash0);
|
||||
REGION_ALIAS("VECTORS_FLASH_LMA", flash0);
|
||||
|
||||
/* Flash region to be used for constructors and destructors.*/
|
||||
REGION_ALIAS("XTORS_FLASH", flash0);
|
||||
REGION_ALIAS("XTORS_FLASH_LMA", flash0);
|
||||
|
||||
/* Flash region to be used for code text.*/
|
||||
REGION_ALIAS("TEXT_FLASH", flash0);
|
||||
REGION_ALIAS("TEXT_FLASH_LMA", flash0);
|
||||
|
||||
/* Flash region to be used for read only data.*/
|
||||
REGION_ALIAS("RODATA_FLASH", flash0);
|
||||
REGION_ALIAS("RODATA_FLASH_LMA", flash0);
|
||||
|
||||
/* Flash region to be used for various.*/
|
||||
REGION_ALIAS("VARIOUS_FLASH", flash0);
|
||||
REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);
|
||||
|
||||
/* Flash region to be used for RAM(n) initialization data.*/
|
||||
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);
|
||||
|
||||
/* RAM region to be used for Main stack. This stack accommodates the processing
|
||||
of all exceptions and interrupts.*/
|
||||
REGION_ALIAS("MAIN_STACK_RAM", ram0);
|
||||
|
||||
/* RAM region to be used for the process stack. This is the stack used by
|
||||
the main() function.*/
|
||||
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
|
||||
|
||||
/* RAM region to be used for data segment.*/
|
||||
REGION_ALIAS("DATA_RAM", ram0);
|
||||
REGION_ALIAS("DATA_RAM_LMA", flash0);
|
||||
|
||||
/* RAM region to be used for BSS segment.*/
|
||||
REGION_ALIAS("BSS_RAM", ram0);
|
||||
|
||||
/* RAM region to be used for the default heap.*/
|
||||
REGION_ALIAS("HEAP_RAM", ram0);
|
||||
|
||||
/* Generic rules inclusion.*/
|
||||
INCLUDE rules.ld
|
||||
|
||||
/* Bootloader reset support */
|
||||
_board_magic_reg = ORIGIN(ram0) + 16k; /* this is based off the code within backup.c */
|
|
@ -104,6 +104,11 @@ ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
|||
BOOTLOADER_TYPE = tinyuf2
|
||||
FIRMWARE_FORMAT = uf2
|
||||
endif
|
||||
ifeq ($(strip $(BOOTLOADER)), uf2boot)
|
||||
OPT_DEFS += -DBOOTLOADER_UF2BOOT
|
||||
BOOTLOADER_TYPE = uf2boot
|
||||
FIRMWARE_FORMAT = uf2
|
||||
endif
|
||||
ifeq ($(strip $(BOOTLOADER)), rp2040)
|
||||
OPT_DEFS += -DBOOTLOADER_RP2040
|
||||
BOOTLOADER_TYPE = rp2040
|
||||
|
|
23
platforms/chibios/bootloaders/uf2boot.c
Normal file
23
platforms/chibios/bootloaders/uf2boot.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2023 QMK
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "bootloader.h"
|
||||
|
||||
// From mmoskal/uf2-stm32f103's backup.c
|
||||
#define MAGIC_BOOT 0x544F4F42UL
|
||||
|
||||
// defined by linker script
|
||||
extern uint32_t _board_magic_reg[];
|
||||
#define MAGIC_REG _board_magic_reg[0]
|
||||
|
||||
void bootloader_jump(void) {
|
||||
MAGIC_REG = MAGIC_BOOT;
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void mcu_reset(void) {
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
/* not needed, no two-stage reset */
|
||||
void enter_bootloader_mode_if_requested(void) {}
|
|
@ -109,6 +109,8 @@ else ifeq ($(strip $(BOOTLOADER)),kiibohd)
|
|||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_DFU_UTIL)
|
||||
else ifeq ($(strip $(BOOTLOADER)),tinyuf2)
|
||||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
||||
else ifeq ($(strip $(BOOTLOADER)),uf2boot)
|
||||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
||||
else ifeq ($(strip $(BOOTLOADER)),rp2040)
|
||||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
||||
else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
|
||||
|
|
Loading…
Reference in a new issue