rp/uart: make dma multicore-safe

running rx and tx on different cores could lead to hangs if the dmacr
register modifys run concurrently. this is bad.
This commit is contained in:
pennae 2023-04-30 09:30:10 +02:00
parent 861f49cfd4
commit be66e0f7ce

View File

@ -206,7 +206,7 @@ impl<'d, T: Instance> UartTx<'d, T, Async> {
pub async fn write(&mut self, buffer: &[u8]) -> Result<(), Error> {
let ch = self.tx_dma.as_mut().unwrap();
let transfer = unsafe {
T::regs().uartdmacr().modify(|reg| {
T::regs().uartdmacr().write_set(|reg| {
reg.set_txdmae(true);
});
// If we don't assign future to a variable, the data register pointer
@ -296,7 +296,7 @@ impl<'d, T: Instance> UartRx<'d, T, Async> {
pub async fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
let ch = self.rx_dma.as_mut().unwrap();
let transfer = unsafe {
T::regs().uartdmacr().modify(|reg| {
T::regs().uartdmacr().write_set(|reg| {
reg.set_rxdmae(true);
});
// If we don't assign future to a variable, the data register pointer