1use crate::clocks::{phclk, Stm32f4Clocks};
12use core::cell::Cell;
13use kernel::deferred_call::{DeferredCall, DeferredCallClient};
14use kernel::hil::can::{self, StandardBitTiming};
15use kernel::platform::chip::ClockInterface;
16use kernel::utilities::cells::{OptionalCell, TakeCell};
17use kernel::utilities::registers::interfaces::{ReadWriteable, Readable};
18use kernel::utilities::registers::{register_bitfields, register_structs, ReadWrite};
19use kernel::utilities::StaticRef;
20
21pub const BRP_MIN_STM32: u32 = 0;
22pub const BRP_MAX_STM32: u32 = 1023;
23
24pub const TX_MAILBOX_COUNT: usize = 3;
25pub const RX_MAILBOX_COUNT: usize = 2;
26pub const FILTER_COUNT: usize = 56;
27
28register_structs! {
29 pub Registers {
30 (0x000 => can_mcr: ReadWrite<u32, CAN_MCR::Register>),
32 (0x004 => can_msr: ReadWrite<u32, CAN_MSR::Register>),
34 (0x008 => can_tsr: ReadWrite<u32, CAN_TSR::Register>),
36 (0x00c => can_rf0r: ReadWrite<u32, CAN_RF0R::Register>),
38 (0x010 => can_rf1r: ReadWrite<u32, CAN_RF1R::Register>),
40 (0x014 => can_ier: ReadWrite<u32, CAN_IER::Register>),
42 (0x018 => can_esr: ReadWrite<u32, CAN_ESR::Register>),
44 (0x01c => can_btr: ReadWrite<u32, CAN_BTR::Register>),
46 (0x020 => _reserved0),
47 (0x180 => can_tx_mailbox: [TransmitMailBox; TX_MAILBOX_COUNT]),
53 (0x1b0 => can_rx_mailbox: [ReceiveMailBox; RX_MAILBOX_COUNT]),
55 (0x1d0 => _reserved1),
56 (0x200 => can_fmr: ReadWrite<u32, CAN_FMR::Register>),
63 (0x204 => can_fm1r: ReadWrite<u32, CAN_FM1R::Register>),
65 (0x208 => _reserved2),
66 (0x20c => can_fs1r: ReadWrite<u32, CAN_FS1R::Register>),
68 (0x210 => _reserved3),
69 (0x214 => can_ffa1r: ReadWrite<u32, CAN_FFA1R::Register>),
71 (0x218 => _reserved4),
72 (0x21c => can_fa1r: ReadWrite<u32, CAN_FA1R::Register>),
74 (0x220 => _reserved5),
75 (0x240 => can_firx: [ReadWrite<u32, CAN_FiRx::Register>; FILTER_COUNT]),
77 (0x320 => @END),
78 },
79
80 TransmitMailBox {
81 (0x00 => can_tir: ReadWrite<u32, CAN_TIxR::Register>),
82 (0x04 => can_tdtr: ReadWrite<u32, CAN_TDTxR::Register>),
83 (0x08 => can_tdlr: ReadWrite<u32, CAN_TDLxR::Register>),
84 (0x0c => can_tdhr: ReadWrite<u32, CAN_TDHxR::Register>),
85 (0x010 => @END),
86 },
87
88 ReceiveMailBox {
89 (0x00 => can_rir: ReadWrite<u32, CAN_RIxR::Register>),
90 (0x04 => can_rdtr: ReadWrite<u32, CAN_RDTxR::Register>),
91 (0x08 => can_rdlr: ReadWrite<u32, CAN_RDLxR::Register>),
92 (0x0c => can_rdhr: ReadWrite<u32, CAN_RDHxR::Register>),
93 (0x010 => @END),
94 }
95}
96
97register_bitfields![u32,
98 CAN_MCR [
99 DBF OFFSET(16) NUMBITS(1) [],
101 RESET OFFSET(15) NUMBITS(1) [],
103 TTCM OFFSET(7) NUMBITS(1) [],
105 ABOM OFFSET(6) NUMBITS(1) [],
107 AWUM OFFSET(5) NUMBITS(1) [],
109 NART OFFSET(4) NUMBITS(1) [],
111 RFLM OFFSET(3) NUMBITS(1) [],
113 TXFP OFFSET(2) NUMBITS(1) [],
115 SLEEP OFFSET(1) NUMBITS(1) [],
117 INRQ OFFSET(0) NUMBITS(1) []
119 ],
120 CAN_MSR [
121 RX OFFSET(11) NUMBITS(1) [],
123 SAMP OFFSET(10) NUMBITS(1) [],
125 RXM OFFSET(9) NUMBITS(1) [],
127 TXM OFFSET(8) NUMBITS(1) [],
129 SLAKI OFFSET(4) NUMBITS(1) [],
131 WKUI OFFSET(3) NUMBITS(1) [],
133 ERRI OFFSET(2) NUMBITS(1) [],
135 SLAK OFFSET(1) NUMBITS(1) [],
137 INAK OFFSET(0) NUMBITS(1) []
139 ],
140 CAN_TSR [
141 LOW2 OFFSET(31) NUMBITS(1) [],
143 LOW1 OFFSET(30) NUMBITS(1) [],
145 LOW0 OFFSET(29) NUMBITS(1) [],
147 TME2 OFFSET(28) NUMBITS(1) [],
149 TME1 OFFSET(27) NUMBITS(1) [],
151 TME0 OFFSET(26) NUMBITS(1) [],
153 CODE OFFSET(24) NUMBITS(2) [],
155 ABRQ2 OFFSET(23) NUMBITS(1) [],
157 TERR2 OFFSET(19) NUMBITS(1) [],
159 ALST2 OFFSET(18) NUMBITS(1) [],
161 TXOK2 OFFSET(17) NUMBITS(1) [],
163 RQCP2 OFFSET(16) NUMBITS(1) [],
165 ABRQ1 OFFSET(15) NUMBITS(1) [],
167 TERR1 OFFSET(11) NUMBITS(1) [],
169 ALST1 OFFSET(10) NUMBITS(1) [],
171 TXOK1 OFFSET(9) NUMBITS(1) [],
173 RQCP1 OFFSET(8) NUMBITS(1) [],
175 ABRQ0 OFFSET(7) NUMBITS(1) [],
177 TERR0 OFFSET(3) NUMBITS(1) [],
179 ALST0 OFFSET(2) NUMBITS(1) [],
181 TXOK0 OFFSET(1) NUMBITS(1) [],
183 RQCP0 OFFSET(0) NUMBITS(1) []
185 ],
186 CAN_RF0R [
187 RFOM0 OFFSET(5) NUMBITS(1) [],
189 FOVR0 OFFSET(4) NUMBITS(1) [],
191 FULL0 OFFSET(3) NUMBITS(1) [],
193 FMP0 OFFSET(0) NUMBITS(2) []
195 ],
196 CAN_RF1R [
197 RFOM1 OFFSET(5) NUMBITS(1) [],
199 FOVR1 OFFSET(4) NUMBITS(1) [],
201 FULL1 OFFSET(3) NUMBITS(1) [],
203 FMP1 OFFSET(0) NUMBITS(2) []
205 ],
206 CAN_IER [
207 SLKIE OFFSET(17) NUMBITS(1) [],
209 WKUIE OFFSET(16) NUMBITS(1) [],
211 ERRIE OFFSET(15) NUMBITS(1) [],
213 LECIE OFFSET(11) NUMBITS(1) [],
215 BOFIE OFFSET(10) NUMBITS(1) [],
217 EPVIE OFFSET(9) NUMBITS(1) [],
219 EWGIE OFFSET(8) NUMBITS(1) [],
221 FOVIE1 OFFSET(6) NUMBITS(1) [],
223 FFIE1 OFFSET(5) NUMBITS(1) [],
225 FMPIE1 OFFSET(4) NUMBITS(1) [],
227 FOVIE0 OFFSET(3) NUMBITS(1) [],
229 FFIE0 OFFSET(2) NUMBITS(1) [],
231 FMPIE0 OFFSET(1) NUMBITS(1) [],
233 TMEIE OFFSET(0) NUMBITS(1) []
235 ],
236 CAN_ESR [
237 REC OFFSET(24) NUMBITS(8) [],
239 TEC OFFSET(16) NUMBITS(8) [],
241 LEC OFFSET(4) NUMBITS(3) [
243 NoError = 0,
244 StuffError = 1,
245 FormError = 2,
246 AcknowledgmentError = 3,
247 BitRecessiveError = 4,
248 BitDominantError = 5,
249 CrcError = 6,
250 SetBySoftware = 7
251 ],
252 BOFF OFFSET(2) NUMBITS(1) [],
254 EPVF OFFSET(1) NUMBITS(1) [],
256 EWGF OFFSET(0) NUMBITS(1) []
258 ],
259 CAN_BTR [
260 SILM OFFSET(31) NUMBITS(1) [],
262 LBKM OFFSET(30) NUMBITS(1) [],
264 SJW OFFSET(24) NUMBITS(2) [],
266 TS2 OFFSET(20) NUMBITS(3) [],
268 TS1 OFFSET(16) NUMBITS(4) [],
270 BRP OFFSET(0) NUMBITS(10) []
272 ],
273 CAN_TIxR [
279 STID OFFSET(21) NUMBITS(11) [],
281 EXID OFFSET(3) NUMBITS(18) [],
283 IDE OFFSET(2) NUMBITS(1) [],
285 RTR OFFSET(1) NUMBITS(1) [],
287 TXRQ OFFSET(0) NUMBITS(1) []
289 ],
290 CAN_TDTxR [
291 TIME OFFSET(16) NUMBITS(16) [],
293 TGT OFFSET(8) NUMBITS(1) [],
295 DLC OFFSET(0) NUMBITS(4) []
297 ],
298 CAN_TDLxR [
299 DATA3 OFFSET(24) NUMBITS(8) [],
301 DATA2 OFFSET(16) NUMBITS(8) [],
303 DATA1 OFFSET(8) NUMBITS(8) [],
305 DATA0 OFFSET(0) NUMBITS(8) []
307 ],
308 CAN_TDHxR [
309 DATA7 OFFSET(24) NUMBITS(8) [],
311 DATA6 OFFSET(16) NUMBITS(8) [],
313 DATA5 OFFSET(8) NUMBITS(8) [],
315 DATA4 OFFSET(0) NUMBITS(8) []
317 ],
318 CAN_RIxR [
319 STID OFFSET(21) NUMBITS(11) [],
321 EXID OFFSET(3) NUMBITS(18) [],
323 IDE OFFSET(2) NUMBITS(1) [],
325 RTR OFFSET(1) NUMBITS(1) []
327 ],
328 CAN_RDTxR [
329 TIME OFFSET(16) NUMBITS(16) [],
331 FMI OFFSET(8) NUMBITS(8) [],
333 DLC OFFSET(0) NUMBITS(4) []
335 ],
336 CAN_RDLxR [
337 DATA3 OFFSET(24) NUMBITS(8) [],
339 DATA2 OFFSET(16) NUMBITS(8) [],
341 DATA1 OFFSET(8) NUMBITS(8) [],
343 DATA0 OFFSET(0) NUMBITS(8) []
345 ],
346 CAN_RDHxR [
347 DATA7 OFFSET(24) NUMBITS(8) [],
349 DATA6 OFFSET(16) NUMBITS(8) [],
351 DATA5 OFFSET(8) NUMBITS(8) [],
353 DATA4 OFFSET(0) NUMBITS(8) []
355 ],
356 CAN_FMR [
362 CANSB OFFSET(8) NUMBITS(6) [],
364 FINIT OFFSET(0) NUMBITS(1) []
366 ],
367 CAN_FM1R [
369 FBM OFFSET(0) NUMBITS(28) []
371 ],
372 CAN_FS1R [
373 FSC OFFSET(0) NUMBITS(28) []
375 ],
376 CAN_FFA1R [
377 FFA OFFSET(0) NUMBITS(28) []
379 ],
380 CAN_FA1R [
381 FACT OFFSET(0) NUMBITS(28) []
383 ],
384 CAN_FiRx [
385 FB OFFSET(0) NUMBITS(32) []
387 ]
388];
389
390#[derive(Copy, Clone, PartialEq)]
391enum CanState {
392 Initialization,
393 Normal,
394 Sleep,
395 RunningError(can::Error),
396}
397
398#[derive(Copy, Clone, PartialEq)]
400enum AsyncAction {
401 Enable,
402 AbortReceive,
403 Disabled,
404 EnableError(kernel::ErrorCode),
405}
406
407#[repr(u32)]
408enum BitSegment1 {
409 CanBtrTs1Min = 0b0000,
410 CanBtrTs1Max = 0b1111,
411}
412
413#[repr(u32)]
414enum BitSegment2 {
415 CanBtrTs2Min = 0b0000,
416 CanBtrTs2Max = 0b0111,
417}
418
419#[repr(u32)]
420enum SynchronizationJumpWidth {
421 CanBtrSjwMin = 0b00,
422 CanBtrSjwMax = 0b11,
423}
424
425#[derive(Copy, Clone, PartialEq)]
426pub enum CanInterruptMode {
427 TransmitInterrupt,
428 Fifo0Interrupt,
429 Fifo1Interrupt,
430 ErrorAndStatusChangeInterrupt,
431}
432
433impl From<CanState> for can::State {
434 fn from(state: CanState) -> Self {
435 match state {
436 CanState::Initialization | CanState::Sleep => can::State::Disabled,
437 CanState::Normal => can::State::Running,
438 CanState::RunningError(err) => can::State::Error(err),
439 }
440 }
441}
442
443pub struct Can<'a> {
444 registers: StaticRef<Registers>,
445 clock: CanClock<'a>,
446 can_state: Cell<CanState>,
447 error_interrupt_counter: Cell<u32>,
448 fifo0_interrupt_counter: Cell<u32>,
449 fifo1_interrupt_counter: Cell<u32>,
450 failed_messages: Cell<u32>,
451
452 automatic_retransmission: Cell<bool>,
454 automatic_wake_up: Cell<bool>,
455 operating_mode: OptionalCell<can::OperationMode>,
456 bit_timing: OptionalCell<can::BitTiming>,
457
458 controller_client: OptionalCell<&'static dyn can::ControllerClient>,
460 receive_client:
461 OptionalCell<&'static dyn can::ReceiveClient<{ can::STANDARD_CAN_PACKET_SIZE }>>,
462 transmit_client:
463 OptionalCell<&'static dyn can::TransmitClient<{ can::STANDARD_CAN_PACKET_SIZE }>>,
464
465 rx_buffer: TakeCell<'static, [u8; can::STANDARD_CAN_PACKET_SIZE]>,
467 tx_buffer: TakeCell<'static, [u8; can::STANDARD_CAN_PACKET_SIZE]>,
468
469 deferred_call: DeferredCall,
470 deferred_action: OptionalCell<AsyncAction>,
472}
473
474impl<'a> Can<'a> {
475 pub fn new(clocks: &'a dyn Stm32f4Clocks, registers: StaticRef<Registers>) -> Can<'a> {
476 Can {
477 registers,
478 clock: CanClock(phclk::PeripheralClock::new(
479 phclk::PeripheralClockType::APB1(phclk::PCLK1::CAN1),
480 clocks,
481 )),
482 can_state: Cell::new(CanState::Sleep),
483 error_interrupt_counter: Cell::new(0),
484 fifo0_interrupt_counter: Cell::new(0),
485 fifo1_interrupt_counter: Cell::new(0),
486 failed_messages: Cell::new(0),
487 automatic_retransmission: Cell::new(false),
488 automatic_wake_up: Cell::new(false),
489 operating_mode: OptionalCell::empty(),
490 bit_timing: OptionalCell::empty(),
491 controller_client: OptionalCell::empty(),
492 receive_client: OptionalCell::empty(),
493 transmit_client: OptionalCell::empty(),
494 rx_buffer: TakeCell::empty(),
495 tx_buffer: TakeCell::empty(),
496 deferred_call: DeferredCall::new(),
497 deferred_action: OptionalCell::empty(),
498 }
499 }
500
501 fn wait_for(times: usize, f: impl Fn() -> bool) -> bool {
509 for _ in 0..times {
510 if f() {
511 return true;
512 }
513 }
514
515 false
516 }
517
518 pub fn enable(&self) -> Result<(), kernel::ErrorCode> {
521 self.registers.can_mcr.modify(CAN_MCR::SLEEP::CLEAR);
523
524 self.registers.can_mcr.modify(CAN_MCR::INRQ::SET);
526
527 if !Can::wait_for(20000, || self.registers.can_msr.is_set(CAN_MSR::INAK)) {
532 return Err(kernel::ErrorCode::FAIL);
533 }
534
535 self.can_state.set(CanState::Initialization);
536
537 if !Can::wait_for(20000, || !self.registers.can_msr.is_set(CAN_MSR::SLAK)) {
542 return Err(kernel::ErrorCode::FAIL);
543 }
544
545 self.registers.can_mcr.modify(CAN_MCR::TTCM::CLEAR);
547 self.registers.can_mcr.modify(CAN_MCR::ABOM::CLEAR);
548 self.registers.can_mcr.modify(CAN_MCR::RFLM::CLEAR);
549 self.registers.can_mcr.modify(CAN_MCR::TXFP::CLEAR);
550
551 match self.automatic_retransmission.get() {
552 true => self.registers.can_mcr.modify(CAN_MCR::AWUM::SET),
553 false => self.registers.can_mcr.modify(CAN_MCR::AWUM::CLEAR),
554 }
555
556 match self.automatic_wake_up.get() {
557 true => self.registers.can_mcr.modify(CAN_MCR::NART::CLEAR),
558 false => self.registers.can_mcr.modify(CAN_MCR::NART::SET),
559 }
560
561 if let Some(operating_mode_settings) = self.operating_mode.get() {
562 match operating_mode_settings {
563 can::OperationMode::Loopback => self.registers.can_btr.modify(CAN_BTR::LBKM::SET),
564 can::OperationMode::Monitoring => self.registers.can_btr.modify(CAN_BTR::SILM::SET),
565 can::OperationMode::Freeze => return Err(kernel::ErrorCode::INVAL),
566 _ => {}
567 }
568 }
569
570 if let Some(bit_timing_settings) = self.bit_timing.get() {
572 self.registers
573 .can_btr
574 .modify(CAN_BTR::TS1.val(bit_timing_settings.segment1 as u32));
575 self.registers
576 .can_btr
577 .modify(CAN_BTR::TS2.val(bit_timing_settings.segment2 as u32));
578 self.registers
579 .can_btr
580 .modify(CAN_BTR::SJW.val(bit_timing_settings.sync_jump_width));
581 self.registers
582 .can_btr
583 .modify(CAN_BTR::BRP.val(bit_timing_settings.baud_rate_prescaler));
584 } else {
585 self.enter_sleep_mode();
586 return Err(kernel::ErrorCode::INVAL);
587 }
588
589 Ok(())
590 }
591
592 pub fn config_filter(&self, filter_info: can::FilterParameters, enable: bool) {
594 let filter_number = 1 << filter_info.number;
596
597 self.registers.can_fmr.modify(CAN_FMR::FINIT::SET);
599
600 self.registers.can_fa1r.modify(
602 CAN_FA1R::FACT.val(self.registers.can_fa1r.read(CAN_FA1R::FACT) & !filter_number),
603 );
604
605 match filter_info.scale_bits {
607 can::ScaleBits::Bits16 => {
608 self.registers.can_fs1r.modify(
609 CAN_FS1R::FSC.val(self.registers.can_fs1r.read(CAN_FS1R::FSC) | filter_number),
610 );
611 }
612 can::ScaleBits::Bits32 => {
613 self.registers.can_fs1r.modify(
614 CAN_FS1R::FSC.val(self.registers.can_fs1r.read(CAN_FS1R::FSC) & !filter_number),
615 );
616 }
617 }
618
619 self.registers.can_firx[(filter_info.number as usize) * 2].modify(CAN_FiRx::FB.val(0));
620 self.registers.can_firx[(filter_info.number as usize) * 2 + 1].modify(CAN_FiRx::FB.val(0));
621
622 match filter_info.identifier_mode {
624 can::IdentifierMode::List => {
625 self.registers.can_fm1r.modify(
626 CAN_FM1R::FBM.val(self.registers.can_fm1r.read(CAN_FM1R::FBM) | filter_number),
627 );
628 }
629 can::IdentifierMode::Mask => {
630 self.registers.can_fm1r.modify(
631 CAN_FM1R::FBM.val(self.registers.can_fm1r.read(CAN_FM1R::FBM) & !filter_number),
632 );
633 }
634 }
635
636 if filter_info.fifo_number == 0 {
638 self.registers.can_ffa1r.modify(
639 CAN_FFA1R::FFA.val(self.registers.can_ffa1r.read(CAN_FFA1R::FFA) & !filter_number),
640 );
641 } else {
642 self.registers.can_ffa1r.modify(
643 CAN_FFA1R::FFA.val(self.registers.can_ffa1r.read(CAN_FFA1R::FFA) | filter_number),
644 );
645 }
646
647 if enable {
648 self.registers.can_fa1r.modify(
649 CAN_FA1R::FACT.val(self.registers.can_fa1r.read(CAN_FA1R::FACT) | filter_number),
650 );
651 } else {
652 self.registers.can_fa1r.modify(
653 CAN_FA1R::FACT.val(self.registers.can_fa1r.read(CAN_FA1R::FACT) & !filter_number),
654 );
655 }
656 }
657
658 pub fn enable_filter_config(&self) {
659 self.registers.can_fmr.modify(CAN_FMR::FINIT::CLEAR);
661 }
662
663 pub fn enter_normal_mode(&self) -> Result<(), kernel::ErrorCode> {
664 self.registers.can_mcr.modify(CAN_MCR::INRQ::CLEAR);
666
667 if !Can::wait_for(20000, || !self.registers.can_msr.is_set(CAN_MSR::INAK)) {
672 return Err(kernel::ErrorCode::FAIL);
673 }
674
675 self.can_state.set(CanState::Normal);
676 Ok(())
677 }
678
679 pub fn enter_sleep_mode(&self) {
680 self.disable_irqs();
682 self.registers.can_mcr.modify(CAN_MCR::SLEEP::SET);
683 self.can_state.set(CanState::Sleep);
684 }
685
686 pub fn send_8byte_message(
688 &self,
689 id: can::Id,
690 dlc: usize,
691 rtr: u8,
692 ) -> Result<(), kernel::ErrorCode> {
693 self.enable_irq(CanInterruptMode::ErrorAndStatusChangeInterrupt);
694 if self.can_state.get() == CanState::Normal {
695 if let Some(tx_mailbox) = self.find_empty_mailbox() {
696 match id {
698 can::Id::Standard(id) => {
699 self.registers.can_tx_mailbox[tx_mailbox]
700 .can_tir
701 .modify(CAN_TIxR::IDE::CLEAR);
702 self.registers.can_tx_mailbox[tx_mailbox]
703 .can_tir
704 .modify(CAN_TIxR::STID.val(id as u32 & 0xeff));
705 self.registers.can_tx_mailbox[tx_mailbox]
706 .can_tir
707 .modify(CAN_TIxR::EXID.val(0));
708 }
709 can::Id::Extended(id) => {
710 self.registers.can_tx_mailbox[tx_mailbox]
711 .can_tir
712 .modify(CAN_TIxR::IDE::SET);
713 self.registers.can_tx_mailbox[tx_mailbox]
714 .can_tir
715 .modify(CAN_TIxR::STID.val((id & 0xffc0000) >> 18));
716 self.registers.can_tx_mailbox[tx_mailbox]
717 .can_tir
718 .modify(CAN_TIxR::EXID.val(id & 0x003fffff));
719 }
720 }
721 self.registers.can_tx_mailbox[tx_mailbox]
723 .can_tir
724 .modify(CAN_TIxR::RTR.val(rtr.into()));
725 self.registers.can_tx_mailbox[tx_mailbox]
727 .can_tdtr
728 .modify(CAN_TDTxR::DLC.val(dlc as u32));
729 match self.tx_buffer.map(|tx| {
731 self.registers.can_tx_mailbox[tx_mailbox]
732 .can_tdlr
733 .modify(CAN_TDLxR::DATA0.val(tx[0].into()));
734 self.registers.can_tx_mailbox[tx_mailbox]
735 .can_tdlr
736 .modify(CAN_TDLxR::DATA1.val(tx[1].into()));
737 self.registers.can_tx_mailbox[tx_mailbox]
738 .can_tdlr
739 .modify(CAN_TDLxR::DATA2.val(tx[2].into()));
740 self.registers.can_tx_mailbox[tx_mailbox]
741 .can_tdlr
742 .modify(CAN_TDLxR::DATA3.val(tx[3].into()));
743 self.registers.can_tx_mailbox[tx_mailbox]
745 .can_tdhr
746 .modify(CAN_TDHxR::DATA4.val(tx[4].into()));
747 self.registers.can_tx_mailbox[tx_mailbox]
748 .can_tdhr
749 .modify(CAN_TDHxR::DATA5.val(tx[5].into()));
750 self.registers.can_tx_mailbox[tx_mailbox]
751 .can_tdhr
752 .modify(CAN_TDHxR::DATA6.val(tx[6].into()));
753 self.registers.can_tx_mailbox[tx_mailbox]
754 .can_tdhr
755 .modify(CAN_TDHxR::DATA7.val(tx[7].into()));
756
757 self.registers.can_tx_mailbox[tx_mailbox]
758 .can_tir
759 .modify(CAN_TIxR::TXRQ::SET);
760 }) {
761 Some(()) => Ok(()),
762 None => Err(kernel::ErrorCode::FAIL),
763 }
764 } else {
765 self.failed_messages.replace(self.failed_messages.get() + 1);
767 Err(kernel::ErrorCode::BUSY)
768 }
769 } else {
770 Err(kernel::ErrorCode::OFF)
771 }
772 }
773
774 pub fn find_empty_mailbox(&self) -> Option<usize> {
775 if self.registers.can_tsr.read(CAN_TSR::TME0) == 1 {
776 Some(0)
777 } else if self.registers.can_tsr.read(CAN_TSR::TME1) == 1 {
778 Some(1)
779 } else if self.registers.can_tsr.read(CAN_TSR::TME2) == 1 {
780 Some(2)
781 } else {
782 None
783 }
784 }
785
786 pub fn is_enabled_clock(&self) -> bool {
787 self.clock.is_enabled()
788 }
789
790 pub fn enable_clock(&self) {
791 self.clock.enable();
792 }
793
794 pub fn disable_clock(&self) {
795 self.clock.disable();
796 }
797
798 pub fn handle_transmit_interrupt(&self) {
801 let mut state = Ok(());
802 if self.registers.can_esr.read(CAN_ESR::BOFF) == 1 {
803 state = Err(can::Error::BusOff)
804 } else {
805 if self.registers.can_tsr.read(CAN_TSR::RQCP0) == 1 {
806 state = if self.registers.can_tsr.read(CAN_TSR::TXOK0) == 1 {
808 Ok(())
809 } else if self.registers.can_tsr.read(CAN_TSR::TERR0) == 1 {
810 Err(can::Error::Transmission)
811 } else if self.registers.can_tsr.read(CAN_TSR::ALST0) == 1 {
812 Err(can::Error::ArbitrationLost)
813 } else {
814 Ok(())
815 };
816 self.registers.can_tsr.modify(CAN_TSR::RQCP0::SET);
818 }
819 if self.registers.can_tsr.read(CAN_TSR::RQCP1) == 1 {
820 state = if self.registers.can_tsr.read(CAN_TSR::TXOK1) == 1 {
821 Ok(())
822 } else if self.registers.can_tsr.read(CAN_TSR::TERR1) == 1 {
823 Err(can::Error::Transmission)
824 } else if self.registers.can_tsr.read(CAN_TSR::ALST1) == 1 {
825 Err(can::Error::ArbitrationLost)
826 } else {
827 Ok(())
828 };
829 self.registers.can_tsr.modify(CAN_TSR::RQCP1::SET);
831 }
832 if self.registers.can_tsr.read(CAN_TSR::RQCP2) == 1 {
833 state = if self.registers.can_tsr.read(CAN_TSR::TXOK2) == 1 {
834 Ok(())
835 } else if self.registers.can_tsr.read(CAN_TSR::TERR2) == 1 {
836 Err(can::Error::Transmission)
837 } else if self.registers.can_tsr.read(CAN_TSR::ALST2) == 1 {
838 Err(can::Error::ArbitrationLost)
839 } else {
840 Ok(())
841 };
842 self.registers.can_tsr.modify(CAN_TSR::RQCP2::SET);
844 }
845 }
846
847 match state {
848 Err(err) => self.can_state.set(CanState::RunningError(err)),
849 _ => {}
850 }
851
852 self.transmit_client
853 .map(|transmit_client| match self.tx_buffer.take() {
854 Some(buf) => transmit_client.transmit_complete(state, buf),
855 None => {}
856 });
857 }
858
859 pub fn process_received_message(
860 &self,
861 rx_mailbox: usize,
862 ) -> (can::Id, usize, [u8; can::STANDARD_CAN_PACKET_SIZE]) {
863 let message_id = if self.registers.can_rx_mailbox[rx_mailbox]
864 .can_rir
865 .read(CAN_RIxR::IDE)
866 == 0
867 {
868 can::Id::Standard(
869 self.registers.can_rx_mailbox[rx_mailbox]
870 .can_rir
871 .read(CAN_RIxR::STID) as u16,
872 )
873 } else {
874 can::Id::Extended(
875 (self.registers.can_rx_mailbox[rx_mailbox]
876 .can_rir
877 .read(CAN_RIxR::STID)
878 << 18)
879 | (self.registers.can_rx_mailbox[rx_mailbox]
880 .can_rir
881 .read(CAN_RIxR::EXID)),
882 )
883 };
884 let message_length = self.registers.can_rx_mailbox[rx_mailbox]
885 .can_rdtr
886 .read(CAN_RDTxR::DLC) as usize;
887 let recv: u64 = ((self.registers.can_rx_mailbox[0].can_rdhr.get() as u64) << 32)
888 | (self.registers.can_rx_mailbox[0].can_rdlr.get() as u64);
889 let rx_buf = recv.to_le_bytes();
890 self.rx_buffer.map(|rx| {
891 rx[..8].copy_from_slice(&rx_buf[..8]);
892 });
893
894 (message_id, message_length, rx_buf)
895 }
896
897 pub fn handle_fifo0_interrupt(&self) {
898 if self.registers.can_rf0r.read(CAN_RF0R::FULL0) == 1 {
899 self.registers.can_rf0r.modify(CAN_RF0R::FULL0::SET);
900 }
901
902 if self.registers.can_rf0r.read(CAN_RF0R::FOVR0) == 1 {
903 self.registers.can_rf0r.modify(CAN_RF0R::FOVR0::SET);
904 }
905
906 if self.registers.can_rf0r.read(CAN_RF0R::FMP0) != 0 {
907 let (message_id, message_length, mut rx_buf) = self.process_received_message(0);
908
909 self.receive_client.map(|receive_client| {
910 receive_client.message_received(message_id, &mut rx_buf, message_length, Ok(()))
911 });
912 self.fifo0_interrupt_counter
913 .replace(self.fifo0_interrupt_counter.get() + 1);
914
915 self.registers.can_rf0r.modify(CAN_RF0R::RFOM0::SET);
917 }
918 }
919
920 pub fn handle_fifo1_interrupt(&self) {
921 if self.registers.can_rf1r.read(CAN_RF1R::FULL1) == 1 {
922 self.registers.can_rf1r.modify(CAN_RF1R::FULL1::SET);
923 }
924
925 if self.registers.can_rf1r.read(CAN_RF1R::FOVR1) == 1 {
926 self.registers.can_rf1r.modify(CAN_RF1R::FOVR1::SET);
927 }
928
929 if self.registers.can_rf1r.read(CAN_RF1R::FMP1) != 0 {
930 self.fifo1_interrupt_counter
931 .replace(self.fifo1_interrupt_counter.get() + 1);
932 let (message_id, message_length, mut rx_buf) = self.process_received_message(1);
933 self.receive_client.map(|receive_client| {
934 receive_client.message_received(message_id, &mut rx_buf, message_length, Ok(()))
935 });
936
937 self.registers.can_rf1r.modify(CAN_RF1R::RFOM1::SET);
939 }
940 }
941
942 pub fn handle_error_status_interrupt(&self) {
943 if self.registers.can_msr.read(CAN_MSR::WKUI) == 1 {
945 self.registers.can_msr.modify(CAN_MSR::WKUI::SET);
947 }
948 if self.registers.can_msr.read(CAN_MSR::SLAKI) == 1 {
949 self.registers.can_msr.modify(CAN_MSR::SLAKI::SET);
951 }
952
953 if self.registers.can_esr.read(CAN_ESR::EWGF) == 1 {
956 self.can_state
957 .set(CanState::RunningError(can::Error::Warning));
958 }
959 if self.registers.can_esr.read(CAN_ESR::EPVF) == 1 {
961 self.can_state
962 .set(CanState::RunningError(can::Error::Passive));
963 }
964 if self.registers.can_esr.read(CAN_ESR::BOFF) == 1 {
966 self.can_state
967 .set(CanState::RunningError(can::Error::BusOff));
968 }
969 match self.registers.can_esr.read(CAN_ESR::LEC) {
971 0x001 => self
972 .can_state
973 .set(CanState::RunningError(can::Error::Stuff)),
974 0x010 => self.can_state.set(CanState::RunningError(can::Error::Form)),
975 0x011 => self.can_state.set(CanState::RunningError(can::Error::Ack)),
976 0x100 => self
977 .can_state
978 .set(CanState::RunningError(can::Error::BitRecessive)),
979 0x101 => self
980 .can_state
981 .set(CanState::RunningError(can::Error::BitDominant)),
982 0x110 => self.can_state.set(CanState::RunningError(can::Error::Crc)),
983 0x111 => self
984 .can_state
985 .set(CanState::RunningError(can::Error::SetBySoftware)),
986 _ => {}
987 }
988
989 self.error_interrupt_counter
990 .replace(self.error_interrupt_counter.get() + 1);
991
992 match self.can_state.get() {
993 CanState::RunningError(err) => {
994 self.controller_client.map(|controller_client| {
995 controller_client.state_changed(kernel::hil::can::State::Error(err));
996 });
997 }
998 _ => {}
999 }
1000 }
1001
1002 pub fn enable_irq(&self, interrupt: CanInterruptMode) {
1003 match interrupt {
1004 CanInterruptMode::TransmitInterrupt => {
1005 self.registers.can_ier.modify(CAN_IER::TMEIE::SET);
1006 }
1007 CanInterruptMode::Fifo0Interrupt => {
1008 self.registers.can_ier.modify(CAN_IER::FMPIE0::SET);
1009 self.registers.can_ier.modify(CAN_IER::FFIE0::SET);
1010 self.registers.can_ier.modify(CAN_IER::FOVIE0::SET);
1011 }
1012 CanInterruptMode::Fifo1Interrupt => {
1013 self.registers.can_ier.modify(CAN_IER::FMPIE1::SET);
1014 self.registers.can_ier.modify(CAN_IER::FFIE1::SET);
1015 self.registers.can_ier.modify(CAN_IER::FOVIE1::SET);
1016 }
1017 CanInterruptMode::ErrorAndStatusChangeInterrupt => {
1018 self.registers.can_ier.modify(CAN_IER::ERRIE::SET);
1019 self.registers.can_ier.modify(CAN_IER::EWGIE::SET);
1020 self.registers.can_ier.modify(CAN_IER::EPVIE::SET);
1021 self.registers.can_ier.modify(CAN_IER::BOFIE::SET);
1022 self.registers.can_ier.modify(CAN_IER::LECIE::SET);
1023 self.registers.can_ier.modify(CAN_IER::WKUIE::SET);
1024 self.registers.can_ier.modify(CAN_IER::SLKIE::SET);
1025 }
1026 }
1027 }
1028
1029 pub fn disable_irq(&self, interrupt: CanInterruptMode) {
1030 match interrupt {
1031 CanInterruptMode::TransmitInterrupt => {
1032 self.registers.can_ier.modify(CAN_IER::TMEIE::CLEAR);
1033 }
1034 CanInterruptMode::Fifo0Interrupt => {
1035 self.registers.can_ier.modify(CAN_IER::FMPIE0::CLEAR);
1036 self.registers.can_ier.modify(CAN_IER::FFIE0::CLEAR);
1037 self.registers.can_ier.modify(CAN_IER::FOVIE0::CLEAR);
1038 }
1039 CanInterruptMode::Fifo1Interrupt => {
1040 self.registers.can_ier.modify(CAN_IER::FMPIE1::CLEAR);
1041 self.registers.can_ier.modify(CAN_IER::FFIE1::CLEAR);
1042 self.registers.can_ier.modify(CAN_IER::FOVIE1::CLEAR);
1043 }
1044 CanInterruptMode::ErrorAndStatusChangeInterrupt => {
1045 self.registers.can_ier.modify(CAN_IER::ERRIE::CLEAR);
1046 self.registers.can_ier.modify(CAN_IER::EWGIE::CLEAR);
1047 self.registers.can_ier.modify(CAN_IER::EPVIE::CLEAR);
1048 self.registers.can_ier.modify(CAN_IER::BOFIE::CLEAR);
1049 self.registers.can_ier.modify(CAN_IER::LECIE::CLEAR);
1050 self.registers.can_ier.modify(CAN_IER::WKUIE::CLEAR);
1051 self.registers.can_ier.modify(CAN_IER::SLKIE::CLEAR);
1052 }
1053 }
1054 }
1055
1056 pub fn enable_irqs(&self) {
1057 self.enable_irq(CanInterruptMode::TransmitInterrupt);
1058 self.enable_irq(CanInterruptMode::Fifo0Interrupt);
1059 self.enable_irq(CanInterruptMode::Fifo1Interrupt);
1060 self.enable_irq(CanInterruptMode::ErrorAndStatusChangeInterrupt);
1061 }
1062
1063 pub fn disable_irqs(&self) {
1064 self.disable_irq(CanInterruptMode::TransmitInterrupt);
1065 self.disable_irq(CanInterruptMode::Fifo0Interrupt);
1066 self.disable_irq(CanInterruptMode::Fifo1Interrupt);
1067 self.disable_irq(CanInterruptMode::ErrorAndStatusChangeInterrupt);
1068 }
1069}
1070
1071impl DeferredCallClient for Can<'_> {
1072 fn register(&'static self) {
1073 self.deferred_call.register(self)
1074 }
1075
1076 fn handle_deferred_call(&self) {
1077 match self.deferred_action.take() {
1078 Some(action) => match action {
1079 AsyncAction::Enable => {
1080 if let Err(enable_err) = self.enter_normal_mode() {
1081 self.controller_client.map(|controller_client| {
1082 controller_client.state_changed(self.can_state.get().into());
1083 controller_client.enabled(Err(enable_err));
1084 });
1085 }
1086 self.controller_client.map(|controller_client| {
1087 controller_client.state_changed(can::State::Running);
1088 controller_client.enabled(Ok(()));
1089 });
1090 }
1091 AsyncAction::AbortReceive => {
1092 if let Some(rx) = self.rx_buffer.take() {
1093 self.receive_client
1094 .map(|receive_client| receive_client.stopped(rx));
1095 }
1096 }
1097 AsyncAction::Disabled => {
1098 self.controller_client.map(|controller_client| {
1099 controller_client.state_changed(self.can_state.get().into());
1100 controller_client.disabled(Ok(()));
1101 });
1102 }
1103 AsyncAction::EnableError(err) => {
1104 self.controller_client.map(|controller_client| {
1105 controller_client.state_changed(self.can_state.get().into());
1106 controller_client.enabled(Err(err));
1107 });
1108 }
1109 },
1110 None => todo!(),
1112 }
1113 }
1114}
1115
1116struct CanClock<'a>(phclk::PeripheralClock<'a>);
1117
1118impl ClockInterface for CanClock<'_> {
1119 fn is_enabled(&self) -> bool {
1120 self.0.is_enabled()
1121 }
1122
1123 fn enable(&self) {
1124 self.0.enable();
1125 }
1126
1127 fn disable(&self) {
1128 self.0.disable();
1129 }
1130}
1131
1132impl can::Configure for Can<'_> {
1133 const MIN_BIT_TIMINGS: can::BitTiming = can::BitTiming {
1134 segment1: BitSegment1::CanBtrTs1Min as u8,
1135 segment2: BitSegment2::CanBtrTs2Min as u8,
1136 propagation: 0,
1137 sync_jump_width: SynchronizationJumpWidth::CanBtrSjwMin as u32,
1138 baud_rate_prescaler: BRP_MIN_STM32,
1139 };
1140
1141 const MAX_BIT_TIMINGS: can::BitTiming = can::BitTiming {
1142 segment1: BitSegment1::CanBtrTs1Max as u8,
1143 segment2: BitSegment2::CanBtrTs2Max as u8,
1144 propagation: 0,
1145 sync_jump_width: SynchronizationJumpWidth::CanBtrSjwMax as u32,
1146 baud_rate_prescaler: BRP_MAX_STM32,
1147 };
1148
1149 const SYNC_SEG: u8 = 1;
1150
1151 fn set_bitrate(&self, bitrate: u32) -> Result<(), kernel::ErrorCode> {
1152 let bit_timing = Self::bit_timing_for_bitrate(16_000_000, bitrate)?;
1153 self.set_bit_timing(bit_timing)
1154 }
1155
1156 fn set_bit_timing(&self, bit_timing: can::BitTiming) -> Result<(), kernel::ErrorCode> {
1157 match self.can_state.get() {
1158 CanState::Sleep => {
1159 self.bit_timing.set(bit_timing);
1160 Ok(())
1161 }
1162 CanState::Normal | CanState::Initialization | CanState::RunningError(_) => {
1163 Err(kernel::ErrorCode::BUSY)
1164 }
1165 }
1166 }
1167
1168 fn set_operation_mode(&self, mode: can::OperationMode) -> Result<(), kernel::ErrorCode> {
1169 match self.can_state.get() {
1170 CanState::Sleep => {
1171 self.operating_mode.set(mode);
1172 Ok(())
1173 }
1174 CanState::Normal | CanState::Initialization | CanState::RunningError(_) => {
1175 Err(kernel::ErrorCode::BUSY)
1176 }
1177 }
1178 }
1179
1180 fn get_bit_timing(&self) -> Result<can::BitTiming, kernel::ErrorCode> {
1181 if let Some(bit_timing) = self.bit_timing.get() {
1182 Ok(bit_timing)
1183 } else {
1184 Err(kernel::ErrorCode::INVAL)
1185 }
1186 }
1187
1188 fn get_operation_mode(&self) -> Result<can::OperationMode, kernel::ErrorCode> {
1189 if let Some(operation_mode) = self.operating_mode.get() {
1190 Ok(operation_mode)
1191 } else {
1192 Err(kernel::ErrorCode::INVAL)
1193 }
1194 }
1195
1196 fn set_automatic_retransmission(&self, automatic: bool) -> Result<(), kernel::ErrorCode> {
1197 match self.can_state.get() {
1198 CanState::Sleep => {
1199 self.automatic_retransmission.replace(automatic);
1200 Ok(())
1201 }
1202 CanState::Normal | CanState::Initialization | CanState::RunningError(_) => {
1203 Err(kernel::ErrorCode::BUSY)
1204 }
1205 }
1206 }
1207
1208 fn set_wake_up(&self, wake_up: bool) -> Result<(), kernel::ErrorCode> {
1209 match self.can_state.get() {
1210 CanState::Sleep => {
1211 self.automatic_wake_up.replace(wake_up);
1212 Ok(())
1213 }
1214 CanState::Normal | CanState::Initialization | CanState::RunningError(_) => {
1215 Err(kernel::ErrorCode::BUSY)
1216 }
1217 }
1218 }
1219
1220 fn get_automatic_retransmission(&self) -> Result<bool, kernel::ErrorCode> {
1221 Ok(self.automatic_retransmission.get())
1222 }
1223
1224 fn get_wake_up(&self) -> Result<bool, kernel::ErrorCode> {
1225 Ok(self.automatic_wake_up.get())
1226 }
1227
1228 fn receive_fifo_count(&self) -> usize {
1229 2
1230 }
1231}
1232
1233impl can::Controller for Can<'_> {
1234 fn set_client(&self, client: Option<&'static dyn can::ControllerClient>) {
1235 if let Some(client) = client {
1236 self.controller_client.replace(client);
1237 } else {
1238 self.controller_client.clear();
1239 }
1240 }
1241
1242 fn enable(&self) -> Result<(), kernel::ErrorCode> {
1243 match self.can_state.get() {
1244 CanState::Sleep => {
1245 if self.bit_timing.is_none() || self.operating_mode.is_none() {
1246 Err(kernel::ErrorCode::INVAL)
1247 } else {
1248 let r = self.enable();
1249 if self.deferred_action.is_some() {
1251 Err(kernel::ErrorCode::BUSY)
1252 } else {
1253 match r {
1255 Ok(()) => {
1256 self.deferred_action.set(AsyncAction::Enable);
1257 }
1258 Err(err) => {
1259 self.deferred_action.set(AsyncAction::EnableError(err));
1260 }
1261 }
1262 self.deferred_call.set();
1263 r
1264 }
1265 }
1266 }
1267 CanState::Normal | CanState::Initialization => Err(kernel::ErrorCode::ALREADY),
1268 CanState::RunningError(_) => Err(kernel::ErrorCode::FAIL),
1269 }
1270 }
1271
1272 fn disable(&self) -> Result<(), kernel::ErrorCode> {
1273 match self.can_state.get() {
1274 CanState::Normal | CanState::RunningError(_) => {
1275 self.enter_sleep_mode();
1276 if self.deferred_action.is_some() {
1277 return Err(kernel::ErrorCode::BUSY);
1279 } else {
1280 self.deferred_action.set(AsyncAction::Disabled);
1282 self.deferred_call.set();
1283 }
1284 Ok(())
1285 }
1286 CanState::Sleep | CanState::Initialization => Err(kernel::ErrorCode::OFF),
1287 }
1288 }
1289
1290 fn get_state(&self) -> Result<can::State, kernel::ErrorCode> {
1291 Ok(self.can_state.get().into())
1292 }
1293}
1294
1295impl can::Transmit<{ can::STANDARD_CAN_PACKET_SIZE }> for Can<'_> {
1296 fn set_client(
1297 &self,
1298 client: Option<&'static dyn can::TransmitClient<{ can::STANDARD_CAN_PACKET_SIZE }>>,
1299 ) {
1300 if let Some(client) = client {
1301 self.transmit_client.set(client);
1302 } else {
1303 self.transmit_client.clear();
1304 }
1305 }
1306
1307 fn send(
1308 &self,
1309 id: can::Id,
1310 buffer: &'static mut [u8; can::STANDARD_CAN_PACKET_SIZE],
1311 len: usize,
1312 ) -> Result<
1313 (),
1314 (
1315 kernel::ErrorCode,
1316 &'static mut [u8; can::STANDARD_CAN_PACKET_SIZE],
1317 ),
1318 > {
1319 match self.can_state.get() {
1320 CanState::Normal | CanState::RunningError(_) => {
1321 self.tx_buffer.replace(buffer);
1322 self.enable_irq(CanInterruptMode::TransmitInterrupt);
1323 self.can_state.set(CanState::Normal);
1324 match self.send_8byte_message(id, len, 0) {
1325 Ok(()) => Ok(()),
1326 Err(err) => Err((err, self.tx_buffer.take().unwrap())),
1327 }
1328 }
1329 CanState::Sleep | CanState::Initialization => Err((kernel::ErrorCode::OFF, buffer)),
1330 }
1331 }
1332}
1333
1334impl can::Receive<{ can::STANDARD_CAN_PACKET_SIZE }> for Can<'_> {
1335 fn set_client(
1336 &self,
1337 client: Option<&'static dyn can::ReceiveClient<{ can::STANDARD_CAN_PACKET_SIZE }>>,
1338 ) {
1339 if let Some(client) = client {
1340 self.receive_client.set(client);
1341 } else {
1342 self.receive_client.clear();
1343 }
1344 }
1345
1346 fn start_receive_process(
1347 &self,
1348 buffer: &'static mut [u8; can::STANDARD_CAN_PACKET_SIZE],
1349 ) -> Result<
1350 (),
1351 (
1352 kernel::ErrorCode,
1353 &'static mut [u8; can::STANDARD_CAN_PACKET_SIZE],
1354 ),
1355 > {
1356 match self.can_state.get() {
1357 CanState::Normal | CanState::RunningError(_) => {
1358 self.can_state.set(CanState::Normal);
1359 self.config_filter(
1360 can::FilterParameters {
1361 number: 0,
1362 scale_bits: can::ScaleBits::Bits32,
1363 identifier_mode: can::IdentifierMode::Mask,
1364 fifo_number: 0,
1365 },
1366 true,
1367 );
1368 self.config_filter(
1369 can::FilterParameters {
1370 number: 1,
1371 scale_bits: can::ScaleBits::Bits32,
1372 identifier_mode: can::IdentifierMode::Mask,
1373 fifo_number: 1,
1374 },
1375 true,
1376 );
1377 self.enable_filter_config();
1378 self.enable_irq(CanInterruptMode::Fifo0Interrupt);
1379 self.enable_irq(CanInterruptMode::Fifo1Interrupt);
1380 self.rx_buffer.put(Some(buffer));
1381 Ok(())
1382 }
1383 CanState::Sleep | CanState::Initialization => Err((kernel::ErrorCode::OFF, buffer)),
1384 }
1385 }
1386
1387 fn stop_receive(&self) -> Result<(), kernel::ErrorCode> {
1388 match self.can_state.get() {
1389 CanState::Normal | CanState::RunningError(_) => {
1390 self.can_state.set(CanState::Normal);
1391 self.config_filter(
1392 can::FilterParameters {
1393 number: 0,
1394 scale_bits: can::ScaleBits::Bits32,
1395 identifier_mode: can::IdentifierMode::Mask,
1396 fifo_number: 0,
1397 },
1398 false,
1399 );
1400 self.config_filter(
1401 can::FilterParameters {
1402 number: 1,
1403 scale_bits: can::ScaleBits::Bits32,
1404 identifier_mode: can::IdentifierMode::Mask,
1405 fifo_number: 1,
1406 },
1407 false,
1408 );
1409 self.enable_filter_config();
1410 self.disable_irq(CanInterruptMode::Fifo0Interrupt);
1411 self.disable_irq(CanInterruptMode::Fifo1Interrupt);
1412 if self.deferred_action.is_some() {
1414 Err(kernel::ErrorCode::BUSY)
1415 } else if self.rx_buffer.is_none() {
1417 Err(kernel::ErrorCode::SIZE)
1418 } else {
1419 self.deferred_action.set(AsyncAction::AbortReceive);
1421 self.deferred_call.set();
1422 Ok(())
1423 }
1424 }
1425 CanState::Sleep | CanState::Initialization => Err(kernel::ErrorCode::OFF),
1426 }
1427 }
1428}