Merge #977
977: Use firmware writer in stm32{f7, h7} example app r=lulf a=lulf
The new FirmwareWriter is useful in particular for these architectures due to the large erase sector size.
Co-authored-by: Ulf Lilleengen <ulf.lilleengen@gmail.com>
			
			
This commit is contained in:
		
						commit
						7bbb4c22a1
					
				@ -5,7 +5,6 @@
 | 
				
			|||||||
#[cfg(feature = "defmt-rtt")]
 | 
					#[cfg(feature = "defmt-rtt")]
 | 
				
			||||||
use defmt_rtt::*;
 | 
					use defmt_rtt::*;
 | 
				
			||||||
use embassy_boot_stm32::{AlignedBuffer, FirmwareUpdater};
 | 
					use embassy_boot_stm32::{AlignedBuffer, FirmwareUpdater};
 | 
				
			||||||
use embassy_embedded_hal::adapter::BlockingAsync;
 | 
					 | 
				
			||||||
use embassy_executor::Spawner;
 | 
					use embassy_executor::Spawner;
 | 
				
			||||||
use embassy_stm32::exti::ExtiInput;
 | 
					use embassy_stm32::exti::ExtiInput;
 | 
				
			||||||
use embassy_stm32::flash::{Flash, WRITE_SIZE};
 | 
					use embassy_stm32::flash::{Flash, WRITE_SIZE};
 | 
				
			||||||
@ -17,8 +16,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
 | 
				
			|||||||
#[embassy_executor::main]
 | 
					#[embassy_executor::main]
 | 
				
			||||||
