From f68e84b7f115ef23acd678e6696b40bebd40064e Mon Sep 17 00:00:00 2001 From: zvecr Date: Sat, 14 Jan 2023 16:25:36 +0000 Subject: [PATCH 1/3] Add mmoskal/uf2-stm32f103 bootloader support --- builddefs/mcu_selection.mk | 6 +- data/schemas/keyboard.jsonschema | 1 + .../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/STM32F103x8_uf2boot.ld | 88 +++++++++++++++++++ platforms/chibios/bootloader.mk | 5 ++ platforms/chibios/bootloaders/uf2boot.c | 31 +++++++ platforms/chibios/flash.mk | 2 + 12 files changed, 243 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/STM32F103x8_uf2boot.ld create mode 100644 platforms/chibios/bootloaders/uf2boot.c diff --git a/builddefs/mcu_selection.mk b/builddefs/mcu_selection.mk index 382d9571a469..0b238e3cbaee 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 ?= STM32F103x8_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 513564a643b0..000289832722 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/keyboards/handwired/onekey/bluepill_uf2boot/config.h b/keyboards/handwired/onekey/bluepill_uf2boot/config.h new file mode 100644 index 000000000000..79fa79595a45 --- /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 000000000000..dbc3e82a79a7 --- /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 000000000000..1f823ea0d7ff --- /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 000000000000..39834c135b65 --- /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 000000000000..7886ed188809 --- /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 000000000000..a92b0993283e --- /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/STM32F103x8_uf2boot.ld b/platforms/chibios/boards/common/ld/STM32F103x8_uf2boot.ld new file mode 100644 index 000000000000..d8786a9e11f6 --- /dev/null +++ b/platforms/chibios/boards/common/ld/STM32F103x8_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 + +/* TinyUF2 bootloader reset support */ +_board_dfu_dbl_tap = ORIGIN(ram0) + 20k - 4; /* this is based off the linker file for tinyuf2 */ diff --git a/platforms/chibios/bootloader.mk b/platforms/chibios/bootloader.mk index 0568d353219b..85f186606228 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 000000000000..fa51423f03e2 --- /dev/null +++ b/platforms/chibios/bootloaders/uf2boot.c @@ -0,0 +1,31 @@ +/* Copyright 2021 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 3 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 . + */ + +#include "bootloader.h" + +#define MAGIC_BOOT 0x544F4F42UL +#define MAGIC_REG *(volatile uint32_t*)0x20004000 + +void bootloader_jump(void) { + MAGIC_REG = MAGIC_BOOT; + NVIC_SystemReset(); +} + +__attribute__((weak)) void mcu_reset(void) { + NVIC_SystemReset(); +} + +__attribute__((weak)) void enter_bootloader_mode_if_requested(void) {} diff --git a/platforms/chibios/flash.mk b/platforms/chibios/flash.mk index 6e23d96e1cb1..ac842e8d62cd 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) From 1ff3e47bda23b9fab93967ba9ecb1576fabe7783 Mon Sep 17 00:00:00 2001 From: zvecr Date: Sat, 14 Jan 2023 16:38:57 +0000 Subject: [PATCH 2/3] tidy --- builddefs/mcu_selection.mk | 2 +- ...03x8_uf2boot.ld => STM32F103xB_uf2boot.ld} | 0 platforms/chibios/bootloaders/uf2boot.c | 19 +++---------------- 3 files changed, 4 insertions(+), 17 deletions(-) rename platforms/chibios/boards/common/ld/{STM32F103x8_uf2boot.ld => STM32F103xB_uf2boot.ld} (100%) diff --git a/builddefs/mcu_selection.mk b/builddefs/mcu_selection.mk index 0b238e3cbaee..b566b1b5ac43 100644 --- a/builddefs/mcu_selection.mk +++ b/builddefs/mcu_selection.mk @@ -276,7 +276,7 @@ ifneq ($(findstring STM32F103, $(MCU)),) # - it should exist either in /os/common/startup/ARMCMx/compilers/GCC/ld/ # or /ld/ ifeq ($(strip $(BOOTLOADER)), uf2boot) - MCU_LDSCRIPT ?= STM32F103x8_uf2boot + MCU_LDSCRIPT ?= STM32F103xB_uf2boot else MCU_LDSCRIPT ?= STM32F103x8 endif diff --git a/platforms/chibios/boards/common/ld/STM32F103x8_uf2boot.ld b/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld similarity index 100% rename from platforms/chibios/boards/common/ld/STM32F103x8_uf2boot.ld rename to platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld diff --git a/platforms/chibios/bootloaders/uf2boot.c b/platforms/chibios/bootloaders/uf2boot.c index fa51423f03e2..8127e4c9b3ec 100644 --- a/platforms/chibios/bootloaders/uf2boot.c +++ b/platforms/chibios/bootloaders/uf2boot.c @@ -1,18 +1,5 @@ -/* Copyright 2021 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 3 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 . - */ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later #include "bootloader.h" @@ -24,7 +11,7 @@ void bootloader_jump(void) { NVIC_SystemReset(); } -__attribute__((weak)) void mcu_reset(void) { +void mcu_reset(void) { NVIC_SystemReset(); } From e9c0c7530decc75854e459af43050c400376a7a1 Mon Sep 17 00:00:00 2001 From: zvecr Date: Sun, 15 Jan 2023 13:19:42 +0000 Subject: [PATCH 3/3] Review comments --- docs/flashing.md | 41 +++++++++++++++++++ .../boards/common/ld/STM32F103xB_uf2boot.ld | 4 +- platforms/chibios/bootloaders/uf2boot.c | 9 +++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/docs/flashing.md b/docs/flashing.md index b3f055f6cb27..a636f19c721d 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/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld b/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld index d8786a9e11f6..98d0f3ea754f 100644 --- a/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld +++ b/platforms/chibios/boards/common/ld/STM32F103xB_uf2boot.ld @@ -84,5 +84,5 @@ REGION_ALIAS("HEAP_RAM", ram0); /* Generic rules inclusion.*/ INCLUDE rules.ld -/* TinyUF2 bootloader reset support */ -_board_dfu_dbl_tap = ORIGIN(ram0) + 20k - 4; /* this is based off the linker file for tinyuf2 */ +/* Bootloader reset support */ +_board_magic_reg = ORIGIN(ram0) + 16k; /* this is based off the code within backup.c */ diff --git a/platforms/chibios/bootloaders/uf2boot.c b/platforms/chibios/bootloaders/uf2boot.c index 8127e4c9b3ec..f5b1a64334cf 100644 --- a/platforms/chibios/bootloaders/uf2boot.c +++ b/platforms/chibios/bootloaders/uf2boot.c @@ -3,8 +3,12 @@ #include "bootloader.h" +// From mmoskal/uf2-stm32f103's backup.c #define MAGIC_BOOT 0x544F4F42UL -#define MAGIC_REG *(volatile uint32_t*)0x20004000 + +// 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; @@ -15,4 +19,5 @@ void mcu_reset(void) { NVIC_SystemReset(); } -__attribute__((weak)) void enter_bootloader_mode_if_requested(void) {} +/* not needed, no two-stage reset */ +void enter_bootloader_mode_if_requested(void) {}