From 744af003befb3f5cf6dc6b6f3e581f288d598f96 Mon Sep 17 00:00:00 2001
From: Joel Challis <git@zvecr.com>
Date: Wed, 6 Jul 2022 19:27:15 +0100
Subject: [PATCH] Add kb2040 and sparkfun rp2040 converters (#17514)

---
 data/mappings/defaults.json                   | 12 +++
 data/schemas/keyboard.jsonschema              |  2 +-
 .../chibios/boards/QMK_PM2040/board/board.mk  |  9 ++
 .../chibios/boards/QMK_PM2040/configs/board.h | 12 +++
 .../boards/QMK_PM2040/configs/chconf.h        | 13 +++
 .../boards/QMK_PM2040/configs/config.h        | 21 ++++
 .../boards/QMK_PM2040/configs/halconf.h       |  9 ++
 .../boards/QMK_PM2040/configs/mcuconf.h       | 98 +++++++++++++++++++
 .../converters/promicro_to_kb2040/_pin_defs.h | 36 +++++++
 .../promicro_to_kb2040/converter.mk           |  9 ++
 .../promicro_to_promicro_rp2040/_pin_defs.h   | 36 +++++++
 .../promicro_to_promicro_rp2040/converter.mk  |  9 ++
 12 files changed, 265 insertions(+), 1 deletion(-)
 create mode 100644 platforms/chibios/boards/QMK_PM2040/board/board.mk
 create mode 100644 platforms/chibios/boards/QMK_PM2040/configs/board.h
 create mode 100644 platforms/chibios/boards/QMK_PM2040/configs/chconf.h
 create mode 100644 platforms/chibios/boards/QMK_PM2040/configs/config.h
 create mode 100644 platforms/chibios/boards/QMK_PM2040/configs/halconf.h
 create mode 100644 platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h
 create mode 100644 platforms/chibios/converters/promicro_to_kb2040/_pin_defs.h
 create mode 100644 platforms/chibios/converters/promicro_to_kb2040/converter.mk
 create mode 100644 platforms/chibios/converters/promicro_to_promicro_rp2040/_pin_defs.h
 create mode 100644 platforms/chibios/converters/promicro_to_promicro_rp2040/converter.mk

diff --git a/data/mappings/defaults.json b/data/mappings/defaults.json
index e62ab688d6..c6cb53f4c3 100644
--- a/data/mappings/defaults.json
+++ b/data/mappings/defaults.json
@@ -16,6 +16,18 @@
             "board": "QMK_PROTON_C",
             "pin_compatible": "promicro"
         },
