aboutsummaryrefslogtreecommitdiffstats
path: root/src/rp2040
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2024-10-25 14:43:05 -0400
committerKevin O'Connor <kevin@koconnor.net>2024-11-14 11:17:52 -0500
commit06bb49f135ccedcebf7aa01896cba13f0d5d1145 (patch)
tree31ac78ee771ea3dd982927ad378a905b876209d6 /src/rp2040
parent61f81bdb26e91a18eddd5dd118a45011ee9e314d (diff)
downloadkutter-06bb49f135ccedcebf7aa01896cba13f0d5d1145.tar.gz
kutter-06bb49f135ccedcebf7aa01896cba13f0d5d1145.tar.xz
kutter-06bb49f135ccedcebf7aa01896cba13f0d5d1145.zip
rp2040: Initial rp2350 support
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/rp2040')
-rw-r--r--src/rp2040/Kconfig25
-rw-r--r--src/rp2040/Makefile24
-rw-r--r--src/rp2040/internal.h10
-rw-r--r--src/rp2040/main.c16
-rw-r--r--src/rp2040/rpxxxx_link.lds.S9
5 files changed, 61 insertions, 23 deletions
diff --git a/src/rp2040/Kconfig b/src/rp2040/Kconfig
index bec96336..2749db08 100644
--- a/src/rp2040/Kconfig
+++ b/src/rp2040/Kconfig
@@ -10,7 +10,7 @@ config RPXXXX_SELECT
select HAVE_GPIO_SPI
select HAVE_GPIO_I2C
select HAVE_STRICT_TIMING
- select HAVE_CHIPID
+ select HAVE_CHIPID if MACH_RP2040
select HAVE_GPIO_HARD_PWM
select HAVE_STEPPER_BOTH_EDGE
select HAVE_BOOTLOADER_REQUEST
@@ -27,15 +27,19 @@ choice
prompt "Processor model"
config MACH_RP2040
bool "rp2040"
+ config MACH_RP2350
+ bool "rp2350"
endchoice
config MCU
string
- default "rp2040"
+ default "rp2040" if MACH_RP2040
+ default "rp2350" if MACH_RP2350
config CLOCK_FREQ
int
- default 12000000
+ default 12000000 if MACH_RP2040
+ default 150000000 if MACH_RP2350
config FLASH_SIZE
hex
@@ -43,7 +47,8 @@ config FLASH_SIZE
config FLASH_BOOT_ADDRESS
hex
- default 0x10000100 # Stage2 binary starts at 0x10000000
+ default 0x10000100 if MACH_RP2040 # Stage2 binary starts at 0x10000000
+ default 0x10000000 if MACH_RP2350
config RAM_START
hex
@@ -51,7 +56,8 @@ config RAM_START
config RAM_SIZE
hex
- default 0x42000
+ default 0x42000 if MACH_RP2040
+ default 0x82000 if MACH_RP2350
config STACK_SIZE
int
@@ -66,20 +72,25 @@ config RP2040_HAVE_STAGE2
bool
config RPXXXX_HAVE_BOOTLOADER
bool
- default y if !RP2040_HAVE_STAGE2
choice
prompt "Bootloader offset"
+ config RPXXXX_FLASH_START_0000
+ bool "No bootloader"
+ depends on MACH_RP2350
config RPXXXX_FLASH_START_0100
bool "No bootloader"
+ depends on MACH_RP2040
select RP2040_HAVE_STAGE2
config RPXXXX_FLASH_START_4000
bool "16KiB bootloader"
+ select RPXXXX_HAVE_BOOTLOADER
endchoice
config FLASH_APPLICATION_ADDRESS
hex
default 0x10004000 if RPXXXX_FLASH_START_4000
- default 0x10000100
+ default 0x10000100 if RPXXXX_FLASH_START_0100
+ default 0x10000000 if RPXXXX_FLASH_START_0000
choice
prompt "Flash chip" if LOW_LEVEL_OPTIONS && RP2040_HAVE_STAGE2
diff --git a/src/rp2040/Makefile b/src/rp2040/Makefile
index bad4151e..8e2bf57b 100644
--- a/src/rp2040/Makefile
+++ b/src/rp2040/Makefile
@@ -8,23 +8,25 @@ dirs-y += src/rp2040 src/generic lib/elf2uf2 lib/fast-hash lib/can2040
MCU := $(shell echo $(CONFIG_MCU))
MCU_UPPER := $(shell echo $(CONFIG_MCU) | tr a-z A-Z | tr X x)
-CFLAGS += -mcpu=cortex-m0plus -mthumb -Ilib/cmsis-core
+CFLAGS-$(CONFIG_MACH_RP2040) += -mcpu=cortex-m0plus
+CFLAGS-$(CONFIG_MACH_RP2350) += -mcpu=cortex-m33
+CFLAGS += $(CFLAGS-y) -DPICO_$(MCU_UPPER) -mthumb -Ilib/cmsis-core
CFLAGS += -Ilib/pico-sdk/$(MCU) -Ilib/pico-sdk
CFLAGS += -Ilib/pico-sdk/$(MCU)/cmsis_include -Ilib/fast-hash -Ilib/can2040
-CFLAGS += -DPICO_$(MCU_UPPER)
# Add source files
-src-y += rp2040/main.c rp2040/watchdog.c rp2040/gpio.c
-src-y += rp2040/adc.c rp2040/timer.c rp2040/bootrom.c
-src-y += generic/armcm_boot.c generic/armcm_irq.c generic/armcm_reset.c
-src-y += generic/timer_irq.c generic/crc16_ccitt.c
-src-$(CONFIG_USBSERIAL) += rp2040/usbserial.c generic/usb_cdc.c
-src-$(CONFIG_USBSERIAL) += rp2040/chipid.c
+src-y += rp2040/main.c rp2040/watchdog.c rp2040/gpio.c rp2040/adc.c
+src-y += generic/armcm_boot.c generic/armcm_irq.c
+src-y += generic/armcm_reset.c generic/crc16_ccitt.c
+chipid-src-$(CONFIG_MACH_RP2040) := rp2040/chipid.c
+src-$(CONFIG_MACH_RP2040) += rp2040/timer.c generic/timer_irq.c rp2040/bootrom.c
+src-$(CONFIG_MACH_RP2350) += generic/armcm_timer.c
+src-$(CONFIG_USBSERIAL) += rp2040/usbserial.c generic/usb_cdc.c $(chipid-src-y)
src-$(CONFIG_SERIAL) += rp2040/serial.c generic/serial_irq.c
-src-$(CONFIG_CANSERIAL) += rp2040/can.c rp2040/chipid.c ../lib/can2040/can2040.c
+src-$(CONFIG_CANSERIAL) += rp2040/can.c $(chipid-src-y) ../lib/can2040/can2040.c
src-$(CONFIG_CANSERIAL) += generic/canserial.c generic/canbus.c
src-$(CONFIG_CANSERIAL) += ../lib/fast-hash/fasthash.c
-src-$(CONFIG_USBCANBUS) += rp2040/can.c rp2040/chipid.c ../lib/can2040/can2040.c
+src-$(CONFIG_USBCANBUS) += rp2040/can.c $(chipid-src-y) ../lib/can2040/can2040.c
src-$(CONFIG_USBCANBUS) += generic/canserial.c generic/usb_canbus.c
src-$(CONFIG_USBCANBUS) += ../lib/fast-hash/fasthash.c rp2040/usbserial.c
src-$(CONFIG_HAVE_GPIO_HARD_PWM) += rp2040/hard_pwm.c
@@ -50,7 +52,7 @@ $(OUT)klipper.uf2: $(OUT)klipper.elf $(OUT)lib/elf2uf2/elf2uf2
@echo " Creating uf2 file $@"
$(Q)$(OUT)lib/elf2uf2/elf2uf2 $< $@
-rptarget-$(CONFIG_RP2040_HAVE_STAGE2) := $(OUT)klipper.uf2
+rptarget-y := $(OUT)klipper.uf2
stage2-$(CONFIG_RP2040_HAVE_STAGE2) := $(OUT)stage2.o
# rp2040 building when using a bootloader
diff --git a/src/rp2040/internal.h b/src/rp2040/internal.h
index 8553278d..010318a6 100644
--- a/src/rp2040/internal.h
+++ b/src/rp2040/internal.h
@@ -1,8 +1,14 @@
#ifndef __RP2040_INTERNAL_H
#define __RP2040_INTERNAL_H
-// Local definitions for rp2040
+// Local definitions for RPxxxx chips
-#include "RP2040.h"
+#include "autoconf.h" // CONFIG_MACH_RP2040
+
+#if CONFIG_MACH_RP2040
+ #include "RP2040.h"
+#elif CONFIG_MACH_RP2350
+ #include "RP2350.h"
+#endif
void enable_pclock(uint32_t reset_bit);
int is_enabled_pclock(uint32_t reset_bit);
diff --git a/src/rp2040/main.c b/src/rp2040/main.c
index f94f4782..ed84e6e0 100644
--- a/src/rp2040/main.c
+++ b/src/rp2040/main.c
@@ -15,6 +15,10 @@
#include "internal.h" // enable_pclock
#include "sched.h" // sched_main
+#if !CONFIG_MACH_RP2040
+#include "hardware/structs/ticks.h" // ticks_hw
+#endif
+
/****************************************************************
* Ram IRQ vector table
@@ -46,7 +50,8 @@ bootloader_request(void)
watchdog_hw->ctrl = 0;
try_request_canboot();
// Use the bootrom-provided code to reset into BOOTSEL mode
- reset_to_usb_boot(0, 0);
+ if (CONFIG_MACH_RP2040)
+ reset_to_usb_boot(0, 0);
}
@@ -55,7 +60,7 @@ bootloader_request(void)
****************************************************************/
#define FREQ_XOSC 12000000
-#define FREQ_SYS 125000000
+#define FREQ_SYS (CONFIG_MACH_RP2040 ? 125000000 : CONFIG_CLOCK_FREQ)
#define FREQ_USB 48000000
void
@@ -85,7 +90,7 @@ xosc_setup(void)
xosc_hw->startup = DIV_ROUND_UP(FREQ_XOSC, 1000 * 256); // 1ms
xosc_hw->ctrl = (XOSC_CTRL_FREQ_RANGE_VALUE_1_15MHZ
| (XOSC_CTRL_ENABLE_VALUE_ENABLE << XOSC_CTRL_ENABLE_LSB));
- while(!(xosc_hw->status & XOSC_STATUS_STABLE_BITS))
+ while (!(xosc_hw->status & XOSC_STATUS_STABLE_BITS))
;
}
@@ -159,7 +164,12 @@ clock_setup(void)
cref->ctrl = CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC;
while (!(cref->selected & (1 << 2)))
;
+#if CONFIG_MACH_RP2040
watchdog_hw->tick = 1 | WATCHDOG_TICK_ENABLE_BITS;
+#else
+ ticks_hw->ticks[TICK_WATCHDOG].cycles = 1;
+ ticks_hw->ticks[TICK_WATCHDOG].ctrl = TICKS_WATCHDOG_CTRL_ENABLE_BITS;
+#endif
// Enable GPIO control
enable_pclock(RESETS_RESET_IO_BANK0_BITS | RESETS_RESET_PADS_BANK0_BITS);
diff --git a/src/rp2040/rpxxxx_link.lds.S b/src/rp2040/rpxxxx_link.lds.S
index abc5be6c..5cd556fe 100644
--- a/src/rp2040/rpxxxx_link.lds.S
+++ b/src/rp2040/rpxxxx_link.lds.S
@@ -42,6 +42,15 @@ SECTIONS
KEEP(*(.vector_table))
_text_vectortable_end = .;
*(.text.armcm_boot*)
+
+#if CONFIG_MACH_RP2350
+ // The rp2350 needs an "image definition" for the internal ROM
+ LONG(0xffffded3)
+ LONG(0x10210142)
+ LONG(0x000001ff)
+ LONG(0x00000000)
+ LONG(0xab123579)
+#endif
} > rom :text_segment
. = ALIGN(4);