diff --git a/README.md b/README.md index 01f4582..f26ec08 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ probe-rs run --chip VA108xx_RAM --protocol jtag target/thumbv6m-none-eabi/debug/ to flash and run the blinky program on the RAM. There is also a `VA108xx` chip target available for persistent flashing. -Runner configuration avilable in the `.cargo/def-config.toml` file to use `probe-rs` for +Runner configuration is available in the `.cargo/def-config.toml` file to use `probe-rs` for convenience. `probe-rs` is also able to process and display `defmt` strings directly. ### Using VS Code @@ -150,11 +150,10 @@ address for the RTT block placement is 0x10000000. It is recommended to use a se 0x1000 around that base address when using the RTT viewer. The RTT viewer will not be able to process `defmt` printouts. However, you can view the defmt -logs by [installing defmt-print](https://crates.io/crates/defmt-print) first and then piping -the output on telnet port 19021 into `defmt-print`, for example by running +logs by [installing defmt-print](https://crates.io/crates/defmt-print) first and then running ```sh -telnet localhost 19021 | defmt-print -e +defmt-print -e tcp ``` The path of the ELF file which is being debugged needs to be specified for this to work. diff --git a/bootloader/Cargo.toml b/bootloader/Cargo.toml index 13ab933..68d85a5 100644 --- a/bootloader/Cargo.toml +++ b/bootloader/Cargo.toml @@ -7,9 +7,9 @@ edition = "2021" cortex-m = "0.7" cortex-m-rt = "0.7" embedded-hal = "1" -panic-rtt-target = "0.2" -panic-halt = "1" -rtt-target = "0.6" +defmt-rtt = "0.4" +defmt = "1" +panic-probe = { version = "1", features = ["defmt"] } crc = "3" num_enum = { version = "0.7", default-features = false } static_assertions = "1" @@ -17,6 +17,7 @@ static_assertions = "1" [dependencies.va108xx-hal] version = "0.11" path = "../va108xx-hal" +features = ["defmt"] [dependencies.vorago-reb1] version = "0.8" diff --git a/bootloader/src/main.rs b/bootloader/src/main.rs index b55ef6f..b4ab86f 100644 --- a/bootloader/src/main.rs +++ b/bootloader/src/main.rs @@ -6,17 +6,16 @@ use cortex_m_rt::entry; use crc::{Crc, CRC_16_IBM_3740}; use embedded_hal::delay::DelayNs; use num_enum::TryFromPrimitive; -#[cfg(not(feature = "rtt-panic"))] -use panic_halt as _; -#[cfg(feature = "rtt-panic")] -use panic_rtt_target as _; -use rtt_target::{rprintln, rtt_init_print}; +// Import panic provider. +use panic_probe as _; +// Import logger. +use defmt_rtt as _; use va108xx_hal::{pac, time::Hertz, timer::CountdownTimer}; use vorago_reb1::m95m01::M95M01; // Useful for debugging and see what the bootloader is doing. Enabled currently, because // the binary stays small enough. -const RTT_PRINTOUT: bool = true; +const DEFMT_PRINTOUT: bool = true; const DEBUG_PRINTOUTS: bool = true; // Small delay, allows RTT printout to catch up. const BOOT_DELAY_MS: u32 = 2000; @@ -74,7 +73,7 @@ pub const PREFERRED_SLOT_OFFSET: u32 = 0x20000 - 1; const CRC_ALGO: Crc = Crc::::new(&CRC_16_IBM_3740); -#[derive(Debug, Copy, Clone, PartialEq, Eq, TryFromPrimitive)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, TryFromPrimitive, defmt::Format)] #[repr(u8)] enum AppSel { A = 0, @@ -100,9 +99,8 @@ impl NvmInterface for NvmWrapper { #[entry] fn main() -> ! { - if RTT_PRINTOUT { - rtt_init_print!(); - rprintln!("-- VA108xx bootloader --"); + if DEFMT_PRINTOUT { + defmt::println!("-- VA108xx bootloader --"); } let dp = pac::Peripherals::take().unwrap(); let cp = cortex_m::Peripherals::take().unwrap(); @@ -131,21 +129,21 @@ fn main() -> ! { nvm.write(0x4, bootloader_data) .expect("writing to NVM failed"); if let Err(e) = nvm.verify(0x0, &first_four_bytes) { - if RTT_PRINTOUT { - rprintln!("verification of self-flash to NVM failed: {:?}", e); + if DEFMT_PRINTOUT { + defmt::error!("verification of self-flash to NVM failed: {:?}", e); } } if let Err(e) = nvm.verify(0x4, bootloader_data) { - if RTT_PRINTOUT { - rprintln!("verification of self-flash to NVM failed: {:?}", e); + if DEFMT_PRINTOUT { + defmt::error!("verification of self-flash to NVM failed: {:?}", e); } } nvm.write(BOOTLOADER_CRC_ADDR as usize, &bootloader_crc.to_be_bytes()) .expect("writing CRC failed"); if let Err(e) = nvm.verify(BOOTLOADER_CRC_ADDR as usize, &bootloader_crc.to_be_bytes()) { - if RTT_PRINTOUT { - rprintln!( + if DEFMT_PRINTOUT { + defmt::error!( "error: CRC verification for bootloader self-flash failed: {:?}", e ); @@ -173,8 +171,8 @@ fn main() -> ! { } else if check_app_crc(other_app) { boot_app(&dp.sysconfig, &cp, other_app, &mut timer) } else { - if DEBUG_PRINTOUTS && RTT_PRINTOUT { - rprintln!("both images corrupt! booting image A"); + if DEBUG_PRINTOUTS && DEFMT_PRINTOUT { + defmt::error!("both images corrupt! booting image A"); } // TODO: Shift a CCSDS packet out to inform host/OBC about image corruption. // Both images seem to be corrupt. Boot default image A. @@ -204,8 +202,8 @@ fn check_own_crc( }); let crc_calc = digest.finalize(); if crc_exp == 0x0000 || crc_exp == 0xffff { - if DEBUG_PRINTOUTS && RTT_PRINTOUT { - rprintln!("BL CRC blank - prog new CRC"); + if DEBUG_PRINTOUTS && DEFMT_PRINTOUT { + defmt::info!("BL CRC blank - prog new CRC"); } // Blank CRC, write it to NVM. nvm.write(BOOTLOADER_CRC_ADDR as usize, &crc_calc.to_be_bytes()) @@ -215,8 +213,8 @@ fn check_own_crc( // cortex_m::peripheral::SCB::sys_reset(); } else if crc_exp != crc_calc { // Bootloader is corrupted. Try to run App A. - if DEBUG_PRINTOUTS && RTT_PRINTOUT { - rprintln!( + if DEBUG_PRINTOUTS && DEFMT_PRINTOUT { + defmt::warn!( "bootloader CRC corrupt, read {} and expected {}. booting image A immediately", crc_calc, crc_exp @@ -241,8 +239,8 @@ fn read_four_bytes_at_addr_zero(buf: &mut [u8; 4]) { } } fn check_app_crc(app_sel: AppSel) -> bool { - if DEBUG_PRINTOUTS && RTT_PRINTOUT { - rprintln!("Checking image {:?}", app_sel); + if DEBUG_PRINTOUTS && DEFMT_PRINTOUT { + defmt::info!("Checking image {:?}", app_sel); } if app_sel == AppSel::A { check_app_given_addr(APP_A_CRC_ADDR, APP_A_START_ADDR, APP_A_SIZE_ADDR) @@ -256,8 +254,8 @@ fn check_app_given_addr(crc_addr: u32, start_addr: u32, image_size_addr: u32) -> let image_size = unsafe { (image_size_addr as *const u32).read_unaligned().to_be() }; // Sanity check. if image_size > APP_A_END_ADDR - APP_A_START_ADDR - 8 { - if RTT_PRINTOUT { - rprintln!("detected invalid app size {}", image_size); + if DEFMT_PRINTOUT { + defmt::error!("detected invalid app size {}", image_size); } return false; } @@ -278,8 +276,8 @@ fn boot_app( app_sel: AppSel, timer: &mut CountdownTimer, ) -> ! { - if DEBUG_PRINTOUTS && RTT_PRINTOUT { - rprintln!("booting app {:?}", app_sel); + if DEBUG_PRINTOUTS && DEFMT_PRINTOUT { + defmt::info!("booting app {:?}", app_sel); } timer.delay_ms(BOOT_DELAY_MS);