Triggering the dfu bootloader works

This commit is contained in:
Sebastian 2024-10-03 22:54:05 +02:00
parent ceb4dc035f
commit 524ed8f2c6
7 changed files with 131 additions and 25 deletions

View file

@ -1,5 +1,5 @@
use core::mem::MaybeUninit;
use core::ptr::addr_of_mut;
use stm32f4xx_hal::pac;
fn jump_to_bootloader() {
@ -23,19 +23,25 @@ fn jump_to_bootloader() {
const BOOTLOADER_REQUESTED: u32 = 0xdecafbad;
#[link_section = ".uninit.DFU_FLAG"]
static mut DFU_FLAG: MaybeUninit<u32> = MaybeUninit::uninit();
fn magic_mut_ptr() -> *mut u32 {
extern "C" {
#[link_name = "_dfu_magic"]
static mut magic: u32;
}
unsafe { addr_of_mut!(magic) }
}
fn get_bootloader_flag() -> u32 {
unsafe { DFU_FLAG.assume_init() }
unsafe { magic_mut_ptr().read_volatile() }
}
fn set_bootloader_flag() {
unsafe { DFU_FLAG.write(BOOTLOADER_REQUESTED) };
unsafe { magic_mut_ptr().write_volatile(BOOTLOADER_REQUESTED) };
}
fn clear_bootloader_flag() {
unsafe { DFU_FLAG.write(0) };
unsafe { magic_mut_ptr().write_volatile(BOOTLOADER_REQUESTED) };
}
pub fn init() {

View file

@ -27,6 +27,8 @@ mod app {
use heapless::{String, Vec};
use num_traits::{Float, FloatConst};
use postcard::{from_bytes_cobs, to_vec_cobs};
use radomctl_protocol::*;
use rtic_monotonics::systick::prelude::*;
use stm32f4xx_hal::{
gpio::{gpioa, gpiob, gpioc, Output, PushPull},
i2c,
@ -39,7 +41,6 @@ mod app {
use usb_device::prelude::*;
use usb_device::{class_prelude::UsbBusAllocator, device};
use usbd_serial::SerialPort;
use xca9548a::{SlaveAddr, Xca9548a};
use qmc5883l::{self, QMC5883L};
@ -131,22 +132,11 @@ mod app {
let usb_serial = usbd_serial::SerialPort::new(unsafe { USB_BUS.as_ref().unwrap() });
let serial = unsafe {
let u_id0 = 0x1FFF_7A10 as *const u32;
let u_id2 = 0x1FFF_7A18 as *const u32;
defmt::debug!("UID0: {:x}", u_id0.read());
defmt::debug!("UID2: {:x}", u_id2.read());
// See https://community.st.com/t5/stm32-mcus-products/usb-bootloader-serial-number/td-p/432148
(u_id0.read() as u64 + u_id2.read() as u64) << 16
| (u_id2.read() as u64 & 0xFF00) >> 8
| (u_id2.read() as u64 & 0x00FF) << 8
};
let uid = signature::Uid::get();
static mut SERIAL: String<16> = String::new();
unsafe {
write!(SERIAL, "{:X}", serial).unwrap();
write!(SERIAL, "{}{:x}{:x}", uid.lot_num(), uid.x(), uid.y()).unwrap();
}
let usb_dev = unsafe {
@ -177,7 +167,7 @@ mod app {
defmt::info!("I2C Setup done");
let mut i2cmux = Xca9548a::new(i2c, SlaveAddr::default());
i2cmux.select_channels(0b0000_0001).unwrap();
//i2cmux.select_channels(0b0000_0001).unwrap();
defmt::info!("I2C MUX Setup done");