#![allow(dead_code)]
use core::fmt::Write;
use core::ptr::{addr_of, addr_of_mut};
use embedded_sdmmc::{Mode, TimeSource, Timestamp, VolumeIdx, VolumeManager};
use rpi_hal::halt;
use rpi_hal::mini_uart::MiniUart;
use rpi_hal::pac;
use rpi_hal::sd::{Sd, SdCard, SdCardError};
use rpi_hal::timer::Timer;
pub const BT_DIR: &str = "BT";
pub const FIRMWARE_FILE: &str = "BT.HCD";
pub const HCI_BAUD: u32 = 3_000_000;
static mut HCD_BUF: [u8; 64 * 1024] = [0; 64 * 1024];
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
let peripherals = unsafe { pac::Peripherals::steal() };
let mut uart = MiniUart::init(&peripherals.GPIO, &peripherals.AUX, peripherals.UART1);
let _ = writeln!(uart, "PANIC: {info}");
halt();
}
pub struct FixedTime;
impl TimeSource for FixedTime {
fn get_timestamp(&self) -> Timestamp {
Timestamp {
year_since_1970: 56,
zero_indexed_month: 0,
zero_indexed_day: 0,
hours: 0,
minutes: 0,
seconds: 0,
}
}
}
pub fn firmware_from_sd(
sd: Sd,
timer: &Timer,
) -> Result<&'static [u8], embedded_sdmmc::Error<SdCardError>> {
let volume_mgr = VolumeManager::new(SdCard::new(sd, timer), FixedTime);
let volume = volume_mgr.open_volume(VolumeIdx(0))?;
let root = volume.open_root_dir()?;
let bt = root.open_dir(BT_DIR)?;
let file = bt.open_file_in_dir(FIRMWARE_FILE, Mode::ReadOnly)?;
let buf = unsafe { &mut *addr_of_mut!(HCD_BUF) };
let mut total = 0;
while !file.is_eof() && total < buf.len() {
let n = file.read(&mut buf[total..])?;
if n == 0 {
break;
}
total += n;
}
Ok(&unsafe { &*addr_of!(HCD_BUF) }[..total])
}
pub fn write_address(console: &mut MiniUart, address: &[u8; 6]) {
for (i, byte) in address.iter().rev().enumerate() {
if i != 0 {
let _ = write!(console, ":");
}
let _ = write!(console, "{byte:02X}");
}
}