Moved the bootloader out of the pico_p1 project
This commit is contained in:
commit
43ceddb563
6
.cargo/config.toml
Normal file
6
.cargo/config.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[build]
|
||||
target = "thumbv6m-none-eabi"
|
||||
|
||||
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
|
||||
# This needs to be put in a seperate script because the log arguments do not get parsed properly
|
||||
runner = ".cargo/runner.sh"
|
3
.cargo/runner.sh
Executable file
3
.cargo/runner.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
probe-run --chip RP2040 --log-format="{L} {s}
|
||||
└─ [{t}] {m} @ {F}:{l}" $@
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
target/
|
6
bootloader/.cargo/config.toml
Normal file
6
bootloader/.cargo/config.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[unstable]
|
||||
build-std = ["core"]
|
||||
build-std-features = ["panic_immediate_abort"]
|
||||
|
||||
[build]
|
||||
target = "thumbv6m-none-eabi"
|
1418
bootloader/Cargo.lock
generated
Normal file
1418
bootloader/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
37
bootloader/Cargo.toml
Normal file
37
bootloader/Cargo.toml
Normal file
|
@ -0,0 +1,37 @@
|
|||
[package]
|
||||
name = "bootloader"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
defmt = { version = "0.3", optional = true }
|
||||
defmt-rtt = { version = "0.4", optional = true }
|
||||
|
||||
embassy-boot = { version = "0.1", features = ["nightly"] }
|
||||
embassy-boot-rp = { version = "0.1", features = ["nightly"] }
|
||||
embassy-rp = { version = "0.1", features = ["nightly"] }
|
||||
embassy-sync = { version = "0.3", features = ["nightly"] }
|
||||
|
||||
cortex-m = { version = "0.7", features = [
|
||||
"inline-asm",
|
||||
"critical-section-single-core",
|
||||
] }
|
||||
cortex-m-rt = { version = "0.7" }
|
||||
embedded-storage = "0.3.0"
|
||||
|
||||
[patch.crates-io]
|
||||
# This is needed as embassy-rp is not on crates.io
|
||||
embassy-boot = { git = "https://github.com/embassy-rs/embassy" }
|
||||
embassy-boot-rp = { git = "https://github.com/embassy-rs/embassy" }
|
||||
embassy-rp = { git = "https://github.com/embassy-rs/embassy" }
|
||||
embassy-sync = { git = "https://github.com/embassy-rs/embassy" }
|
||||
|
||||
[features]
|
||||
defmt = ["dep:defmt", "embassy-boot/defmt", "embassy-boot-rp/defmt", "embassy-rp/defmt", "embassy-sync/defmt"]
|
||||
debug = ["defmt-rtt", "defmt"]
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
opt-level = 's'
|
||||
codegen-units = 1
|
||||
lto = true
|
2
bootloader/Embed.toml
Normal file
2
bootloader/Embed.toml
Normal file
|
@ -0,0 +1,2 @@
|
|||
[default.general]
|
||||
chip = "rp2040"
|
36
bootloader/build.rs
Normal file
36
bootloader/build.rs
Normal file
|
@ -0,0 +1,36 @@
|
|||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::Write;
|
||||
use std::path::PathBuf;
|
||||
|
||||
fn main() {
|
||||
let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||
|
||||
// By default cortex-m-rt expects memory.x, however this causes issues with workspaces as it
|
||||
// will pick the first file that is found.
|
||||
// In order to get around this we make a dummy memory.x file
|
||||
File::create(out.join("memory.x")).unwrap();
|
||||
|
||||
// Use memory.x.in as a template for the actual memory.x
|
||||
let memory = include_str!("memory.x.in")
|
||||
.replace("{BOOTLOADER}", "FLASH")
|
||||
.replace("{ACTIVE}", "ACTIVE");
|
||||
|
||||
// And then include it with a unique name
|
||||
File::create(out.join("memory_boot.x"))
|
||||
.unwrap()
|
||||
.write_all(memory.as_bytes())
|
||||
.unwrap();
|
||||
println!("cargo:rustc-link-search={}", out.display());
|
||||
println!("cargo:rerun-if-changed=../memory.x.in");
|
||||
|
||||
// And link with that one
|
||||
println!("cargo:rustc-link-arg-bins=-Tmemory_boot.x");
|
||||
|
||||
println!("cargo:rustc-link-arg-bins=--nmagic");
|
||||
println!("cargo:rustc-link-arg-bins=-Tlink.x");
|
||||
println!("cargo:rustc-link-arg-bins=-Tlink-rp.x");
|
||||
if env::var("CARGO_FEATURE_DEFMT").is_ok() {
|
||||
println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
|
||||
}
|
||||
}
|
22
bootloader/memory.x.in
Normal file
22
bootloader/memory.x.in
Normal file
|
@ -0,0 +1,22 @@
|
|||
MEMORY {
|
||||
BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
|
||||
{BOOTLOADER} : ORIGIN = 0x10000100, LENGTH = 24k - 0x100
|
||||
BOOTLOADER_STATE : ORIGIN = 0x10006000, LENGTH = 4k
|
||||
{ACTIVE} : ORIGIN = 0x10007000, LENGTH = 876k
|
||||
DFU : ORIGIN = 0x100E2000, LENGTH = 880k
|
||||
FW : ORIGIN = 0x101BE000, LENGTH = 256k
|
||||
CLM : ORIGIN = 0x101FE000, LENGTH = 8k
|
||||
RAM : ORIGIN = 0x20000000, LENGTH = 264K
|
||||
}
|
||||
|
||||
__bootloader_state_start = ORIGIN(BOOTLOADER_STATE) - ORIGIN(BOOT2);
|
||||
__bootloader_state_end = ORIGIN(BOOTLOADER_STATE) + LENGTH(BOOTLOADER_STATE) - ORIGIN(BOOT2);
|
||||
|
||||
__bootloader_active_start = ORIGIN({ACTIVE}) - ORIGIN(BOOT2);
|
||||
__bootloader_active_end = ORIGIN({ACTIVE}) + LENGTH({ACTIVE}) - ORIGIN(BOOT2);
|
||||
|
||||
__bootloader_dfu_start = ORIGIN(DFU) - ORIGIN(BOOT2);
|
||||
__bootloader_dfu_end = ORIGIN(DFU) + LENGTH(DFU) - ORIGIN(BOOT2);
|
||||
|
||||
__fw_start = ORIGIN(FW);
|
||||
__clm_start = ORIGIN(CLM);
|
46
bootloader/src/main.rs
Normal file
46
bootloader/src/main.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use core::cell::RefCell;
|
||||
|
||||
use cortex_m_rt::{entry, exception};
|
||||
#[cfg(feature = "defmt")]
|
||||
use defmt_rtt as _;
|
||||
use embassy_boot_rp::*;
|
||||
use embassy_rp::flash::{Blocking, Flash};
|
||||
use embassy_sync::blocking_mutex::Mutex;
|
||||
|
||||
const FLASH_SIZE: usize = 2 * 1024 * 1024;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
let p = embassy_rp::init(Default::default());
|
||||
|
||||
let flash = Flash::<_, Blocking, FLASH_SIZE>::new_blocking(p.FLASH);
|
||||
let flash = Mutex::new(RefCell::new(flash));
|
||||
|
||||
let config = BootLoaderConfig::from_linkerfile_blocking(&flash);
|
||||
let active_offset = config.active.offset();
|
||||
let bl: BootLoader = BootLoader::prepare(config);
|
||||
|
||||
unsafe { bl.load(embassy_rp::flash::FLASH_BASE as u32 + active_offset) }
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
#[cfg_attr(target_os = "none", link_section = ".HardFault.user")]
|
||||
unsafe extern "C" fn HardFault() {
|
||||
cortex_m::peripheral::SCB::sys_reset();
|
||||
}
|
||||
|
||||
#[exception]
|
||||
unsafe fn DefaultHandler(_: i16) -> ! {
|
||||
const SCB_ICSR: *const u32 = 0xE000_ED04 as *const u32;
|
||||
let irqn = core::ptr::read_volatile(SCB_ICSR) as u8 as i16 - 16;
|
||||
|
||||
panic!("DefaultHandler #{:?}", irqn);
|
||||
}
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(_info: &core::panic::PanicInfo) -> ! {
|
||||
cortex_m::asm::udf();
|
||||
}
|
3
rust-toolchain.toml
Normal file
3
rust-toolchain.toml
Normal file
|
@ -0,0 +1,3 @@
|
|||
[toolchain]
|
||||
channel = "nightly"
|
||||
targets = ["thumbv6m-none-eabi"]
|
Loading…
Reference in New Issue
Block a user