Compare commits
	
		
			3 Commits
		
	
	
		
			noproto-cr
			...
			boot-hil
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9010bfe79b | ||
|  | 2a437d31c4 | ||
|  | 2d78aa763a | 
							
								
								
									
										3
									
								
								ci.sh
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								ci.sh
									
									
									
									
									
								
							| @@ -155,7 +155,7 @@ cargo batch  \ | ||||
|     --- build --release --manifest-path examples/boot/application/stm32l1/Cargo.toml --target thumbv7m-none-eabi --features skip-include --out-dir out/examples/boot/stm32l1 \ | ||||
|     --- build --release --manifest-path examples/boot/application/stm32l4/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32l4 \ | ||||
|     --- build --release --manifest-path examples/boot/application/stm32wl/Cargo.toml --target thumbv7em-none-eabihf --features skip-include --out-dir out/examples/boot/stm32wl \ | ||||
|     --- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \ | ||||
|     --- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 --out-dir out/examples/bootloader/nrf \ | ||||
|     --- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \ | ||||
|     --- build --release --manifest-path examples/boot/bootloader/rp/Cargo.toml --target thumbv6m-none-eabi \ | ||||
|     --- build --release --manifest-path examples/boot/bootloader/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \ | ||||
| @@ -171,6 +171,7 @@ cargo batch  \ | ||||
|     --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585ai --out-dir out/tests/stm32u585ai \ | ||||
|     --- build --release --manifest-path tests/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/tests/rpi-pico \ | ||||
|     --- build --release --manifest-path tests/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/nrf52840-dk \ | ||||
|     --- build --release --manifest-path tests/boot/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/boot/nrf52840-dk \ | ||||
|     --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \ | ||||
|     $BUILD_EXTRA | ||||
|  | ||||
|   | ||||
| @@ -1,17 +1,6 @@ | ||||
| [unstable] | ||||
| build-std = ["core"] | ||||
| build-std-features = ["panic_immediate_abort"] | ||||
|  | ||||
| [target.'cfg(all(target_arch = "arm", target_os = "none"))'] | ||||
| #runner = "./fruitrunner" | ||||
| runner = "probe-rs run --chip nrf52840_xxAA" | ||||
|  | ||||
| rustflags = [ | ||||
|   # Code-size optimizations. | ||||
|   "-Z", "trap-unreachable=no", | ||||
|   #"-C", "no-vectorize-loops", | ||||
|   "-C", "force-frame-pointers=yes", | ||||
| ] | ||||
| runner = "teleprobe local run --chip nRF52832_xxAA --elf" | ||||
|  | ||||
| [build] | ||||
| target = "thumbv7em-none-eabi" | ||||
|   | ||||
| @@ -6,8 +6,8 @@ description = "Bootloader for nRF chips" | ||||
| license = "MIT OR Apache-2.0" | ||||
|  | ||||
| [dependencies] | ||||
| defmt = { version = "0.3", optional = true } | ||||
| defmt-rtt = { version = "0.4", optional = true } | ||||
| defmt = { version = "0.3" } | ||||
| defmt-rtt = { version = "0.4" } | ||||
|  | ||||
| embassy-nrf = { path = "../../../../embassy-nrf", features = ["nightly"] } | ||||
| embassy-boot-nrf = { path = "../../../../embassy-boot/nrf" } | ||||
| @@ -17,15 +17,9 @@ cortex-m-rt = { version = "0.7" } | ||||
| cfg-if = "1.0.0" | ||||
|  | ||||
| [features] | ||||
| defmt = [ | ||||
|     "dep:defmt", | ||||
|     "embassy-boot-nrf/defmt", | ||||
|     "embassy-nrf/defmt", | ||||
| ] | ||||
| softdevice = [ | ||||
|     "embassy-boot-nrf/softdevice", | ||||
| ] | ||||
| debug = ["defmt-rtt", "defmt"] | ||||
|  | ||||
| [profile.dev] | ||||
| debug = 2 | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| use core::cell::RefCell; | ||||
|  | ||||
| use cortex_m_rt::{entry, exception}; | ||||
| #[cfg(feature = "defmt")] | ||||
| use defmt_rtt as _; | ||||
| use embassy_boot_nrf::*; | ||||
| use embassy_nrf::nvmc::Nvmc; | ||||
|   | ||||
							
								
								
									
										9
									
								
								tests/boot/nrf/.cargo/config.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								tests/boot/nrf/.cargo/config.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| [target.'cfg(all(target_arch = "arm", target_os = "none"))'] | ||||
