fix spi panic on read due to i2s configuration conversion check
This commit is contained in:
parent
f9324201b1
commit
76fbec74da
1 changed files with 29 additions and 23 deletions
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue