Triggering the dfu bootloader works
This commit is contained in:
parent
ceb4dc035f
commit
524ed8f2c6
7 changed files with 131 additions and 25 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue