stm32f4xx/
can.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022
4// Copyright OxidOS Automotive SRL 2022
5//
6// Author: Teona Severin <teona.severin@oxidos.io>
7
8//! Low-level CAN driver for STM32F4XX chips
9//!
10
11use 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        /// CAN control and status registers
31        (0x000 => can_mcr: ReadWrite<u32, CAN_MCR::Register>),
32        /// CAN master status register
33        (0x004 => can_msr: ReadWrite<u32, CAN_MSR::Register>),
34        /// CAN transmit status register
35        (0x008 => can_tsr: ReadWrite<u32, CAN_TSR::Register>),
36        /// CAN receive FIFO 0 register
37        (0x00c => can_rf0r: ReadWrite<u32, CAN_RF0R::Register>),
38        /// CAN receive FIFO 1 registers
39        (0x010 => can_rf1r: ReadWrite<u32, CAN_RF1R::Register>),
40        /// CAN interrupt enable register
41        (0x014 => can_ier: ReadWrite<u32, CAN_IER::Register>),
42        /// CAN error status register
43        (0x018 => can_esr: ReadWrite<u32, CAN_ESR::Register>),
44        /// CAN bit timing register
45        (0x01c => can_btr: ReadWrite<u32, CAN_BTR::Register>),
46        (0x020 => _reserved0),
47        ///
48        ///
49        /// CAN MAILBOX REGISTERS
50        ///
51        /// CAN TX mailbox identifier registers
52        (0x180 => can_tx_mailbox: [TransmitMailBox; TX_MAILBOX_COUNT]),
53        /// CAN RX mailbox identifier registers
54        (0x1b0 => can_rx_mailbox: [ReceiveMailBox; RX_MAILBOX_COUNT]),
55        (0x1d0 => _reserved1),
56        ///
57        ///
58        /// CAN FILTER REGISTERS
59        ///
60        ///
61        /// CAN filter master register
62        (0x200 => can_fmr: ReadWrite<u32, CAN_FMR::Register>),
63        /// CAN filter mode register
64        (0x204 => can_fm1r: ReadWrite<u32, CAN_FM1R::Register>),
65        (0x208 => _reserved2),
66        /// CAN filter scale register
67        (0x20c => can_fs1r: ReadWrite<u32, CAN_FS1R::Register>),
68        (0x210 => _reserved3),
69        /// CAN filter FIFO assignment register
70        (0x214 => can_ffa1r: ReadWrite<u32, CAN_FFA1R::Register>),
71        (0x218 => _reserved4),
72        /// CAN filter activation register
73        (0x21c => can_fa1r: ReadWrite<u32, CAN_FA1R::Register>),
74        (0x220 => _reserved5),
75        /// Filter bank 0-27 for register 1-2
76        (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        /// Debug freeze
100        DBF OFFSET(16) NUMBITS(1) [],
101        /// bcXAN software master reset
102        RESET OFFSET(15) NUMBITS(1) [],
103        /// Time triggered communication mode
104        TTCM OFFSET(7) NUMBITS(1) [],
105        /// Automatic bus-off management
106        ABOM OFFSET(6) NUMBITS(1) [],
107        /// Automatic wakeup mode
108        AWUM OFFSET(5) NUMBITS(1) [],
109        /// No automatic retransmission
110        NART OFFSET(4) NUMBITS(1) [],
111        /// Receive FIFO locked mode
112        RFLM OFFSET(3) NUMBITS(1) [],
113        /// Transmit FIFO prioritY
114        TXFP OFFSET(2) NUMBITS(1) [],
115        /// Sleep mode request
116        SLEEP OFFSET(1) NUMBITS(1) [],
117        /// Initialization request
118        INRQ OFFSET(0) NUMBITS(1) []
119    ],
120    CAN_MSR [
121        /// CAN Rx signal
122        RX OFFSET(11) NUMBITS(1) [],
123        /// Last sample point
124        SAMP OFFSET(10) NUMBITS(1) [],
125        /// Receive mode
126        RXM OFFSET(9) NUMBITS(1) [],
127        /// Transmit mode
128        TXM OFFSET(8) NUMBITS(1) [],
129        /// Sleep acknowledge interrupt
130        SLAKI OFFSET(4) NUMBITS(1) [],
131        /// Wakeup interrupt
132        WKUI OFFSET(3) NUMBITS(1) [],
133        /// Error interrupt
134        ERRI OFFSET(2) NUMBITS(1) [],
135        /// Sleep acknowledge
136        SLAK OFFSET(1) NUMBITS(1) [],
137        /// Initialization acknowledge
138        INAK OFFSET(0) NUMBITS(1) []
139    ],
140    CAN_TSR [
141        /// Lowest priority flag for mailbox 2
142        LOW2 OFFSET(31) NUMBITS(1) [],
143        /// Lowest priority flag for mailbox 1
144        LOW1 OFFSET(30) NUMBITS(1) [],
145        /// Lowest priority flag for mailbox 0
146        LOW0 OFFSET(29) NUMBITS(1) [],
147        /// Transmit mailbox 2 empty
148        TME2 OFFSET(28) NUMBITS(1) [],
149        /// Transmit mailbox 1 empty
150        TME1 OFFSET(27) NUMBITS(1) [],
151        /// Transmit mailbox 0 empty
152        TME0 OFFSET(26) NUMBITS(1) [],
153        /// Mailbox code
154        CODE OFFSET(24) NUMBITS(2) [],
155        /// Abort request for mailbox 2
156        ABRQ2 OFFSET(23) NUMBITS(1) [],
157        /// Transmission error of mailbox 2
158        TERR2 OFFSET(19) NUMBITS(1) [],
159        /// Arbitration lost for mailbox 2
160        ALST2 OFFSET(18) NUMBITS(1) [],
161        /// Transmission OK of mailbox 2
162        TXOK2 OFFSET(17) NUMBITS(1) [],
163        /// Request completed mailbox 2
164        RQCP2 OFFSET(16) NUMBITS(1) [],
165        /// Abort request for mailbox 1
166        ABRQ1 OFFSET(15) NUMBITS(1) [],
167        /// Transmission error of mailbox 1
168        TERR1 OFFSET(11) NUMBITS(1) [],
169        /// Arbitration lost for mailbox 1
170        ALST1 OFFSET(10) NUMBITS(1) [],
171        /// Transmission OK of mailbox 1
172        TXOK1 OFFSET(9) NUMBITS(1) [],
173        /// Request completed mailbox 1
174        RQCP1 OFFSET(8) NUMBITS(1) [],
175        /// Abort request for mailbox 0
176        ABRQ0 OFFSET(7) NUMBITS(1) [],
177        /// Transmission error of mailbox 0
178        TERR0 OFFSET(3) NUMBITS(1) [],
179        /// Arbitration lost for mailbox 0
180        ALST0 OFFSET(2) NUMBITS(1) [],
181        /// Transmission OK of mailbox 0
182        TXOK0 OFFSET(1) NUMBITS(1) [],
183        /// Request completed mailbox 0
184        RQCP0 OFFSET(0) NUMBITS(1) []
185    ],
186    CAN_RF0R [
187        /// Release FIFO 0 output mailbox
188        RFOM0 OFFSET(5) NUMBITS(1) [],
189        /// FIFO 0 overrun
190        FOVR0 OFFSET(4) NUMBITS(1) [],
191        /// FIFO 0 full
192        FULL0 OFFSET(3) NUMBITS(1) [],
193        /// FIFO 0 message pending
194        FMP0 OFFSET(0) NUMBITS(2) []
195    ],
196    CAN_RF1R [
197        /// Release FIFO 1 output mailbox
198        RFOM1 OFFSET(5) NUMBITS(1) [],
199        /// FIFO 1 overrun
200        FOVR1 OFFSET(4) NUMBITS(1) [],
201        /// FIFO 1 full
202        FULL1 OFFSET(3) NUMBITS(1) [],
203        /// FIFO 1 message pending
204        FMP1 OFFSET(0) NUMBITS(2) []
205    ],
206    CAN_IER [
207        /// Sleep interrupt enable
208        SLKIE OFFSET(17) NUMBITS(1) [],
209        /// Wakeup interrupt enable
210        WKUIE OFFSET(16) NUMBITS(1) [],
211        /// Error interrupt enable
212        ERRIE OFFSET(15) NUMBITS(1) [],
213        /// Last error code interrupt enable
214        LECIE OFFSET(11) NUMBITS(1) [],
215        /// Bus-off interrupt enable
216        BOFIE OFFSET(10) NUMBITS(1) [],
217        /// Error passive interrupt enable
218        EPVIE OFFSET(9) NUMBITS(1) [],
219        /// Error warning interrupt enable
220        EWGIE OFFSET(8) NUMBITS(1) [],
221        /// FIFO 1 overrun interrupt enable
222        FOVIE1 OFFSET(6) NUMBITS(1) [],
223        /// FIFO 1 full interrupt enable
224        FFIE1 OFFSET(5) NUMBITS(1) [],
225        /// FIFO 1 message pending interrupt enable
226        FMPIE1 OFFSET(4) NUMBITS(1) [],
227        /// FIFO 0 overrun interrupt enable
228        FOVIE0 OFFSET(3) NUMBITS(1) [],
229        /// FIFO 0 full interrupt enable
230        FFIE0 OFFSET(2) NUMBITS(1) [],
231        /// FIFO 0 message pending interrupt enable
232        FMPIE0 OFFSET(1) NUMBITS(1) [],
233        /// Transmit mailbox empty interrupt enable
234        TMEIE OFFSET(0) NUMBITS(1) []
235    ],
236    CAN_ESR [
237        /// Receive error counter
238        REC OFFSET(24) NUMBITS(8) [],
239        /// Least significant byte of the 9-bit transmit error counter
240        TEC OFFSET(16) NUMBITS(8) [],
241        /// Last error code
242        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        /// Bus-off flag
253        BOFF OFFSET(2) NUMBITS(1) [],
254        /// Error passive flag
255        EPVF OFFSET(1) NUMBITS(1) [],
256        /// Error warning flag
257        EWGF OFFSET(0) NUMBITS(1) []
258    ],
259    CAN_BTR [
260        /// Silent mode (debug)
261        SILM OFFSET(31) NUMBITS(1) [],
262        /// Loop back mode (debug)
263        LBKM OFFSET(30) NUMBITS(1) [],
264        /// Resynchronization jump width
265        SJW OFFSET(24) NUMBITS(2) [],
266        /// Time segment 2
267        TS2 OFFSET(20) NUMBITS(3) [],
268        /// Time segment 1
269        TS1 OFFSET(16) NUMBITS(4) [],
270        /// Baud rate prescaler
271        BRP OFFSET(0) NUMBITS(10) []
272    ],
273    ///
274    ///
275    /// CAN mailbox registers
276    ///
277    ///
278    CAN_TIxR [
279        /// Standard identifier or extended identifier
280        STID OFFSET(21) NUMBITS(11) [],
281        /// Extended identifier
282        EXID OFFSET(3) NUMBITS(18) [],
283        /// Identifier extension
284        IDE OFFSET(2) NUMBITS(1) [],
285        /// Remote transmission request
286        RTR OFFSET(1) NUMBITS(1) [],
287        /// Transmit mailbox request
288        TXRQ OFFSET(0) NUMBITS(1) []
289    ],
290    CAN_TDTxR [
291        /// Message time stamp
292        TIME OFFSET(16) NUMBITS(16) [],
293        /// Transmit global time
294        TGT OFFSET(8) NUMBITS(1) [],
295        /// Data length code
296        DLC OFFSET(0) NUMBITS(4) []
297    ],
298    CAN_TDLxR [
299        /// Data byte 3
300        DATA3 OFFSET(24) NUMBITS(8) [],
301        /// Data byte 2
302        DATA2 OFFSET(16) NUMBITS(8) [],
303        /// Data byte 1
304        DATA1 OFFSET(8) NUMBITS(8) [],
305        /// Data byte 0
306        DATA0 OFFSET(0) NUMBITS(8) []
307    ],
308    CAN_TDHxR [
309        /// Data byte 7
310        DATA7 OFFSET(24) NUMBITS(8) [],
311        /// Data byte 6
312        DATA6 OFFSET(16) NUMBITS(8) [],
313        /// Data byte 5
314        DATA5 OFFSET(8) NUMBITS(8) [],
315        /// Data byte 4
316        DATA4 OFFSET(0) NUMBITS(8) []
317    ],
318    CAN_RIxR [
319        /// Standard identifier or extended identifier
320        STID OFFSET(21) NUMBITS(11) [],
321        /// Extended identifier
322        EXID OFFSET(3) NUMBITS(18) [],
323        /// Identifier extension
324        IDE OFFSET(2) NUMBITS(1) [],
325        /// Remote transmission request
326        RTR OFFSET(1) NUMBITS(1) []
327    ],
328    CAN_RDTxR [
329        /// Message time stamp
330        TIME OFFSET(16) NUMBITS(16) [],
331        /// Filter match index
332        FMI OFFSET(8) NUMBITS(8) [],
333        /// Data length code
334        DLC OFFSET(0) NUMBITS(4) []
335    ],
336    CAN_RDLxR [
337        /// Data byte 3
338        DATA3 OFFSET(24) NUMBITS(8) [],
339        /// Data byte 2
340        DATA2 OFFSET(16) NUMBITS(8) [],
341        /// Data byte 1
342        DATA1 OFFSET(8) NUMBITS(8) [],
343        /// Data byte 0
344        DATA0 OFFSET(0) NUMBITS(8) []
345    ],
346    CAN_RDHxR [
347        /// Data byte 7
348        DATA7 OFFSET(24) NUMBITS(8) [],
349        /// Data byte 6
350        DATA6 OFFSET(16) NUMBITS(8) [],
351        /// Data byte 5
352        DATA5 OFFSET(8) NUMBITS(8) [],
353        /// Data byte 4
354        DATA4 OFFSET(0) NUMBITS(8) []
355    ],
356    ///
357    ///
358    /// CAN filter registers
359    ///
360    ///
361    CAN_FMR [
362        /// CAN start bank
363        CANSB OFFSET(8) NUMBITS(6) [],
364        /// Filter initialization mode
365        FINIT OFFSET(0) NUMBITS(1) []
366    ],
367    /// CAN filter mode register
368    CAN_FM1R [
369        /// Filter mode
370        FBM OFFSET(0) NUMBITS(28) []
371    ],
372    CAN_FS1R [
373        /// Filter scale configuration
374        FSC OFFSET(0) NUMBITS(28) []
375    ],
376    CAN_FFA1R [
377        /// Filter FIFO assignment for filter x
378        FFA OFFSET(0) NUMBITS(28) []
379    ],
380    CAN_FA1R [
381        /// Filter active
382        FACT OFFSET(0) NUMBITS(28) []
383    ],
384    CAN_FiRx [
385        /// Filter bits
386        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// The 4 possbile actions that the deferred call task can do.
399#[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    // communication parameters
453    automatic_retransmission: Cell<bool>,
454    automatic_wake_up: Cell<bool>,
455    operating_mode: OptionalCell<can::OperationMode>,
456    bit_timing: OptionalCell<can::BitTiming>,
457
458    // clients
459    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    // buffers for transmission and reception
466    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 call task action
471    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    /// This function is used for busy waiting and checks if the closure
502    /// received as an argument returns a true value for `times` times.
503    ///
504    /// Usage: check is the INAK bit in the CAN_MSR is set for 200_000 times.
505    /// ```ignore
506    ///    Can::wait_for(200_000, || self.registers.can_msr.is_set(CAN_MSR::INAK))
507    /// ```
508    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    /// Enable the peripheral with the stored communication parameters:
519    /// bit timing settings and communication mode
520    pub fn enable(&self) -> Result<(), kernel::ErrorCode> {
521        // leave Sleep Mode
522        self.registers.can_mcr.modify(CAN_MCR::SLEEP::CLEAR);
523
524        // request to enter the initialization mode
525        self.registers.can_mcr.modify(CAN_MCR::INRQ::SET);
526
527        // After requesting to enter the initialization mode, the driver
528        // must wait for ACK from the peripheral - the INAK bit to be set
529        // (as explained in RM0090 Reference Manual, Chapter 32.4.1).
530        // This is done by checking the INAK bit 20_000 times or until it is set.
531        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        // After requesting to enter the initialization mode, the driver
538        // must wait for ACK from the peripheral - the SLAK bit to be cleared
539        // (as explained in RM0090 Reference Manual, Chapter 32.4, Figure 336).
540        // This is done by checking the SLAK bit 20_000 times or until it is cleared.
541        if !Can::wait_for(20000, || !self.registers.can_msr.is_set(CAN_MSR::SLAK)) {
542            return Err(kernel::ErrorCode::FAIL);
543        }
544
545        // set communication mode
546        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        // set bit timing mode
571        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    /// Configure a filter to receive messages
593    pub fn config_filter(&self, filter_info: can::FilterParameters, enable: bool) {
594        // get position of the filter number
595        let filter_number = 1 << filter_info.number;
596
597        // start filter configuration
598        self.registers.can_fmr.modify(CAN_FMR::FINIT::SET);
599
600        // request filter number filter_number
601        self.registers.can_fa1r.modify(
602            CAN_FA1R::FACT.val(self.registers.can_fa1r.read(CAN_FA1R::FACT) & !filter_number),
603        );
604
605        // request filter width to be 32 or 16 bits
606        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        // request filter mode to be mask or list
623        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        // request fifo0 or fifo1
637        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        // activate the filter configuration
660        self.registers.can_fmr.modify(CAN_FMR::FINIT::CLEAR);
661    }
662
663    pub fn enter_normal_mode(&self) -> Result<(), kernel::ErrorCode> {
664        // request to enter normal mode by clearing INRQ bit
665        self.registers.can_mcr.modify(CAN_MCR::INRQ::CLEAR);
666
667        // After requesting to enter the normal mode, the driver
668        // must wait for ACK from the peripheral - the INAK bit to be cleared
669        // (as explained in RM0090 Reference Manual, Chapter 32.4.2).
670        // This is done by checking the INAK bit 20_000 times or until it is cleared.
671        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        // request to enter sleep mode by setting SLEEP bit
681        self.disable_irqs();
682        self.registers.can_mcr.modify(CAN_MCR::SLEEP::SET);
683        self.can_state.set(CanState::Sleep);
684    }
685
686    /// This function sends an 8-byte message
687    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                // set extended or standard id in registers
697                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                // write rtr
722                self.registers.can_tx_mailbox[tx_mailbox]
723                    .can_tir
724                    .modify(CAN_TIxR::RTR.val(rtr.into()));
725                // write dlc
726                self.registers.can_tx_mailbox[tx_mailbox]
727                    .can_tdtr
728                    .modify(CAN_TDTxR::DLC.val(dlc as u32));
729                // write first 4 bytes of the data
730                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                    // write the last 4 bytes of the data
744                    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                // no mailbox empty
766                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    /// Handle the transmit interrupt. Check the status register for each
799    /// transmit mailbox to find out the mailbox that the message was sent from.
800    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                // check status
807                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                // mark the interrupt as handled
817                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                // mark the interrupt as handled
830                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                // mark the interrupt as handled
843                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            // mark the interrupt as handled
916            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            // mark the interrupt as handled
938            self.registers.can_rf1r.modify(CAN_RF1R::RFOM1::SET);
939        }
940    }
941
942    pub fn handle_error_status_interrupt(&self) {
943        // Check if there is a status change interrupt
944        if self.registers.can_msr.read(CAN_MSR::WKUI) == 1 {
945            // mark the interrupt as handled
946            self.registers.can_msr.modify(CAN_MSR::WKUI::SET);
947        }
948        if self.registers.can_msr.read(CAN_MSR::SLAKI) == 1 {
949            // mark the interrupt as handled
950            self.registers.can_msr.modify(CAN_MSR::SLAKI::SET);
951        }
952
953        // Check if there is an error interrupt
954        // Warning flag
955        if self.registers.can_esr.read(CAN_ESR::EWGF) == 1 {
956            self.can_state
957                .set(CanState::RunningError(can::Error::Warning));
958        }
959        // Passive flag
960        if self.registers.can_esr.read(CAN_ESR::EPVF) == 1 {
961            self.can_state
962                .set(CanState::RunningError(can::Error::Passive));
963        }
964        // Bus-off flag
965        if self.registers.can_esr.read(CAN_ESR::BOFF) == 1 {
966            self.can_state
967                .set(CanState::RunningError(can::Error::BusOff));
968        }
969        // Last Error Code
970        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            // todo no action set
1111            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                    // there is another deferred action that must be completed
1250                    if self.deferred_action.is_some() {
1251                        Err(kernel::ErrorCode::BUSY)
1252                    } else {
1253                        // set an Enable or an EnableError deferred action
1254                        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                    // there is another deferred action that must be completed
1278                    return Err(kernel::ErrorCode::BUSY);
1279                } else {
1280                    // set a Disable deferred action
1281                    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                // there is another deferred action that must be completed
1413                if self.deferred_action.is_some() {
1414                    Err(kernel::ErrorCode::BUSY)
1415                // the chip does not own the buffer from the capsule
1416                } else if self.rx_buffer.is_none() {
1417                    Err(kernel::ErrorCode::SIZE)
1418                } else {
1419                    // set a AbortReceive deferred action
1420                    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}