1use 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#[repr(C)]
28struct UsartRegisters {
29 cr: WriteOnly<u32, Control::Register>, mr: ReadWrite<u32, Mode::Register>, ier: WriteOnly<u32, Interrupt::Register>, idr: WriteOnly<u32, Interrupt::Register>, imr: ReadOnly<u32, Interrupt::Register>, csr: ReadOnly<u32, ChannelStatus::Register>, rhr: ReadOnly<u32, ReceiverHold::Register>, thr: WriteOnly<u32, TransmitHold::Register>, brgr: ReadWrite<u32, BaudRate::Register>, rtor: ReadWrite<u32, RxTimeout::Register>, ttgr: ReadWrite<u32, TxTimeGuard::Register>, _reserved0: [ReadOnly<u32>; 5],
41 fidi: ReadWrite<u32, FidiRatio::Register>, ner: ReadOnly<u32, NumErrors::Register>, _reserved1: ReadOnly<u32>,
44 ifr: ReadWrite<u32, IrdaFilter::Register>, man: ReadWrite<u32, Manchester::Register>, linmr: ReadWrite<u32, LinMode::Register>, linir: ReadWrite<u32, LinID::Register>, linbr: ReadOnly<u32, LinBaud::Register>, _reserved2: [ReadOnly<u32>; 33],
50 wpmr: ReadWrite<u32, ProtectMode::Register>, wpsr: ReadOnly<u32, ProtectStatus::Register>, _reserved3: [ReadOnly<u32>; 4],
53 version: ReadOnly<u32, Version::Register>, }
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 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 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, }
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
384struct 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 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 client: OptionalCell::empty(),
443
444 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 unimplemented!("Dynamically changing USART mode");
505 }
506
507 self.usart_mode.set(mode);
508
509 let usart = &USARTRegManager::new(self);
510
511 self.disable_interrupts(usart);
513
514 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 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 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 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 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 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 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 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 self.spi_chip_select.map_or_else(
684 || {
685 self.rts_disable_spi_deassert_cs(usart);
687 },
688 |cs| {
689 cs.deactivate();
690 },
691 );
692
693 let rxbuf = self.rx_dma.get().map_or(None, |dma| {
696 let buf = dma.abort_transfer();
697 dma.disable();
698 buf
699 });
700
701 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 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 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 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 fn rts_enable_spi_assert_cs(&self, usart: &USARTRegManager) {
752 usart.registers.cr.write(Control::RTSEN::SET);
753 }
754
755 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 usart.registers.cr.write(Control::STTTO::SET);
770
771 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 usart.registers.idr.write(Interrupt::TIMEOUT::SET);
780 }
781
782 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 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 if pid == self.rx_dma_peripheral {
826 self.disable_rx_interrupts(usart);
830 self.disable_rx(usart);
831 self.usart_rx_state.set(USARTStateRX::Idle);
832
833 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 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 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 self.usart_tx_state.set(USARTStateTX::Transfer_Completing);
873 self.enable_tx_empty_interrupt(usart);
874
875 self.usart_rx_state.set(USARTStateRX::Idle);
878 self.disable_rx(usart);
879 }
880 }
881
882 _ => {}
883 }
884 }
885}
886
887impl<'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 self.enable_rx(usart);
909 self.enable_rx_error_interrupts(usart);
910 self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
911 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 self.enable_tx(usart);
949 self.usart_tx_state.set(USARTStateTX::DMA_Transmitting);
950
951 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 let mut mode = Mode::OVER::SET; mode += Mode::CHRL::BITS8; mode += Mode::USCLKS::CLK_USART; 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, uart::Parity::Odd => Mode::PAR::ODD, uart::Parity::Even => Mode::PAR::EVEN, };
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 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 self.enable_rx(usart);
1040 self.enable_rx_error_interrupts(usart);
1041 self.usart_rx_state.set(USARTStateRX::DMA_Receiving);
1042
1043 self.enable_rx_timeout(usart, interbyte_timeout);
1045
1046 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
1057impl<'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 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 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 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 self.spi_chip_select.map_or_else(
1118 || {
1119 self.rts_enable_spi_assert_cs(usart);
1122 },
1123 |cs| {
1124 cs.activate();
1125 },
1126 );
1127
1128 if read_buffer.is_some() {
1130 read_buffer.map(|rbuf| {
1132 self.tx_dma.get().map(move |dma| {
1133 self.rx_dma.get().map(move |read| {
1134 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 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 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 fn specify_chip_select(&self, cs: Self::ChipSelect) -> Result<(), ErrorCode> {
1198 self.spi_chip_select.set(cs);
1199 Ok(())
1200 }
1201
1202 fn set_rate(&self, rate: u32) -> Result<u32, ErrorCode> {
1204 let usart = &USARTRegManager::new(self);
1205 self.set_baud_rate(usart, rate);
1206
1207 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 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 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 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 match phase {
1266 0 => spi::ClockPhase::SampleLeading,
1267 _ => spi::ClockPhase::SampleTrailing,
1268 }
1269 }
1270
1271 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}