1use 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
28register_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 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 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, }
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
388struct 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 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 client: OptionalCell::empty(),
447
448 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 unimplemented!("Dynamically changing USART mode");
509 }
510
511 self.usart_mode.set(mode);
512
513 let usart = &USARTRegManager::new(self);
514
515 self.disable_interrupts(usart);
517
518 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 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 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 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 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 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 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 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 self.spi_chip_select.map_or_else(
688 || {
689 self.rts_disable_spi_deassert_cs(usart);
691 },
692 |cs| {
693 cs.deactivate();
694 },
695 );
696
697 let rxbuf = self.rx_dma.get().and_then(|dma| {
700 let buf = dma.abort_transfer();
701 dma.disable();
702 buf
703 });
704
705 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 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 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 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 fn rts_enable_spi_assert_cs(&self, usart: &USARTRegManager) {
756 usart.registers.cr.write(Control::RTSEN::SET);
757 }
758
759 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 usart.registers.cr.write(Control::STTTO::SET);
774
775 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 usart.registers.idr.write(Interrupt::TIMEOUT::SET);
784 }
785
786 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 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 if pid == self.rx_dma_peripheral {
830 self.disable_rx_interrupts(usart);
834 self.disable_rx(usart);
835 self.usart_rx_state.set(USARTStateRX::Idle);
836
837 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 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 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 self.usart_tx_state.set(USARTStateTX::Transfer_Completing);
877 self.enable_tx_empty_interrupt(usart);
878
879 self.usart_rx_state.set(USARTStateRX::Idle);
882 self.disable_rx(usart);
883 }
884 }
885
886 _ => {}
887 }
888 }
889}
890
891impl<'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 self.enable_rx(usart);
913 self.enable_rx_error_interrupts(usart);
914 self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
915 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 self.enable_tx(usart);
953 self.usart_tx_state.set(USARTStateTX::DMA_Transmitting);
954
955 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 let mut mode = Mode::OVER::SET; mode += Mode::CHRL::BITS8; mode += Mode::USCLKS::CLK_USART; 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, uart::Parity::Odd => Mode::PAR::ODD, uart::Parity::Even => Mode::PAR::EVEN, };
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 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 self.enable_rx(usart);
1044 self.enable_rx_error_interrupts(usart);
1045 self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
1046
1047 self.enable_rx_timeout(usart, interbyte_timeout);
1049
1050 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
1061impl<'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 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 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 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 self.spi_chip_select.map_or_else(
1122 || {
1123 self.rts_enable_spi_assert_cs(usart);
1126 },
1127 |cs| {
1128 cs.activate();
1129 },
1130 );
1131
1132 if read_buffer.is_some() {
1134 read_buffer.map(|rbuf| {
1136 self.tx_dma.get().map(move |dma| {
1137 self.rx_dma.get().map(move |read| {
1138 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 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 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 fn specify_chip_select(&self, cs: Self::ChipSelect) -> Result<(), ErrorCode> {
1169 self.spi_chip_select.set(cs);
1170 Ok(())
1171 }
1172
1173 fn set_rate(&self, rate: u32) -> Result<u32, ErrorCode> {
1175 let usart = &USARTRegManager::new(self);
1176 self.set_baud_rate(usart, rate);
1177
1178 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 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 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 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 match phase {
1237 0 => spi::ClockPhase::SampleLeading,
1238 _ => spi::ClockPhase::SampleTrailing,
1239 }
1240 }
1241
1242 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}