Add mmoskal/uf2-stm32f103 bootloader support (#19594)
parent
a92071494a
commit
0730740add
|
@ -275,7 +275,11 @@ ifneq ($(findstring STM32F103, $(MCU)),)
|
||||||
# Linker script to use
|
# Linker script to use
|
||||||
# - it should exist either in <chibios>/os/common/startup/ARMCMx/compilers/GCC/ld/
|
# - it should exist either in <chibios>/os/common/startup/ARMCMx/compilers/GCC/ld/
|
||||||
# or <keyboard_dir>/ld/
|
# or <keyboard_dir>/ld/
|
||||||
MCU_LDSCRIPT ?= STM32F103x8
|
ifeq ($(strip $(BOOTLOADER)), uf2boot)
|
||||||
|
MCU_LDSCRIPT ?= STM32F103xB_uf2boot
|
||||||
|
else
|
||||||
|
MCU_LDSCRIPT ?= STM32F103x8
|
||||||
|
endif
|
||||||
|
|
||||||
# Startup code to use
|
# Startup code to use
|
||||||
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
|
|
@ -171,6 +171,7 @@
|
||||||
"stm32-dfu",
|
"stm32-dfu",
|
||||||
"stm32duino",
|
"stm32duino",
|
||||||
"tinyuf2",
|
"tinyuf2",
|
||||||
|
"uf2boot",
|
||||||
"unknown",
|
"unknown",
|
||||||
"usbasploader",
|
"usbasploader",
|
||||||
"wb32-dfu"
|
"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.
|
* `: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
|
## Raspberry Pi RP2040 UF2
|
||||||
|
|
||||||
The `rules.mk` setting for this bootloader is `rp2040`, and can be specified at the keymap or user level.
|
The `rules.mk` setting for this bootloader is `rp2040`, and can be specified at the keymap or user level.
|
||||||
|
|
|
@ -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
|
|
@ -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>
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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.
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Enter lower-power sleep mode when on the ChibiOS idle thread
|
||||||
|
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
|
|
@ -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
|
BOOTLOADER_TYPE = tinyuf2
|
||||||
FIRMWARE_FORMAT = uf2
|
FIRMWARE_FORMAT = uf2
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), uf2boot)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_UF2BOOT
|
||||||
|
BOOTLOADER_TYPE = uf2boot
|
||||||
|
FIRMWARE_FORMAT = uf2
|
||||||
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), rp2040)
|
ifeq ($(strip $(BOOTLOADER)), rp2040)
|
||||||
OPT_DEFS += -DBOOTLOADER_RP2040
|
OPT_DEFS += -DBOOTLOADER_RP2040
|
||||||
BOOTLOADER_TYPE = rp2040
|
BOOTLOADER_TYPE = rp2040
|
||||||
|
|
|
@ -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)
|
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_DFU_UTIL)
|
||||||
else ifeq ($(strip $(BOOTLOADER)),tinyuf2)
|
else ifeq ($(strip $(BOOTLOADER)),tinyuf2)
|
||||||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
$(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)
|
else ifeq ($(strip $(BOOTLOADER)),rp2040)
|
||||||
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
$(UNSYNC_OUTPUT_CMD) && $(call EXEC_UF2_UTIL_DEPLOY)
|
||||||
else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
|
else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
|
||||||
|
|
Loading…
Reference in New Issue