diff options
Diffstat (limited to 'embassy-rp/src')
| -rw-r--r-- | embassy-rp/src/flash.rs | 2 | ||||
| -rw-r--r-- | embassy-rp/src/gpio.rs | 303 | ||||
| -rw-r--r-- | embassy-rp/src/i2c.rs | 230 | ||||
| -rw-r--r-- | embassy-rp/src/lib.rs | 4 | ||||
| -rw-r--r-- | embassy-rp/src/spi.rs | 108 | ||||
| -rw-r--r-- | embassy-rp/src/uart/buffered.rs | 165 | ||||
| -rw-r--r-- | embassy-rp/src/uart/mod.rs | 244 |
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")] | ||
| 356 | impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::ReadNorFlash | 355 | impl<'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")] | ||
| 371 | impl<'d, T: Instance, const FLASH_SIZE: usize> embedded_storage_async::nor_flash::NorFlash | 369 | impl<'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] |
| 2 | use core::convert::Infallible; | ||
| 2 | use core::future::Future; | 3 | use core::future::Future; |
| 3 | use core::pin::Pin as FuturePin; | 4 | use core::pin::Pin as FuturePin; |
| 4 | use core::task::{Context, Poll}; | 5 | use core::task::{Context, Poll}; |
| @@ -1036,217 +1037,207 @@ mod eh02 { | |||
| 1036 | } | 1037 | } |
| 1037 | } | 1038 | } |
| 1038 | 1039 | ||
| 1039 | #[cfg(feature = "unstable-traits")] | 1040 | impl<'d, T: Pin> embedded_hal_1::digital::ErrorType for Input<'d, T> { |
| 1040 | mod eh1 { | 1041 | type Error = Infallible; |
| 1041 | use core::convert::Infallible; | 1042 | } |
| 1042 | 1043 | ||
| 1043 | use super::*; | 1044 | impl<'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> { | 1054 | impl<'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> { | 1058 | impl<'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> { | 1068 | impl<'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> { | 1078 | impl<'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> { | 1084 | impl<'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 | |
| 1088 | impl<'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> { | 1098 | impl<'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> { | 1108 | impl<'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> { | 1114 | impl<'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> { | 1124 | impl<'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> { | 1128 | impl<'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> { | 1138 | impl<'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> { | 1148 | impl<'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> { | 1158 | impl<'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")] | 1164 | impl<'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")] | 1191 | impl<'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")] | 1218 | impl<'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 | ||
| 591 | mod eh02 { | 591 | impl<'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> { | 599 | impl<'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> { | 607 | impl<'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> { | 615 | impl<'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")] | 637 | impl embedded_hal_1::i2c::Error for Error { |
| 642 | mod 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> { | 654 | impl<'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> { | 658 | impl<'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"))] | ||
| 697 | mod nightly { | ||
| 698 | use embedded_hal_1::i2c::Operation; | ||
| 699 | use embedded_hal_async::i2c::AddressMode; | ||
| 700 | 687 | ||
| 701 | use super::*; | 688 | impl<'d, A, T> embedded_hal_async::i2c::I2c<A> for I2c<'d, T, Async> |
| 689 | where | ||
| 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. |
| 6 | pub(crate) mod fmt; | 5 | pub(crate) mod fmt; |
| @@ -28,7 +27,6 @@ pub mod spi; | |||
| 28 | #[cfg(feature = "time-driver")] | 27 | #[cfg(feature = "time-driver")] |
| 29 | pub mod timer; | 28 | pub mod timer; |
| 30 | pub mod uart; | 29 | pub mod uart; |
| 31 | #[cfg(feature = "nightly")] | ||
| 32 | pub mod usb; | 30 | pub mod usb; |
| 33 | pub mod watchdog; | 31 | pub 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 | ||
| 514 | mod eh02 { | 514 | impl<'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> { | 522 | impl<'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")] | 530 | impl embedded_hal_1::spi::Error for Error { |
| 535 | mod 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> { | 536 | impl<'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> { | 540 | impl<'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"))] | 562 | impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spi<'d, T, Async> { |
| 572 | mod 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 | ||
| 671 | mod eh02 { | 671 | impl<'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> { | 696 | impl<'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> { | 715 | impl<'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> { | 723 | impl<'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")] | 742 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> { |
| 747 | mod 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> { | 746 | impl<'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> { | 750 | impl<'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> { | 754 | impl<'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> { | 760 | impl<'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> { | 770 | impl<'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> { | 776 | impl<'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}; | |||
| 17 | use crate::pac::io::vals::{Inover, Outover}; | 17 | use crate::pac::io::vals::{Inover, Outover}; |
| 18 | use crate::{interrupt, pac, peripherals, Peripheral, RegExt}; | 18 | use crate::{interrupt, pac, peripherals, Peripheral, RegExt}; |
| 19 | 19 | ||
| 20 | #[cfg(feature = "nightly")] | ||
| 21 | mod buffered; | 20 | mod buffered; |
| 22 | #[cfg(feature = "nightly")] | ||
| 23 | pub use buffered::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx}; | 21 | pub 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 | ||
| 195 | impl<'d, T: Instance> UartTx<'d, T, Blocking> { | 193 | impl<'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 | ||
| 712 | mod eh02 { | 707 | impl<'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> { | 731 | impl<'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> { | 753 | impl<'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>> { | 765 | impl<'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> { | 773 | impl<'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")] | 785 | impl<'d, T: Instance, M: Mode> embedded_hal_02::blocking::serial::Write<u8> for Uart<'d, T, M> { |
| 807 | mod 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> { | 797 | impl 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> { | 808 | impl<'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> { | 812 | impl<'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() { | 816 | impl<'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() { | 820 | impl<'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> { | 841 | impl<'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> { | 851 | impl<'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> { | 857 | impl<'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 |
