diff --git a/Cargo.lock b/Cargo.lock index edb3bff..a092d5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -491,9 +491,9 @@ checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -3165,6 +3165,19 @@ dependencies = [ "siphasher 0.3.11", ] +[[package]] +name = "pi-usb-serial" +version = "0.1.0" +dependencies = [ + "az", + "cortex-m", + "cortex-m-rt", + "embedded-alloc", + "embedded-hal", + "panic-halt", + "rp-pico", +] + [[package]] name = "pin-project" version = "1.1.3" diff --git a/Cargo.toml b/Cargo.toml index fe7eceb..5042dc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,5 +30,5 @@ members = [ "sgf", "timezone-testing", "tree", - "visions/server", + "visions/server", "pi-usb-serial", ] diff --git a/bike-lights/bike/build.rs b/bike-lights/bike/build.rs new file mode 100644 index 0000000..d8c8247 --- /dev/null +++ b/bike-lights/bike/build.rs @@ -0,0 +1,15 @@ +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()); + 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=memory.x"); +} + diff --git a/memory.x b/bike-lights/bike/memory.x similarity index 100% rename from memory.x rename to bike-lights/bike/memory.x diff --git a/pi-usb-serial/.cargo/config b/pi-usb-serial/.cargo/config new file mode 100644 index 0000000..bfd0de3 --- /dev/null +++ b/pi-usb-serial/.cargo/config @@ -0,0 +1,14 @@ +[build] +target = "thumbv6m-none-eabi" + +[target.thumbv6m-none-eabi] +rustflags = [ + "-C", "link-arg=--nmagic", + "-C", "link-arg=-Tlink.x", + "-C", "inline-threshold=5", + "-C", "no-vectorize-loops", +] + +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +runner = "elf2uf2-rs -d" + diff --git a/pi-usb-serial/Cargo.toml b/pi-usb-serial/Cargo.toml new file mode 100644 index 0000000..3410d5c --- /dev/null +++ b/pi-usb-serial/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "pi-usb-serial" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +az = { version = "1" } +cortex-m-rt = { version = "0.7.3" } +cortex-m = { version = "0.7.7" } +embedded-alloc = { version = "0.5.1" } +embedded-hal = { version = "0.2.7" } +panic-halt = { version = "0.2.0" } +rp-pico = { version = "0.8.0" } + diff --git a/pi-usb-serial/build.rs b/pi-usb-serial/build.rs new file mode 100644 index 0000000..8293639 --- /dev/null +++ b/pi-usb-serial/build.rs @@ -0,0 +1,14 @@ +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()); + 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=memory.x"); +} diff --git a/pi-usb-serial/memory.x b/pi-usb-serial/memory.x new file mode 100644 index 0000000..e6b80c4 --- /dev/null +++ b/pi-usb-serial/memory.x @@ -0,0 +1,36 @@ +MEMORY { + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 + FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100 + /* + * RAM consists of 4 banks, SRAM0-SRAM3, with a striped mapping. + * This is usually good for performance, as it distributes load on + * those banks evenly. + */ + RAM : ORIGIN = 0x20000000, LENGTH = 256K + /* + * RAM banks 4 and 5 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 = 0x20040000, LENGTH = 4k + SRAM5 : ORIGIN = 0x20041000, LENGTH = 4k + + /* SRAM banks 0-3 can also be accessed directly. However, those ranges + alias with the RAM mapping, above. So don't use them at the same time! + SRAM0 : ORIGIN = 0x21000000, LENGTH = 64k + SRAM1 : ORIGIN = 0x21010000, LENGTH = 64k + SRAM2 : ORIGIN = 0x21020000, LENGTH = 64k + SRAM3 : ORIGIN = 0x21030000, LENGTH = 64k + */ +} + +EXTERN(BOOT2_FIRMWARE) + +SECTIONS { + /* ### Boot loader */ + .boot2 ORIGIN(BOOT2) : + { + KEEP(*(.boot2)); + } > BOOT2 +} INSERT BEFORE .text; diff --git a/pi-usb-serial/src/main.rs b/pi-usb-serial/src/main.rs new file mode 100644 index 0000000..5b05e61 --- /dev/null +++ b/pi-usb-serial/src/main.rs @@ -0,0 +1,59 @@ +//! This example test the RP Pico on board LED. +//! +//! It does not work with the RP Pico W board. See wifi_blinky.rs. + +#![no_std] +#![no_main] + +use cortex_m::delay::Delay; +use embedded_hal::digital::v2::OutputPin; +use panic_halt as _; +use rp_pico::{ + entry, + hal::{ + clocks::init_clocks_and_plls, + pac::{CorePeripherals, Peripherals}, + watchdog::Watchdog, + Clock, Sio, + }, + Pins, +}; + +#[entry] +fn main() -> ! { + let mut pac = Peripherals::take().unwrap(); + let core = CorePeripherals::take().unwrap(); + let sio = Sio::new(pac.SIO); + let pins = Pins::new( + pac.IO_BANK0, + pac.PADS_BANK0, + sio.gpio_bank0, + &mut pac.RESETS, + ); + + let mut watchdog = Watchdog::new(pac.WATCHDOG); + let clocks = init_clocks_and_plls( + 12_000_000u32, + pac.XOSC, + pac.CLOCKS, + pac.PLL_SYS, + pac.PLL_USB, + &mut pac.RESETS, + &mut watchdog, + ) + .ok() + .unwrap(); + + let mut delay = Delay::new(core.SYST, clocks.system_clock.freq().to_Hz()); + + let mut led_pin = pins.led.into_push_pull_output(); + + let delay_ms = 1000; + loop { + let _ = led_pin.set_high(); + delay.delay_ms(delay_ms); + + let _ = led_pin.set_low(); + delay.delay_ms(delay_ms); + } +}