Merge #650
650: `bxcan` improvements r=Dirbaio a=timokroeger * Do not use wildcard reexport for `bxcan` * `cfgs` to fix `bxcan` implementation for devices with "CAN1" but no "CAN2" peripheral Co-authored-by: Timo Kröger <timokroeger93@gmail.com>
This commit is contained in:
		
						commit
						24b6478a7c
					
				@ -7,8 +7,7 @@ use embassy_hal_common::unborrow;
 | 
				
			|||||||
use crate::gpio::sealed::AFType;
 | 
					use crate::gpio::sealed::AFType;
 | 
				
			||||||
use crate::{peripherals, rcc::RccPeripheral};
 | 
					use crate::{peripherals, rcc::RccPeripheral};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[doc(no_inline)]
 | 
					pub use bxcan;
 | 
				
			||||||
pub use bxcan::*;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct Can<'d, T: Instance + bxcan::Instance> {
 | 
					pub struct Can<'d, T: Instance + bxcan::Instance> {
 | 
				
			||||||
    phantom: PhantomData<&'d mut T>,
 | 
					    phantom: PhantomData<&'d mut T>,
 | 
				
			||||||
@ -93,17 +92,28 @@ foreach_peripheral!(
 | 
				
			|||||||
            const NUM_FILTER_BANKS: u8 = 14;
 | 
					            const NUM_FILTER_BANKS: u8 = 14;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    // Only correct when CAN2 also exists… Fix on yaml level?
 | 
					    // CAN1 and CAN2 is a combination of master and slave instance.
 | 
				
			||||||
    // There are only 14 filter banks when CAN2 is not available.
 | 
					    // CAN1 owns the filter bank and needs to be enabled in order
 | 
				
			||||||
 | 
					    // for CAN2 to receive messages.
 | 
				
			||||||
    (can, CAN1) => {
 | 
					    (can, CAN1) => {
 | 
				
			||||||
        unsafe impl bxcan::FilterOwner for peripherals::CAN1 {
 | 
					        cfg_if::cfg_if! {
 | 
				
			||||||
            const NUM_FILTER_BANKS: u8 = 28;
 | 
					            if #[cfg(all(
 | 
				
			||||||
 | 
					                any(stm32l4, stm32f72, stm32f73),
 | 
				
			||||||
 | 
					                not(any(stm32l49, stm32l4a))
 | 
				
			||||||
 | 
					            ))] {
 | 
				
			||||||
 | 
					                // Most L4 devices and some F7 devices use the name "CAN1"
 | 
				
			||||||
 | 
					                // even if there is no "CAN2" peripheral.
 | 
				
			||||||
 | 
					                unsafe impl bxcan::FilterOwner for peripherals::CAN1 {
 | 
				
			||||||
 | 
					                    const NUM_FILTER_BANKS: u8 = 14;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                unsafe impl bxcan::FilterOwner for peripherals::CAN1 {
 | 
				
			||||||
 | 
					                    const NUM_FILTER_BANKS: u8 = 28;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                unsafe impl bxcan::MasterInstance for peripherals::CAN1 {}
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    (can, CAN2) => {
 | 
					 | 
				
			||||||
        // CAN2 is always a slave instance where CAN1 is the master instance
 | 
					 | 
				
			||||||
        unsafe impl bxcan::MasterInstance for peripherals::CAN1 {}
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    (can, CAN3) => {
 | 
					    (can, CAN3) => {
 | 
				
			||||||
        unsafe impl bxcan::FilterOwner for peripherals::CAN3 {
 | 
					        unsafe impl bxcan::FilterOwner for peripherals::CAN3 {
 | 
				
			||||||
            const NUM_FILTER_BANKS: u8 = 14;
 | 
					            const NUM_FILTER_BANKS: u8 = 14;
 | 
				
			||||||
 | 
				
			|||||||
@ -6,8 +6,9 @@
 | 
				
			|||||||
mod example_common;
 | 
					mod example_common;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use cortex_m_rt::entry;
 | 
					use cortex_m_rt::entry;
 | 
				
			||||||
use embassy_stm32::can::filter::Mask32;
 | 
					use embassy_stm32::can::bxcan::filter::Mask32;
 | 
				
			||||||
use embassy_stm32::can::{Can, Frame, StandardId};
 | 
					use embassy_stm32::can::bxcan::{Frame, StandardId};
 | 
				
			||||||
 | 
					use embassy_stm32::can::Can;
 | 
				
			||||||
use embassy_stm32::gpio::{Input, Pull};
 | 
					use embassy_stm32::gpio::{Input, Pull};
 | 
				
			||||||
use example_common::*;
 | 
					use example_common::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user