Browse Source
Added basic support for the RP2040 SoC. Support includes booting and starting the kernel, on one core only. Signed-off-by: Yonatan Schachter <yonatan.schachter@gmail.com> Signed-off-by: Ioannis Glaropoulos <Ioannis.Glaropoulos@nordicsemi.no>pull/42416/head
20 changed files with 518 additions and 0 deletions
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
/* |
||||
* Copyright (c) 2021 Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
#include <arm/armv6-m.dtsi> |
||||
#include <mem.h> |
||||
|
||||
#include "rpi_pico_common.dtsi" |
||||
|
||||
/ { |
||||
cpus { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
|
||||
cpu0: cpu@0 { |
||||
compatible = "arm,cortex-m0+"; |
||||
reg = <0>; |
||||
}; |
||||
|
||||
cpu1: cpu@1 { |
||||
compatible = "arm,cortex-m0+"; |
||||
reg = <1>; |
||||
}; |
||||
}; |
||||
|
||||
soc { |
||||
sram0: memory@20000000 { |
||||
compatible = "mmio-sram"; |
||||
reg = <0x20000000 DT_SIZE_K(264)>; |
||||
}; |
||||
|
||||
flash0: flash@10000000 { |
||||
compatible = "soc-nv-flash"; |
||||
label = "FLASH_RP2"; |
||||
|
||||
write-block-size = <1>; |
||||
}; |
||||
|
||||
peripheral_clk: peripheral-clk { |
||||
compatible = "fixed-clock"; |
||||
clock-frequency = <125000000>; |
||||
#clock-cells = <0>; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
&nvic { |
||||
arm,num-irq-priority-bits = <3>; |
||||
}; |
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
/* |
||||
* Copyright (c) 2021 Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
#ifndef RPI_PICO_DEFAULT_IRQ_PRIORITY |
||||
#define RPI_PICO_DEFAULT_IRQ_PRIORITY 3 |
||||
#endif |
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
include(ExternalProject) |
||||
|
||||
if(CONFIG_HAS_RPI_PICO) |
||||
zephyr_library() |
||||
|
||||
set(rp2_common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2_common) |
||||
set(rp2040_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2040) |
||||
set(common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/common) |
||||
set(boot_stage_dir ${rp2_common_dir}/boot_stage2) |
||||
|
||||
# The Second Stage Bootloader is only linked to the app that resides |
||||
# at 0x100. Therefore, only if the app's offset is 0x100, the second |
||||
# stage bootloader should be compiled. |
||||
if(CONFIG_RP2_REQUIRES_SECOND_STAGE_BOOT) |
||||
foreach(flash W25Q080 GENERIC_03H IS25LP080 W25X10CL AT25SF128A) |
||||
if(CONFIG_RP2_FLASH_${flash}) |
||||
set(flash_type ${flash}) |
||||
break() |
||||
endif() |
||||
endforeach() |
||||
|
||||
set(rp2_bootloader_prefix ${CMAKE_BINARY_DIR}/bootloader) |
||||
ExternalProject_Add( |
||||
second_stage_bootloader |
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/bootloader |
||||
BINARY_DIR ${rp2_bootloader_prefix} |
||||
CMAKE_ARGS |
||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} |
||||
-DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER} |
||||
-DZEPHYR_HAL_RPI_PICO_MODULE_DIR=${ZEPHYR_HAL_RPI_PICO_MODULE_DIR} |
||||
-DZEPHYR_BASE=${ZEPHYR_BASE} |
||||
-DFLASH_TYPE=${flash_type} |
||||
-DPYTHON_EXECUTABLE=${Python3_EXECUTABLE} |
||||
INSTALL_COMMAND "" # No installation needed |
||||
BUILD_BYPRODUCTS ${rp2_bootloader_prefix}/boot_stage2.S |
||||
BUILD_ALWAYS TRUE |
||||
) |
||||
zephyr_library_sources(${rp2_bootloader_prefix}/boot_stage2.S) |
||||
endif() |
||||
|
||||
# Pico sources and headers necessary for every build. |
||||
# These contain definitions and implementation used mostly for |
||||
# initializing the SoC, and therefore are always required. |
||||
|
||||
zephyr_library_sources( |
||||
${rp2_common_dir}/hardware_clocks/clocks.c |
||||
${rp2_common_dir}/hardware_pll/pll.c |
||||
${rp2_common_dir}/hardware_xosc/xosc.c |
||||
${rp2_common_dir}/hardware_watchdog/watchdog.c |
||||
${rp2_common_dir}/pico_platform/platform.c |
||||
) |
||||
|
||||
zephyr_include_directories( |
||||
${rp2_common_dir}/hardware_base/include |
||||
${rp2_common_dir}/hardware_clocks/include |
||||
${rp2_common_dir}/hardware_watchdog/include |
||||
${rp2_common_dir}/hardware_xosc/include |
||||
${rp2_common_dir}/hardware_pll/include |
||||
${rp2_common_dir}/hardware_irq/include |
||||
${rp2_common_dir}/hardware_sync/include |
||||
${rp2_common_dir}/hardware_timer/include |
||||
${rp2_common_dir}/hardware_resets/include |
||||
${rp2040_dir}/hardware_regs/include |
||||
${rp2040_dir}/hardware_structs/include |
||||
${common_dir}/pico_base/include |
||||
${rp2_common_dir}/pico_platform/include |
||||
${CMAKE_CURRENT_LIST_DIR} |
||||
) |
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_GPIO |
||||
${rp2_common_dir}/hardware_gpio/gpio.c) |
||||
zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_GPIO |
||||
${rp2_common_dir}/hardware_gpio/include) |
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_UART |
||||
${rp2_common_dir}/hardware_uart/uart.c) |
||||
zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_UART |
||||
${rp2_common_dir}/hardware_uart/include) |
||||
endif() |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
config HAS_RPI_PICO |
||||
bool |
||||
|
||||
config PICOSDK_USE_UART |
||||
bool |
||||
help |
||||
Use the UART driver from pico-sdk |
||||
|
||||
config PICOSDK_USE_GPIO |
||||
bool |
||||
help |
||||
Use the GPIO driver from pico-sdk |
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
cmake_minimum_required(VERSION 3.20.0) |
||||
|
||||
# Skip compiler checking |
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) |
||||
|
||||
project(second_stage_bootloader) |
||||
enable_language(ASM) |
||||
|
||||
set(rp2_common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2_common) |
||||
set(rp2040_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2040) |
||||
set(common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/common) |
||||
set(boot_stage_dir ${rp2_common_dir}/boot_stage2) |
||||
|
||||
add_executable(boot_stage2) |
||||
|
||||
if(${FLASH_TYPE} STREQUAL W25Q080) |
||||
set(flash_type_file boot2_w25q080.S) |
||||
elseif(${FLASH_TYPE} STREQUAL GENERIC_03H) |
||||
set(flash_type_file boot2_generic_03h.S) |
||||
elseif(${FLASH_TYPE} STREQUAL IS25LP080) |
||||
set(flash_type_file boot2_is25lp080.S) |
||||
elseif(${FLASH_TYPE} STREQUAL W25X10CL) |
||||
set(flash_type_file boot2_w25x10cl.S) |
||||
elseif(${FLASH_TYPE} STREQUAL AT25SF128A) |
||||
set(flash_type_file boot2_at25sf128a.S) |
||||
else() |
||||
message(FATAL_ERROR "No flash type selected") |
||||
endif() |
||||
|
||||
target_sources(boot_stage2 PRIVATE ${boot_stage_dir}/${flash_type_file}) |
||||
|
||||
target_include_directories(boot_stage2 PUBLIC |
||||
.. |
||||
${boot_stage_dir}/asminclude |
||||
${rp2_common_dir}/pico_platform/include |
||||
${rp2040_dir}/hardware_regs/include |
||||
${common_dir}/pico_base/include |
||||
${ZEPHYR_BASE}/include |
||||
) |
||||
|
||||
target_link_options(boot_stage2 PRIVATE |
||||
"-nostartfiles" |
||||
"--specs=nosys.specs" |
||||
"LINKER:--script=${boot_stage_dir}/boot_stage2.ld" |
||||
) |
||||
|
||||
# The second stage bootloader is compiled without kconfig definitions. |
||||
# Therefore, in order to use toolchain.h, it needs to define CONFIG_ARM. |
||||
target_compile_definitions(boot_stage2 PRIVATE -DCONFIG_ARM=1) |
||||
|
||||
# Generates a binary file from the compiled bootloader |
||||
add_custom_command(TARGET boot_stage2 |
||||
POST_BUILD |
||||
BYPRODUCTS boot_stage2.bin |
||||
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:boot_stage2> boot_stage2.bin |
||||
) |
||||
|
||||
# Checksums the binary, pads it, and generates an assembly file |
||||
add_custom_command(TARGET boot_stage2 |
||||
POST_BUILD |
||||
BYPRODUCTS boot_stage2.S |
||||
COMMAND ${PYTHON_EXECUTABLE} ${boot_stage_dir}/pad_checksum |
||||
-s 0xffffffff boot_stage2.bin boot_stage2.S |
||||
) |
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
/*
|
||||
* Originally this file is generated by pico-sdk, and some files |
||||
* try to include it. Therefore, we have to provide that file, |
||||
* with this exact name. |
||||
* Since this file ends up included in all pico-sdk code, it's |
||||
* used to inject workarounds to make pico-sdk compile with Zephyr. |
||||
*/ |
||||
|
||||
#ifndef _CONFIG_AUTOGEN_H_ |
||||
#define _CONFIG_AUTOGEN_H_ |
||||
|
||||
/* WORKAROUNDS */ |
||||
|
||||
/*
|
||||
* static_assert is not supported, so BUILD_ASSERT is used instead. |
||||
* BUILD_ASSERT is included through toolchain.h. |
||||
*/ |
||||
#include <toolchain.h> |
||||
#define static_assert(expr, msg...) BUILD_ASSERT((expr), "" msg) |
||||
|
||||
/* Convert uses of asm, which is not supported in c99, to __asm */ |
||||
#define asm __asm |
||||
|
||||
/* Disable binary info */ |
||||
#define PICO_NO_BINARY_INFO 1 |
||||
|
||||
/* Zephyr compatible way of forcing inline */ |
||||
#ifndef __always_inline |
||||
#define __always_inline ALWAYS_INLINE |
||||
#endif /* __always_inline */ |
||||
|
||||
#endif |
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
/* File intentionally left blank. It's expected by pico-sdk, but isn't used. */ |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
add_subdirectory(${SOC_SERIES}) |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
# Raspberry Pi (RP) MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
config SOC_FAMILY_RPI_PICO |
||||
bool |
||||
|
||||
if SOC_FAMILY_RPI_PICO |
||||
|
||||
config SOC_FAMILY |
||||
string |
||||
default "rpi_pico" |
||||
|
||||
source "soc/arm/rpi_pico/*/Kconfig.soc" |
||||
|
||||
endif # SOC_FAMILY_RPI_PICO |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
# Raspberry Pi (RP) MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
if SOC_FAMILY_RPI_PICO |
||||
|
||||
source "soc/arm/rpi_pico/*/Kconfig.defconfig.series" |
||||
|
||||
endif # SOC_FAMILY_RPI_PICO |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
# Raspberry Pi (RP) MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
source "soc/arm/rpi_pico/*/Kconfig.series" |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
zephyr_library() |
||||
|
||||
zephyr_library_sources(soc.c) |
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
# # Raspberry Pi RP2040 MCU |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
config SOC |
||||
default "rp2040" |
||||
depends on SOC_RP2040 |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
# Raspberry Pi RP2XXX MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
if SOC_SERIES_RP2XXX |
||||
|
||||
source "soc/arm/rpi_pico/rp2/Kconfig.defconfig.rp2*" |
||||
|
||||
config SOC_SERIES |
||||
default "rp2" |
||||
|
||||
config NUM_IRQS |
||||
default 26 |
||||
|
||||
endif # SOC_SERIES_RP2XXX |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
# Raspberry Pi RP2XXX MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
config SOC_SERIES_RP2XXX |
||||
bool "Raspberry Pi RP2 series MCU" |
||||
select ARM |
||||
select CPU_CORTEX_M0PLUS |
||||
select CPU_CORTEX_M_HAS_SYSTICK |
||||
select CPU_CORTEX_M_HAS_VTOR |
||||
select CPU_HAS_ARM_MPU |
||||
select SOC_FAMILY_RPI_PICO |
||||
select HAS_RPI_PICO |
||||
select XIP |
||||
help |
||||
Enable support for Raspberry Pi RP2 MCU series |
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
# Raspberry Pi RP2XXX MCU line |
||||
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA |
||||
# Copyright (c) 2021 Yonatan Schachter |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
choice |
||||
prompt "RP2xxx MCU Selection" |
||||
depends on SOC_SERIES_RP2XXX |
||||
|
||||
config SOC_RP2040 |
||||
bool "Raspberry Pi RP2040" |
||||
|
||||
endchoice |
||||
|
||||
config RP2_REQUIRES_SECOND_STAGE_BOOT |
||||
bool |
||||
default y if FLASH_LOAD_OFFSET = 0x100 |
||||
|
||||
# Flash type used by the SoC. The board should select the one used. |
||||
|
||||
config RP2_FLASH_W25Q080 |
||||
bool |
||||
help |
||||
Configure RP2 to use a W25Q080 flash chip, or similar. Should be selected |
||||
by the board definition, not the user. |
||||
|
||||
config RP2_FLASH_GENERIC_03H |
||||
bool |
||||
help |
||||
Configure RP2 to use a flash chip supporting the standard 03h command. |
||||
Should be selected by the board definition, not the user. |
||||
|
||||
config RP2_FLASH_IS25LP080 |
||||
bool |
||||
help |
||||
Configure RP2 to use a IS25LP080 flash chip, or similar. Should be selected |
||||
by the board definition, not the user. |
||||
|
||||
config RP2_FLASH_W25X10CL |
||||
bool |
||||
help |
||||
Configure RP2 to use a W25X10CL flash chip, or similar. Should be selected |
||||
by the board definition, not the user. |
||||
|
||||
config RP2_FLASH_AT25SF128A |
||||
bool |
||||
help |
||||
Configure RP2 to use a AT25SF128A flash chip, or similar. Should be selected |
||||
by the board definition, not the user. |
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
/* linker.ld - Linker command/script file */ |
||||
|
||||
/* |
||||
* Copyright (c) 2014 Wind River Systems, Inc. |
||||
* Copyright (c) 2021 Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
/* |
||||
* The Second Stage Bootloader is only linked to the app that |
||||
* resides at 0x100. This can be the application, or a bootloader |
||||
* such as mcuboot. |
||||
*/ |
||||
#if CONFIG_RP2_REQUIRES_SECOND_STAGE_BOOT |
||||
MEMORY |
||||
{ |
||||
BOOT_FLASH (r) : ORIGIN = 0x10000000, LENGTH = 256 |
||||
} |
||||
|
||||
SECTIONS |
||||
{ |
||||
.boot2 : { |
||||
KEEP(*(.boot2)) |
||||
} > BOOT_FLASH |
||||
} |
||||
#endif /* CONFIG_RP2_REQUIRES_SECOND_STAGE_BOOT */ |
||||
|
||||
#include <arch/arm/aarch32/cortex_m/scripts/linker.ld> |
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2021 Nordic Semiconductor ASA |
||||
* Copyright (c) 2021 Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief System/hardware module for Raspberry Pi RP2040 family processor |
||||
* |
||||
* This module provides routines to initialize and support board-level hardware |
||||
* for the Raspberry Pi RP2040 family processor. |
||||
*/ |
||||
|
||||
#include <kernel.h> |
||||
#include <init.h> |
||||
#include <logging/log.h> |
||||
|
||||
#include <hardware/regs/resets.h> |
||||
#include <hardware/clocks.h> |
||||
#include <hardware/resets.h> |
||||
|
||||
#ifdef CONFIG_RUNTIME_NMI |
||||
extern void z_arm_nmi_init(void); |
||||
#define NMI_INIT() z_arm_nmi_init() |
||||
#else |
||||
#define NMI_INIT() |
||||
#endif |
||||
|
||||
LOG_MODULE_REGISTER(soc, CONFIG_SOC_LOG_LEVEL); |
||||
|
||||
static int rp2040_init(const struct device *arg) |
||||
{ |
||||
uint32_t key; |
||||
|
||||
reset_block(~(RESETS_RESET_IO_QSPI_BITS | RESETS_RESET_PADS_QSPI_BITS | |
||||
RESETS_RESET_PLL_USB_BITS | RESETS_RESET_PLL_SYS_BITS)); |
||||
|
||||
unreset_block_wait(RESETS_RESET_BITS & |
||||
~(RESETS_RESET_ADC_BITS | RESETS_RESET_RTC_BITS | |
||||
RESETS_RESET_SPI0_BITS | RESETS_RESET_SPI1_BITS | |
||||
RESETS_RESET_UART0_BITS | RESETS_RESET_UART1_BITS | |
||||
RESETS_RESET_USBCTRL_BITS)); |
||||
|
||||
clocks_init(); |
||||
|
||||
unreset_block_wait(RESETS_RESET_BITS); |
||||
|
||||
ARG_UNUSED(arg); |
||||
|
||||
key = irq_lock(); |
||||
|
||||
/* Install default handler that simply resets the CPU
|
||||
* if configured in the kernel, NOP otherwise |
||||
*/ |
||||
NMI_INIT(); |
||||
|
||||
irq_unlock(key); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
SYS_INIT(rp2040_init, PRE_KERNEL_1, 0); |
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Linaro Limited |
||||
* Copyright (c) 2021 Yonatan Schachter |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
/**
|
||||
* @file SoC configuration macros for the Raspberry Pi RP2040 family processors |
||||
*/ |
||||
|
||||
#ifndef _RPI_PICO_RP2040_SOC_H_ |
||||
#define _RPI_PICO_RP2040_SOC_H_ |
||||
|
||||
#include <autoconf.h> |
||||
|
||||
#define __VTOR_PRESENT CONFIG_CPU_CORTEX_M_HAS_VTOR |
||||
#define __MPU_PRESENT CONFIG_CPU_HAS_ARM_MPU |
||||
|
||||
#endif /* _RPI_PICO_RP2040_SOC_H_ */ |
Loading…
Reference in new issue