diff --git a/.cargo/config.toml b/.cargo/config.toml index 7986e53..f93369d 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,16 +1,7 @@ [target.'cfg(all(target_arch = "arm", target_os = "none"))'] -# Choose a default "cargo run" tool: -# - probe-run provides flashing and defmt via a hardware debugger -# - cargo embed offers flashing, rtt, defmt and a gdb server via a hardware debugger -# it is configured via the Embed.toml in the root of this project -# - elf2uf2-rs loads firmware over USB when the rp2040 is in boot mode -# runner = "probe-run --chip RP2040" -# runner = "cargo embed" -runner = "elf2uf2-rs -d" +runner = "picotool load -u -v -x -t elf" +# runner = "elf2uf2-rs -d" # rp2040 [build] -# Cortex-M0 and Cortex-M0+ -target = "thumbv6m-none-eabi" - -[env] -# DEFMT_LOG = "debug" \ No newline at end of file +target = "thumbv8m.main-none-eabihf" +# target = "thumbv6m-none-eabi" # rp2040 diff --git a/.gitea/workflows/pull_request.yaml b/.gitea/workflows/pull_request.yaml deleted file mode 100644 index 09e6ee8..0000000 --- a/.gitea/workflows/pull_request.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: Merge Build -run_name: Test successful build on merge request - -on: - pull_request: - types: [opened, reopened, edited, review_requested, synchronize] - -jobs: - Build: - steps: - - uses: https://github.com/actions/checkout@main - - - uses: https://github.com/dtolnay/rust-toolchain@stable - - - name: Build - run: cargo build \ No newline at end of file diff --git a/.gitea/workflows/push_master.yaml b/.gitea/workflows/push_master.yaml new file mode 100644 index 0000000..69b3951 --- /dev/null +++ b/.gitea/workflows/push_master.yaml @@ -0,0 +1,30 @@ +name: Build on master branch +run_name: Test successful build on push + +on: + push: + branches: + - master + +jobs: + Build: + steps: + - uses: https://github.com/actions/checkout@main + + - uses: https://github.com/SebRollen/toml-action@v1.2.0 + id: read_rust_toolchain + with: + file: rust-toolchain + field: toolchain.targets + id: read_rust_components + with: + file: rust-toolchain + field: toolchain.components + + - uses: https://github.com/dtolnay/rust-toolchain@stable + with: + toolchain: ${{ steps.read_rust_toolchain.outputs.value }} + components: ${{ steps.read_rust_components.outputs.value }} + + - name: Build + run: cargo build \ No newline at end of file diff --git a/.gitea/workflows/push_non_master.yaml b/.gitea/workflows/push_non_master.yaml new file mode 100644 index 0000000..898b577 --- /dev/null +++ b/.gitea/workflows/push_non_master.yaml @@ -0,0 +1,30 @@ +name: Build on feature branch +run_name: Test successful build on push + +on: + push: + branches-ignore: + - master + +jobs: + Build: + steps: + - uses: https://github.com/actions/checkout@main + + - uses: https://github.com/SebRollen/toml-action@v1.2.0 + id: read_rust_toolchain + with: + file: rust-toolchain + field: toolchain.targets + id: read_rust_components + with: + file: rust-toolchain + field: toolchain.components + + - uses: https://github.com/dtolnay/rust-toolchain@stable + with: + toolchain: ${{ steps.read_rust_toolchain.outputs.value }} + components: ${{ steps.read_rust_components.outputs.value }} + + - name: Build + run: cargo build \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 9c4f8fa..40030b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,25 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -embassy-executor = { version = "0.5.0", features = ["task-arena-size-32768", "arch-cortex-m", "executor-thread", "executor-interrupt", "integrated-timers"] } -embassy-rp = { version = "0.1.0", features = ["unstable-pac", "time-driver", "critical-section-impl"] } +embassy-executor = { version = "0.7.0", features = [ + "task-arena-size-32768", + "arch-cortex-m", + "executor-thread", + "executor-interrupt", +] } +embassy-rp = { version = "0.3.1", features = [ + "unstable-pac", + "time-driver", + "critical-section-impl", + "rp235xa", +] } embassy-futures = { version = "0.1.1" } -cortex-m-rt = "0.7.4" +cortex-m-rt = "0.7.5" +cortex-m = { version = "0.7.7", features = ["inline-asm"] } + +[features] +rp2350 = ["embassy-rp/rp235xa"] +rp2040 = ["embassy-rp/rp2040"] + +default = ["rp2350"] diff --git a/build.rs b/build.rs index 113c72e..afb8f34 100644 --- a/build.rs +++ b/build.rs @@ -17,10 +17,19 @@ fn main() { // Put `memory.x` in our output directory and ensure it's // on the linker search path. let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); + + #[cfg(feature = "rp2040")] File::create(out.join("memory.x")) .unwrap() - .write_all(include_bytes!("memory.x")) + .write_all(include_bytes!("rp_2040_memory.x")) .unwrap(); + + #[cfg(feature = "rp2350")] + File::create(out.join("memory.x")) + .unwrap() + .write_all(include_bytes!("rp_2350_memory.x")) + .unwrap(); + println!("cargo:rustc-link-search={}", out.display()); // By default, Cargo will re-run a build script whenever @@ -31,6 +40,7 @@ fn main() { println!("cargo:rustc-link-arg-bins=--nmagic"); println!("cargo:rustc-link-arg-bins=-Tlink.x"); + + #[cfg(feature = "rp2040")] println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); - // println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); } diff --git a/memory.x b/rp_2040_memory.x similarity index 100% rename from memory.x rename to rp_2040_memory.x diff --git a/rp_2350_memory.x b/rp_2350_memory.x new file mode 100644 index 0000000..8b379f5 --- /dev/null +++ b/rp_2350_memory.x @@ -0,0 +1,75 @@ +MEMORY { + /* + * The RP2350 has either external or internal flash. + * + * 2 MiB is a safe default here, although a Pico 2 has 4 MiB. + */ + FLASH : ORIGIN = 0x10000000, LENGTH = 2048K + /* + * RAM consists of 8 banks, SRAM0-SRAM7, with a striped mapping. + * This is usually good for performance, as it distributes load on + * those banks evenly. + */ + RAM : ORIGIN = 0x20000000, LENGTH = 512K + /* + * RAM banks 8 and 9 use a direct mapping. They can be used to have + * memory areas dedicated for some specific job, improving predictability + * of access times. + * Example: Separate stacks for core0 and core1. + */ + SRAM4 : ORIGIN = 0x20080000, LENGTH = 4K + SRAM5 : ORIGIN = 0x20081000, LENGTH = 4K +} + +SECTIONS { + /* ### Boot ROM info + * + * Goes after .vector_table, to keep it in the first 4K of flash + * where the Boot ROM (and picotool) can find it + */ + .start_block : ALIGN(4) + { + __start_block_addr = .; + KEEP(*(.start_block)); + KEEP(*(.boot_info)); + } > FLASH + +} INSERT AFTER .vector_table; + +/* move .text to start /after/ the boot info */ +_stext = ADDR(.start_block) + SIZEOF(.start_block); + +SECTIONS { + /* ### Picotool 'Binary Info' Entries + * + * Picotool looks through this block (as we have pointers to it in our + * header) to find interesting information. + */ + .bi_entries : ALIGN(4) + { + /* We put this in the header */ + __bi_entries_start = .; + /* Here are the entries */ + KEEP(*(.bi_entries)); + /* Keep this block a nice round size */ + . = ALIGN(4); + /* We put this in the header */ + __bi_entries_end = .; + } > FLASH +} INSERT AFTER .text; + +SECTIONS { + /* ### Boot ROM extra info + * + * Goes after everything in our program, so it can contain a signature. + */ + .end_block : ALIGN(4) + { + __end_block_addr = .; + KEEP(*(.end_block)); + } > FLASH + +} INSERT AFTER .uninit; + +PROVIDE(start_to_end = __end_block_addr - __start_block_addr); +PROVIDE(end_to_start = __start_block_addr - __end_block_addr); \ No newline at end of file diff --git a/rust-toolchain.toml b/rust-toolchain.toml index dfac03c..2512127 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,4 @@ [toolchain] -components = [ "rust-src", "rustfmt", "llvm-tools" ] -targets = ["thumbv6m-none-eabi"] \ No newline at end of file +components = ["rust-src", "rustfmt", "llvm-tools"] +targets = ["thumbv8m.main-none-eabihf"] +# targets = ["thumbv6m-none-eabi"] diff --git a/src/main.rs b/src/main.rs index 87ed5d5..f5b7ef1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,12 @@ #![no_std] #![no_main] +#[cfg(not(all( + not(all(feature = "rp2040", feature = "rp2350")), + any(feature = "rp2040", feature = "rp2350") +)))] +compile_error!("Enable either feature rp2040 (pico 1) or feature rp2350 (pico 2)"); + use core::panic::PanicInfo; use embassy_executor::Spawner; @@ -11,6 +17,11 @@ fn panic(_info: &PanicInfo) -> ! { loop {} } +#[cfg(feature = "rp2350")] +#[link_section = ".start_block"] +#[used] +pub static IMAGE_DEF: embassy_rp::block::ImageDef = embassy_rp::block::ImageDef::secure_exe(); + #[embassy_executor::main] async fn main(_spawner: Spawner) { let p = embassy_rp::init(Default::default());