| runner = "teleprobe local run --chip nRF52832_xxAA --elf" | ||||
| #runner = "teleprobe client run" | ||||
|  | ||||
| [build] | ||||
| target = "thumbv7em-none-eabi" | ||||
|  | ||||
| [env] | ||||
| DEFMT_LOG = "trace" | ||||
| @@ -1,6 +1,6 @@ | ||||
| [target.'cfg(all(target_arch = "arm", target_os = "none"))'] | ||||
| #runner = "teleprobe local run --chip nRF52840_xxAA --elf" | ||||
| runner = "teleprobe client run" | ||||
| runner = "teleprobe local run --chip nRF52832_xxAA --elf" | ||||
| #runner = "teleprobe client run" | ||||
|  | ||||
| [build] | ||||
| target = "thumbv7em-none-eabi" | ||||
|   | ||||
| @@ -11,7 +11,7 @@ embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } | ||||
| embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["defmt", "nightly"] } | ||||
| embassy-executor = { version = "0.3.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "defmt", "nightly", "integrated-timers"] } | ||||
| embassy-time = { version = "0.1.3", path = "../../embassy-time", features = ["defmt", "nightly", "unstable-traits", "defmt-timestamp-uptime"] } | ||||
| embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nightly", "unstable-traits", "nrf52840", "time-driver-rtc1", "gpiote", "unstable-pac"] } | ||||
| embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nightly", "unstable-traits", "nrf52832", "time-driver-rtc1", "gpiote", "unstable-pac"] } | ||||
| embedded-io-async = { version = "0.5.0" } | ||||
| embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "tcp", "dhcpv4", "medium-ethernet", "nightly"] } | ||||
| embassy-net-esp-hosted = { version = "0.1.0", path = "../../embassy-net-esp-hosted", features = ["defmt"] } | ||||
|   | ||||
| @@ -1,17 +1,35 @@ | ||||
| use std::error::Error; | ||||
| use std::path::PathBuf; | ||||
| use std::{env, fs}; | ||||
| //! This build script copies the `memory.x` file from the crate root into | ||||
| //! a directory where the linker can always find it at build time. | ||||
| //! For many projects this is optional, as the linker always searches the | ||||
| //! project root directory -- wherever `Cargo.toml` is. However, if you | ||||
| //! are using a workspace or have a more complicated build setup, this | ||||
| //! build script becomes required. Additionally, by requesting that | ||||
| //! Cargo re-run the build script whenever `memory.x` is changed, | ||||
| //! updating `memory.x` ensures a rebuild of the application with the | ||||
| //! new memory settings. | ||||
|  | ||||
| fn main() -> Result<(), Box<dyn Error>> { | ||||
|     let out = PathBuf::from(env::var("OUT_DIR").unwrap()); | ||||
|     fs::write(out.join("link_ram.x"), include_bytes!("link_ram.x")).unwrap(); | ||||
| use std::env; | ||||
| use std::fs::File; | ||||
| use std::io::Write; | ||||
| use std::path::PathBuf; | ||||
|  | ||||
| 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()); | ||||
|     File::create(out.join("memory.x")) | ||||
|         .unwrap() | ||||
|         .write_all(include_bytes!("memory.x")) | ||||
|         .unwrap(); | ||||
|     println!("cargo:rustc-link-search={}", out.display()); | ||||
|     println!("cargo:rerun-if-changed=link_ram.x"); | ||||
|  | ||||
|     // By default, Cargo will re-run a build script whenever | ||||
|     // any file in the project changes. By specifying `memory.x` | ||||
|     // here, we ensure the build script is only re-run when | ||||
|     // `memory.x` is changed. | ||||
|     println!("cargo:rerun-if-changed=memory.x"); | ||||
|  | ||||
|     println!("cargo:rustc-link-arg-bins=--nmagic"); | ||||
|     println!("cargo:rustc-link-arg-bins=-Tlink_ram.x"); | ||||
|     println!("cargo:rustc-link-arg-bins=-Tlink.x"); | ||||
|     println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); | ||||
|     println!("cargo:rustc-link-arg-bins=-Tteleprobe.x"); | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|   | ||||
| @@ -1,254 +0,0 @@ | ||||
| /* ##### EMBASSY NOTE | ||||
|     Originally from https://github.com/rust-embedded/cortex-m-rt/blob/master/link.x.in | ||||
|     Adjusted to put everything in RAM | ||||
| */ | ||||
|  | ||||
| /* # Developer notes | ||||
|  | ||||
| - Symbols that start with a double underscore (__) are considered "private" | ||||
|  | ||||
| - Symbols that start with a single underscore (_) are considered "semi-public"; they can be | ||||
|   overridden in a user linker script, but should not be referred from user code (e.g. `extern "C" { | ||||
|   static mut __sbss }`). | ||||
|  | ||||
| - `EXTERN` forces the linker to keep a symbol in the final binary. We use this to make sure a | ||||
|   symbol if not dropped if it appears in or near the front of the linker arguments and "it's not | ||||
|   needed" by any of the preceding objects (linker arguments) | ||||
|  | ||||
| - `PROVIDE` is used to provide default values that can be overridden by a user linker script | ||||
|  | ||||
| - On alignment: it's important for correctness that the VMA boundaries of both .bss and .data *and* | ||||
|   the LMA of .data are all 4-byte aligned. These alignments are assumed by the RAM initialization | ||||
|   routine. There's also a second benefit: 4-byte aligned boundaries means that you won't see | ||||
|   "Address (..) is out of bounds" in the disassembly produced by `objdump`. | ||||
| */ | ||||
|  | ||||
| /* Provides information about the memory layout of the device */ | ||||
| /* This will be provided by the user (see `memory.x`) or by a Board Support Crate */ | ||||
| INCLUDE memory.x | ||||
|  | ||||
| /* # Entry point = reset vector */ | ||||
| EXTERN(__RESET_VECTOR); | ||||
| EXTERN(Reset); | ||||
| ENTRY(Reset); | ||||
|  | ||||
| /* # Exception vectors */ | ||||
| /* This is effectively weak aliasing at the linker level */ | ||||
| /* The user can override any of these aliases by defining the corresponding symbol themselves (cf. | ||||
|    the `exception!` macro) */ | ||||
| EXTERN(__EXCEPTIONS); /* depends on all the these PROVIDED symbols */ | ||||
|  | ||||
| EXTERN(DefaultHandler); | ||||
|  | ||||
| PROVIDE(NonMaskableInt = DefaultHandler); | ||||
| EXTERN(HardFaultTrampoline); | ||||
| PROVIDE(MemoryManagement = DefaultHandler); | ||||
| PROVIDE(BusFault = DefaultHandler); | ||||
| PROVIDE(UsageFault = DefaultHandler); | ||||
| PROVIDE(SecureFault = DefaultHandler); | ||||
| PROVIDE(SVCall = DefaultHandler); | ||||
| PROVIDE(DebugMonitor = DefaultHandler); | ||||
| PROVIDE(PendSV = DefaultHandler); | ||||
| PROVIDE(SysTick = DefaultHandler); | ||||
|  | ||||
| PROVIDE(DefaultHandler = DefaultHandler_); | ||||
| PROVIDE(HardFault = HardFault_); | ||||
|  | ||||
| /* # Interrupt vectors */ | ||||
| EXTERN(__INTERRUPTS); /* `static` variable similar to `__EXCEPTIONS` */ | ||||
|  | ||||
| /* # Pre-initialization function */ | ||||
| /* If the user overrides this using the `pre_init!` macro or by creating a `__pre_init` function, | ||||
|    then the function this points to will be called before the RAM is initialized. */ | ||||
| PROVIDE(__pre_init = DefaultPreInit); | ||||
|  | ||||
| /* # Sections */ | ||||
| SECTIONS | ||||
| { | ||||
|   PROVIDE(_stack_start = ORIGIN(RAM) + LENGTH(RAM)); | ||||
|  | ||||
|   /* ## Sections in RAM */ | ||||
|   /* ### Vector table */ | ||||
|   .vector_table ORIGIN(RAM) : | ||||
|   { | ||||
|     /* Initial Stack Pointer (SP) value */ | ||||
|     LONG(_stack_start); | ||||
|  | ||||
|     /* Reset vector */ | ||||
|     KEEP(*(.vector_table.reset_vector)); /* this is the `__RESET_VECTOR` symbol */ | ||||
|     __reset_vector = .; | ||||
|  | ||||
|     /* Exceptions */ | ||||
|     KEEP(*(.vector_table.exceptions)); /* this is the `__EXCEPTIONS` symbol */ | ||||
|     __eexceptions = .; | ||||
|  | ||||
|     /* Device specific interrupts */ | ||||
|     KEEP(*(.vector_table.interrupts)); /* this is the `__INTERRUPTS` symbol */ | ||||
|   } > RAM | ||||
|  | ||||
|   PROVIDE(_stext = ADDR(.vector_table) + SIZEOF(.vector_table)); | ||||
|  | ||||
|   /* ### .text */ | ||||
|   .text _stext : | ||||
|   { | ||||
|     __stext = .; | ||||
|     *(.Reset); | ||||
|  | ||||
|     *(.text .text.*); | ||||
|  | ||||
|     /* The HardFaultTrampoline uses the `b` instruction to enter `HardFault`, | ||||
|        so must be placed close to it. */ | ||||
|     *(.HardFaultTrampoline); | ||||
|     *(.HardFault.*); | ||||
|  | ||||
|     . = ALIGN(4); /* Pad .text to the alignment to workaround overlapping load section bug in old lld */ | ||||
|     __etext = .; | ||||
|   } > RAM | ||||
|  | ||||
|   /* ### .rodata */ | ||||
|   .rodata : ALIGN(4) | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     __srodata = .; | ||||
|     *(.rodata .rodata.*); | ||||
|  | ||||
|     /* 4-byte align the end (VMA) of this section. | ||||
|        This is required by LLD to ensure the LMA of the following .data | ||||
|        section will have the correct alignment. */ | ||||
|     . = ALIGN(4); | ||||
|     __erodata = .; | ||||
|   } > RAM | ||||
|  | ||||
|   /* ## Sections in RAM */ | ||||
|   /* ### .data */ | ||||
|   .data : ALIGN(4) | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     __sdata = .; | ||||
|     __edata = .; | ||||
|     *(.data .data.*); | ||||
|     . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ | ||||
|   } > RAM | ||||
|   /* Allow sections from user `memory.x` injected using `INSERT AFTER .data` to | ||||
|    * use the .data loading mechanism by pushing __edata. Note: do not change | ||||
|    * output region or load region in those user sections! */ | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   /* LMA of .data */ | ||||
|   __sidata = LOADADDR(.data); | ||||
|  | ||||
|   /* ### .gnu.sgstubs | ||||
|      This section contains the TrustZone-M veneers put there by the Arm GNU linker. */ | ||||
|   /* Security Attribution Unit blocks must be 32 bytes aligned. */ | ||||
|   /* Note that this pads the RAM usage to 32 byte alignment. */ | ||||
|   .gnu.sgstubs : ALIGN(32) | ||||
|   { | ||||
|     . = ALIGN(32); | ||||
|     __veneer_base = .; | ||||
|     *(.gnu.sgstubs*) | ||||
|     . = ALIGN(32); | ||||
|     __veneer_limit = .; | ||||
|   } > RAM | ||||
|  | ||||
|   /* ### .bss */ | ||||
|   .bss (NOLOAD) : ALIGN(4) | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     __sbss = .; | ||||
|     *(.bss .bss.*); | ||||
|     *(COMMON); /* Uninitialized C statics */ | ||||
|     . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ | ||||
|   } > RAM | ||||
|   /* Allow sections from user `memory.x` injected using `INSERT AFTER .bss` to | ||||
|    * use the .bss zeroing mechanism by pushing __ebss. Note: do not change | ||||
|    * output region or load region in those user sections! */ | ||||
|   . = ALIGN(4); | ||||
|   __ebss = .; | ||||
|  | ||||
|   /* ### .uninit */ | ||||
|   .uninit (NOLOAD) : ALIGN(4) | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     __suninit = .; | ||||
|     *(.uninit .uninit.*); | ||||
|     . = ALIGN(4); | ||||
|     __euninit = .; | ||||
|   } > RAM | ||||
|  | ||||
|   /* Place the heap right after `.uninit` in RAM */ | ||||
|   PROVIDE(__sheap = __euninit); | ||||
|  | ||||
|   /* ## .got */ | ||||
|   /* Dynamic relocations are unsupported. This section is only used to detect relocatable code in | ||||
|      the input files and raise an error if relocatable code is found */ | ||||
|   .got (NOLOAD) : | ||||
|   { | ||||
|     KEEP(*(.got .got.*)); | ||||
|   } | ||||
|  | ||||
|   /* ## Discarded sections */ | ||||
|   /DISCARD/ : | ||||
|   { | ||||
|     /* Unused exception related info that only wastes space */ | ||||
|     *(.ARM.exidx); | ||||
|     *(.ARM.exidx.*); | ||||
|     *(.ARM.extab.*); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* Do not exceed this mark in the error messages below                                    | */ | ||||
| /* # Alignment checks */ | ||||
| ASSERT(ORIGIN(RAM) % 4 == 0, " | ||||
| ERROR(cortex-m-rt): the start of the RAM region must be 4-byte aligned"); | ||||
|  | ||||
| ASSERT(__sdata % 4 == 0 && __edata % 4 == 0, " | ||||
| BUG(cortex-m-rt): .data is not 4-byte aligned"); | ||||
|  | ||||
| ASSERT(__sidata % 4 == 0, " | ||||
| BUG(cortex-m-rt): the LMA of .data is not 4-byte aligned"); | ||||
|  | ||||
| ASSERT(__sbss % 4 == 0 && __ebss % 4 == 0, " | ||||
| BUG(cortex-m-rt): .bss is not 4-byte aligned"); | ||||
|  | ||||
| ASSERT(__sheap % 4 == 0, " | ||||
| BUG(cortex-m-rt): start of .heap is not 4-byte aligned"); | ||||
|  | ||||
| /* # Position checks */ | ||||
|  | ||||
| /* ## .vector_table */ | ||||
| ASSERT(__reset_vector == ADDR(.vector_table) + 0x8, " | ||||
| BUG(cortex-m-rt): the reset vector is missing"); | ||||
|  | ||||
| ASSERT(__eexceptions == ADDR(.vector_table) + 0x40, " | ||||
| BUG(cortex-m-rt): the exception vectors are missing"); | ||||
|  | ||||
| ASSERT(SIZEOF(.vector_table) > 0x40, " | ||||
| ERROR(cortex-m-rt): The interrupt vectors are missing. | ||||
| Possible solutions, from most likely to less likely: | ||||
| - Link to a svd2rust generated device crate | ||||
| - Check that you actually use the device/hal/bsp crate in your code | ||||
| - Disable the 'device' feature of cortex-m-rt to build a generic application (a dependency | ||||
| may be enabling it) | ||||
| - Supply the interrupt handlers yourself. Check the documentation for details."); | ||||
|  | ||||
| /* ## .text */ | ||||
| ASSERT(ADDR(.vector_table) + SIZEOF(.vector_table) <= _stext, " | ||||
| ERROR(cortex-m-rt): The .text section can't be placed inside the .vector_table section | ||||
| Set _stext to an address greater than the end of .vector_table (See output of `nm`)"); | ||||
|  | ||||
| ASSERT(_stext + SIZEOF(.text) < ORIGIN(RAM) + LENGTH(RAM), " | ||||
| ERROR(cortex-m-rt): The .text section must be placed inside the RAM memory. | ||||
| Set _stext to an address smaller than 'ORIGIN(RAM) + LENGTH(RAM)'"); | ||||
|  | ||||
| /* # Other checks */ | ||||
| ASSERT(SIZEOF(.got) == 0, " | ||||
| ERROR(cortex-m-rt): .got section detected in the input object files | ||||
| Dynamic relocations are not supported. If you are linking to C code compiled using | ||||
| the 'cc' crate then modify your build script to compile the C code _without_ | ||||
| the -fPIC flag. See the documentation of the `cc::Build.pic` method for details."); | ||||
| /* Do not exceed this mark in the error messages above                                    | */ | ||||
|  | ||||
|  | ||||
| /* Provides weak aliases (cf. PROVIDED) for device specific interrupt handlers */ | ||||
| /* This will usually be provided by a device crate generated using svd2rust (see `device.x`) */ | ||||
| INCLUDE device.x | ||||
| @@ -1,5 +1,7 @@ | ||||
| MEMORY | ||||
| { | ||||
|   FLASH : ORIGIN = 0x00000000, LENGTH = 1024K | ||||
|   RAM : ORIGIN = 0x20000000, LENGTH = 256K | ||||
|   /* NOTE 1 K = 1 KiBi = 1024 bytes */ | ||||
|   /* These values correspond to the NRF52840 with Softdevices S140 7.0.1 */ | ||||
|   FLASH : ORIGIN = 0x00000000, LENGTH = 256K | ||||
|   RAM : ORIGIN = 0x20000000, LENGTH = 32K  | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #![no_std] | ||||
| #![no_main] | ||||
| #![feature(type_alias_impl_trait)] | ||||
| teleprobe_meta::target!(b"nrf52840-dk"); | ||||
| teleprobe_meta::target!(b"nrf52-dk"); | ||||
|  | ||||
| use defmt::{assert, info}; | ||||
| use embassy_executor::Spawner; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user