diff --git a/README.md b/README.md
index 9f08bf67..eaa91012 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ The embassy-net network stac
The nrf-softdevice crate provides Bluetooth Low Energy 4.x and 5.x support for nRF52 microcontrollers.
- **LoRa** -
-embassy-lora supports LoRa networking on STM32WL wireless microcontrollers and Semtech SX127x transceivers.
+embassy-lora supports LoRa networking on STM32WL wireless microcontrollers and Semtech SX126x and SX127x transceivers.
- **USB** -
embassy-usb implements a device-side USB stack. Implementations for common classes such as USB serial (CDC ACM) and USB HID are available, and a rich builder API allows building your own.
diff --git a/embassy-lora/Cargo.toml b/embassy-lora/Cargo.toml
index 0e7a982a..ea2c3fe6 100644
--- a/embassy-lora/Cargo.toml
+++ b/embassy-lora/Cargo.toml
@@ -9,6 +9,7 @@ src_base = "https://github.com/embassy-rs/embassy/blob/embassy-lora-v$VERSION/em
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-lora/src/"
features = ["time", "defmt"]
flavors = [
+ { name = "sx126x", target = "thumbv7em-none-eabihf", features = ["sx126x"] },
{ name = "sx127x", target = "thumbv7em-none-eabihf", features = ["sx127x", "embassy-stm32/stm32wl55jc-cm4", "embassy-stm32/time-driver-any"] },
{ name = "stm32wl", target = "thumbv7em-none-eabihf", features = ["stm32wl", "embassy-stm32/stm32wl55jc-cm4", "embassy-stm32/time-driver-any"] },
]
@@ -16,6 +17,7 @@ flavors = [
[lib]
[features]
+sx126x = []
sx127x = []
stm32wl = ["embassy-stm32", "embassy-stm32/subghz"]
time = []
diff --git a/embassy-lora/src/lib.rs b/embassy-lora/src/lib.rs
index 90ba0d1d..3e474843 100644
--- a/embassy-lora/src/lib.rs
+++ b/embassy-lora/src/lib.rs
@@ -7,6 +7,8 @@ pub(crate) mod fmt;
#[cfg(feature = "stm32wl")]
pub mod stm32wl;
+#[cfg(feature = "sx126x")]
+pub mod sx126x;
#[cfg(feature = "sx127x")]
pub mod sx127x;
diff --git a/embassy-lora/src/sx126x/mod.rs b/embassy-lora/src/sx126x/mod.rs
new file mode 100644
index 00000000..ed8cb405
--- /dev/null
+++ b/embassy-lora/src/sx126x/mod.rs
@@ -0,0 +1,153 @@
+use core::future::Future;
+
+use defmt::Format;
+use embedded_hal::digital::v2::OutputPin;
+use embedded_hal_async::digital::Wait;
+use embedded_hal_async::spi::*;
+use lorawan_device::async_device::radio::{PhyRxTx, RfConfig, RxQuality, TxConfig};
+use lorawan_device::async_device::Timings;
+
+mod sx126x_lora;
+use sx126x_lora::LoRa;
+
+use self::sx126x_lora::mod_params::RadioError;
+
+/// Semtech Sx126x LoRa peripheral
+pub struct Sx126xRadio
+where
+ SPI: SpiBus + 'static,
+ CTRL: OutputPin + 'static,
+ WAIT: Wait + 'static,
+ BUS: Error + Format + 'static,
+{
+ pub lora: LoRa,
+}
+
+impl Sx126xRadio
+where
+ SPI: SpiBus + 'static,
+ CTRL: OutputPin + 'static,
+ WAIT: Wait + 'static,
+ BUS: Error + Format + 'static,
+{
+ pub async fn new(
+ spi: SPI,
+ cs: CTRL,
+ reset: CTRL,
+ antenna_rx: CTRL,
+ antenna_tx: CTRL,
+ dio1: WAIT,
+ busy: WAIT,
+ enable_public_network: bool,
+ ) -> Result> {
+ let mut lora = LoRa::new(spi, cs, reset, antenna_rx, antenna_tx, dio1, busy);
+ lora.init().await?;
+ lora.set_lora_modem(enable_public_network).await?;
+ Ok(Self { lora })
+ }
+}
+
+impl Timings for Sx126xRadio
+where
+ SPI: SpiBus + 'static,
+ CTRL: OutputPin + 'static,
+ WAIT: Wait + 'static,
+ BUS: Error + Format + 'static,
+{
+ fn get_rx_window_offset_ms(&self) -> i32 {
+ -500
+ }
+ fn get_rx_window_duration_ms(&self) -> u32 {
+ 800
+ }
+}
+
+impl PhyRxTx for Sx126xRadio
+where
+ SPI: SpiBus + 'static,
+ CTRL: OutputPin + 'static,
+ WAIT: Wait + 'static,
+ BUS: Error + Format + 'static,
+{
+ type PhyError = RadioError;
+
+ type TxFuture<'m> = impl Future