"Does anyone have experience with..." <- bisync is great. You can deal with embedded_hal vs embedded_hal_async traits by importing the symbols into the module, then inside the implementation modules, use relative paths like `super::SpiBus` rather than `crate::SpiBus` or `embedded_hal::spi::SpiBus`. For example, in embedded-sdmmc's lib.rs I have: ```rust /// Blocking implementation of this crate. Uses traits from embedded_hal & embedded_io crates. #[path = "."] pub mod blocking { use bisync::synchronous::*; use embedded_hal::{delay::DelayNs, spi::SpiDevice}; use embedded_io::{ErrorType, Read, Seek, SeekFrom, Write}; mod inner; pub use inner::*; } /// Async implementation of this crate. Uses traits from embedded_hal_async & embedded_io_async crates. #[path = "."] pub mod asynchronous { use bisync::asynchronous::*; use embedded_hal_async::{delay::DelayNs, spi::SpiDevice}; use embedded_io_async::{ErrorType, Read, Seek, SeekFrom, Write}; mod inner; pub use inner::*; } ```