sam4l/
usart.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Implementation of the SAM4L USART peripheral.
6//!
7//! Supports UART and SPI master modes.
8
9use core::cell::Cell;
10use core::cmp;
11use core::sync::atomic::{AtomicBool, Ordering};
12use kernel::deferred_call::{DeferredCall, DeferredCallClient};
13use kernel::hil::spi;
14use kernel::hil::spi::cs::ChipSelectPolar;
15use kernel::hil::uart;
16use kernel::utilities::cells::OptionalCell;
17use kernel::utilities::leasable_buffer::SubSliceMut;
18use kernel::utilities::registers::interfaces::{ReadWriteable, Readable, Writeable};
19use kernel::utilities::registers::{register_bitfields, ReadOnly, ReadWrite, WriteOnly};
20use kernel::utilities::StaticRef;
21use kernel::ErrorCode;
22
23use crate::dma;
24use crate::pm;
25
26// Register map for SAM4L USART
27#[repr(C)]
28struct UsartRegisters {
29    cr: WriteOnly<u32, Control::Register>,       // 0x00
30    mr: ReadWrite<u32, Mode::Register>,          // 0x04
31    ier: WriteOnly<u32, Interrupt::Register>,    // 0x08
32    idr: WriteOnly<u32, Interrupt::Register>,    // 0x0C
33    imr: ReadOnly<u32, Interrupt::Register>,     // 0x10
34    csr: ReadOnly<u32, ChannelStatus::Register>, // 0x14
35    rhr: ReadOnly<u32, ReceiverHold::Register>,  // 0x18
36    thr: WriteOnly<u32, TransmitHold::Register>, // 0x1C
37    brgr: ReadWrite<u32, BaudRate::Register>,    // 0x20
38    rtor: ReadWrite<u32, RxTimeout::Register>,   // 0x24
39    ttgr: ReadWrite<u32, TxTimeGuard::Register>, // 0x28
40    _reserved0: [ReadOnly<u32>; 5],
41    fidi: ReadWrite<u32, FidiRatio::Register>, // 0x40
42    ner: ReadOnly<u32, NumErrors::Register>,   // 0x44
43    _reserved1: ReadOnly<u32>,
44    ifr: ReadWrite<u32, IrdaFilter::Register>, // 0x4C
45    man: ReadWrite<u32, Manchester::Register>, // 0x50
46    linmr: ReadWrite<u32, LinMode::Register>,  // 0x54
47    linir: ReadWrite<u32, LinID::Register>,    // 0x58
48    linbr: ReadOnly<u32, LinBaud::Register>,   // 0x5C
49    _reserved2: [ReadOnly<u32>; 33],
50    wpmr: ReadWrite<u32, ProtectMode::Register>,  // 0xE4
51    wpsr: ReadOnly<u32, ProtectStatus::Register>, // 0xE8
52    _reserved3: [ReadOnly<u32>; 4],
53    version: ReadOnly<u32, Version::Register>, // 0xFC
54}
55
56register_bitfields![u32,
57    Control [
58        LINWKUP 21,
59        LINABT  20,
60        RTSDIS  19,
61        RTSEN   18,
62        DTRDIS  17,
63        DTREN   16,
64        RETTO   15,
65        RSTNACK 14,
66        RSTIT   13,
67        SENDA   12,
68        STTTO   11,
69        STPBRK  10,
70        STTBRK   9,
71        RSTSTA   8,
72        TXDIS    7,
73        TXEN     6,
74        RXDIS    5,
75        RXEN     4,
76        RSTTX    3,
77        RSTRX    2
78    ],
79    Mode [
80        ONEBIT        OFFSET(31)  NUMBITS(1) [],
81        MODSYNC       OFFSET(30)  NUMBITS(1) [],
82        MAN           OFFSET(29)  NUMBITS(1) [],
83        FILTER        OFFSET(28)  NUMBITS(1) [],
84        MAX_ITERATION OFFSET(24)  NUMBITS(3) [],
85        INVDATA       OFFSET(23)  NUMBITS(1) [],
86        VAR_SYNC      OFFSET(22)  NUMBITS(1) [],
87        DSNACK        OFFSET(21)  NUMBITS(1) [],
88        INACK         OFFSET(20)  NUMBITS(1) [],
89        OVER          OFFSET(19)  NUMBITS(1) [],
90        CLKO          OFFSET(18)  NUMBITS(1) [],
91        MODE9         OFFSET(17)  NUMBITS(1) [],
92        MSBF          OFFSET(16)  NUMBITS(1) [],
93        CHMODE        OFFSET(14)  NUMBITS(2) [
94            NORMAL    = 0b00,
95            ECHO      = 0b01,
96            LOOPBACK  = 0xb10,
97            RLOOPBACK = 0b11
98        ],
99        NBSTOP        OFFSET(12)  NUMBITS(2) [
100            BITS_1_1  = 0b00,
101            BITS_15_R = 0b01,
102            BITS_2_2  = 0b10,
103            BITS_R_R  = 0b11
104        ],
105        PAR           OFFSET(9)   NUMBITS(3) [
106            EVEN    = 0b000,
107            ODD     = 0b001,
108            SPACE   = 0b010,
109            MARK    = 0b011,
110            NONE    = 0b100,
111            MULTID  = 0b110
112        ],
113        SYNC          OFFSET(8)   NUMBITS(1) [],
114        CHRL          OFFSET(6)   NUMBITS(2) [
115            BITS5  = 0b00,
116            BITS6  = 0b01,
117            BITS7  = 0b10,
118            BITS8  = 0b11
119        ],
120        USCLKS        OFFSET(4)   NUMBITS(2) [
121            CLK_USART     = 0b00,
122            CLK_USART_DIV = 0b01,
123            RES           = 0b10,
124            CLK           = 0b11
125        ],
126        MODE          OFFSET(0)   NUMBITS(4) [
127            NORMAL        = 0b0000,
128            RS485         = 0b0001,
129            HARD_HAND     = 0b0010,
130            MODEM         = 0b0011,
131            ISO7816_T0    = 0b0100,
132            ISO7816_T1    = 0b0110,
133            IRDA          = 0b1000,
134            LIN_MASTER    = 0b1010,
135            LIN_SLAVE     = 0b1011,
136            SPI_MASTER    = 0b1110,
137            SPI_SLAVE     = 0b1111
138        ]
139    ],
140    Interrupt [
141        LINHTE  31,
142        LINSTE  30,
143        LINSNRE 29,
144        LINCE   28,
145        LINIPE  27,
146        LINISFE 26,
147        LINBE   25,
148        MANEA   24,
149        MANE    20,
150        CTSIC   19,
151        DCDIC   18,
152        DSRIC   17,
153        RIIC    16,
154        LINTC   15,
155        LINID   14,
156        NACK    13,
157        RXBUFF  12,
158        ITER    10,
159        TXEMPTY  9,
160        TIMEOUT  8,
161        PARE     7,
162        FRAME    6,
163        OVRE     5,
164        RXBRK    2,
165        TXRDY    1,
166        RXRDY    0
167    ],
168    ChannelStatus [
169        LINHTE  31,
170        LINSTE  30,
171        LINSNRE 29,
172        LINCE   28,
173        LINIPE  27,
174        LINISFE 26,
175        LINBE   25,
176        MANERR  24,
177        CTS     23,
178        DCD     22,
179        DSR     21,
180        RI      20,
181        CTSIC   19,
182        DCDIC   18,
183        DSRIC   17,
184        RIIC    16,
185        LINTC   15,
186        LINID   14,
187        NACK    13,
188        RXBUFF  12,
189        ITER    10,
190        TXEMPTY  9,
191        TIMEOUT  8,
192        PARE     7,
193        FRAME    6,
194        OVRE     5,
195        RXBRK    2,
196        TXRDY    1,
197        RXRDY    0
198    ],
199    ReceiverHold [
200        RXSYNH   OFFSET(15)  NUMBITS(1) [],
201        RXCHR    OFFSET(0)   NUMBITS(9) []
202    ],
203    TransmitHold [
204        TXSYNH   OFFSET(15)  NUMBITS(1) [],
205        TXCHR    OFFSET(0)   NUMBITS(9) []
206    ],
207    BaudRate [
208        FP       OFFSET(16)  NUMBITS(3)  [],
209        CD       OFFSET(0)   NUMBITS(16) []
210    ],
211    RxTimeout [
212        TO       OFFSET(0)  NUMBITS(17)  []
213    ],
214    TxTimeGuard [
215        TG       OFFSET(0)  NUMBITS(8)   []
216    ],
217    FidiRatio [
218        RATIO    OFFSET(0)  NUMBITS(11)  []
219    ],
220    NumErrors [
221        NB_ERRORS  OFFSET(0)  NUMBITS(8)  []
222    ],
223    IrdaFilter [
224        FILTER     OFFSET(0)  NUMBITS(8)  []
225    ],
226    Manchester [
227        DRIFT      OFFSET(30) NUMBITS(1)  [],
228        RX_MPOL    OFFSET(28) NUMBITS(1)  [],
229        RX_PP      OFFSET(24) NUMBITS(2)  [
230            ALL_ONE = 0b00,
231            ALL_ZERO = 0b01,
232            ZERO_ONE = 0b10,
233            ONE_ZERO = 0b11
234        ],
235        RX_PL      OFFSET(16) NUMBITS(4)  [],
236        TX_MPOL    OFFSET(12) NUMBITS(1)  [],
237        TX_PP      OFFSET(8)  NUMBITS(2)  [
238            ALL_ONE = 0b00,
239            ALL_ZERO = 0b01,
240            ZERO_ONE = 0b10,
241            ONE_ZERO = 0b11
242        ],
243        TX_PL      OFFSET(0)  NUMBITS(4)  []
244    ],
245    LinMode [
246        SYNCDIS   OFFSET(17)  NUMBITS(1) [],
247        PDCM      OFFSET(16)  NUMBITS(1) [],
248        DLC       OFFSET(8)   NUMBITS(8) [],
249        WKUPTYP   OFFSET(7)   NUMBITS(1) [],
250        FSDIS     OFFSET(6)   NUMBITS(1) [],
251        DLM       OFFSET(5)   NUMBITS(1) [],
252        CHKTYP    OFFSET(4)   NUMBITS(1) [],
253        CHKDIS    OFFSET(3)   NUMBITS(1) [],
254        PARDIS    OFFSET(2)   NUMBITS(1) [],
255        NACT      OFFSET(0)   NUMBITS(2) [
256            PUBLISH    = 0b00,
257            SUBSCRIBE  = 0b01,
258            IGNORE     = 0b10,
259            RESERVED   = 0b11
260        ]
261    ],
262    LinID [
263        IDCHR   OFFSET(0)  NUMBITS(8) []
264    ],
265    LinBaud [
266        LINFP   OFFSET(16) NUMBITS(3)  [],
267        LINCD   OFFSET(0)  NUMBITS(16) []
268    ],
269    ProtectMode [
270        WPKEY   OFFSET(8)  NUMBITS(24) [],
271        WPEN    OFFSET(0)  NUMBITS(1)  []
272    ],
273    ProtectStatus [
274        WPVSRC  OFFSET(8)  NUMBITS(16) [],
275        WPVS    OFFSET(0)  NUMBITS(1)  []
276    ],
277    Version [
278        MFN     OFFSET(16)  NUMBITS(3)  [],
279        VERSION OFFSET(0)   NUMBITS(11) []
280    ]
281];
282
283const USART_BASE_ADDRS: [StaticRef<UsartRegisters>; 4] = unsafe {
284    [
285        StaticRef::new(0x40024000 as *const UsartRegisters),
286        StaticRef::new(0x40028000 as *const UsartRegisters),
287        StaticRef::new(0x4002C000 as *const UsartRegisters),
288        StaticRef::new(0x40030000 as *const UsartRegisters),
289    ]
290};
291
292pub struct USARTRegManager<'a> {
293    registers: &'a UsartRegisters,
294    clock: pm::Clock,
295    rx_dma: Option<&'a dma::DMAChannel>,
296    tx_dma: Option<&'a dma::DMAChannel>,
297}
298
299static IS_PANICING: AtomicBool = AtomicBool::new(false);
300
301impl<'a> USARTRegManager<'a> {
302    fn real_new(usart: &'a USART) -> USARTRegManager<'a> {
303        if !pm::is_clock_enabled(usart.clock) {
304            pm::enable_clock(usart.clock);
305        }
306        let regs: &UsartRegisters = &usart.registers;
307        USARTRegManager {
308            registers: regs,
309            clock: usart.clock,
310            rx_dma: usart.rx_dma.get(),
311            tx_dma: usart.tx_dma.get(),
312        }
313    }
314
315    fn new(usart: &'a USART) -> USARTRegManager<'a> {
316        USARTRegManager::real_new(usart)
317    }
318
319    pub fn panic_new(usart: &'a USART) -> USARTRegManager<'a> {
320        IS_PANICING.store(true, Ordering::Relaxed);
321        USARTRegManager::real_new(usart)
322    }
323}
324
325impl Drop for USARTRegManager<'_> {
326    fn drop(&mut self) {
327        // Anything listening for RX or TX interrupts?
328        let ints_active = self.registers.imr.any_matching_bits_set(
329            Interrupt::RXBUFF::SET
330                + Interrupt::TXEMPTY::SET
331                + Interrupt::TIMEOUT::SET
332                + Interrupt::PARE::SET
333                + Interrupt::FRAME::SET
334                + Interrupt::OVRE::SET
335                + Interrupt::TXRDY::SET
336                + Interrupt::RXRDY::SET,
337        );
338
339        let rx_active = self.rx_dma.is_some_and(|rx_dma| rx_dma.is_enabled());
340        let tx_active = self.tx_dma.is_some_and(|tx_dma| tx_dma.is_enabled());
341
342        // Special-case panic here as panic does not actually use the
343        // USART driver code in this file, rather it writes the registers
344        // directly and we can't safely reason about what the custom panic
345        // USART driver is doing / expects.
346        let is_panic = IS_PANICING.load(Ordering::Relaxed);
347        if !(rx_active || tx_active || ints_active || is_panic) {
348            pm::disable_clock(self.clock);
349        }
350    }
351}
352
353#[derive(Copy, Clone, PartialEq)]
354#[allow(non_camel_case_types)]
355pub enum USARTStateRX {
356    Idle,
357    DMA_Receiving,
358}
359
360#[derive(Copy, Clone, PartialEq)]
361#[allow(non_camel_case_types)]
362pub enum USARTStateTX {
363    Idle,
364    DMA_Transmitting,
365    Transfer_Completing, // DMA finished, but not all bytes sent
366}
367
368#[derive(Copy, Clone, PartialEq)]
369pub enum UsartMode {
370    Uart,
371    Spi,
372    Unused,
373}
374
375#[derive(Copy, Clone)]
376enum UsartClient<'a> {
377    Uart(
378        Option<&'a dyn uart::ReceiveClient>,
379        Option<&'a dyn uart::TransmitClient>,
380    ),
381    SpiMaster(&'a dyn spi::SpiMasterClient),
382}
383
384// State that needs to be stored for deferred calls
385struct DeferredCallState {
386    abort_rx_buf: Option<&'static mut [u8]>,
387    abort_rx_len: usize,
388    abort_rx_rcode: Result<(), ErrorCode>,
389    abort_rx_error: uart::Error,
390}
391
392pub struct USART<'a> {
393    registers: StaticRef<UsartRegisters>,
394    clock: pm::Clock,
395
396    usart_mode: Cell<UsartMode>,
397
398    usart_tx_state: Cell<USARTStateTX>,
399    usart_rx_state: Cell<USARTStateRX>,
400
401    rx_dma: Cell<Option<&'a dma::DMAChannel>>,
402    rx_dma_peripheral: dma::DMAPeripheral,
403    rx_len: Cell<usize>,
404    tx_dma: Cell<Option<&'a dma::DMAChannel>>,
405    tx_dma_peripheral: dma::DMAPeripheral,
406    tx_len: Cell<usize>,
407
408    client: OptionalCell<UsartClient<'a>>,
409
410    spi_chip_select: OptionalCell<ChipSelectPolar<'a, crate::gpio::GPIOPin<'a>>>,
411    pm: &'a pm::PowerManager,
412    dc_state: OptionalCell<DeferredCallState>,
413    deferred_call: DeferredCall,
414}
415
416impl<'a> USART<'a> {
417    fn new(
418        base_addr: StaticRef<UsartRegisters>,
419        clock: pm::PBAClock,
420        rx_dma_peripheral: dma::DMAPeripheral,
421        tx_dma_peripheral: dma::DMAPeripheral,
422        pm: &'a pm::PowerManager,
423    ) -> Self {
424        Self {
425            registers: base_addr,
426            clock: pm::Clock::PBA(clock),
427
428            usart_mode: Cell::new(UsartMode::Unused),
429
430            usart_rx_state: Cell::new(USARTStateRX::Idle),
431            usart_tx_state: Cell::new(USARTStateTX::Idle),
432
433            // these get defined later by `chip.rs`
434            rx_dma: Cell::new(None),
435            rx_dma_peripheral,
436            rx_len: Cell::new(0),
437            tx_dma: Cell::new(None),
438            tx_dma_peripheral,
439            tx_len: Cell::new(0),
440
441            // this gets defined later by `main.rs`
442            client: OptionalCell::empty(),
443
444            // This is only used if the USART is in SPI mode.
445            spi_chip_select: OptionalCell::empty(),
446            pm,
447            dc_state: OptionalCell::empty(),
448            deferred_call: DeferredCall::new(),
449        }
450    }
451
452    pub fn new_usart0(pm: &'a pm::PowerManager) -> Self {
453        USART::new(
454            USART_BASE_ADDRS[0],
455            pm::PBAClock::USART0,
456            dma::DMAPeripheral::USART0_RX,
457            dma::DMAPeripheral::USART0_TX,
458            pm,
459        )
460    }
461
462    pub fn new_usart1(pm: &'a pm::PowerManager) -> Self {
463        USART::new(
464            USART_BASE_ADDRS[1],
465            pm::PBAClock::USART1,
466            dma::DMAPeripheral::USART1_RX,
467            dma::DMAPeripheral::USART1_TX,
468            pm,
469        )
470    }
471
472    pub fn new_usart2(pm: &'a pm::PowerManager) -> Self {
473        USART::new(
474            USART_BASE_ADDRS[2],
475            pm::PBAClock::USART2,
476            dma::DMAPeripheral::USART2_RX,
477            dma::DMAPeripheral::USART2_TX,
478            pm,
479        )
480    }
481
482    pub fn new_usart3(pm: &'a pm::PowerManager) -> Self {
483        USART::new(
484            USART_BASE_ADDRS[3],
485            pm::PBAClock::USART3,
486            dma::DMAPeripheral::USART3_RX,
487            dma::DMAPeripheral::USART3_TX,
488            pm,
489        )
490    }
491
492    pub fn set_dma(&self, rx_dma: &'a dma::DMAChannel, tx_dma: &'a dma::DMAChannel) {
493        self.rx_dma.set(Some(rx_dma));
494        self.tx_dma.set(Some(tx_dma));
495    }
496
497    pub fn set_mode(&self, mode: UsartMode) {
498        if self.usart_mode.get() != UsartMode::Unused {
499            // n.b. This may actually "just work", particularly if we reset the
500            // whole peripheral here. But we really should check other
501            // conditions, such as whether there's an outstanding transaction
502            // in progress (will a USART reset cancel the DMA? will we get an
503            // unexpected interrupt?), before letting this happen.
504            unimplemented!("Dynamically changing USART mode");
505        }
506
507        self.usart_mode.set(mode);
508
509        let usart = &USARTRegManager::new(self);
510
511        // disable interrupts
512        self.disable_interrupts(usart);
513
514        // stop any TX and RX and clear status
515        self.reset(usart);
516    }
517
518    fn enable_rx(&self, usart: &USARTRegManager) {
519        usart.registers.cr.write(Control::RXEN::SET);
520    }
521
522    pub fn enable_tx(&self, usart: &USARTRegManager) {
523        usart.registers.cr.write(Control::TXEN::SET);
524    }
525
526    fn disable_rx(&self, usart: &USARTRegManager) {
527        usart.registers.cr.write(Control::RXDIS::SET);
528        self.usart_rx_state.set(USARTStateRX::Idle);
529    }
530
531    fn disable_tx(&self, usart: &USARTRegManager) {
532        usart.registers.cr.write(Control::TXDIS::SET);
533        self.usart_tx_state.set(USARTStateTX::Idle);
534    }
535
536    fn abort_rx(&self, usart: &USARTRegManager, rcode: Result<(), ErrorCode>, error: uart::Error) {
537        if self.usart_rx_state.get() == USARTStateRX::DMA_Receiving {
538            self.disable_rx_interrupts(usart);
539            self.disable_rx(usart);
540            self.usart_rx_state.set(USARTStateRX::Idle);
541
542            // get buffer
543            let mut length = 0;
544            let mut buffer = self.rx_dma.get().and_then(|rx_dma| {
545                length = self.rx_len.get() - rx_dma.transfer_counter();
546                let buf = rx_dma.abort_transfer();
547                rx_dma.disable();
548                buf
549            });
550            self.rx_len.set(0);
551            // Save state for deferred call
552            let dc_state = DeferredCallState {
553                abort_rx_buf: buffer.take(),
554                abort_rx_len: length,
555                abort_rx_rcode: rcode,
556                abort_rx_error: error,
557            };
558            self.dc_state.set(dc_state);
559
560            // schedule a deferred call to alert the client of this particular UART
561            self.deferred_call.set();
562        }
563    }
564
565    fn abort_tx(&self, usart: &USARTRegManager, rcode: Result<(), ErrorCode>) {
566        if self.usart_tx_state.get() == USARTStateTX::DMA_Transmitting {
567            self.disable_tx_interrupts(usart);
568            self.disable_tx(usart);
569            self.usart_tx_state.set(USARTStateTX::Idle);
570
571            // get buffer
572            let mut length = 0;
573            let mut buffer = self.tx_dma.get().and_then(|tx_dma| {
574                length = self.tx_len.get() - tx_dma.transfer_counter();
575                let buf = tx_dma.abort_transfer();
576                tx_dma.disable();
577                buf
578            });
579            self.tx_len.set(0);
580
581            // alert client
582            self.client.map(|usartclient| {
583                if let UsartClient::Uart(_rx, Some(tx)) = usartclient {
584                    buffer
585                        .take()
586                        .map(|buf| tx.transmitted_buffer(buf, length, rcode));
587                }
588            });
589        }
590    }
591
592    fn enable_tx_empty_interrupt(&self, usart: &USARTRegManager) {
593        usart.registers.ier.write(Interrupt::TXEMPTY::SET);
594    }
595
596    fn disable_tx_empty_interrupt(&self, usart: &USARTRegManager) {
597        usart.registers.idr.write(Interrupt::TXEMPTY::SET);
598    }
599
600    fn enable_rx_error_interrupts(&self, usart: &USARTRegManager) {
601        usart
602            .registers
603            .ier
604            .write(Interrupt::PARE::SET + Interrupt::FRAME::SET + Interrupt::OVRE::SET);
605    }
606
607    fn disable_rx_interrupts(&self, usart: &USARTRegManager) {
608        usart.registers.idr.write(
609            Interrupt::RXBUFF::SET
610                + Interrupt::TIMEOUT::SET
611                + Interrupt::PARE::SET
612                + Interrupt::FRAME::SET
613                + Interrupt::OVRE::SET
614                + Interrupt::RXRDY::SET,
615        );
616    }
617
618    fn disable_tx_interrupts(&self, usart: &USARTRegManager) {
619        usart
620            .registers
621            .idr
622            .write(Interrupt::TXEMPTY::SET + Interrupt::TXRDY::SET);
623    }
624
625    fn disable_interrupts(&self, usart: &USARTRegManager) {
626        self.disable_rx_interrupts(usart);
627        self.disable_tx_interrupts(usart);
628    }
629
630    fn reset(&self, usart: &USARTRegManager) {
631        usart
632            .registers
633            .cr
634            .write(Control::RSTSTA::SET + Control::RSTTX::SET + Control::RSTRX::SET);
635
636        self.abort_rx(usart, Err(ErrorCode::FAIL), uart::Error::ResetError);
637        self.abort_tx(usart, Err(ErrorCode::FAIL));
638    }
639
640    pub fn handle_interrupt(&self) {
641        let usart = &USARTRegManager::new(self);
642
643        let status = usart.registers.csr.extract();
644        let mask = usart.registers.imr.extract();
645
646        if status.is_set(ChannelStatus::TIMEOUT) && mask.is_set(Interrupt::TIMEOUT) {
647            self.disable_rx_timeout(usart);
648            self.abort_rx(usart, Ok(()), uart::Error::Aborted);
649        } else if status.is_set(ChannelStatus::TXEMPTY) && mask.is_set(Interrupt::TXEMPTY) {
650            self.disable_tx_empty_interrupt(usart);
651            self.disable_tx(usart);
652            self.usart_tx_state.set(USARTStateTX::Idle);
653
654            // Now that we know the TX transaction is finished we can get the
655            // buffer back from DMA and pass it back to the client. If we don't
656            // wait until we are completely finished, then the
657            // `transmit_complete` callback is in a "bad" part of the USART
658            // state machine, and clients cannot issue other USART calls from
659            // the callback.
660            let txbuffer = self.tx_dma.get().map_or(None, |tx_dma| {
661                let buf = tx_dma.abort_transfer();
662                tx_dma.disable();
663                buf
664            });
665
666            // alert client
667            self.client.map(|usartclient| {
668                match usartclient {
669                    UsartClient::Uart(_rx, tx) => {
670                        if txbuffer.is_some() {
671                            let len = self.tx_len.get();
672                            self.tx_len.set(0);
673                            tx.map(|client| {
674                                client.transmitted_buffer(txbuffer.unwrap(), len, Ok(()))
675                            });
676                        }
677                    }
678                    UsartClient::SpiMaster(client) => {
679                        // For the SPI case it is a little more complicated.
680
681                        // First, it is now a valid time to de-assert the CS
682                        // line because we know the write and/or read is done.
683                        self.spi_chip_select.map_or_else(
684                            || {
685                                // Do "else" case first. Thanks, rust.
686                                self.rts_disable_spi_deassert_cs(usart);
687                            },
688                            |cs| {
689                                cs.deactivate();
690                            },
691                        );
692
693                        // Get the RX buffer, and it is ok if we didn't use one,
694                        // we can just return None.
695                        let rxbuf = self.rx_dma.get().map_or(None, |dma| {
696                            let buf = dma.abort_transfer();
697                            dma.disable();
698                            buf
699                        });
700
701                        // And now it is safe to notify the client because TX is
702                        // in its Idle state rather than its transfer completing
703                        // state.
704                        let len = self.tx_len.get();
705                        self.tx_len.set(0);
706                        client.read_write_done(
707                            txbuffer.unwrap().into(),
708                            rxbuf.map(|b| b.into()),
709                            Ok(len),
710                        );
711                    }
712                }
713            });
714        } else if status.is_set(ChannelStatus::PARE) {
715            self.abort_rx(usart, Err(ErrorCode::FAIL), uart::Error::ParityError);
716        } else if status.is_set(ChannelStatus::FRAME) {
717            self.abort_rx(usart, Err(ErrorCode::FAIL), uart::Error::FramingError);
718        } else if status.is_set(ChannelStatus::OVRE) {
719            self.abort_rx(usart, Err(ErrorCode::FAIL), uart::Error::OverrunError);
720        }
721
722        // Reset status registers.
723        usart.registers.cr.write(Control::RSTSTA::SET);
724    }
725
726    fn set_baud_rate(&self, usart: &USARTRegManager, baud_rate: u32) {
727        let system_frequency = self.pm.get_system_frequency();
728
729        // The clock divisor is calculated differently in UART and SPI modes.
730        match self.usart_mode.get() {
731            UsartMode::Uart => {
732                let uart_baud_rate = 8 * baud_rate;
733                let cd = system_frequency / uart_baud_rate;
734                //Generate fractional part
735                let fp = (system_frequency + baud_rate / 2) / baud_rate - 8 * cd;
736                usart
737                    .registers
738                    .brgr
739                    .write(BaudRate::FP.val(fp) + BaudRate::CD.val(cd));
740            }
741            UsartMode::Spi => {
742                let cd = system_frequency / baud_rate;
743                usart.registers.brgr.write(BaudRate::CD.val(cd));
744            }
745            UsartMode::Unused => {}
746        }
747    }
748
749    /// In non-SPI mode, this drives RTS low.
750    /// In SPI mode, this asserts (drives low) the chip select line.
751    fn rts_enable_spi_assert_cs(&self, usart: &USARTRegManager) {
752        usart.registers.cr.write(Control::RTSEN::SET);
753    }
754
755    /// In non-SPI mode, this drives RTS high.
756    /// In SPI mode, this de-asserts (drives high) the chip select line.
757    fn rts_disable_spi_deassert_cs(&self, usart: &USARTRegManager) {
758        usart.registers.cr.write(Control::RTSDIS::SET);
759    }
760
761    fn enable_rx_timeout(&self, usart: &USARTRegManager, timeout: u8) {
762        usart
763            .registers
764            .rtor
765            .write(RxTimeout::TO.val(timeout as u32));
766
767        // Start the timeout, and we must do this before enabling the interrupt.
768        // This ordering ensures that the interrupt does not fire prematurely.
769        usart.registers.cr.write(Control::STTTO::SET);
770
771        // enable timeout interrupt
772        usart.registers.ier.write(Interrupt::TIMEOUT::SET);
773    }
774
775    fn disable_rx_timeout(&self, usart: &USARTRegManager) {
776        usart.registers.rtor.write(RxTimeout::TO.val(0));
777
778        // enable timeout interrupt
779        usart.registers.idr.write(Interrupt::TIMEOUT::SET);
780    }
781
782    // for use by panic in io.rs
783    pub fn send_byte(&self, usart: &USARTRegManager, byte: u8) {
784        usart
785            .registers
786            .thr
787            .write(TransmitHold::TXCHR.val(byte as u32));
788    }
789
790    // for use by panic in io.rs
791    pub fn tx_ready(&self, usart: &USARTRegManager) -> bool {
792        usart.registers.csr.is_set(ChannelStatus::TXRDY)
793    }
794}
795
796impl DeferredCallClient for USART<'_> {
797    fn handle_deferred_call(&self) {
798        self.dc_state.take().map(|mut dc_state| {
799            self.client.map(|usartclient| {
800                if let UsartClient::Uart(Some(rx), _tx) = usartclient {
801                    dc_state.abort_rx_buf.take().map(|buf| {
802                        rx.received_buffer(
803                            buf,
804                            dc_state.abort_rx_len,
805                            dc_state.abort_rx_rcode,
806                            dc_state.abort_rx_error,
807                        )
808                    });
809                }
810            });
811        });
812    }
813
814    fn register(&'static self) {
815        self.deferred_call.register(self);
816    }
817}
818
819impl dma::DMAClient for USART<'_> {
820    fn transfer_done(&self, pid: dma::DMAPeripheral) {
821        let usart = &USARTRegManager::new(self);
822        match self.usart_mode.get() {
823            UsartMode::Uart => {
824                // determine if it was an RX or TX transfer
825                if pid == self.rx_dma_peripheral {
826                    // RX transfer was completed
827
828                    // disable RX and RX interrupts
829                    self.disable_rx_interrupts(usart);
830                    self.disable_rx(usart);
831                    self.usart_rx_state.set(USARTStateRX::Idle);
832
833                    // get buffer
834                    let buffer = self.rx_dma.get().and_then(|rx_dma| {
835                        let buf = rx_dma.abort_transfer();
836                        rx_dma.disable();
837                        buf
838                    });
839
840                    // alert client
841                    self.client.map(|usartclient| {
842                        if let UsartClient::Uart(Some(rx), _tx) = usartclient {
843                            buffer.map(|buf| {
844                                let length = self.rx_len.get();
845                                self.rx_len.set(0);
846                                rx.received_buffer(buf, length, Ok(()), uart::Error::None);
847                            });
848                        }
849                    });
850                } else if pid == self.tx_dma_peripheral {
851                    // TX transfer was completed
852
853                    // note that the DMA has finished but TX cannot yet be disabled yet because
854                    // there may still be bytes left in the TX buffer.
855                    self.usart_tx_state.set(USARTStateTX::Transfer_Completing);
856                    self.enable_tx_empty_interrupt(usart);
857                }
858            }
859
860            UsartMode::Spi => {
861                if (self.usart_rx_state.get() == USARTStateRX::Idle
862                    && pid == self.tx_dma_peripheral)
863                    || pid == self.rx_dma_peripheral
864                {
865                    // SPI transfer was completed. Either we didn't do a read,
866                    // so the only event we expect is a TX DMA done, OR, we did
867                    // a read so we ignore the TX DMA done event and wait for
868                    // the RX DMA done event.
869
870                    // Note that the DMA has finished but TX cannot be disabled
871                    // yet.
872                    self.usart_tx_state.set(USARTStateTX::Transfer_Completing);
873                    self.enable_tx_empty_interrupt(usart);
874
875                    // The RX is either already idle and disabled (we didn't
876                    // do a read) or it is now safe to do this.
877                    self.usart_rx_state.set(USARTStateRX::Idle);
878                    self.disable_rx(usart);
879                }
880            }
881
882            _ => {}
883        }
884    }
885}
886
887/// Implementation of kernel::uart
888impl<'a> uart::Receive<'a> for USART<'a> {
889    fn set_receive_client(&self, client: &'a dyn uart::ReceiveClient) {
890        if let Some(UsartClient::Uart(_rx, Some(tx))) = self.client.take() {
891            self.client.set(UsartClient::Uart(Some(client), Some(tx)));
892        } else {
893            self.client.set(UsartClient::Uart(Some(client), None));
894        }
895    }
896
897    fn receive_buffer(
898        &self,
899        rx_buffer: &'static mut [u8],
900        rx_len: usize,
901    ) -> Result<(), (ErrorCode, &'static mut [u8])> {
902        if rx_len > rx_buffer.len() {
903            return Err((ErrorCode::SIZE, rx_buffer));
904        }
905        let usart = &USARTRegManager::new(self);
906
907        // enable RX
908        self.enable_rx(usart);
909        self.enable_rx_error_interrupts(usart);
910        self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
911        // set up dma transfer and start reception
912        if let Some(dma) = self.rx_dma.get() {
913            dma.enable();
914            self.rx_len.set(rx_len);
915            dma.do_transfer(self.rx_dma_peripheral, rx_buffer, rx_len);
916            Ok(())
917        } else {
918            Err((ErrorCode::OFF, rx_buffer))
919        }
920    }
921
922    fn receive_abort(&self) -> Result<(), ErrorCode> {
923        let usart = &USARTRegManager::new(self);
924        self.disable_rx_timeout(usart);
925        self.abort_rx(usart, Err(ErrorCode::CANCEL), uart::Error::Aborted);
926        Err(ErrorCode::BUSY)
927    }
928
929    fn receive_word(&self) -> Result<(), ErrorCode> {
930        Err(ErrorCode::FAIL)
931    }
932}
933
934impl<'a> uart::Transmit<'a> for USART<'a> {
935    fn transmit_buffer(
936        &self,
937        tx_buffer: &'static mut [u8],
938        tx_len: usize,
939    ) -> Result<(), (ErrorCode, &'static mut [u8])> {
940        if self.usart_tx_state.get() != USARTStateTX::Idle {
941            Err((ErrorCode::BUSY, tx_buffer))
942        } else {
943            if tx_len > tx_buffer.len() {
944                return Err((ErrorCode::SIZE, tx_buffer));
945            }
946            let usart = &USARTRegManager::new(self);
947            // enable TX
948            self.enable_tx(usart);
949            self.usart_tx_state.set(USARTStateTX::DMA_Transmitting);
950
951            // set up dma transfer and start transmission
952            if self.tx_dma.get().is_some() {
953                self.tx_dma.get().map(move |dma| {
954                    dma.enable();
955                    self.tx_len.set(tx_len);
956                    dma.do_transfer(self.tx_dma_peripheral, tx_buffer, tx_len);
957                });
958                Ok(())
959            } else {
960                Err((ErrorCode::OFF, tx_buffer))
961            }
962        }
963    }
964
965    fn transmit_abort(&self) -> Result<(), ErrorCode> {
966        if self.usart_tx_state.get() != USARTStateTX::Idle {
967            let usart = &USARTRegManager::new(self);
968            self.abort_tx(usart, Err(ErrorCode::CANCEL));
969            Err(ErrorCode::BUSY)
970        } else {
971            Ok(())
972        }
973    }
974
975    fn set_transmit_client(&self, client: &'a dyn uart::TransmitClient) {
976        if let Some(UsartClient::Uart(Some(rx), _tx)) = self.client.take() {
977            self.client.set(UsartClient::Uart(Some(rx), Some(client)));
978        } else {
979            self.client.set(UsartClient::Uart(None, Some(client)));
980        }
981    }
982
983    fn transmit_word(&self, _word: u32) -> Result<(), ErrorCode> {
984        Err(ErrorCode::FAIL)
985    }
986}
987
988impl uart::Configure for USART<'_> {
989    fn configure(&self, parameters: uart::Parameters) -> Result<(), ErrorCode> {
990        if self.usart_mode.get() != UsartMode::Uart {
991            return Err(ErrorCode::OFF);
992        }
993
994        let usart = &USARTRegManager::new(self);
995
996        // set USART mode register
997        let mut mode = Mode::OVER::SET; // OVER: oversample at 8x
998
999        mode += Mode::CHRL::BITS8; // CHRL: 8-bit characters
1000        mode += Mode::USCLKS::CLK_USART; // USCLKS: select CLK_USART
1001
1002        mode += match parameters.stop_bits {
1003            uart::StopBits::One => Mode::NBSTOP::BITS_1_1,
1004            uart::StopBits::Two => Mode::NBSTOP::BITS_2_2,
1005        };
1006
1007        mode += match parameters.parity {
1008            uart::Parity::None => Mode::PAR::NONE, // no parity
1009            uart::Parity::Odd => Mode::PAR::ODD,   // odd parity
1010            uart::Parity::Even => Mode::PAR::EVEN, // even parity
1011        };
1012
1013        mode += match parameters.hw_flow_control {
1014            true => Mode::MODE::HARD_HAND,
1015            false => Mode::MODE::NORMAL,
1016        };
1017        usart.registers.mr.write(mode);
1018        // Set baud rate
1019        self.set_baud_rate(usart, parameters.baud_rate);
1020
1021        Ok(())
1022    }
1023}
1024
1025impl<'a> uart::ReceiveAdvanced<'a> for USART<'a> {
1026    fn receive_automatic(
1027        &self,
1028        rx_buffer: &'static mut [u8],
1029        len: usize,
1030        interbyte_timeout: u8,
1031    ) -> Result<(), (ErrorCode, &'static mut [u8])> {
1032        if self.usart_rx_state.get() != USARTStateRX::Idle {
1033            Err((ErrorCode::BUSY, rx_buffer))
1034        } else {
1035            let usart = &USARTRegManager::new(self);
1036            let length = cmp::min(len, rx_buffer.len());
1037
1038            // enable RX
1039            self.enable_rx(usart);
1040            self.enable_rx_error_interrupts(usart);
1041            self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
1042
1043            // enable receive timeout
1044            self.enable_rx_timeout(usart, interbyte_timeout);
1045
1046            // set up dma transfer and start reception
1047            self.rx_dma.get().map(move |dma| {
1048                dma.enable();
1049                dma.do_transfer(self.rx_dma_peripheral, rx_buffer, length);
1050                self.rx_len.set(length);
1051            });
1052            Ok(())
1053        }
1054    }
1055}
1056
1057/// SPI
1058impl<'a> spi::SpiMaster<'a> for USART<'a> {
1059    type ChipSelect = ChipSelectPolar<'a, crate::gpio::GPIOPin<'a>>;
1060
1061    fn init(&self) -> Result<(), ErrorCode> {
1062        let usart = &USARTRegManager::new(self);
1063
1064        self.usart_mode.set(UsartMode::Spi);
1065
1066        // Set baud rate, default to 2 MHz.
1067        self.set_baud_rate(usart, 2000000);
1068
1069        usart.registers.mr.write(
1070            Mode::MODE::SPI_MASTER
1071                + Mode::USCLKS::CLK_USART
1072                + Mode::CHRL::BITS8
1073                + Mode::PAR::NONE
1074                + Mode::CLKO::SET,
1075        );
1076
1077        // Set four bit periods of guard time before RTS/CTS toggle after a
1078        // message.
1079        usart.registers.ttgr.write(TxTimeGuard::TG.val(4));
1080        Ok(())
1081    }
1082
1083    fn set_client(&self, client: &'a dyn spi::SpiMasterClient) {
1084        let c = UsartClient::SpiMaster(client);
1085        self.client.set(c);
1086    }
1087
1088    fn is_busy(&self) -> bool {
1089        false
1090    }
1091
1092    fn read_write_bytes(
1093        &self,
1094        write_buffer: SubSliceMut<'static, u8>,
1095        read_buffer: Option<SubSliceMut<'static, u8>>,
1096    ) -> Result<
1097        (),
1098        (
1099            ErrorCode,
1100            SubSliceMut<'static, u8>,
1101            Option<SubSliceMut<'static, u8>>,
1102        ),
1103    > {
1104        let usart = &USARTRegManager::new(self);
1105
1106        self.enable_tx(usart);
1107        self.enable_rx(usart);
1108
1109        // Calculate the correct length for the transmission
1110        let count = read_buffer.as_ref().map_or(write_buffer.len(), |rbuf| {
1111            cmp::min(rbuf.len(), write_buffer.len())
1112        });
1113
1114        self.tx_len.set(count);
1115
1116        // Set !CS low
1117        self.spi_chip_select.map_or_else(
1118            || {
1119                // Do the "else" case first. If a CS pin was provided as the
1120                // CS line, we use the HW RTS pin as the CS line instead.
1121                self.rts_enable_spi_assert_cs(usart);
1122            },
1123            |cs| {
1124                cs.activate();
1125            },
1126        );
1127
1128        // Check if we should read and write or just write.
1129        if read_buffer.is_some() {
1130            // We are reading and writing.
1131            read_buffer.map(|rbuf| {
1132                self.tx_dma.get().map(move |dma| {
1133                    self.rx_dma.get().map(move |read| {
1134                        // Do all the maps before starting anything in case
1135                        // they take too much time.
1136
1137                        // Start the write transaction.
1138                        self.usart_tx_state.set(USARTStateTX::DMA_Transmitting);
1139                        self.usart_rx_state.set(USARTStateRX::Idle);
1140                        dma.enable();
1141                        dma.do_transfer(self.tx_dma_peripheral, write_buffer.take(), count);
1142
1143                        // Start the read transaction.
1144                        self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
1145                        read.enable();
1146                        read.do_transfer(self.rx_dma_peripheral, rbuf.take(), count);
1147                    });
1148                });
1149            });
1150        } else {
1151            // We are just writing.
1152            self.tx_dma.get().map(move |dma| {
1153                self.usart_tx_state.set(USARTStateTX::DMA_Transmitting);
1154                self.usart_rx_state.set(USARTStateRX::Idle);
1155                dma.enable();
1156                dma.do_transfer(self.tx_dma_peripheral, write_buffer.take(), count);
1157            });
1158        }
1159
1160        Ok(())
1161    }
1162
1163    fn write_byte(&self, val: u8) -> Result<(), ErrorCode> {
1164        let usart = &USARTRegManager::new(self);
1165        usart
1166            .registers
1167            .cr
1168            .write(Control::RXEN::SET + Control::TXEN::SET);
1169        usart
1170            .registers
1171            .thr
1172            .write(TransmitHold::TXCHR.val(val as u32));
1173        Ok(())
1174    }
1175
1176    fn read_byte(&self) -> Result<u8, ErrorCode> {
1177        let usart = &USARTRegManager::new(self);
1178        Ok(usart.registers.rhr.read(ReceiverHold::RXCHR) as u8)
1179    }
1180
1181    fn read_write_byte(&self, val: u8) -> Result<u8, ErrorCode> {
1182        let usart = &USARTRegManager::new(self);
1183        usart
1184            .registers
1185            .cr
1186            .write(Control::RXEN::SET + Control::TXEN::SET);
1187
1188        usart
1189            .registers
1190            .thr
1191            .write(TransmitHold::TXCHR.val(val as u32));
1192        while !usart.registers.csr.is_set(ChannelStatus::RXRDY) {}
1193        Ok(usart.registers.rhr.read(ReceiverHold::RXCHR) as u8)
1194    }
1195
1196    /// Pass in a None to use the HW chip select pin on the USART (RTS).
1197    fn specify_chip_select(&self, cs: Self::ChipSelect) -> Result<(), ErrorCode> {
1198        self.spi_chip_select.set(cs);
1199        Ok(())
1200    }
1201
1202    /// Returns the actual rate set
1203    fn set_rate(&self, rate: u32) -> Result<u32, ErrorCode> {
1204        let usart = &USARTRegManager::new(self);
1205        self.set_baud_rate(usart, rate);
1206
1207        // Calculate what rate will actually be
1208        let system_frequency = self.pm.get_system_frequency();
1209        let cd = system_frequency / rate;
1210        Ok(system_frequency / cd)
1211    }
1212
1213    fn get_rate(&self) -> u32 {
1214        let usart = &USARTRegManager::new(self);
1215        let system_frequency = self.pm.get_system_frequency();
1216        let cd = usart.registers.brgr.read(BaudRate::CD);
1217        system_frequency / cd
1218    }
1219
1220    fn set_polarity(&self, polarity: spi::ClockPolarity) -> Result<(), ErrorCode> {
1221        let usart = &USARTRegManager::new(self);
1222        // Note that in SPI mode MSBF bit is clock polarity (CPOL)
1223        match polarity {
1224            spi::ClockPolarity::IdleLow => {
1225                usart.registers.mr.modify(Mode::MSBF::CLEAR);
1226            }
1227            spi::ClockPolarity::IdleHigh => {
1228                usart.registers.mr.modify(Mode::MSBF::SET);
1229            }
1230        }
1231        Ok(())
1232    }
1233
1234    fn get_polarity(&self) -> spi::ClockPolarity {
1235        let usart = &USARTRegManager::new(self);
1236
1237        // Note that in SPI mode MSBF bit is clock polarity (CPOL)
1238        let idle = usart.registers.mr.read(Mode::MSBF);
1239        match idle {
1240            0 => spi::ClockPolarity::IdleLow,
1241            _ => spi::ClockPolarity::IdleHigh,
1242        }
1243    }
1244
1245    fn set_phase(&self, phase: spi::ClockPhase) -> Result<(), ErrorCode> {
1246        let usart = &USARTRegManager::new(self);
1247
1248        // Note that in SPI mode SYNC bit is clock phase
1249        match phase {
1250            spi::ClockPhase::SampleLeading => {
1251                usart.registers.mr.modify(Mode::SYNC::SET);
1252            }
1253            spi::ClockPhase::SampleTrailing => {
1254                usart.registers.mr.modify(Mode::SYNC::CLEAR);
1255            }
1256        }
1257        Ok(())
1258    }
1259
1260    fn get_phase(&self) -> spi::ClockPhase {
1261        let usart = &USARTRegManager::new(self);
1262        let phase = usart.registers.mr.read(Mode::SYNC);
1263
1264        // Note that in SPI mode SYNC bit is clock phase
1265        match phase {
1266            0 => spi::ClockPhase::SampleLeading,
1267            _ => spi::ClockPhase::SampleTrailing,
1268        }
1269    }
1270
1271    // These two functions determine what happens to the chip
1272    // select line between transfers. If hold_low() is called,
1273    // then the chip select line is held low after transfers
1274    // complete. If release_low() is called, then the chip select
1275    // line is brought high after a transfer completes. A "transfer"
1276    // is any of the read/read_write calls. These functions
1277    // allow an application to manually control when the
1278    // CS line is high or low, such that it can issue multi-byte
1279    // requests with single byte operations.
1280    fn hold_low(&self) {
1281        unimplemented!("USART: SPI: Use `read_write_bytes()` instead.");
1282    }
1283
1284    fn release_low(&self) {
1285        unimplemented!("USART: SPI: Use `read_write_bytes()` instead.");
1286    }
1287}