+        "kb2040": {
+            "processor": "RP2040",
+            "bootloader": "rp2040",
+            "board": "QMK_PM2040",
+            "pin_compatible": "promicro"
+        },
+        "promicro_rp2040": {
+            "processor": "RP2040",
+            "bootloader": "rp2040",
+            "board": "QMK_PM2040",
+            "pin_compatible": "promicro"
+        },
         "bluepill": {
             "processor": "STM32F103",
             "bootloader": "stm32duino",
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema
index 320974f0c4..166a5d4d3b 100644
--- a/data/schemas/keyboard.jsonschema
+++ b/data/schemas/keyboard.jsonschema
@@ -34,7 +34,7 @@
         },
         "development_board": {
             "type": "string",
-            "enum": ["promicro", "elite_c", "proton_c", "bluepill", "blackpill_f401", "blackpill_f411"]
+            "enum": ["promicro", "elite_c", "proton_c", "kb2040", "promicro_rp2040", "bluepill", "blackpill_f401", "blackpill_f411"]
         },
         "pin_compatible": {
             "type": "string",
diff --git a/platforms/chibios/boards/QMK_PM2040/board/board.mk b/platforms/chibios/boards/QMK_PM2040/board/board.mk
new file mode 100644
index 0000000000..911cc5a058
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/board/board.mk
@@ -0,0 +1,9 @@
+# List of all the board related files.
+BOARDSRC = $(CHIBIOS)/os/hal/boards/RP_PICO_RP2040/board.c
+
+# Required include directories
+BOARDINC = $(CHIBIOS)/os/hal/boards/RP_PICO_RP2040
+
+# Shared variables
+ALLCSRC += $(BOARDSRC) 
+ALLINC  += $(BOARDINC)
diff --git a/platforms/chibios/boards/QMK_PM2040/configs/board.h b/platforms/chibios/boards/QMK_PM2040/configs/board.h
new file mode 100644
index 0000000000..433e1c527f
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/configs/board.h
@@ -0,0 +1,12 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next "board.h"
+
+#undef BOARD_RP_PICO_RP2040
+#define BOARD_PM2040
+
+#undef BOARD_NAME
+#define BOARD_NAME "Pro Micro RP2040"
diff --git a/platforms/chibios/boards/QMK_PM2040/configs/chconf.h b/platforms/chibios/boards/QMK_PM2040/configs/chconf.h
new file mode 100644
index 0000000000..d53f57edd9
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/configs/chconf.h
@@ -0,0 +1,13 @@
+// Copyright 2022 Stefan Kerkmann
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define CH_CFG_SMP_MODE                     TRUE
+#define CH_CFG_ST_RESOLUTION                32
+#define CH_CFG_ST_FREQUENCY                 1000000
+#define CH_CFG_INTERVALS_SIZE               32
+#define CH_CFG_TIME_TYPES_SIZE              32
+#define CH_CFG_ST_TIMEDELTA                 20
+
+#include_next <chconf.h>
diff --git a/platforms/chibios/boards/QMK_PM2040/configs/config.h b/platforms/chibios/boards/QMK_PM2040/configs/config.h
new file mode 100644
index 0000000000..6b1dcca938
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/configs/config.h
@@ -0,0 +1,21 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#ifndef I2C_DRIVER
+#    define I2C_DRIVER I2CD2
+#endif
+#ifndef I2C1_SDA_PIN
+#    define I2C1_SDA_PIN D2
+#endif
+#ifndef I2C1_SCL_PIN
+#    define I2C1_SCL_PIN D3
+#endif
+
+#ifndef RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#    define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#endif
+#ifndef RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT
+#    define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+#endif
diff --git a/platforms/chibios/boards/QMK_PM2040/configs/halconf.h b/platforms/chibios/boards/QMK_PM2040/configs/halconf.h
new file mode 100644
index 0000000000..d7a58f0ea6
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/configs/halconf.h
@@ -0,0 +1,9 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h b/platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h
new file mode 100644
index 0000000000..a737b36c1c
--- /dev/null
+++ b/platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h
@@ -0,0 +1,98 @@
+/*
+    ChibiOS - Copyright (C) 2006..2021 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.
+*/
+
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
+/*
+ * RP2040_MCUCONF drivers configuration.
+ *
+ * IRQ priorities:
+ * 3...0        Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...1        Lowest...Highest.
+ */
+
+#define RP2040_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define RP_NO_INIT                          FALSE
+#define RP_CORE1_START                      FALSE
+#define RP_CORE1_VECTORS_TABLE              _vectors
+#define RP_CORE1_ENTRY_POINT                _crt0_c1_entry
+#define RP_CORE1_STACK_END                  __c1_main_stack_end__
+
+/*
+ * IRQ system settings.
+ */
+#define RP_IRQ_SYSTICK_PRIORITY             2
+#define RP_IRQ_TIMER_ALARM0_PRIORITY        2
+#define RP_IRQ_TIMER_ALARM1_PRIORITY        2
+#define RP_IRQ_TIMER_ALARM2_PRIORITY        2
+#define RP_IRQ_TIMER_ALARM3_PRIORITY        2
+#define RP_IRQ_UART0_PRIORITY               3
+#define RP_IRQ_UART1_PRIORITY               3
+#define RP_IRQ_SPI0_PRIORITY                2
+#define RP_IRQ_SPI1_PRIORITY                2
+#define RP_IRQ_USB0_PRIORITY                3
+#define RP_IRQ_I2C0_PRIORITY                2
+#define RP_IRQ_I2C1_PRIORITY                2
+
+/*
+ * ADC driver system settings.
+ */
+#define RP_ADC_USE_ADC1                     FALSE
+
+/*
+ * SIO driver system settings.
+ */
+#define RP_SIO_USE_UART0                    FALSE
+#define RP_SIO_USE_UART1                    FALSE
+
+/*
+ * SPI driver system settings.
+ */
+#define RP_SPI_USE_SPI0                     TRUE
+#define RP_SPI_USE_SPI1                     FALSE
+#define RP_SPI_SPI0_RX_DMA_CHANNEL          RP_DMA_CHANNEL_ID_ANY
+#define RP_SPI_SPI0_TX_DMA_CHANNEL          RP_DMA_CHANNEL_ID_ANY
+#define RP_SPI_SPI1_RX_DMA_CHANNEL          RP_DMA_CHANNEL_ID_ANY
+#define RP_SPI_SPI1_TX_DMA_CHANNEL          RP_DMA_CHANNEL_ID_ANY
+#define RP_SPI_SPI0_DMA_PRIORITY            1
+#define RP_SPI_SPI1_DMA_PRIORITY            1
+#define RP_SPI_DMA_ERROR_HOOK(spip)
+
+/*
+ * I2C driver system settings.
+ */
+#define RP_I2C_USE_I2C0                     FALSE
+#define RP_I2C_USE_I2C1                     TRUE
+#define RP_I2C_BUSY_TIMEOUT                 50
+#define RP_I2C_ADDRESS_MODE_10BIT           FALSE
+
+/*
+ * USB driver system settings.
+ */
+#define RP_USB_USE_USBD0                    TRUE
+#define RP_USB_FORCE_VBUS_DETECT            TRUE
+#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
+#define RP_USB_USE_SOF_INTR                 TRUE
+#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
+
+#endif /* MCUCONF_H */
diff --git a/platforms/chibios/converters/promicro_to_kb2040/_pin_defs.h b/platforms/chibios/converters/promicro_to_kb2040/_pin_defs.h
new file mode 100644
index 0000000000..0a3110890b
--- /dev/null
+++ b/platforms/chibios/converters/promicro_to_kb2040/_pin_defs.h
@@ -0,0 +1,36 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Left side (front)
+#define D3 0U
+#define D2 1U
+//      GND
+//      GND
+#define D1 2U
+#define D0 3U
+#define D4 4U
+#define C6 5U
+#define D7 6U
+#define E6 7U
+#define B4 8U
+#define B5 9U
+
+// Right side (front)
+//      RAW
+//      GND
+//      RESET
+//      VCC
+#define F4 29U
+#define F5 28U
+#define F6 27U
+#define F7 26U
+#define B1 18U
+#define B3 20U
+#define B2 19U
+#define B6 10U
+
+// LEDs (Mapped to QT connector to avoid collisions with button/neopixel)
+#define D5 12U
+#define B0 13U
diff --git a/platforms/chibios/converters/promicro_to_kb2040/converter.mk b/platforms/chibios/converters/promicro_to_kb2040/converter.mk
new file mode 100644
index 0000000000..6ffee357b3
--- /dev/null
+++ b/platforms/chibios/converters/promicro_to_kb2040/converter.mk
@@ -0,0 +1,9 @@
+# Adafruit KB2040 MCU settings for converting AVR projects
+MCU := RP2040
+BOARD := QMK_PM2040
+BOOTLOADER := rp2040
+
+# These are defaults based on what has been implemented for RP2040 boards
+SERIAL_DRIVER ?= vendor
+WS2812_DRIVER ?= vendor
+BACKLIGHT_DRIVER ?= software
diff --git a/platforms/chibios/converters/promicro_to_promicro_rp2040/_pin_defs.h b/platforms/chibios/converters/promicro_to_promicro_rp2040/_pin_defs.h
new file mode 100644
index 0000000000..0a1f4112a3
--- /dev/null
+++ b/platforms/chibios/converters/promicro_to_promicro_rp2040/_pin_defs.h
@@ -0,0 +1,36 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Left side (front)
+#define D3 0U
+#define D2 1U
+//      GND
+//      GND
+#define D1 2U
+#define D0 3U
+#define D4 4U
+#define C6 5U
+#define D7 6U
+#define E6 7U
+#define B4 8U
+#define B5 9U
+
+// Right side (front)
+//      RAW
+//      GND
+//      RESET
+//      VCC
+#define F4 29U
+#define F5 28U
+#define F6 27U
+#define F7 26U
+#define B1 22U
+#define B3 20U
+#define B2 23U
+#define B6 21U
+
+// LEDs (Mapped to QT connector to avoid collisions with button/neopixel)
+#define D5 17U
+#define B0 16U
diff --git a/platforms/chibios/converters/promicro_to_promicro_rp2040/converter.mk b/platforms/chibios/converters/promicro_to_promicro_rp2040/converter.mk
new file mode 100644
index 0000000000..03863eeb02
--- /dev/null
+++ b/platforms/chibios/converters/promicro_to_promicro_rp2040/converter.mk
@@ -0,0 +1,9 @@
+# Sparkfun Pro Micro RP2040 MCU settings for converting AVR projects
+MCU := RP2040
+BOARD := QMK_PM2040
+BOOTLOADER := rp2040
+
+# These are defaults based on what has been implemented for RP2040 boards
+SERIAL_DRIVER ?= vendor
+WS2812_DRIVER ?= vendor
+BACKLIGHT_DRIVER ?= software