#![no_std]
#![no_main]
use panic_halt as _;
use rp_pico as bsp;
use bsp::entry;
use fugit::RateExtU32;
use display_interface_spi::SPIInterface;
use embedded_graphics::prelude::*;
use embedded_graphics::{image::Image, pixelcolor::Rgb565};
use tinybmp::Bmp;
use bsp::hal::{
clocks::{init_clocks_and_plls, Clock},
gpio, pac, pwm,
sio::Sio,
spi,
watchdog::Watchdog,
};
#[entry]
fn main() -> ! {
let mut pac = pac::Peripherals::take().unwrap();
let core = pac::CorePeripherals::take().unwrap();
let mut watchdog = Watchdog::new(pac.WATCHDOG);
let sio = Sio::new(pac.SIO);
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz());
let pins = bsp::Pins::new(
pac.IO_BANK0,
pac.PADS_BANK0,
sio.gpio_bank0,
&mut pac.RESETS,
);
let _spi_sclk = pins.gpio10.into_mode::<gpio::FunctionSpi>();
let _spi_mosi = pins.gpio11.into_mode::<gpio::FunctionSpi>();
let spi_cs = pins.gpio9.into_push_pull_output();
let spi = spi::Spi::<_, _, 8>::new(pac.SPI1);
let spi = spi.init(
&mut pac.RESETS,
clocks.peripheral_clock.freq(),
8_000_000u32.Hz(),
&embedded_hal::spi::MODE_0,
);
let dc_pin = pins.gpio8.into_push_pull_output();
let rst_pin = pins.gpio12.into_push_pull_output();
let spi_interface = SPIInterface::new(spi, dc_pin, spi_cs);
let pwm_slices = pwm::Slices::new(pac.PWM, &mut pac.RESETS);
let mut pwm = pwm_slices.pwm6;
pwm.set_ph_correct();
pwm.enable();
let mut channel = pwm.channel_b;
channel.output_to(pins.gpio13);
let mut display = gc9a01a::GC9A01A::new(spi_interface, rst_pin, channel);
display.reset(&mut delay).unwrap();
display.set_backlight(55000);
display.initialize(&mut delay).unwrap();
display.clear(Rgb565::BLACK).unwrap();
let Ok(bmp) = Bmp::from_slice(include_bytes!("./rust.bmp")) else {
display.clear(Rgb565::RED).unwrap();
exit()
};
let im: Image<Bmp<Rgb565>> = Image::new(&bmp, Point::new(56, 56));
im.draw(&mut display).unwrap();
exit()
}
pub fn exit() -> ! {
loop {
cortex_m::asm::bkpt();
}
}