mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-21 22:32:29 +00:00
Merge pull request #3269 from embassy-rs/rp-binary-info
rp: use the rp-binary-info crate for binary info.
This commit is contained in:
commit
cd4e199065
1
ci.sh
1
ci.sh
@ -88,6 +88,7 @@ cargo batch \
|
||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features time-driver,qspi-as-gpio,rp2040 \
|
||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv8m.main-none-eabihf --features time-driver,defmt,rp235xa \
|
||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv8m.main-none-eabihf --features time-driver,log,rp235xa \
|
||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv8m.main-none-eabihf --features time-driver,rp235xa,binary-info \
|
||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any,time \
|
||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time-driver-any,time \
|
||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time \
|
||||
|
@ -105,7 +105,7 @@ _test = []
|
||||
##
|
||||
## Takes up a little flash space, but picotool can then report the name of your
|
||||
## program and other details.
|
||||
binary-info = [ "rt" ]
|
||||
binary-info = ["rt", "dep:rp-binary-info", "rp-binary-info?/binary-info"]
|
||||
|
||||
[dependencies]
|
||||
embassy-sync = { version = "0.6.0", path = "../embassy-sync" }
|
||||
@ -143,6 +143,7 @@ pio = {version= "0.2.1" }
|
||||
rp2040-boot2 = "0.3"
|
||||
document-features = "0.2.7"
|
||||
sha2-const-stable = "0.1"
|
||||
rp-binary-info = { version = "0.1.0", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
embassy-executor = { version = "0.6.0", path = "../embassy-executor", features = ["arch-std", "executor-thread"] }
|
||||
|
@ -1,34 +0,0 @@
|
||||
//! Constants for binary info
|
||||
|
||||
// Credit: Taken from https://github.com/thejpster/rp-hal-rp2350-public (also licensed Apache 2.0 + MIT).
|
||||
// Copyright (c) rp-rs organization
|
||||
|
||||
/// All Raspberry Pi specified IDs have this tag.
|
||||
///
|
||||
/// You can create your own for custom fields.
|
||||
pub const TAG_RASPBERRY_PI: u16 = super::make_tag(b"RP");
|
||||
|
||||
/// Used to note the program name - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_NAME: u32 = 0x02031c86;
|
||||
/// Used to note the program version - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_VERSION_STRING: u32 = 0x11a9bc3a;
|
||||
/// Used to note the program build date - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_BUILD_DATE_STRING: u32 = 0x9da22254;
|
||||
/// Used to note the size of the binary - use with IntegerEntry
|
||||
pub const ID_RP_BINARY_END: u32 = 0x68f465de;
|
||||
/// Used to note a URL for the program - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_URL: u32 = 0x1856239a;
|
||||
/// Used to note a description of the program - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_DESCRIPTION: u32 = 0xb6a07c19;
|
||||
/// Used to note some feature of the program - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_FEATURE: u32 = 0xa1f4b453;
|
||||
/// Used to note some whether this was a Debug or Release build - use with StringEntry
|
||||
pub const ID_RP_PROGRAM_BUILD_ATTRIBUTE: u32 = 0x4275f0d3;
|
||||
/// Used to note the Pico SDK version used - use with StringEntry
|
||||
pub const ID_RP_SDK_VERSION: u32 = 0x5360b3ab;
|
||||
/// Used to note which board this program targets - use with StringEntry
|
||||
pub const ID_RP_PICO_BOARD: u32 = 0xb63cffbb;
|
||||
/// Used to note which `boot2` image this program uses - use with StringEntry
|
||||
pub const ID_RP_BOOT2_NAME: u32 = 0x7f8882e1;
|
||||
|
||||
// End of file
|
@ -1,171 +0,0 @@
|
||||
//! Handy macros for making Binary Info entries
|
||||
|
||||
// Credit: Taken from https://github.com/thejpster/rp-hal-rp2350-public (also licensed Apache 2.0 + MIT).
|
||||
// Copyright (c) rp-rs organization
|
||||
|
||||
/// Generate a static item containing the given environment variable,
|
||||
/// and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_env {
|
||||
($tag:expr, $id:expr, $env_var_name:expr) => {
|
||||
$crate::binary_info_str!($tag, $id, {
|
||||
let value = concat!(env!($env_var_name), "\0");
|
||||
// # Safety
|
||||
//
|
||||
// We used `concat!` to null-terminate on the line above.
|
||||
let value_cstr = unsafe { core::ffi::CStr::from_bytes_with_nul_unchecked(value.as_bytes()) };
|
||||
value_cstr
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the given string, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
///
|
||||
/// You must pass a numeric tag, a numeric ID, and `&CStr` (which is always
|
||||
/// null-terminated).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_str {
|
||||
($tag:expr, $id:expr, $str:expr) => {{
|
||||
static ENTRY: $crate::binary_info::StringEntry = $crate::binary_info::StringEntry::new($tag, $id, $str);
|
||||
ENTRY.addr()
|
||||
}};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the given string, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
///
|
||||
/// You must pass a numeric tag, a numeric ID, and `&CStr` (which is always
|
||||
/// null-terminated).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_int {
|
||||
($tag:expr, $id:expr, $int:expr) => {{
|
||||
static ENTRY: $crate::binary_info::IntegerEntry = $crate::binary_info::IntegerEntry::new($tag, $id, $int);
|
||||
ENTRY.addr()
|
||||
}};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the program name, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_program_name {
|
||||
($name:expr) => {
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_NAME,
|
||||
$name
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the `CARGO_BIN_NAME` as the program name,
|
||||
/// and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_cargo_bin_name {
|
||||
() => {
|
||||
$crate::binary_info_env!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_NAME,
|
||||
"CARGO_BIN_NAME"
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the program version, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_program_version {
|
||||
($version:expr) => {{
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_VERSION,
|
||||
$version
|
||||
)
|
||||
}};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the `CARGO_PKG_VERSION` as the program
|
||||
/// version, and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_cargo_version {
|
||||
() => {
|
||||
$crate::binary_info_env!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_VERSION_STRING,
|
||||
"CARGO_PKG_VERSION"
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the program URL, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_program_url {
|
||||
($url:expr) => {
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_URL,
|
||||
$url
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the `CARGO_PKG_HOMEPAGE` as the program URL,
|
||||
/// and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_cargo_homepage_url {
|
||||
() => {
|
||||
$crate::binary_info_env!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_URL,
|
||||
"CARGO_PKG_HOMEPAGE"
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the program description, and return its
|
||||
/// [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_program_description {
|
||||
($description:expr) => {
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_DESCRIPTION,
|
||||
$description
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing whether this is a debug or a release
|
||||
/// build, and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_program_build_attribute {
|
||||
() => {
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PROGRAM_BUILD_ATTRIBUTE,
|
||||
{
|
||||
if cfg!(debug_assertions) {
|
||||
c"debug"
|
||||
} else {
|
||||
c"release"
|
||||
}
|
||||
}
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/// Generate a static item containing the specific board this program runs on,
|
||||
/// and return its [`EntryAddr`](super::EntryAddr).
|
||||
#[macro_export]
|
||||
macro_rules! binary_info_rp_pico_board {
|
||||
($board:expr) => {
|
||||
$crate::binary_info_str!(
|
||||
$crate::binary_info::consts::TAG_RASPBERRY_PI,
|
||||
$crate::binary_info::consts::ID_RP_PICO_BOARD,
|
||||
$board
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
// End of file
|
@ -1,175 +0,0 @@
|
||||
//! Code and types for creating Picotool compatible "Binary Info" metadata
|
||||
//!
|
||||
//! Add something like this to your program, and compile with the "binary-info"
|
||||
//! and "rt" features:
|
||||
//!
|
||||
//! ```
|
||||
//! #[link_section = ".bi_entries"]
|
||||
//! #[used]
|
||||
//! pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 3] = [
|
||||
//! embassy_rp::binary_info_rp_program_name!(c"Program Name Here"),
|
||||
//! embassy_rp::binary_info_rp_cargo_version!(),
|
||||
//! embassy_rp::binary_info_int!(embassy_rp::binary_info::make_tag(b"JP"), 0x0000_0001, 0x12345678),
|
||||
//! ];
|
||||
//! ```
|
||||
|
||||
// Credit: Taken from https://github.com/thejpster/rp-hal-rp2350-public (also licensed Apache 2.0 + MIT).
|
||||
// Copyright (c) rp-rs organization
|
||||
|
||||
pub mod consts;
|
||||
|
||||
mod types;
|
||||
pub use types::*;
|
||||
|
||||
#[macro_use]
|
||||
mod macros;
|
||||
|
||||
extern "C" {
|
||||
/// The linker script sets this symbol to have the address of the first
|
||||
/// entry in the `.bi_entries` section.
|
||||
static __bi_entries_start: EntryAddr;
|
||||
/// The linker script sets this symbol to have the address just past the
|
||||
/// last entry in the `.bi_entries` section.
|
||||
static __bi_entries_end: EntryAddr;
|
||||
/// The linker script sets this symbol to have the address of the first
|
||||
/// entry in the `.data` section.
|
||||
static __sdata: u32;
|
||||
/// The linker script sets this symbol to have the address just past the
|
||||
/// first entry in the `.data` section.
|
||||
static __edata: u32;
|
||||
/// The linker script sets this symbol to have the address of the
|
||||
/// initialisation data for the first entry in the `.data` section (i.e. a
|
||||
/// flash address, not a RAM address).
|
||||
static __sidata: u32;
|
||||
}
|
||||
|
||||
/// Picotool can find this block in our ELF file and report interesting
|
||||
/// metadata.
|
||||
///
|
||||
/// The data here tells picotool the start and end flash addresses of our
|
||||
/// metadata.
|
||||
#[cfg(feature = "binary-info")]
|
||||
#[link_section = ".start_block"]
|
||||
#[used]
|
||||
pub static PICOTOOL_HEADER: Header = unsafe {
|
||||
Header::new(
|
||||
core::ptr::addr_of!(__bi_entries_start),
|
||||
core::ptr::addr_of!(__bi_entries_end),
|
||||
&MAPPING_TABLE,
|
||||
)
|
||||
};
|
||||
|
||||
/// This tells picotool how to convert RAM addresses back into Flash addresses
|
||||
#[cfg(feature = "binary-info")]
|
||||
pub static MAPPING_TABLE: [MappingTableEntry; 2] = [
|
||||
// This is the entry for .data
|
||||
MappingTableEntry {
|
||||
source_addr_start: unsafe { core::ptr::addr_of!(__sidata) },
|
||||
dest_addr_start: unsafe { core::ptr::addr_of!(__sdata) },
|
||||
dest_addr_end: unsafe { core::ptr::addr_of!(__edata) },
|
||||
},
|
||||
// This is the terminating marker
|
||||
MappingTableEntry::null(),
|
||||
];
|
||||
|
||||
/// Create a 'Binary Info' entry containing the program name
|
||||
///
|
||||
/// This is well-known to picotool, and will be displayed if you run `picotool info`.
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * ID: [`consts::ID_RP_PROGRAM_NAME`]
|
||||
pub const fn rp_program_name(name: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_NAME, name)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' entry containing the program version.
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_VERSION_STRING`]
|
||||
pub const fn rp_program_version(name: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_VERSION_STRING, name)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' entry with a URL
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_URL`]
|
||||
pub const fn rp_program_url(url: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_URL, url)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with the program build date
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_BUILD_DATE_STRING`]
|
||||
pub const fn rp_program_build_date_string(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_BUILD_DATE_STRING, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with the size of the binary
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_BINARY_END`]
|
||||
pub const fn rp_binary_end(value: u32) -> IntegerEntry {
|
||||
IntegerEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_BINARY_END, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with a description of the program
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_DESCRIPTION`]
|
||||
pub const fn rp_program_description(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_DESCRIPTION, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with some feature of the program
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_FEATURE`]
|
||||
pub const fn rp_program_feature(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_FEATURE, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with some whether this was a Debug or Release build
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PROGRAM_BUILD_ATTRIBUTE`]
|
||||
pub const fn rp_program_build_attribute(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PROGRAM_BUILD_ATTRIBUTE, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with the Pico SDK version used
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_SDK_VERSION`]
|
||||
pub const fn rp_sdk_version(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_SDK_VERSION, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with which board this program targets
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_PICO_BOARD`]
|
||||
pub const fn rp_pico_board(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_PICO_BOARD, value)
|
||||
}
|
||||
|
||||
/// Create a 'Binary Info' with which `boot2` image this program uses
|
||||
///
|
||||
/// * Tag: [`consts::TAG_RASPBERRY_PI`]
|
||||
/// * Id: [`consts::ID_RP_BOOT2_NAME`]
|
||||
pub const fn rp_boot2_name(value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry::new(consts::TAG_RASPBERRY_PI, consts::ID_RP_BOOT2_NAME, value)
|
||||
}
|
||||
|
||||
/// Create a tag from two ASCII letters.
|
||||
///
|
||||
/// ```
|
||||
/// let tag = embassy_rp::binary_info::make_tag(b"RP");
|
||||
/// assert_eq!(tag, 0x5052);
|
||||
/// ```
|
||||
pub const fn make_tag(c: &[u8; 2]) -> u16 {
|
||||
u16::from_le_bytes(*c)
|
||||
}
|
||||
|
||||
// End of file
|
@ -1,195 +0,0 @@
|
||||
//! Types for the Binary Info system
|
||||
|
||||
// Credit: Taken from https://github.com/thejpster/rp-hal-rp2350-public (also licensed Apache 2.0 + MIT).
|
||||
// Copyright (c) rp-rs organization
|
||||
|
||||
/// This is the 'Binary Info' header block that `picotool` looks for in your UF2
|
||||
/// file/ELF file/Pico in Bootloader Mode to give you useful metadata about your
|
||||
/// program.
|
||||
///
|
||||
/// It should be placed in the first 4096 bytes of flash, so use your `memory.x`
|
||||
/// to insert a section between `.text` and `.vector_table` and put a static
|
||||
/// value of this type in that section.
|
||||
#[repr(C)]
|
||||
pub struct Header {
|
||||
/// Must be equal to Picotool::MARKER_START
|
||||
marker_start: u32,
|
||||
/// The first in our table of pointers to Entries
|
||||
entries_start: *const EntryAddr,
|
||||
/// The last in our table of pointers to Entries
|
||||
entries_end: *const EntryAddr,
|
||||
/// The first entry in a null-terminated RAM/Flash mapping table
|
||||
mapping_table: *const MappingTableEntry,
|
||||
/// Must be equal to Picotool::MARKER_END
|
||||
marker_end: u32,
|
||||
}
|
||||
|
||||
impl Header {
|
||||
/// This is the `BINARY_INFO_MARKER_START` magic value from `picotool`
|
||||
const MARKER_START: u32 = 0x7188ebf2;
|
||||
/// This is the `BINARY_INFO_MARKER_END` magic value from `picotool`
|
||||
const MARKER_END: u32 = 0xe71aa390;
|
||||
|
||||
/// Create a new `picotool` compatible header.
|
||||
///
|
||||
/// * `entries_start` - the first [`EntryAddr`] in the table
|
||||
/// * `entries_end` - the last [`EntryAddr`] in the table
|
||||
/// * `mapping_table` - the RAM/Flash address mapping table
|
||||
pub const fn new(
|
||||
entries_start: *const EntryAddr,
|
||||
entries_end: *const EntryAddr,
|
||||
mapping_table: &'static [MappingTableEntry],
|
||||
) -> Self {
|
||||
let mapping_table = mapping_table.as_ptr();
|
||||
Self {
|
||||
marker_start: Self::MARKER_START,
|
||||
entries_start,
|
||||
entries_end,
|
||||
mapping_table,
|
||||
marker_end: Self::MARKER_END,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We need this as rustc complains that is is unsafe to share `*const u32`
|
||||
// pointers between threads. We only allow these to be created with static
|
||||
// data, so this is OK.
|
||||
unsafe impl Sync for Header {}
|
||||
|
||||
/// This is a reference to an entry. It's like a `&dyn` ref to some type `T:
|
||||
/// Entry`, except that the run-time type information is encoded into the
|
||||
/// Entry itself in very specific way.
|
||||
#[repr(transparent)]
|
||||
pub struct EntryAddr(*const u32);
|
||||
|
||||
// We need this as rustc complains that is is unsafe to share `*const u32`
|
||||
// pointers between threads. We only allow these to be created with static
|
||||
// data, so this is OK.
|
||||
unsafe impl Sync for EntryAddr {}
|
||||
|
||||
/// Allows us to tell picotool where values are in the UF2 given their run-time
|
||||
/// address.
|
||||
///
|
||||
/// The most obvious example is RAM variables, which must be found in the
|
||||
/// `.data` section of the UF2.
|
||||
#[repr(C)]
|
||||
pub struct MappingTableEntry {
|
||||
/// The start address in RAM (or wherever the address picotool finds will
|
||||
/// point)
|
||||
pub source_addr_start: *const u32,
|
||||
/// The start address in flash (or whever the data actually lives in the
|
||||
/// ELF)
|
||||
pub dest_addr_start: *const u32,
|
||||
/// The end address in flash
|
||||
pub dest_addr_end: *const u32,
|
||||
}
|
||||
|
||||
impl MappingTableEntry {
|
||||
/// Generate a null entry to mark the end of the list
|
||||
pub const fn null() -> MappingTableEntry {
|
||||
MappingTableEntry {
|
||||
source_addr_start: core::ptr::null(),
|
||||
dest_addr_start: core::ptr::null(),
|
||||
dest_addr_end: core::ptr::null(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We need this as rustc complains that is is unsafe to share `*const u32`
|
||||
// pointers between threads. We only allow these to be created with static
|
||||
// data, so this is OK.
|
||||
unsafe impl Sync for MappingTableEntry {}
|
||||
|
||||
/// This is the set of data types that `picotool` supports.
|
||||
#[repr(u16)]
|
||||
pub enum DataType {
|
||||
/// Raw data
|
||||
Raw = 1,
|
||||
/// Data with a size
|
||||
SizedData = 2,
|
||||
/// A list of binary data
|
||||
BinaryInfoListZeroTerminated = 3,
|
||||
/// A BSON encoded blob
|
||||
Bson = 4,
|
||||
/// An Integer with an ID
|
||||
IdAndInt = 5,
|
||||
/// A string with an Id
|
||||
IdAndString = 6,
|
||||
/// A block device
|
||||
BlockDevice = 7,
|
||||
/// GPIO pins, with their function
|
||||
PinsWithFunction = 8,
|
||||
/// GPIO pins, with their name
|
||||
PinsWithName = 9,
|
||||
/// GPIO pins, with multiple names?
|
||||
PinsWithNames = 10,
|
||||
}
|
||||
|
||||
/// All Entries start with this common header
|
||||
#[repr(C)]
|
||||
struct EntryCommon {
|
||||
data_type: DataType,
|
||||
tag: u16,
|
||||
}
|
||||
|
||||
/// An entry which contains both an ID (e.g. `ID_RP_PROGRAM_NAME`) and a pointer
|
||||
/// to a null-terminated string.
|
||||
#[repr(C)]
|
||||
pub struct StringEntry {
|
||||
header: EntryCommon,
|
||||
id: u32,
|
||||
value: *const core::ffi::c_char,
|
||||
}
|
||||
|
||||
impl StringEntry {
|
||||
/// Create a new `StringEntry`
|
||||
pub const fn new(tag: u16, id: u32, value: &'static core::ffi::CStr) -> StringEntry {
|
||||
StringEntry {
|
||||
header: EntryCommon {
|
||||
data_type: DataType::IdAndString,
|
||||
tag,
|
||||
},
|
||||
id,
|
||||
value: value.as_ptr(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get this entry's address
|
||||
pub const fn addr(&self) -> EntryAddr {
|
||||
EntryAddr(self as *const Self as *const u32)
|
||||
}
|
||||
}
|
||||
|
||||
// We need this as rustc complains that is is unsafe to share `*const
|
||||
// core::ffi::c_char` pointers between threads. We only allow these to be
|
||||
// created with static string slices, so it's OK.
|
||||
unsafe impl Sync for StringEntry {}
|
||||
|
||||
/// An entry which contains both an ID (e.g. `ID_RP_BINARY_END`) and an integer.
|
||||
#[repr(C)]
|
||||
pub struct IntegerEntry {
|
||||
header: EntryCommon,
|
||||
id: u32,
|
||||
value: u32,
|
||||
}
|
||||
|
||||
impl IntegerEntry {
|
||||
/// Create a new `StringEntry`
|
||||
pub const fn new(tag: u16, id: u32, value: u32) -> IntegerEntry {
|
||||
IntegerEntry {
|
||||
header: EntryCommon {
|
||||
data_type: DataType::IdAndInt,
|
||||
tag,
|
||||
},
|
||||
id,
|
||||
value,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get this entry's address
|
||||
pub const fn addr(&self) -> EntryAddr {
|
||||
EntryAddr(self as *const Self as *const u32)
|
||||
}
|
||||
}
|
||||
|
||||
// End of file
|
@ -9,6 +9,9 @@
|
||||
// This mod MUST go first, so that the others see its macros.
|
||||
pub(crate) mod fmt;
|
||||
|
||||
#[cfg(feature = "binary-info")]
|
||||
pub use rp_binary_info as binary_info;
|
||||
|
||||
#[cfg(feature = "critical-section-impl")]
|
||||
mod critical_section_impl;
|
||||
|
||||
@ -16,8 +19,6 @@ mod intrinsics;
|
||||
|
||||
pub mod adc;
|
||||
#[cfg(feature = "_rp235x")]
|
||||
pub mod binary_info;
|
||||
#[cfg(feature = "_rp235x")]
|
||||
pub mod block;
|
||||
#[cfg(feature = "rp2040")]
|
||||
pub mod bootsel;
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -28,10 +28,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -23,10 +23,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
enum LedState {
|
||||
|
@ -23,10 +23,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
type LedType = Mutex<ThreadModeRawMutex, Option<Output<'static>>>;
|
||||
|
@ -18,10 +18,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
pub struct Debouncer<'a> {
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
const ADDR_OFFSET: u32 = 0x100000;
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
/// It requires an external signal to be manually triggered on PIN 16. For
|
||||
|
@ -20,10 +20,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -24,10 +24,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
// Our anonymous hypotetical temperature sensor could be:
|
||||
|
@ -22,10 +22,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[allow(dead_code)]
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -33,10 +33,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
static COUNTER: AtomicU32 = AtomicU32::new(0);
|
||||
|
@ -24,10 +24,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
static mut CORE1_STACK: Stack<4096> = Stack::new();
|
||||
|
@ -74,10 +74,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::task]
|
||||
|
@ -20,10 +20,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -26,10 +26,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(pub struct Irqs {
|
||||
|
@ -29,10 +29,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -22,10 +22,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
const REFRESH_INTERVAL: u64 = 20000;
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -22,10 +22,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
const DEFAULT_MIN_PULSE_WIDTH: u64 = 1000; // uncalibrated default, the shortest duty cycle sent to a servo
|
||||
|
@ -25,10 +25,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -27,10 +27,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -20,10 +20,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -27,10 +27,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
type Spi1Bus = Mutex<NoopRawMutex, Spi<'static, SPI1, spi::Async>>;
|
||||
|
@ -40,10 +40,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
type UartAsyncMutex = mutex::Mutex<CriticalSectionRawMutex, UartTx<'static, UART0, uart::Async>>;
|
||||
|
@ -21,10 +21,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -36,10 +36,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
use crate::my_display_interface::SPIDeviceInterface;
|
||||
|
@ -25,10 +25,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
struct DummyTimesource();
|
||||
|
@ -20,10 +20,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -26,10 +26,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -19,10 +19,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(pub struct Irqs {
|
||||
|
@ -25,10 +25,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -38,10 +38,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
|
@ -22,10 +22,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
#[embassy_executor::main]
|
||||
|
@ -27,10 +27,10 @@ pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
|
||||
#[link_section = ".bi_entries"]
|
||||
#[used]
|
||||
pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
|
||||
embassy_rp::binary_info_rp_cargo_bin_name!(),
|
||||
embassy_rp::binary_info_rp_cargo_version!(),
|
||||
embassy_rp::binary_info_rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info_rp_program_build_attribute!(),
|
||||
embassy_rp::binary_info::rp_program_name!(c"example"),
|
||||
embassy_rp::binary_info::rp_cargo_version!(),
|
||||
embassy_rp::binary_info::rp_program_description!(c"Blinky"),
|
||||
embassy_rp::binary_info::rp_program_build_attribute!(),
|
||||
];
|
||||
|
||||
type SampleBuffer = [u16; 512];
|
||||
|
Loading…
Reference in New Issue
Block a user