aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-rp/src')
-rw-r--r--embassy-rp/src/flash.rs2
-rw-r--r--embassy-rp/src/gpio.rs303
-rw-r--r--embassy-rp/src/i2c.rs230
-rw-r--r--embassy-rp/src/lib.rs4
-rw-r--r--embassy-rp/src/spi.rs108
-rw-r--r--embassy-rp/src/uart/buffered.rs165
-rw-r--r--embassy-rp/src/uart/mod.rs244
7 files changed, 497 insertions, 559 deletions
diff --git a/embassy-rp/src/flash.rs b/embassy-rp/src/flash.rs
index 8fb5542f1..1b20561da 100644
--- a/embassy-rp/src/flash.rs
+++ b/embassy-rp/src/flash.rs
@@ -352,7 +352,6 @@ impl<'d, T: Instance, M: Mode, const FLASH_SIZE: usize> NorFlash for Flash<'d, T
352 } 352 }
353} 353}
354 354
355#[cfg(feature = "nightly")]
356impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::ReadNorFlash 355impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::ReadNorFlash
357 for Flash<'d, T, Async, FLASH_SIZE> 356 for Flash<'d, T, Async, FLASH_SIZE>
358{ 357{
@@ -367,7 +366,6 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash
367 } 366 }
368} 367}
369 368
370#[cfg(feature = "nightly")]
371impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::NorFlash 369impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::NorFlash
372 for Flash<'d, T, Async, FLASH_SIZE> 370 for Flash<'d, T, Async, FLASH_SIZE>
373{ 371{
diff --git a/embassy-rp/src/gpio.rs b/embassy-rp/src/gpio.rs
index ee7e03e95..9034f3f36 100644
--- a/embassy-rp/src/gpio.rs
+++ b/embassy-rp/src/gpio.rs
@@ -1,4 +1,5 @@
1#![macro_use] 1#![macro_use]
2use core::convert::Infallible;
2use core::future::Future; 3use core::future::Future;
3use core::pin::Pin as FuturePin; 4use core::pin::Pin as FuturePin;
4use core::task::{Context, Poll}; 5use core::task::{Context, Poll};
@@ -1036,217 +1037,207 @@ mod eh02 {
1036 } 1037 }
1037} 1038}
1038 1039
1039#[cfg(feature = "unstable-traits")] 1040impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Input<'d, T> {
1040mod eh1 { 1041 type Error = Infallible;
1041 use core::convert::Infallible; 1042}
1042 1043
1043 use super::*; 1044impl<'d, T: Pin> embedded_hal_1::digital::InputPin for Input<'d, T> {
1045 fn is_high(&self) -> Result<bool, Self::Error> {
1046 Ok(self.is_high())
1047 }
1044 1048
1045 impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Input<'d, T> { 1049 fn is_low(&self) -> Result<bool, Self::Error> {
1046 type Error = Infallible; 1050 Ok(self.is_low())
1047 } 1051 }
1052}
1048 1053
1049 impl<'d, T: Pin> embedded_hal_1::digital::InputPin for Input<'d, T> { 1054impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Output<'d, T> {
1050 fn is_high(&self) -> Result<bool, Self::Error> { 1055 type Error = Infallible;
1051 Ok(self.is_high()) 1056}
1052 }
1053 1057
1054 fn is_low(&self) -> Result<bool, Self::Error> { 1058impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for Output<'d, T> {
1055 Ok(self.is_low()) 1059 fn set_high(&mut self) -> Result<(), Self::Error> {
1056 } 1060 Ok(self.set_high())
1057 } 1061 }
1058 1062
1059 impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Output<'d, T> { 1063 fn set_low(&mut self) -> Result<(), Self::Error> {
1060 type Error = Infallible; 1064 Ok(self.set_low())
1061 } 1065 }
1066}
1062 1067
1063 impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for Output<'d, T> { 1068impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for Output<'d, T> {
1064 fn set_high(&mut self) -> Result<(), Self::Error> { 1069 fn is_set_high(&self) -> Result<bool, Self::Error> {
1065 Ok(self.set_high()) 1070 Ok(self.is_set_high())
1066 }
1067
1068 fn set_low(&mut self) -> Result<(), Self::Error> {
1069 Ok(self.set_low())
1070 }
1071 } 1071 }
1072 1072
1073 impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for Output<'d, T> { 1073 fn is_set_low(&self) -> Result<bool, Self::Error> {
1074 fn is_set_high(&self) -> Result<bool, Self::Error> { 1074 Ok(self.is_set_low())
1075 Ok(self.is_set_high()) 1075 }
1076 } 1076}
1077 1077
1078 fn is_set_low(&self) -> Result<bool, Self::Error> { 1078impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for Output<'d, T> {
1079 Ok(self.is_set_low()) 1079 fn toggle(&mut self) -> Result<(), Self::Error> {
1080 } 1080 Ok(self.toggle())
1081 } 1081 }
1082}
1082 1083
1083 impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for Output<'d, T> { 1084impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for OutputOpenDrain<'d, T> {
1084 fn toggle(&mut self) -> Result<(), Self::Error> { 1085 type Error = Infallible;
1085 Ok(self.toggle()) 1086}
1086 } 1087
1088impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for OutputOpenDrain<'d, T> {
1089 fn set_high(&mut self) -> Result<(), Self::Error> {
1090 Ok(self.set_high())
1087 } 1091 }
1088 1092
1089 impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for OutputOpenDrain<'d, T> { 1093 fn set_low(&mut self) -> Result<(), Self::Error> {
1090 type Error = Infallible; 1094 Ok(self.set_low())
1091 } 1095 }
1096}
1092 1097
1093 impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for OutputOpenDrain<'d, T> { 1098impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for OutputOpenDrain<'d, T> {
1094 fn set_high(&mut self) -> Result<(), Self::Error> { 1099 fn is_set_high(&self) -> Result<bool, Self::Error> {
1095 Ok(self.set_high()) 1100 Ok(self.is_set_high())
1096 } 1101 }
1097 1102
1098 fn set_low(&mut self) -> Result<(), Self::Error> { 1103 fn is_set_low(&self) -> Result<bool, Self::Error> {
1099 Ok(self.set_low()) 1104 Ok(self.is_set_low())
1100 }
1101 } 1105 }
1106}
1102 1107
1103 impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for OutputOpenDrain<'d, T> { 1108impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for OutputOpenDrain<'d, T> {
1104 fn is_set_high(&self) -> Result<bool, Self::Error> { 1109 fn toggle(&mut self) -> Result<(), Self::Error> {
1105 Ok(self.is_set_high()) 1110 Ok(self.toggle())
1106 } 1111 }
1112}
1107 1113
1108 fn is_set_low(&self) -> Result<bool, Self::Error> { 1114impl<'d, T: Pin> embedded_hal_1::digital::InputPin for OutputOpenDrain<'d, T> {
1109 Ok(self.is_set_low()) 1115 fn is_high(&self) -> Result<bool, Self::Error> {
1110 } 1116 Ok(self.is_high())
1111 } 1117 }
1112 1118
1113 impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for OutputOpenDrain<'d, T> { 1119 fn is_low(&self) -> Result<bool, Self::Error> {
1114 fn toggle(&mut self) -> Result<(), Self::Error> { 1120 Ok(self.is_low())
1115 Ok(self.toggle())
1116 }
1117 } 1121 }
1122}
1118 1123
1119 impl<'d, T: Pin> embedded_hal_1::digital::InputPin for OutputOpenDrain<'d, T> { 1124impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Flex<'d, T> {
1120 fn is_high(&self) -> Result<bool, Self::Error> { 1125 type Error = Infallible;
1121 Ok(self.is_high()) 1126}
1122 }
1123 1127
1124 fn is_low(&self) -> Result<bool, Self::Error> { 1128impl<'d, T: Pin> embedded_hal_1::digital::InputPin for Flex<'d, T> {
1125 Ok(self.is_low()) 1129 fn is_high(&self) -> Result<bool, Self::Error> {
1126 } 1130 Ok(self.is_high())
1127 } 1131 }
1128 1132
1129 impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Flex<'d, T> { 1133 fn is_low(&self) -> Result<bool, Self::Error> {
1130 type Error = Infallible; 1134 Ok(self.is_low())
1131 } 1135 }
1136}
1132 1137
1133 impl<'d, T: Pin> embedded_hal_1::digital::InputPin for Flex<'d, T> { 1138impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for Flex<'d, T> {
1134 fn is_high(&self) -> Result<bool, Self::Error> { 1139 fn set_high(&mut self) -> Result<(), Self::Error> {
1135 Ok(self.is_high()) 1140 Ok(self.set_high())
1136 }
1137
1138 fn is_low(&self) -> Result<bool, Self::Error> {
1139 Ok(self.is_low())
1140 }
1141 } 1141 }
1142 1142
1143 impl<'d, T: Pin> embedded_hal_1::digital::OutputPin for Flex<'d, T> { 1143 fn set_low(&mut self) -> Result<(), Self::Error> {
1144 fn set_high(&mut self) -> Result<(), Self::Error> { 1144 Ok(self.set_low())
1145 Ok(self.set_high())
1146 }
1147
1148 fn set_low(&mut self) -> Result<(), Self::Error> {
1149 Ok(self.set_low())
1150 }
1151 } 1145 }
1146}
1152 1147
1153 impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for Flex<'d, T> { 1148impl<'d, T: Pin> embedded_hal_1::digital::StatefulOutputPin for Flex<'d, T> {
1154 fn is_set_high(&self) -> Result<bool, Self::Error> { 1149 fn is_set_high(&self) -> Result<bool, Self::Error> {
1155 Ok(self.is_set_high()) 1150 Ok(self.is_set_high())
1156 } 1151 }
1157 1152
1158 fn is_set_low(&self) -> Result<bool, Self::Error> { 1153 fn is_set_low(&self) -> Result<bool, Self::Error> {
1159 Ok(self.is_set_low()) 1154 Ok(self.is_set_low())
1160 }
1161 } 1155 }
1156}
1162 1157
1163 impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for Flex<'d, T> { 1158impl<'d, T: Pin> embedded_hal_1::digital::ToggleableOutputPin for Flex<'d, T> {
1164 fn toggle(&mut self) -> Result<(), Self::Error> { 1159 fn toggle(&mut self) -> Result<(), Self::Error> {
1165 Ok(self.toggle()) 1160 Ok(self.toggle())
1166 }
1167 } 1161 }
1162}
1168 1163
1169 #[cfg(feature = "nightly")] 1164impl<'d, T: Pin> embedded_hal_async::digital::Wait for Flex<'d, T> {
1170 impl<'d, T: Pin> embedded_hal_async::digital::Wait for Flex<'d, T> { 1165 async fn wait_for_high(&mut self) -> Result<(), Self::Error> {
1171 async fn wait_for_high(&mut self) -> Result<(), Self::Error> { 1166 self.wait_for_high().await;
1172 self.wait_for_high().await; 1167 Ok(())
1173 Ok(()) 1168 }
1174 }
1175 1169
1176 async fn wait_for_low(&mut self) -> Result<(), Self::Error> { 1170 async fn wait_for_low(&mut self) -> Result<(), Self::Error> {
1177 self.wait_for_low().await; 1171 self.wait_for_low().await;
1178 Ok(()) 1172 Ok(())
1179 } 1173 }
1180 1174
1181 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> { 1175 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> {
1182 self.wait_for_rising_edge().await; 1176 self.wait_for_rising_edge().await;
1183 Ok(()) 1177 Ok(())
1184 } 1178 }
1185 1179
1186 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> { 1180 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> {
1187 self.wait_for_falling_edge().await; 1181 self.wait_for_falling_edge().await;
1188 Ok(()) 1182 Ok(())
1189 } 1183 }
1190 1184
1191 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> { 1185 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> {
1192 self.wait_for_any_edge().await; 1186 self.wait_for_any_edge().await;
1193 Ok(()) 1187 Ok(())
1194 }
1195 } 1188 }
1189}
1196 1190
1197 #[cfg(feature = "nightly")] 1191impl<'d, T: Pin> embedded_hal_async::digital::Wait for Input<'d, T> {
1198 impl<'d, T: Pin> embedded_hal_async::digital::Wait for Input<'d, T> { 1192 async fn wait_for_high(&mut self) -> Result<(), Self::Error> {
1199 async fn wait_for_high(&mut self) -> Result<(), Self::Error> { 1193 self.wait_for_high().await;
1200 self.wait_for_high().await; 1194 Ok(())
1201 Ok(()) 1195 }
1202 }
1203 1196
1204 async fn wait_for_low(&mut self) -> Result<(), Self::Error> { 1197 async fn wait_for_low(&mut self) -> Result<(), Self::Error> {
1205 self.wait_for_low().await; 1198 self.wait_for_low().await;
1206 Ok(()) 1199 Ok(())
1207 } 1200 }
1208 1201
1209 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> { 1202 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> {
1210 self.wait_for_rising_edge().await; 1203 self.wait_for_rising_edge().await;
1211 Ok(()) 1204 Ok(())
1212 } 1205 }
1213 1206
1214 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> { 1207 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> {
1215 self.wait_for_falling_edge().await; 1208 self.wait_for_falling_edge().await;
1216 Ok(()) 1209 Ok(())
1217 } 1210 }
1218 1211
1219 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> { 1212 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> {
1220 self.wait_for_any_edge().await; 1213 self.wait_for_any_edge().await;
1221 Ok(()) 1214 Ok(())
1222 }
1223 } 1215 }
1216}
1224 1217
1225 #[cfg(feature = "nightly")] 1218impl<'d, T: Pin> embedded_hal_async::digital::Wait for OutputOpenDrain<'d, T> {
1226 impl<'d, T: Pin> embedded_hal_async::digital::Wait for OutputOpenDrain<'d, T> { 1219 async fn wait_for_high(&mut self) -> Result<(), Self::Error> {
1227 async fn wait_for_high(&mut self) -> Result<(), Self::Error> { 1220 self.wait_for_high().await;
1228 self.wait_for_high().await; 1221 Ok(())
1229 Ok(()) 1222 }
1230 }
1231 1223
1232 async fn wait_for_low(&mut self) -> Result<(), Self::Error> { 1224 async fn wait_for_low(&mut self) -> Result<(), Self::Error> {
1233 self.wait_for_low().await; 1225 self.wait_for_low().await;
1234 Ok(()) 1226 Ok(())
1235 } 1227 }
1236 1228
1237 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> { 1229 async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> {
1238 self.wait_for_rising_edge().await; 1230 self.wait_for_rising_edge().await;
1239 Ok(()) 1231 Ok(())
1240 } 1232 }
1241 1233
1242 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> { 1234 async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> {
1243 self.wait_for_falling_edge().await; 1235 self.wait_for_falling_edge().await;
1244 Ok(()) 1236 Ok(())
1245 } 1237 }
1246 1238
1247 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> { 1239 async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> {
1248 self.wait_for_any_edge().await; 1240 self.wait_for_any_edge().await;
1249 Ok(()) 1241 Ok(())
1250 }
1251 } 1242 }
1252} 1243}
diff --git a/embassy-rp/src/i2c.rs b/embassy-rp/src/i2c.rs
index 4fe4b27eb..15095236a 100644
--- a/embassy-rp/src/i2c.rs
+++ b/embassy-rp/src/i2c.rs
@@ -588,167 +588,157 @@ impl<'d, T: Instance + 'd, M: Mode> I2c<'d, T, M> {
588 } 588 }
589} 589}
590 590
591mod eh02 { 591impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Read for I2c<'d, T, M> {
592 use super::*; 592 type Error = Error;
593 593
594 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Read for I2c<'d, T, M> { 594 fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error> {
595 type Error = Error; 595 self.blocking_read(address, buffer)
596
597 fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error> {
598 self.blocking_read(address, buffer)
599 }
600 } 596 }
597}
601 598
602 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Write for I2c<'d, T, M> { 599impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Write for I2c<'d, T, M> {
603 type Error = Error; 600 type Error = Error;
604 601
605 fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), Self::Error> { 602 fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), Self::Error> {
606 self.blocking_write(address, bytes) 603 self.blocking_write(address, bytes)
607 }
608 } 604 }
605}
609 606
610 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::WriteRead for I2c<'d, T, M> { 607impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::WriteRead for I2c<'d, T, M> {
611 type Error = Error; 608 type Error = Error;
612 609
613 fn write_read(&mut self, address: u8, bytes: &[u8], buffer: &mut [u8]) -> Result<(), Self::Error> { 610 fn write_read(&mut self, address: u8, bytes: &[u8], buffer: &mut [u8]) -> Result<(), Self::Error> {
614 self.blocking_write_read(address, bytes, buffer) 611 self.blocking_write_read(address, bytes, buffer)
615 }
616 } 612 }
613}
617 614
618 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Transactional for I2c<'d, T, M> { 615impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::i2c::Transactional for I2c<'d, T, M> {
619 type Error = Error; 616 type Error = Error;
620 617
621 fn exec( 618 fn exec(
622 &mut self, 619 &mut self,
623 address: u8, 620 address: u8,
624 operations: &mut [embedded_hal_02::blocking::i2c::Operation<'_>], 621 operations: &mut [embedded_hal_02::blocking::i2c::Operation<'_>],
625 ) -> Result<(), Self::Error> { 622 ) -> Result<(), Self::Error> {
626 Self::setup(address.into())?; 623 Self::setup(address.into())?;
627 for i in 0..operations.len() { 624 for i in 0..operations.len() {
628 let last = i == operations.len() - 1; 625 let last = i == operations.len() - 1;
629 match &mut operations[i] { 626 match &mut operations[i] {
630 embedded_hal_02::blocking::i2c::Operation::Read(buf) => { 627 embedded_hal_02::blocking::i2c::Operation::Read(buf) => {
631 self.read_blocking_internal(buf, false, last)? 628 self.read_blocking_internal(buf, false, last)?
632 }
633 embedded_hal_02::blocking::i2c::Operation::Write(buf) => self.write_blocking_internal(buf, last)?,
634 } 629 }
630 embedded_hal_02::blocking::i2c::Operation::Write(buf) => self.write_blocking_internal(buf, last)?,
635 } 631 }
636 Ok(())
637 } 632 }
633 Ok(())
638 } 634 }
639} 635}
640 636
641#[cfg(feature = "unstable-traits")] 637impl embedded_hal_1::i2c::Error for Error {
642mod eh1 { 638 fn kind(&self) -> embedded_hal_1::i2c::ErrorKind {
643 use super::*; 639 match *self {
644 640 Self::Abort(AbortReason::ArbitrationLoss) => embedded_hal_1::i2c::ErrorKind::ArbitrationLoss,
645 impl embedded_hal_1::i2c::Error for Error { 641 Self::Abort(AbortReason::NoAcknowledge) => {
646 fn kind(&self) -> embedded_hal_1::i2c::ErrorKind { 642 embedded_hal_1::i2c::ErrorKind::NoAcknowledge(embedded_hal_1::i2c::NoAcknowledgeSource::Address)
647 match *self {
648 Self::Abort(AbortReason::ArbitrationLoss) => embedded_hal_1::i2c::ErrorKind::ArbitrationLoss,
649 Self::Abort(AbortReason::NoAcknowledge) => {
650 embedded_hal_1::i2c::ErrorKind::NoAcknowledge(embedded_hal_1::i2c::NoAcknowledgeSource::Address)
651 }
652 Self::Abort(AbortReason::TxNotEmpty(_)) => embedded_hal_1::i2c::ErrorKind::Other,
653 Self::Abort(AbortReason::Other(_)) => embedded_hal_1::i2c::ErrorKind::Other,
654 Self::InvalidReadBufferLength => embedded_hal_1::i2c::ErrorKind::Other,
655 Self::InvalidWriteBufferLength => embedded_hal_1::i2c::ErrorKind::Other,
656 Self::AddressOutOfRange(_) => embedded_hal_1::i2c::ErrorKind::Other,
657 Self::AddressReserved(_) => embedded_hal_1::i2c::ErrorKind::Other,
658 } 643 }
644 Self::Abort(AbortReason::TxNotEmpty(_)) => embedded_hal_1::i2c::ErrorKind::Other,
645 Self::Abort(AbortReason::Other(_)) => embedded_hal_1::i2c::ErrorKind::Other,
646 Self::InvalidReadBufferLength => embedded_hal_1::i2c::ErrorKind::Other,
647 Self::InvalidWriteBufferLength => embedded_hal_1::i2c::ErrorKind::Other,
648 Self::AddressOutOfRange(_) => embedded_hal_1::i2c::ErrorKind::Other,
649 Self::AddressReserved(_) => embedded_hal_1::i2c::ErrorKind::Other,
659 } 650 }
660 } 651 }
652}
661 653
662 impl<'d, T: Instance, M: Mode> embedded_hal_1::i2c::ErrorType for I2c<'d, T, M> { 654impl<'d, T: Instance, M: Mode> embedded_hal_1::i2c::ErrorType for I2c<'d, T, M> {
663 type Error = Error; 655 type Error = Error;
664 } 656}
665 657
666 impl<'d, T: Instance, M: Mode> embedded_hal_1::i2c::I2c for I2c<'d, T, M> { 658impl<'d, T: Instance, M: Mode> embedded_hal_1::i2c::I2c for I2c<'d, T, M> {
667 fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { 659 fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> {
668 self.blocking_read(address, read) 660 self.blocking_read(address, read)
669 } 661 }
670 662
671 fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> { 663 fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> {
672 self.blocking_write(address, write) 664 self.blocking_write(address, write)
673 } 665 }
674 666
675 fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { 667 fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
676 self.blocking_write_read(address, write, read) 668 self.blocking_write_read(address, write, read)
677 } 669 }
678 670
679 fn transaction( 671 fn transaction(
680 &mut self, 672 &mut self,
681 address: u8, 673 address: u8,
682 operations: &mut [embedded_hal_1::i2c::Operation<'_>], 674 operations: &mut [embedded_hal_1::i2c::Operation<'_>],
683 ) -> Result<(), Self::Error> { 675 ) -> Result<(), Self::Error> {
684 Self::setup(address.into())?; 676 Self::setup(address.into())?;
685 for i in 0..operations.len() { 677 for i in 0..operations.len() {
686 let last = i == operations.len() - 1; 678 let last = i == operations.len() - 1;
687 match &mut operations[i] { 679 match &mut operations[i] {
688 embedded_hal_1::i2c::Operation::Read(buf) => self.read_blocking_internal(buf, false, last)?, 680 embedded_hal_1::i2c::Operation::Read(buf) => self.read_blocking_internal(buf, false, last)?,
689 embedded_hal_1::i2c::Operation::Write(buf) => self.write_blocking_internal(buf, last)?, 681 embedded_hal_1::i2c::Operation::Write(buf) => self.write_blocking_internal(buf, last)?,
690 }
691 } 682 }
692 Ok(())
693 } 683 }
684 Ok(())
694 } 685 }
695} 686}
696#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
697mod nightly {
698 use embedded_hal_1::i2c::Operation;
699 use embedded_hal_async::i2c::AddressMode;
700 687
701 use super::*; 688impl<'d, A, T> embedded_hal_async::i2c::I2c<A> for I2c<'d, T, Async>
689where
690 A: embedded_hal_async::i2c::AddressMode + Into<u16> + 'static,
691 T: Instance + 'd,
692{
693 async fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> {
694 let addr: u16 = address.into();
702 695
703 impl<'d, A, T> embedded_hal_async::i2c::I2c<A> for I2c<'d, T, Async> 696 Self::setup(addr)?;
704 where 697 self.read_async_internal(read, false, true).await
705 A: AddressMode + Into<u16> + 'static, 698 }
706 T: Instance + 'd,
707 {
708 async fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> {
709 let addr: u16 = address.into();
710 699
711 Self::setup(addr)?; 700 async fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> {
712 self.read_async_internal(read, false, true).await 701 let addr: u16 = address.into();
713 }
714 702
715 async fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { 703 Self::setup(addr)?;
716 let addr: u16 = address.into(); 704 self.write_async_internal(write.iter().copied(), true).await
705 }
717 706
718 Self::setup(addr)?; 707 async fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
719 self.write_async_internal(write.iter().copied(), true).await 708 let addr: u16 = address.into();
720 }
721 709
722 async fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { 710 Self::setup(addr)?;
723 let addr: u16 = address.into(); 711 self.write_async_internal(write.iter().cloned(), false).await?;
712 self.read_async_internal(read, true, true).await
713 }
724 714
725 Self::setup(addr)?; 715 async fn transaction(
726 self.write_async_internal(write.iter().cloned(), false).await?; 716 &mut self,
727 self.read_async_internal(read, true, true).await 717 address: A,
728 } 718 operations: &mut [embedded_hal_1::i2c::Operation<'_>],
719 ) -> Result<(), Self::Error> {
720 use embedded_hal_1::i2c::Operation;
729 721
730 async fn transaction(&mut self, address: A, operations: &mut [Operation<'_>]) -> Result<(), Self::Error> { 722 let addr: u16 = address.into();
731 let addr: u16 = address.into();
732 723
733 if operations.len() > 0 { 724 if operations.len() > 0 {
734 Self::setup(addr)?; 725 Self::setup(addr)?;
735 } 726 }
736 let mut iterator = operations.iter_mut(); 727 let mut iterator = operations.iter_mut();
737 728
738 while let Some(op) = iterator.next() { 729 while let Some(op) = iterator.next() {
739 let last = iterator.len() == 0; 730 let last = iterator.len() == 0;
740 731
741 match op { 732 match op {
742 Operation::Read(buffer) => { 733 Operation::Read(buffer) => {
743 self.read_async_internal(buffer, false, last).await?; 734 self.read_async_internal(buffer, false, last).await?;
744 } 735 }
745 Operation::Write(buffer) => { 736 Operation::Write(buffer) => {
746 self.write_async_internal(buffer.into_iter().cloned(), last).await?; 737 self.write_async_internal(buffer.into_iter().cloned(), last).await?;
747 }
748 } 738 }
749 } 739 }
750 Ok(())
751 } 740 }
741 Ok(())
752 } 742 }
753} 743}
754 744
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs
index c9fe89b8c..66e4cfdcf 100644
--- a/embassy-rp/src/lib.rs
+++ b/embassy-rp/src/lib.rs
@@ -1,6 +1,5 @@
1#![no_std] 1#![no_std]
2#![cfg_attr(feature = "nightly", feature(async_fn_in_trait, impl_trait_projections))] 2#![allow(async_fn_in_trait)]
3#![cfg_attr(feature = "nightly", allow(stable_features, unknown_lints, async_fn_in_trait))]
4 3
5// This mod MUST go first, so that the others see its macros. 4// This mod MUST go first, so that the others see its macros.
6pub(crate) mod fmt; 5pub(crate) mod fmt;
@@ -28,7 +27,6 @@ pub mod spi;
28#[cfg(feature = "time-driver")] 27#[cfg(feature = "time-driver")]
29pub mod timer; 28pub mod timer;
30pub mod uart; 29pub mod uart;
31#[cfg(feature = "nightly")]
32pub mod usb; 30pub mod usb;
33pub mod watchdog; 31pub mod watchdog;
34 32
diff --git a/embassy-rp/src/spi.rs b/embassy-rp/src/spi.rs
index a59ce8419..6ba985a65 100644
--- a/embassy-rp/src/spi.rs
+++ b/embassy-rp/src/spi.rs
@@ -511,87 +511,73 @@ impl_mode!(Async);
511 511
512// ==================== 512// ====================
513 513
514mod eh02 { 514impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::spi::Transfer<u8> for Spi<'d, T, M> {
515 use super::*; 515 type Error = Error;
516 516 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
517 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::spi::Transfer<u8> for Spi<'d, T, M> { 517 self.blocking_transfer_in_place(words)?;
518 type Error = Error; 518 Ok(words)
519 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
520 self.blocking_transfer_in_place(words)?;
521 Ok(words)
522 }
523 } 519 }
520}
524 521
525 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::spi::Write<u8> for Spi<'d, T, M> { 522impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::spi::Write<u8> for Spi<'d, T, M> {
526 type Error = Error; 523 type Error = Error;
527 524
528 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { 525 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
529 self.blocking_write(words) 526 self.blocking_write(words)
530 }
531 } 527 }
532} 528}
533 529
534#[cfg(feature = "unstable-traits")] 530impl embedded_hal_1::spi::Error for Error {
535mod eh1 { 531 fn kind(&self) -> embedded_hal_1::spi::ErrorKind {
536 use super::*; 532 match *self {}
537
538 impl embedded_hal_1::spi::Error for Error {
539 fn kind(&self) -> embedded_hal_1::spi::ErrorKind {
540 match *self {}
541 }
542 } 533 }
534}
543 535
544 impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::ErrorType for Spi<'d, T, M> { 536impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::ErrorType for Spi<'d, T, M> {
545 type Error = Error; 537 type Error = Error;
546 } 538}
547 539
548 impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBus<u8> for Spi<'d, T, M> { 540impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBus<u8> for Spi<'d, T, M> {
549 fn flush(&mut self) -> Result<(), Self::Error> { 541 fn flush(&mut self) -> Result<(), Self::Error> {
550 Ok(()) 542 Ok(())
551 } 543 }
552 544
553 fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> { 545 fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
554 self.blocking_transfer(words, &[]) 546 self.blocking_transfer(words, &[])
555 } 547 }
556 548
557 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { 549 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
558 self.blocking_write(words) 550 self.blocking_write(words)
559 } 551 }
560 552
561 fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> { 553 fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
562 self.blocking_transfer(read, write) 554 self.blocking_transfer(read, write)
563 } 555 }
564 556
565 fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> { 557 fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
566 self.blocking_transfer_in_place(words) 558 self.blocking_transfer_in_place(words)
567 }
568 } 559 }
569} 560}
570 561
571#[cfg(all(feature = "unstable-traits", feature = "nightly"))] 562impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spi<'d, T, Async> {
572mod eha { 563 async fn flush(&mut self) -> Result<(), Self::Error> {
573 use super::*; 564 Ok(())
574 565 }
575 impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spi<'d, T, Async> {
576 async fn flush(&mut self) -> Result<(), Self::Error> {
577 Ok(())
578 }
579 566
580 async fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { 567 async fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
581 self.write(words).await 568 self.write(words).await
582 } 569 }
583 570
584 async fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> { 571 async fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
585 self.read(words).await 572 self.read(words).await
586 } 573 }
587 574
588 async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> { 575 async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
589 self.transfer(read, write).await 576 self.transfer(read, write).await
590 } 577 }
591 578
592 async fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> { 579 async fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
593 self.transfer_in_place(words).await 580 self.transfer_in_place(words).await
594 }
595 } 581 }
596} 582}
597 583
diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs
index 9f638761d..ca030f560 100644
--- a/embassy-rp/src/uart/buffered.rs
+++ b/embassy-rp/src/uart/buffered.rs
@@ -668,126 +668,117 @@ impl<'d, T: Instance + 'd> embedded_io::Write for BufferedUartTx<'d, T> {
668 } 668 }
669} 669}
670 670
671mod eh02 { 671impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d, T> {
672 use super::*; 672 type Error = Error;
673 673
674 impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d, T> { 674 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
675 type Error = Error; 675 let r = T::regs();
676 if r.uartfr().read().rxfe() {
677 return Err(nb::Error::WouldBlock);
678 }
676 679
677 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 680 let dr = r.uartdr().read();
678 let r = T::regs();
679 if r.uartfr().read().rxfe() {
680 return Err(nb::Error::WouldBlock);
681 }
682 681
683 let dr = r.uartdr().read(); 682 if dr.oe() {
684 683 Err(nb::Error::Other(Error::Overrun))
685 if dr.oe() { 684 } else if dr.be() {
686 Err(nb::Error::Other(Error::Overrun)) 685 Err(nb::Error::Other(Error::Break))
687 } else if dr.be() { 686 } else if dr.pe() {
688 Err(nb::Error::Other(Error::Break)) 687 Err(nb::Error::Other(Error::Parity))
689 } else if dr.pe() { 688 } else if dr.fe() {
690 Err(nb::Error::Other(Error::Parity)) 689 Err(nb::Error::Other(Error::Framing))
691 } else if dr.fe() { 690 } else {
692 Err(nb::Error::Other(Error::Framing)) 691 Ok(dr.data())
693 } else {
694 Ok(dr.data())
695 }
696 } 692 }
697 } 693 }
694}
698 695
699 impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { 696impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> {
700 type Error = Error; 697 type Error = Error;
701 698
702 fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { 699 fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> {
703 while !buffer.is_empty() { 700 while !buffer.is_empty() {
704 match self.blocking_write(buffer) { 701 match self.blocking_write(buffer) {
705 Ok(0) => panic!("zero-length write."), 702 Ok(0) => panic!("zero-length write."),
706 Ok(n) => buffer = &buffer[n..], 703 Ok(n) => buffer = &buffer[n..],
707 Err(e) => return Err(e), 704 Err(e) => return Err(e),
708 }
709 } 705 }
710 Ok(())
711 } 706 }
707 Ok(())
708 }
712 709
713 fn bflush(&mut self) -> Result<(), Self::Error> { 710 fn bflush(&mut self) -> Result<(), Self::Error> {
714 self.blocking_flush() 711 self.blocking_flush()
715 }
716 } 712 }
713}
717 714
718 impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUart<'d, T> { 715impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUart<'d, T> {
719 type Error = Error; 716 type Error = Error;
720 717
721 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 718 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
722 embedded_hal_02::serial::Read::read(&mut self.rx) 719 embedded_hal_02::serial::Read::read(&mut self.rx)
723 }
724 } 720 }
721}
725 722
726 impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { 723impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> {
727 type Error = Error; 724 type Error = Error;
728 725
729 fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { 726 fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> {
730 while !buffer.is_empty() { 727 while !buffer.is_empty() {
731 match self.blocking_write(buffer) { 728 match self.blocking_write(buffer) {
732 Ok(0) => panic!("zero-length write."), 729 Ok(0) => panic!("zero-length write."),
733 Ok(n) => buffer = &buffer[n..], 730 Ok(n) => buffer = &buffer[n..],
734 Err(e) => return Err(e), 731 Err(e) => return Err(e),
735 }
736 } 732 }
737 Ok(())
738 } 733 }
734 Ok(())
735 }
739 736
740 fn bflush(&mut self) -> Result<(), Self::Error> { 737 fn bflush(&mut self) -> Result<(), Self::Error> {
741 self.blocking_flush() 738 self.blocking_flush()
742 }
743 } 739 }
744} 740}
745 741
746#[cfg(feature = "unstable-traits")] 742impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> {
747mod eh1 { 743 type Error = Error;
748 use super::*; 744}
749 745
750 impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> { 746impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartTx<'d, T> {
751 type Error = Error; 747 type Error = Error;
752 } 748}
753 749
754 impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartTx<'d, T> { 750impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUart<'d, T> {
755 type Error = Error; 751 type Error = Error;
756 } 752}
757 753
758 impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUart<'d, T> { 754impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUartRx<'d, T> {
759 type Error = Error; 755 fn read(&mut self) -> nb::Result<u8, Self::Error> {
756 embedded_hal_02::serial::Read::read(self)
760 } 757 }
758}
761 759
762 impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUartRx<'d, T> { 760impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> {
763 fn read(&mut self) -> nb::Result<u8, Self::Error> { 761 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
764 embedded_hal_02::serial::Read::read(self) 762 self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other)
765 }
766 } 763 }
767 764
768 impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> { 765 fn flush(&mut self) -> nb::Result<(), Self::Error> {
769 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { 766 self.blocking_flush().map_err(nb::Error::Other)
770 self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other)
771 }
772
773 fn flush(&mut self) -> nb::Result<(), Self::Error> {
774 self.blocking_flush().map_err(nb::Error::Other)
775 }
776 } 767 }
768}
777 769
778 impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUart<'d, T> { 770impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUart<'d, T> {
779 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 771 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
780 embedded_hal_02::serial::Read::read(&mut self.rx) 772 embedded_hal_02::serial::Read::read(&mut self.rx)
781 }
782 } 773 }
774}
783 775
784 impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> { 776impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> {
785 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { 777 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
786 self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) 778 self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other)
787 } 779 }
788 780
789 fn flush(&mut self) -> nb::Result<(), Self::Error> { 781 fn flush(&mut self) -> nb::Result<(), Self::Error> {
790 self.blocking_flush().map_err(nb::Error::Other) 782 self.blocking_flush().map_err(nb::Error::Other)
791 }
792 } 783 }
793} 784}
diff --git a/embassy-rp/src/uart/mod.rs b/embassy-rp/src/uart/mod.rs
index 461986c81..18705b141 100644
--- a/embassy-rp/src/uart/mod.rs
+++ b/embassy-rp/src/uart/mod.rs
@@ -17,9 +17,7 @@ use crate::interrupt::typelevel::{Binding, Interrupt};
17use crate::pac::io::vals::{Inover, Outover}; 17use crate::pac::io::vals::{Inover, Outover};
18use crate::{interrupt, pac, peripherals, Peripheral, RegExt}; 18use crate::{interrupt, pac, peripherals, Peripheral, RegExt};
19 19
20#[cfg(feature = "nightly")]
21mod buffered; 20mod buffered;
22#[cfg(feature = "nightly")]
23pub use buffered::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx}; 21pub use buffered::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx};
24 22
25#[derive(Clone, Copy, PartialEq, Eq, Debug)] 23#[derive(Clone, Copy, PartialEq, Eq, Debug)]
@@ -193,7 +191,6 @@ impl<'d, T: Instance, M: Mode> UartTx<'d, T, M> {
193} 191}
194 192
195impl<'d, T: Instance> UartTx<'d, T, Blocking> { 193impl<'d, T: Instance> UartTx<'d, T, Blocking> {
196 #[cfg(feature = "nightly")]
197 pub fn into_buffered( 194 pub fn into_buffered(
198 self, 195 self,
199 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>, 196 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>,
@@ -307,7 +304,6 @@ impl<'d, T: Instance> UartRx<'d, T, Blocking> {
307 Self::new_inner(false, None) 304 Self::new_inner(false, None)
308 } 305 }
309 306
310 #[cfg(feature = "nightly")]
311 pub fn into_buffered( 307 pub fn into_buffered(
312 self, 308 self,
313 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>, 309 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>,
@@ -462,7 +458,6 @@ impl<'d, T: Instance> Uart<'d, T, Blocking> {
462 ) 458 )
463 } 459 }
464 460
465 #[cfg(feature = "nightly")]
466 pub fn into_buffered( 461 pub fn into_buffered(
467 self, 462 self,
468 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>, 463 irq: impl Binding<T::Interrupt, BufferedInterruptHandler<T>>,
@@ -709,172 +704,163 @@ impl<'d, T: Instance> Uart<'d, T, Async> {
709 } 704 }
710} 705}
711 706
712mod eh02 { 707impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, M> {
713 use super::*; 708 type Error = Error;
714 709 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
715 impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, M> { 710 let r = T::regs();
716 type Error = Error; 711 if r.uartfr().read().rxfe() {
717 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 712 return Err(nb::Error::WouldBlock);
718 let r = T::regs(); 713 }
719 if r.uartfr().read().rxfe() {
720 return Err(nb::Error::WouldBlock);
721 }
722 714
723 let dr = r.uartdr().read(); 715 let dr = r.uartdr().read();
724 716
725 if dr.oe() { 717 if dr.oe() {
726 Err(nb::Error::Other(Error::Overrun)) 718 Err(nb::Error::Other(Error::Overrun))
727 } else if dr.be() { 719 } else if dr.be() {
728 Err(nb::Error::Other(Error::Break)) 720 Err(nb::Error::Other(Error::Break))
729 } else if dr.pe() { 721 } else if dr.pe() {
730 Err(nb::Error::Other(Error::Parity)) 722 Err(nb::Error::Other(Error::Parity))
731 } else if dr.fe() { 723 } else if dr.fe() {
732 Err(nb::Error::Other(Error::Framing)) 724 Err(nb::Error::Other(Error::Framing))
733 } else { 725 } else {
734 Ok(dr.data()) 726 Ok(dr.data())
735 }
736 } 727 }
737 } 728 }
729}
738 730
739 impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Write<u8> for UartTx<'d, T, M> { 731impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Write<u8> for UartTx<'d, T, M> {
740 type Error = Error; 732 type Error = Error;
741
742 fn write(&mut self, word: u8) -> Result<(), nb::Error<Self::Error>> {
743 let r = T::regs();
744 if r.uartfr().read().txff() {
745 return Err(nb::Error::WouldBlock);
746 }
747 733
748 r.uartdr().write(|w| w.set_data(word)); 734 fn write(&mut self, word: u8) -> Result<(), nb::Error<Self::Error>> {
749 Ok(()) 735 let r = T::regs();
736 if r.uartfr().read().txff() {
737 return Err(nb::Error::WouldBlock);
750 } 738 }
751 739
752 fn flush(&mut self) -> Result<(), nb::Error<Self::Error>> { 740 r.uartdr().write(|w| w.set_data(word));
753 let r = T::regs(); 741 Ok(())
754 if !r.uartfr().read().txfe() {
755 return Err(nb::Error::WouldBlock);
756 }
757 Ok(())
758 }
759 } 742 }
760 743
761 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::serial::Write<u8> for UartTx<'d, T, M> { 744 fn flush(&mut self) -> Result<(), nb::Error<Self::Error>> {
762 type Error = Error; 745 let r = T::regs();
763 746 if !r.uartfr().read().txfe() {
764 fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { 747 return Err(nb::Error::WouldBlock);
765 self.blocking_write(buffer)
766 }
767
768 fn bflush(&mut self) -> Result<(), Self::Error> {
769 self.blocking_flush()
770 } 748 }
749 Ok(())
771 } 750 }
751}
772 752
773 impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Read<u8> for Uart<'d, T, M> { 753impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::serial::Write<u8> for UartTx<'d, T, M> {
774 type Error = Error; 754 type Error = Error;
775 755
776 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 756 fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
777 embedded_hal_02::serial::Read::read(&mut self.rx) 757 self.blocking_write(buffer)
778 }
779 } 758 }
780 759
781 impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Write<u8> for Uart<'d, T, M> { 760 fn bflush(&mut self) -> Result<(), Self::Error> {
782 type Error = Error; 761 self.blocking_flush()
762 }
763}
783 764
784 fn write(&mut self, word: u8) -> Result<(), nb::Error<Self::Error>> { 765impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Read<u8> for Uart<'d, T, M> {
785 embedded_hal_02::serial::Write::write(&mut self.tx, word) 766 type Error = Error;
786 }
787 767
788 fn flush(&mut self) -> Result<(), nb::Error<Self::Error>> { 768 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
789 embedded_hal_02::serial::Write::flush(&mut self.tx) 769 embedded_hal_02::serial::Read::read(&mut self.rx)
790 }
791 } 770 }
771}
792 772
793 impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::serial::Write<u8> for Uart<'d, T, M> { 773impl<'d, T: Instance, M: Mode> embedded_hal_02::serial::Write<u8> for Uart<'d, T, M> {
794 type Error = Error; 774 type Error = Error;
795 775
796 fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { 776 fn write(&mut self, word: u8) -> Result<(), nb::Error<Self::Error>> {
797 self.blocking_write(buffer) 777 embedded_hal_02::serial::Write::write(&mut self.tx, word)
798 } 778 }
799 779
800 fn bflush(&mut self) -> Result<(), Self::Error> { 780 fn flush(&mut self) -> Result<(), nb::Error<Self::Error>> {
801 self.blocking_flush() 781 embedded_hal_02::serial::Write::flush(&mut self.tx)
802 }
803 } 782 }
804} 783}
805 784
806#[cfg(feature = "unstable-traits")] 785impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::serial::Write<u8> for Uart<'d, T, M> {
807mod eh1 { 786 type Error = Error;
808 use super::*;
809 787
810 impl embedded_hal_nb::serial::Error for Error { 788 fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
811 fn kind(&self) -> embedded_hal_nb::serial::ErrorKind { 789 self.blocking_write(buffer)
812 match *self {
813 Self::Framing => embedded_hal_nb::serial::ErrorKind::FrameFormat,
814 Self::Break => embedded_hal_nb::serial::ErrorKind::Other,
815 Self::Overrun => embedded_hal_nb::serial::ErrorKind::Overrun,
816 Self::Parity => embedded_hal_nb::serial::ErrorKind::Parity,
817 }
818 }
819 } 790 }
820 791
821 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for UartRx<'d, T, M> { 792 fn bflush(&mut self) -> Result<(), Self::Error> {
822 type Error = Error; 793 self.blocking_flush()
823 } 794 }
795}
824 796
825 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for UartTx<'d, T, M> { 797impl embedded_hal_nb::serial::Error for Error {
826 type Error = Error; 798 fn kind(&self) -> embedded_hal_nb::serial::ErrorKind {
799 match *self {
800 Self::Framing => embedded_hal_nb::serial::ErrorKind::FrameFormat,
801 Self::Break => embedded_hal_nb::serial::ErrorKind::Other,
802 Self::Overrun => embedded_hal_nb::serial::ErrorKind::Overrun,
803 Self::Parity => embedded_hal_nb::serial::ErrorKind::Parity,
804 }
827 } 805 }
806}
828 807
829 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for Uart<'d, T, M> { 808impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for UartRx<'d, T, M> {
830 type Error = Error; 809 type Error = Error;
831 } 810}
832 811
833 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Read for UartRx<'d, T, M> { 812impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for UartTx<'d, T, M> {
834 fn read(&mut self) -> nb::Result<u8, Self::Error> { 813 type Error = Error;
835 let r = T::regs(); 814}
836 let dr = r.uartdr().read();
837 815
838 if dr.oe() { 816impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::ErrorType for Uart<'d, T, M> {
839 Err(nb::Error::Other(Error::Overrun)) 817 type Error = Error;
840 } else if dr.be() { 818}
841 Err(nb::Error::Other(Error::Break)) 819
842 } else if dr.pe() { 820impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Read for UartRx<'d, T, M> {
843 Err(nb::Error::Other(Error::Parity)) 821 fn read(&mut self) -> nb::Result<u8, Self::Error> {
844 } else if dr.fe() { 822 let r = T::regs();
845 Err(nb::Error::Other(Error::Framing)) 823 let dr = r.uartdr().read();
846 } else if dr.fe() { 824
847 Ok(dr.data()) 825 if dr.oe() {
848 } else { 826 Err(nb::Error::Other(Error::Overrun))
849 Err(nb::Error::WouldBlock) 827 } else if dr.be() {
850 } 828 Err(nb::Error::Other(Error::Break))
829 } else if dr.pe() {
830 Err(nb::Error::Other(Error::Parity))
831 } else if dr.fe() {
832 Err(nb::Error::Other(Error::Framing))
833 } else if dr.fe() {
834 Ok(dr.data())
835 } else {
836 Err(nb::Error::WouldBlock)
851 } 837 }
852 } 838 }
839}
853 840
854 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Write for UartTx<'d, T, M> { 841impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Write for UartTx<'d, T, M> {
855 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { 842 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
856 self.blocking_write(&[char]).map_err(nb::Error::Other) 843 self.blocking_write(&[char]).map_err(nb::Error::Other)
857 } 844 }
858 845
859 fn flush(&mut self) -> nb::Result<(), Self::Error> { 846 fn flush(&mut self) -> nb::Result<(), Self::Error> {
860 self.blocking_flush().map_err(nb::Error::Other) 847 self.blocking_flush().map_err(nb::Error::Other)
861 }
862 } 848 }
849}
863 850
864 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Read for Uart<'d, T, M> { 851impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Read for Uart<'d, T, M> {
865 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 852 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
866 embedded_hal_02::serial::Read::read(&mut self.rx) 853 embedded_hal_02::serial::Read::read(&mut self.rx)
867 }
868 } 854 }
855}
869 856
870 impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Write for Uart<'d, T, M> { 857impl<'d, T: Instance, M: Mode> embedded_hal_nb::serial::Write for Uart<'d, T, M> {
871 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { 858 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
872 self.blocking_write(&[char]).map_err(nb::Error::Other) 859 self.blocking_write(&[char]).map_err(nb::Error::Other)
873 } 860 }
874 861
875 fn flush(&mut self) -> nb::Result<(), Self::Error> { 862 fn flush(&mut self) -> nb::Result<(), Self::Error> {
876 self.blocking_flush().map_err(nb::Error::Other) 863 self.blocking_flush().map_err(nb::Error::Other)
877 }
878 } 864 }
879} 865}
880 866
@@ -891,7 +877,6 @@ mod sealed {
891 877
892 fn regs() -> pac::uart::Uart; 878 fn regs() -> pac::uart::Uart;
893 879
894 #[cfg(feature = "nightly")]
895 fn buffered_state() -> &'static buffered::State; 880 fn buffered_state() -> &'static buffered::State;
896 881
897 fn dma_state() -> &'static DmaState; 882 fn dma_state() -> &'static DmaState;
@@ -931,7 +916,6 @@ macro_rules! impl_instance {
931 pac::$inst 916 pac::$inst
932 } 917 }
933 918
934 #[cfg(feature = "nightly")]
935 fn buffered_state() -> &'static buffered::State { 919 fn buffered_state() -> &'static buffered::State {
936 static STATE: buffered::State = buffered::State::new(); 920 static STATE: buffered::State = buffered::State::new();
937 &STATE 921 &STATE