From e7a50040b252ac3cbfc512a18f8bfd07b03022e7 Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Sat, 2 Nov 2024 13:17:50 -0400 Subject: [PATCH] Bare-bones control of the first 30 leds --- Cargo.lock | 157 ++++++++++++++++++++++++++++-- Cargo.toml | 2 +- halloween-leds/.cargo/config.toml | 12 +++ halloween-leds/Cargo.toml | 11 +++ halloween-leds/src/main.rs | 103 ++++++++++++++++++++ 5 files changed, 274 insertions(+), 11 deletions(-) create mode 100644 halloween-leds/.cargo/config.toml create mode 100644 halloween-leds/Cargo.toml create mode 100644 halloween-leds/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index ca31bff..d96f183 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -373,12 +373,12 @@ dependencies = [ "cortex-m", "cortex-m-rt", "embedded-alloc", - "embedded-hal", + "embedded-hal 0.2.7", "fixed", "fugit", "lights-core", - "panic-halt", - "rp-pico", + "panic-halt 0.2.0", + "rp-pico 0.8.0", ] [[package]] @@ -429,6 +429,12 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" +[[package]] +name = "bitfield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" + [[package]] name = "bitflags" version = "1.3.2" @@ -775,8 +781,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" dependencies = [ "bare-metal", - "bitfield", - "embedded-hal", + "bitfield 0.13.2", + "embedded-hal 0.2.7", "volatile-register", ] @@ -1067,6 +1073,37 @@ dependencies = [ "void", ] +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" +dependencies = [ + "embedded-hal 1.0.0", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" +dependencies = [ + "embedded-hal 1.0.0", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "emseries" version = "0.6.0" @@ -1973,6 +2010,26 @@ dependencies = [ "crunchy", ] +[[package]] +name = "halloween-leds" +version = "0.1.0" +dependencies = [ + "cortex-m-rt", + "embedded-hal 1.0.0", + "embedded-io", + "panic-halt 1.0.0", + "rp-pico 0.9.0", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -2022,6 +2079,16 @@ dependencies = [ "http 0.2.12", ] +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.4.1" @@ -3082,6 +3149,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812" +[[package]] +name = "panic-halt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11" + [[package]] name = "parking" version = "2.2.1" @@ -3810,8 +3883,21 @@ dependencies = [ "cortex-m-rt", "fugit", "rp2040-boot2", - "rp2040-hal", - "usb-device", + "rp2040-hal 0.9.2", + "usb-device 0.2.9", +] + +[[package]] +name = "rp-pico" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9342d3ac7011ac688300979e9b52a81f0add1d05feb02868cf94bfee0705b28" +dependencies = [ + "cortex-m-rt", + "fugit", + "rp2040-boot2", + "rp2040-hal 0.10.2", + "usb-device 0.3.2", ] [[package]] @@ -3832,7 +3918,7 @@ dependencies = [ "cortex-m", "critical-section", "embedded-dma", - "embedded-hal", + "embedded-hal 0.2.7", "frunk", "fugit", "itertools 0.10.5", @@ -3841,8 +3927,37 @@ dependencies = [ "pio", "rand_core 0.6.4", "rp2040-hal-macros", - "rp2040-pac", - "usb-device", + "rp2040-pac 0.5.0", + "usb-device 0.2.9", + "vcell", + "void", +] + +[[package]] +name = "rp2040-hal" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d11e711940087f2cdff8aeae9f4b902e2014c06a00b39a1092686b81ec973d6f" +dependencies = [ + "bitfield 0.14.0", + "cortex-m", + "critical-section", + "embedded-dma", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "frunk", + "fugit", + "itertools 0.10.5", + "nb 1.1.0", + "paste", + "pio", + "rand_core 0.6.4", + "rp2040-hal-macros", + "rp2040-pac 0.6.0", + "usb-device 0.3.2", "vcell", "void", ] @@ -3871,6 +3986,18 @@ dependencies = [ "vcell", ] +[[package]] +name = "rp2040-pac" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83cbcd3f7a0ca7bbe61dc4eb7e202842bee4e27b769a7bf3a4a72fa399d6e404" +dependencies = [ + "cortex-m", + "cortex-m-rt", + "critical-section", + "vcell", +] + [[package]] name = "rsa" version = "0.9.6" @@ -5086,6 +5213,16 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508" +[[package]] +name = "usb-device" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" +dependencies = [ + "heapless", + "portable-atomic", +] + [[package]] name = "utf-8" version = "0.7.6" diff --git a/Cargo.toml b/Cargo.toml index 96c65e1..b9dcc6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,5 +30,5 @@ members = [ "sgf", "timezone-testing", "tree", - "visions/server", "gm-dash/server", + "visions/server", "gm-dash/server", "halloween-leds" ] diff --git a/halloween-leds/.cargo/config.toml b/halloween-leds/.cargo/config.toml new file mode 100644 index 0000000..fead60a --- /dev/null +++ b/halloween-leds/.cargo/config.toml @@ -0,0 +1,12 @@ +[build] +target = "thumbv6m-none-eabi" + +[target.thumbv6m-none-eabi] +rustflags = [ + "-C", "link-arg=--nmagic", + "-C", "link-arg=-Tlink.x", + "-C", "llvm-args=--inline-threshold=5", + "-C", "no-vectorize-loops", +] + +runner = "elf2uf2-rs -d" diff --git a/halloween-leds/Cargo.toml b/halloween-leds/Cargo.toml new file mode 100644 index 0000000..676ac35 --- /dev/null +++ b/halloween-leds/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "halloween-leds" +version = "0.1.0" +edition = "2021" + +[dependencies] +cortex-m-rt = "0.7.3" +embedded-hal = "1.0.0" +embedded-io = "0.6.1" +panic-halt = "1.0.0" +rp-pico = "0.9.0" diff --git a/halloween-leds/src/main.rs b/halloween-leds/src/main.rs new file mode 100644 index 0000000..5dea472 --- /dev/null +++ b/halloween-leds/src/main.rs @@ -0,0 +1,103 @@ +#![no_main] +#![no_std] + +use embedded_hal::{delay::DelayNs, digital::OutputPin}; +use embedded_hal::spi::SpiBus; +use panic_halt as _; +use rp_pico::hal::gpio::bank0::Gpio0; +use rp_pico::{ + entry, + hal::{ + clocks::init_clocks_and_plls, + fugit::RateExtU32, + gpio::{ + bank0::{Gpio2, Gpio4}, + FunctionSio, Pin, PullDown, SioOutput, + }, + spi::{Enabled, Spi, SpiDevice, ValidSpiPinout}, + uart::{DataBits, StopBits, UartConfig, UartPeripheral}, + Clock, Sio, Timer, Watchdog, + }, + pac, Pins, +}; + +const XOSC_CRYSTAL_FREQ: u32 = 12_000_000; // MHz, https://forums.raspberrypi.com/viewtopic.php?t=356764 + +#[entry] +unsafe fn main() -> ! { + let mut peripherals = pac::Peripherals::take().unwrap(); + let sio = Sio::new(peripherals.SIO); + let mut watchdog = Watchdog::new(peripherals.WATCHDOG); + let pins = Pins::new( + peripherals.IO_BANK0, + peripherals.PADS_BANK0, + sio.gpio_bank0, + &mut peripherals.RESETS, + ); + let clocks = init_clocks_and_plls( + XOSC_CRYSTAL_FREQ, + peripherals.XOSC, + peripherals.CLOCKS, + peripherals.PLL_SYS, + peripherals.PLL_USB, + &mut peripherals.RESETS, + &mut watchdog, + ) + .ok() + .unwrap(); + + // let mut power_light: Pin, PullDown> = pins.gpio0.into_function(); + // power_light.set_high(); + let mut timer = Timer::new(peripherals.TIMER, &mut peripherals.RESETS, &clocks); + + let spi_clk = pins.gpio10.into_function(); + let spi_sdo = pins.gpio11.into_function(); + let spi = Spi::<_, _, _, 8>::new(peripherals.SPI1, (spi_sdo, spi_clk)); + let mut spi = spi.init( + &mut peripherals.RESETS, + clocks.peripheral_clock.freq(), + 1_u32.MHz(), + embedded_hal::spi::MODE_1, + ); + + let mut lights: [u8; 126] = [0; 126]; + lights[124] = 0xff; + lights[125] = 0xff; + for i in 0..30 { + lights[(i + 1) * 4 + 0] = 0xe0 + 1; + lights[(i + 1) * 4 + 1] = 255; + } + + let mut brightness = 1; + let mut step = 1; + loop { + if brightness == 255 && step == 1 { + step = -1; + } else if brightness == 1 && step == -1 { + step = 1; + }; + for i in 0..30 { + lights[(i + 1) * 4 + 3] = brightness as u8; + } + brightness = brightness + step; + + spi.write(lights.as_slice()); + timer.delay_ms(10); + } + + /* + let pins = (pins.gpio0.into_function(), pins.gpio1.into_function()); + + let uart = UartPeripheral::new(peripherals.UART0, pins, &mut peripherals.RESETS) + .enable( + UartConfig::new(9600_u32.Hz(), DataBits::Eight, None, StopBits::One), + clocks.peripheral_clock.freq(), + ) + .unwrap(); + + loop { + uart.write_full_blocking(b"Hello World!\r\n"); + timer.delay_ms(1000); + } + */ +}