Skip to main content

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