Compare commits

...

2 commits

Author SHA1 Message Date
3e30545a55
add binary info 2022-07-09 13:25:27 +01:00
51300ffea4
add some more code 2022-07-09 12:16:28 +01:00
9 changed files with 773 additions and 361 deletions

35
Cargo.lock generated
View file

@ -197,6 +197,28 @@ version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
[[package]]
name = "git-version"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899"
dependencies = [
"git-version-macro",
"proc-macro-hack",
]
[[package]]
name = "git-version-macro"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f"
dependencies = [
"proc-macro-hack",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "itertools"
version = "0.10.3"
@ -367,6 +389,12 @@ dependencies = [
"version_check",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
version = "1.0.40"
@ -439,10 +467,17 @@ dependencies = [
"defmt-rtt",
"embedded-hal",
"embedded-time",
"git-version",
"panic-probe",
"rp-binary-info",
"rp-pico",
]
[[package]]
name = "rp-binary-info"
version = "0.1.0"
source = "git+https://github.com/rp-rs/rp-binary-info#a9397d433b1bea5cedd17192db10c40e5008ab88"
[[package]]
name = "rp-pico"
version = "0.4.1"

862
Cargo.nix

File diff suppressed because it is too large Load diff

View file

@ -21,6 +21,12 @@ defmt-rtt = "0.3"
panic-probe = { version = "0.3", features = ["print-defmt"] }
rp-pico = "0.4"
[dependencies.rp-binary-info]
git = "https://github.com/rp-rs/rp-binary-info"
[build-dependencies]
git-version = "0.3.5"
# cargo build/run
[profile.dev]
codegen-units = 1

View file

@ -28,4 +28,5 @@ fn main() {
// 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-env=GIT_VERSION={}", git_version::git_version!());
}

View file

@ -54,6 +54,7 @@
elf2uf2-rs
cargo-embed
llvmPackages_latest.bintools
picotool
];
};
packages = rec {
@ -73,6 +74,9 @@
};
rkbfirm-crate = (rustPkgs.workspace.rkbfirm {}).overrideAttrs (old: {
configureCargo = "true";
postPatch = ''
sed -i 's/git_version::git_version!()/"${self.lastModifiedDate}"/' build.rs
'';
});
tinyptr-crate = rustPkgs.workspace.tinyptr {};
tinyptr-alloc-crate = rustPkgs.workspace.tinyptr-alloc {};

View file

@ -1,6 +1,6 @@
#![no_std]
use tinyptr::ptr::MutPtr;
use tinyptr::ptr::{MutPtr, NonNull};
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct ListNode<const BASE: usize> {
@ -8,3 +8,22 @@ pub struct ListNode<const BASE: usize> {
pub size: u16
}
impl<const BASE: usize> ListNode<BASE> {
pub unsafe fn next(&mut self) -> Option<&mut Self> {
if self.next.is_null() {
None
} else {
Some(&mut *(self.next.wide()))
}
}
pub unsafe fn link_next(&mut self, block: NonNull<Self, BASE>) {
(*block.as_ptr().wide()).next = self.next;
self.next = block.as_ptr();
}
pub unsafe fn unlink_next(&mut self) {
if self.next.is_null() {
return;
}
self.next = (*self.next.wide()).next;
}
}

View file

@ -13,3 +13,21 @@ SECTIONS {
KEEP(*(.boot2));
} > BOOT2
} INSERT BEFORE .text;
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;

42
src/binary_info.rs Normal file
View file

@ -0,0 +1,42 @@
extern "C" {
static __bi_entries_start: rp_binary_info::entry::Addr;
static __bi_entries_end: rp_binary_info::entry::Addr;
static __sdata: u32;
static __edata: u32;
static __sidata: u32;
}
/// Picotool can find this block in our ELF file and report interesting metadata.
#[link_section = ".bi_header"]
#[used]
pub static PICOTOOL_META: rp_binary_info::Header =
unsafe { rp_binary_info::Header::new(&__bi_entries_start, &__bi_entries_end, &MAPPING_TABLE) };
/// This tells picotool how to convert RAM addresses back into Flash addresses
static MAPPING_TABLE: [rp_binary_info::MappingTableEntry; 2] = [
// This is the entry for .data
rp_binary_info::MappingTableEntry {
source_addr_start: unsafe { &__sidata },
dest_addr_start: unsafe { &__sdata },
dest_addr_end: unsafe { &__edata },
},
// This is the terminating marker
rp_binary_info::MappingTableEntry {
source_addr_start: core::ptr::null(),
dest_addr_start: core::ptr::null(),
dest_addr_end: core::ptr::null(),
},
];
/// This is a list of references to our table entries
#[link_section = ".bi_entries"]
#[used]
pub static PICOTOOL_ENTRIES: [rp_binary_info::entry::Addr; 2] = [
PROGRAM_NAME.addr(),
PROGRAM_VERSION.addr(),
];
static PROGRAM_NAME: rp_binary_info::entry::IdAndString =
rp_binary_info::program_name(concat!("RKB1 firmware", "\0"));
static PROGRAM_VERSION: rp_binary_info::entry::IdAndString =
rp_binary_info::version(concat!(env!("GIT_VERSION"), "\0"));

View file

@ -10,6 +10,7 @@ use defmt_rtt as _;
use embedded_hal::digital::v2::OutputPin;
use embedded_time::fixed_point::FixedPoint;
use panic_probe as _;
mod binary_info;
// Provide an alias for our BSP so we can switch targets quickly.
// Uncomment the BSP you included in Cargo.toml, the rest of the code does not need to change.