From 0730740add19d3afe3d96ead50ba7d29e5dcb109 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 15 Jan 2023 15:04:32 +0000 Subject: [PATCH] Add mmoskal/uf2-stm32f103 bootloader support (#19594) --- builddefs/mcu_selection.mk | 6 +- data/schemas/keyboard.jsonschema | 1 + docs/flashing.md | 41 +++++++++ .../onekey/bluepill_uf2boot/config.h | 26 ++++++ .../onekey/bluepill_uf2boot/halconf.h | 28 ++++++ .../onekey/bluepill_uf2boot/info.json | 15 ++++ .../onekey/bluepill_uf2boot/mcuconf.h | 33 +++++++ .../onekey/bluepill_uf2boot/readme.md | 7 ++ .../onekey/bluepill_uf2boot/rules.mk | 2 + .../boards/common/ld/STM32F103xB_uf2boot.ld | 88 +++++++++++++++++++ platforms/chibios/bootloader.mk | 5 ++ platforms/chibios/bootloaders/uf2boot.c | 23 +++++ platforms/chibios/flash.mk | 2 + 13 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/config.h create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/halconf.h create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/info.json create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/readme.md create mode 100644 keyboards/handwired/onekey/bluepill_uf2boot/rules.mk create mode 100644 platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld create mode 100644 platforms/chibios/bootloaders/uf2boot.c diff --git a/builddefs/mcu_selection.mk b/builddefs/mcu_selection.mk index 382d9571a4..b566b1b5ac 100644 --- a/builddefs/mcu_selection.mk +++ b/builddefs/mcu_selection.mk @@ -275,7 +275,11 @@ ifneq ($(findstring STM32F103, $(MCU)),) # Linker script to use # - it should exist either in /os/common/startup/ARMCMx/compilers/GCC/ld/ # or /ld/ - MCU_LDSCRIPT ?= STM32F103x8 + ifeq ($(strip $(BOOTLOADER)), uf2boot) + MCU_LDSCRIPT ?= STM32F103xB_uf2boot + else + MCU_LDSCRIPT ?= STM32F103x8 + endif # Startup code to use # - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 513564a643..0002898327 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -171,6 +171,7 @@ "stm32-dfu", "stm32duino", "tinyuf2", + "uf2boot", "unknown", "usbasploader", "wb32-dfu" diff --git a/docs/flashing.md b/docs/flashing.md index b3f055f6cb..a636f19c72 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -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. diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/config.h b/keyboards/handwired/onekey/bluepill_uf2boot/config.h new file mode 100644 index 0000000000..79fa79595a --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/config.h @@ -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 . + */ + +#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 diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/halconf.h b/keyboards/handwired/onekey/bluepill_uf2boot/halconf.h new file mode 100644 index 0000000000..dbc3e82a79 --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/halconf.h @@ -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 . + */ + +/* + * 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 diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/info.json b/keyboards/handwired/onekey/bluepill_uf2boot/info.json new file mode 100644 index 0000000000..1f823ea0d7 --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/info.json @@ -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" + } +} diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h b/keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h new file mode 100644 index 0000000000..39834c135b --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/mcuconf.h @@ -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 . + */ + +/* + * 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 + +#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 diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/readme.md b/keyboards/handwired/onekey/bluepill_uf2boot/readme.md new file mode 100644 index 0000000000..7886ed1888 --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/readme.md @@ -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. \ No newline at end of file diff --git a/keyboards/handwired/onekey/bluepill_uf2boot/rules.mk b/keyboards/handwired/onekey/bluepill_uf2boot/rules.mk new file mode 100644 index 0000000000..a92b099328 --- /dev/null +++ b/keyboards/handwired/onekey/bluepill_uf2boot/rules.mk @@ -0,0 +1,2 @@ +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld b/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld new file mode 100644 index 0000000000..98d0f3ea75 --- /dev/null +++ b/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld @@ -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 */ diff --git a/platforms/chibios/bootloader.mk b/platforms/chibios/bootloader.mk index 0568d35321..85f1866062 100644 --- a/platforms/chibios/bootloader.mk +++ b/platforms/chibios/bootloader.mk @@ -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 diff --git a/platforms/chibios/bootloaders/uf2boot.c b/platforms/chibios/bootloaders/uf2boot.c new file mode 100644 index 0000000000..f5b1a64334 --- /dev/null +++ b/platforms/chibios/bootloaders/uf2boot.c @@ -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) {} diff --git a/platforms/chibios/flash.mk b/platforms/chibios/flash.mk index 6e23d96e1c..ac842e8d62 100644 --- a/platforms/chibios/flash.mk +++ b/platforms/chibios/flash.mk @@ -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)