async fn main(_spawner: Spawner) {
 | 
					async fn main(_spawner: Spawner) {
 | 
				
			||||||
    let p = embassy_stm32::init(Default::default());
 | 
					    let p = embassy_stm32::init(Default::default());
 | 
				
			||||||
    let flash = Flash::unlock(p.FLASH);
 | 
					    let mut flash = Flash::unlock(p.FLASH);
 | 
				
			||||||
    let mut flash = BlockingAsync::new(flash);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let button = Input::new(p.PC13, Pull::Down);
 | 
					    let button = Input::new(p.PC13, Pull::Down);
 | 
				
			||||||
    let mut button = ExtiInput::new(button, p.EXTI13);
 | 
					    let mut button = ExtiInput::new(button, p.EXTI13);
 | 
				
			||||||
@ -27,16 +25,19 @@ async fn main(_spawner: Spawner) {
 | 
				
			|||||||
    led.set_high();
 | 
					    led.set_high();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut updater = FirmwareUpdater::default();
 | 
					    let mut updater = FirmwareUpdater::default();
 | 
				
			||||||
 | 
					    let mut writer = updater.prepare_update_blocking(&mut flash).unwrap();
 | 
				
			||||||
    button.wait_for_rising_edge().await;
 | 
					    button.wait_for_rising_edge().await;
 | 
				
			||||||
    let mut offset = 0;
 | 
					    let mut offset = 0;
 | 
				
			||||||
    let mut buf: [u8; 256 * 1024] = [0; 256 * 1024];
 | 
					    let mut buf = AlignedBuffer([0; 4096]);
 | 
				
			||||||
    for chunk in APP_B.chunks(256 * 1024) {
 | 
					    for chunk in APP_B.chunks(4096) {
 | 
				
			||||||
        buf[..chunk.len()].copy_from_slice(chunk);
 | 
					        buf.as_mut()[..chunk.len()].copy_from_slice(chunk);
 | 
				
			||||||
        updater.write_firmware(offset, &buf, &mut flash, 2048).await.unwrap();
 | 
					        writer
 | 
				
			||||||
 | 
					            .write_block_blocking(offset, buf.as_ref(), &mut flash, chunk.len())
 | 
				
			||||||
 | 
					            .unwrap();
 | 
				
			||||||
        offset += chunk.len();
 | 
					        offset += chunk.len();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    let mut magic = AlignedBuffer([0; WRITE_SIZE]);
 | 
					    let mut magic = AlignedBuffer([0; WRITE_SIZE]);
 | 
				
			||||||
    updater.mark_updated(&mut flash, magic.as_mut()).await.unwrap();
 | 
					    updater.mark_updated_blocking(&mut flash, magic.as_mut()).unwrap();
 | 
				
			||||||
    led.set_low();
 | 
					    led.set_low();
 | 
				
			||||||
    cortex_m::peripheral::SCB::sys_reset();
 | 
					    cortex_m::peripheral::SCB::sys_reset();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,6 @@
 | 
				
			|||||||
#[cfg(feature = "defmt-rtt")]
 | 
					#[cfg(feature = "defmt-rtt")]
 | 
				
			||||||
use defmt_rtt::*;
 | 
					use defmt_rtt::*;
 | 
				
			||||||
use embassy_boot_stm32::{AlignedBuffer, FirmwareUpdater};
 | 
					use embassy_boot_stm32::{AlignedBuffer, FirmwareUpdater};
 | 
				
			||||||
use embassy_embedded_hal::adapter::BlockingAsync;
 | 
					 | 
				
			||||||
use embassy_executor::Spawner;
 | 
					use embassy_executor::Spawner;
 | 
				
			||||||
use embassy_stm32::exti::ExtiInput;
 | 
					use embassy_stm32::exti::ExtiInput;
 | 
				
			||||||
use embassy_stm32::flash::{Flash, WRITE_SIZE};
 | 
					use embassy_stm32::flash::{Flash, WRITE_SIZE};
 | 
				
			||||||
@ -17,8 +16,7 @@ static APP_B: &[u8] = include_bytes!("../../b.bin");
 | 
				
			|||||||
#[embassy_executor::main]
 | 
					#[embassy_executor::main]
 | 
				
			||||||
async fn main(_spawner: Spawner) {
 | 
					async fn main(_spawner: Spawner) {
 | 
				
			||||||
    let p = embassy_stm32::init(Default::default());
 | 
					    let p = embassy_stm32::init(Default::default());
 | 
				
			||||||
    let flash = Flash::unlock(p.FLASH);
 | 
					    let mut flash = Flash::unlock(p.FLASH);
 | 
				
			||||||
    let mut flash = BlockingAsync::new(flash);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let button = Input::new(p.PC13, Pull::Down);
 | 
					    let button = Input::new(p.PC13, Pull::Down);
 | 
				
			||||||
    let mut button = ExtiInput::new(button, p.EXTI13);
 | 
					    let mut button = ExtiInput::new(button, p.EXTI13);
 | 
				
			||||||
@ -27,19 +25,20 @@ async fn main(_spawner: Spawner) {
 | 
				
			|||||||
    led.set_high();
 | 
					    led.set_high();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut updater = FirmwareUpdater::default();
 | 
					    let mut updater = FirmwareUpdater::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut writer = updater.prepare_update_blocking(&mut flash).unwrap();
 | 
				
			||||||
    button.wait_for_rising_edge().await;
 | 
					    button.wait_for_rising_edge().await;
 | 
				
			||||||
    let mut offset = 0;
 | 
					    let mut offset = 0;
 | 
				
			||||||
    let mut buf = AlignedBuffer([0; 128 * 1024]);
 | 
					    let mut buf = AlignedBuffer([0; 4096]);
 | 
				
			||||||
    for chunk in APP_B.chunks(128 * 1024) {
 | 
					    for chunk in APP_B.chunks(4096) {
 | 
				
			||||||
        buf.as_mut()[..chunk.len()].copy_from_slice(chunk);
 | 
					        buf.as_mut()[..chunk.len()].copy_from_slice(chunk);
 | 
				
			||||||
        updater
 | 
					        writer
 | 
				
			||||||
            .write_firmware(offset, buf.as_ref(), &mut flash, 2048)
 | 
					            .write_block_blocking(offset, buf.as_ref(), &mut flash, 4096)
 | 
				
			||||||
            .await
 | 
					 | 
				
			||||||
            .unwrap();
 | 
					            .unwrap();
 | 
				
			||||||
        offset += chunk.len();
 | 
					        offset += chunk.len();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    let mut magic = AlignedBuffer([0; WRITE_SIZE]);
 | 
					    let mut magic = AlignedBuffer([0; WRITE_SIZE]);
 | 
				
			||||||
    updater.mark_updated(&mut flash, magic.as_mut()).await.unwrap();
 | 
					    updater.mark_updated_blocking(&mut flash, magic.as_mut()).unwrap();
 | 
				
			||||||
    led.set_low();
 | 
					    led.set_low();
 | 
				
			||||||
    cortex_m::peripheral::SCB::sys_reset();
 | 
					    cortex_m::peripheral::SCB::sys_reset();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user