fix spi panic on read due to i2s configuration conversion check

This commit is contained in:
Alexandros Liarokapis 2024-05-27 20:43:17 +03:00
parent f9324201b1
commit 76fbec74da

View file

@ -643,36 +643,40 @@ impl<'d> Spi<'d, Async> {
return Ok(()); return Ok(());
} }
self.info.regs.cr1().modify(|w| { let regs = self.info.regs;
regs.cr1().modify(|w| {
w.set_spe(false); w.set_spe(false);
}); });
let comm = self.info.regs.cfg2().modify(|w| { let comm = regs.cfg2().modify(|w| {
let prev = w.comm(); let prev = w.comm();
w.set_comm(vals::Comm::RECEIVER); w.set_comm(vals::Comm::RECEIVER);
prev prev
}); });
let i2scfg = self.info.regs.i2scfgr().modify(|w| { let i2scfg = regs.i2scfgr().modify(|w| {
let prev = w.i2scfg(); w.i2smod().then(|| {
w.set_i2scfg(match prev { let prev = w.i2scfg();
vals::I2scfg::SLAVERX | vals::I2scfg::SLAVEFULLDUPLEX => vals::I2scfg::SLAVERX, w.set_i2scfg(match prev {
vals::I2scfg::MASTERRX | vals::I2scfg::MASTERFULLDUPLEX => vals::I2scfg::MASTERRX, vals::I2scfg::SLAVERX | vals::I2scfg::SLAVEFULLDUPLEX => vals::I2scfg::SLAVERX,
_ => panic!("unsupported configuration"), vals::I2scfg::MASTERRX | vals::I2scfg::MASTERFULLDUPLEX => vals::I2scfg::MASTERRX,
}); _ => panic!("unsupported configuration"),
prev });
prev
})
}); });
let tsize = self.info.regs.cr2().read().tsize(); let tsize = regs.cr2().read().tsize();
let rx_src = self.info.regs.rx_ptr(); let rx_src = regs.rx_ptr();
let mut read = 0; let mut read = 0;
let mut remaining = data.len(); let mut remaining = data.len();
loop { loop {
self.set_word_size(W::CONFIG); self.set_word_size(W::CONFIG);
set_rxdmaen(self.info.regs, true); set_rxdmaen(regs, true);
let transfer_size = remaining.min(u16::max_value().into()); let transfer_size = remaining.min(u16::max_value().into());
@ -683,21 +687,21 @@ impl<'d> Spi<'d, Async> {
.read(rx_src, &mut data[read..(read + transfer_size)], Default::default()) .read(rx_src, &mut data[read..(read + transfer_size)], Default::default())
}; };
self.info.regs.cr2().modify(|w| { regs.cr2().modify(|w| {
w.set_tsize(transfer_size as u16); w.set_tsize(transfer_size as u16);
}); });
self.info.regs.cr1().modify(|w| { regs.cr1().modify(|w| {
w.set_spe(true); w.set_spe(true);
}); });
self.info.regs.cr1().modify(|w| { regs.cr1().modify(|w| {
w.set_cstart(true); w.set_cstart(true);
}); });
transfer.await; transfer.await;
finish_dma(self.info.regs); finish_dma(regs);
remaining -= transfer_size; remaining -= transfer_size;
@ -708,21 +712,23 @@ impl<'d> Spi<'d, Async> {
read += transfer_size; read += transfer_size;
} }
self.info.regs.cr1().modify(|w| { regs.cr1().modify(|w| {
w.set_spe(false); w.set_spe(false);
}); });
self.info.regs.cfg2().modify(|w| { regs.cfg2().modify(|w| {
w.set_comm(comm); w.set_comm(comm);
}); });
self.info.regs.cr2().modify(|w| { regs.cr2().modify(|w| {
w.set_tsize(tsize); w.set_tsize(tsize);
}); });
self.info.regs.i2scfgr().modify(|w| { if let Some(i2scfg) = i2scfg {
w.set_i2scfg(i2scfg); regs.i2scfgr().modify(|w| {
}); w.set_i2scfg(i2scfg);
});
}
Ok(()) Ok(())
} }