diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-09-20 22:01:24 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-10-02 21:30:43 +0200 |
| commit | 0d84533bcb25a0d6cbe6aee5418e1ebf2cbbc26a (patch) | |
| tree | be1878ad6ecc52e975040d83acad015779938e57 /src | |
| parent | c385bbf07dfcadb832d02e91385bcecc45c0ef58 (diff) | |
Use async spi transaction helper macro.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 176 |
1 files changed, 70 insertions, 106 deletions
diff --git a/src/lib.rs b/src/lib.rs index 2a3d4dee3..ba8acd347 100644 --- a/src/lib.rs +++ b/src/lib.rs | |||
| @@ -23,7 +23,7 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex; | |||
| 23 | use embassy_sync::channel::Channel; | 23 | use embassy_sync::channel::Channel; |
| 24 | use embassy_time::{block_for, Duration, Timer}; | 24 | use embassy_time::{block_for, Duration, Timer}; |
| 25 | use embedded_hal_1::digital::OutputPin; | 25 | use embedded_hal_1::digital::OutputPin; |
| 26 | use embedded_hal_async::spi::{SpiBusRead, SpiBusWrite, SpiDevice}; | 26 | use embedded_hal_async::spi::{transaction, SpiBusRead, SpiBusWrite, SpiDevice}; |
| 27 | 27 | ||
| 28 | use self::structs::*; | 28 | use self::structs::*; |
| 29 | use crate::events::Event; | 29 | use crate::events::Event; |
| @@ -753,17 +753,13 @@ where | |||
| 753 | 753 | ||
| 754 | let cmd = cmd_word(READ, INC_ADDR, FUNC_WLAN, 0, len); | 754 | let cmd = cmd_word(READ, INC_ADDR, FUNC_WLAN, 0, len); |
| 755 | 755 | ||
| 756 | self.spi | 756 | transaction!(&mut self.spi, |bus| async { |
| 757 | .transaction(|bus| { | 757 | bus.write(&[cmd]).await?; |
| 758 | let bus = unsafe { &mut *bus }; | 758 | bus.read(&mut buf[..(len as usize + 3) / 4]).await?; |
| 759 | async { | 759 | Ok(()) |
| 760 | bus.write(&[cmd]).await?; | 760 | }) |
| 761 | bus.read(&mut buf[..(len as usize + 3) / 4]).await?; | 761 | .await |
| 762 | Ok(()) | 762 | .unwrap(); |
| 763 | } | ||
| 764 | }) | ||
| 765 | .await | ||
| 766 | .unwrap(); | ||
| 767 | 763 | ||
| 768 | trace!("rx {:02x}", &slice8_mut(&mut buf)[..(len as usize).min(48)]); | 764 | trace!("rx {:02x}", &slice8_mut(&mut buf)[..(len as usize).min(48)]); |
| 769 | 765 | ||
| @@ -817,17 +813,13 @@ where | |||
| 817 | trace!(" {:02x}", &buf8[..total_len.min(48)]); | 813 | trace!(" {:02x}", &buf8[..total_len.min(48)]); |
| 818 | 814 | ||
| 819 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_WLAN, 0, total_len as _); | 815 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_WLAN, 0, total_len as _); |
| 820 | self.spi | 816 | transaction!(&mut self.spi, |bus| async { |
| 821 | .transaction(|bus| { | 817 | bus.write(&[cmd]).await?; |
| 822 | let bus = unsafe { &mut *bus }; | 818 | bus.write(&buf[..(total_len / 4)]).await?; |
| 823 | async { | 819 | Ok(()) |
| 824 | bus.write(&[cmd]).await?; | 820 | }) |
| 825 | bus.write(&buf[..(total_len / 4)]).await?; | 821 | .await |
| 826 | Ok(()) | 822 | .unwrap(); |
| 827 | } | ||
| 828 | }) | ||
| 829 | .await | ||
| 830 | .unwrap(); | ||
| 831 | } | 823 | } |
| 832 | 824 | ||
| 833 | fn rx(&mut self, packet: &[u8]) { | 825 | fn rx(&mut self, packet: &[u8]) { |
| @@ -1012,17 +1004,13 @@ where | |||
| 1012 | 1004 | ||
| 1013 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_WLAN, 0, total_len as _); | 1005 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_WLAN, 0, total_len as _); |
| 1014 | 1006 | ||
| 1015 | self.spi | 1007 | transaction!(&mut self.spi, |bus| async { |
| 1016 | .transaction(|bus| { | 1008 | bus.write(&[cmd]).await?; |
| 1017 | let bus = unsafe { &mut *bus }; | 1009 | bus.write(&buf[..total_len / 4]).await?; |
| 1018 | async { | 1010 | Ok(()) |
| 1019 | bus.write(&[cmd]).await?; | 1011 | }) |
| 1020 | bus.write(&buf[..total_len / 4]).await?; | 1012 | .await |
| 1021 | Ok(()) | 1013 | .unwrap(); |
| 1022 | } | ||
| 1023 | }) | ||
| 1024 | .await | ||
| 1025 | .unwrap(); | ||
| 1026 | } | 1014 | } |
| 1027 | 1015 | ||
| 1028 | async fn core_disable(&mut self, core: Core) { | 1016 | async fn core_disable(&mut self, core: Core) { |
| @@ -1101,23 +1089,19 @@ where | |||
| 1101 | 1089 | ||
| 1102 | let cmd = cmd_word(READ, INC_ADDR, FUNC_BACKPLANE, window_offs, len as u32); | 1090 | let cmd = cmd_word(READ, INC_ADDR, FUNC_BACKPLANE, window_offs, len as u32); |
| 1103 | 1091 | ||
| 1104 | self.spi | 1092 | transaction!(&mut self.spi, |bus| async { |
| 1105 | .transaction(|bus| { | 1093 | bus.write(&[cmd]).await?; |
| 1106 | let bus = unsafe { &mut *bus }; | ||
| 1107 | async { | ||
| 1108 | bus.write(&[cmd]).await?; | ||
| 1109 | 1094 | ||
| 1110 | // 4-byte response delay. | 1095 | // 4-byte response delay. |
| 1111 | let mut junk = [0; 1]; | 1096 | let mut junk = [0; 1]; |
| 1112 | bus.read(&mut junk).await?; | 1097 | bus.read(&mut junk).await?; |
| 1113 | 1098 | ||
| 1114 | // Read data | 1099 | // Read data |
| 1115 | bus.read(&mut data[..len / 4]).await?; | 1100 | bus.read(&mut data[..len / 4]).await?; |
| 1116 | Ok(()) | 1101 | Ok(()) |
| 1117 | } | 1102 | }) |
| 1118 | }) | 1103 | .await |
| 1119 | .await | 1104 | .unwrap(); |
| 1120 | .unwrap(); | ||
| 1121 | 1105 | ||
| 1122 | // Advance ptr. | 1106 | // Advance ptr. |
| 1123 | addr += len as u32; | 1107 | addr += len as u32; |
| @@ -1146,17 +1130,13 @@ where | |||
| 1146 | 1130 | ||
| 1147 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_BACKPLANE, window_offs, len as u32); | 1131 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_BACKPLANE, window_offs, len as u32); |
| 1148 | 1132 | ||
| 1149 | self.spi | 1133 | transaction!(&mut self.spi, |bus| async { |
| 1150 | .transaction(|bus| { | 1134 | bus.write(&[cmd]).await?; |
| 1151 | let bus = unsafe { &mut *bus }; | 1135 | bus.write(&buf[..(len + 3) / 4]).await?; |
| 1152 | async { | 1136 | Ok(()) |
| 1153 | bus.write(&[cmd]).await?; | 1137 | }) |
| 1154 | bus.write(&buf[..(len + 3) / 4]).await?; | 1138 | .await |
| 1155 | Ok(()) | 1139 | .unwrap(); |
| 1156 | } | ||
| 1157 | }) | ||
| 1158 | .await | ||
| 1159 | .unwrap(); | ||
| 1160 | 1140 | ||
| 1161 | // Advance ptr. | 1141 | // Advance ptr. |
| 1162 | addr += len as u32; | 1142 | addr += len as u32; |
| @@ -1270,21 +1250,17 @@ where | |||
| 1270 | let cmd = cmd_word(READ, INC_ADDR, func, addr, len); | 1250 | let cmd = cmd_word(READ, INC_ADDR, func, addr, len); |
| 1271 | let mut buf = [0; 1]; | 1251 | let mut buf = [0; 1]; |
| 1272 | 1252 | ||
| 1273 | self.spi | 1253 | transaction!(&mut self.spi, |bus| async { |
| 1274 | .transaction(|bus| { | 1254 | bus.write(&[cmd]).await?; |
| 1275 | let bus = unsafe { &mut *bus }; | 1255 | if func == FUNC_BACKPLANE { |
| 1276 | async { | 1256 | // 4-byte response delay. |
| 1277 | bus.write(&[cmd]).await?; | 1257 | bus.read(&mut buf).await?; |
| 1278 | if func == FUNC_BACKPLANE { | 1258 | } |
| 1279 | // 4-byte response delay. | 1259 | bus.read(&mut buf).await?; |
| 1280 | bus.read(&mut buf).await?; | 1260 | Ok(()) |
| 1281 | } | 1261 | }) |
| 1282 | bus.read(&mut buf).await?; | 1262 | .await |
| 1283 | Ok(()) | 1263 | .unwrap(); |
| 1284 | } | ||
| 1285 | }) | ||
| 1286 | .await | ||
| 1287 | .unwrap(); | ||
| 1288 | 1264 | ||
| 1289 | buf[0] | 1265 | buf[0] |
| 1290 | } | 1266 | } |
| @@ -1292,33 +1268,25 @@ where | |||
| 1292 | async fn writen(&mut self, func: u32, addr: u32, val: u32, len: u32) { | 1268 | async fn writen(&mut self, func: u32, addr: u32, val: u32, len: u32) { |
| 1293 | let cmd = cmd_word(WRITE, INC_ADDR, func, addr, len); | 1269 | let cmd = cmd_word(WRITE, INC_ADDR, func, addr, len); |
| 1294 | 1270 | ||
| 1295 | self.spi | 1271 | transaction!(&mut self.spi, |bus| async { |
| 1296 | .transaction(|bus| { | 1272 | bus.write(&[cmd, val]).await?; |
| 1297 | let bus = unsafe { &mut *bus }; | 1273 | Ok(()) |
| 1298 | async { | 1274 | }) |
| 1299 | bus.write(&[cmd, val]).await?; | 1275 | .await |
| 1300 | Ok(()) | 1276 | .unwrap(); |
| 1301 | } | ||
| 1302 | }) | ||
| 1303 | .await | ||
| 1304 | .unwrap(); | ||
| 1305 | } | 1277 | } |
| 1306 | 1278 | ||
| 1307 | async fn read32_swapped(&mut self, addr: u32) -> u32 { | 1279 | async fn read32_swapped(&mut self, addr: u32) -> u32 { |
| 1308 | let cmd = cmd_word(READ, INC_ADDR, FUNC_BUS, addr, 4); | 1280 | let cmd = cmd_word(READ, INC_ADDR, FUNC_BUS, addr, 4); |
| 1309 | let mut buf = [0; 1]; | 1281 | let mut buf = [0; 1]; |
| 1310 | 1282 | ||
| 1311 | self.spi | 1283 | transaction!(&mut self.spi, |bus| async { |
| 1312 | .transaction(|bus| { | 1284 | bus.write(&[swap16(cmd)]).await?; |
| 1313 | let bus = unsafe { &mut *bus }; | 1285 | bus.read(&mut buf).await?; |
| 1314 | async { | 1286 | Ok(()) |
| 1315 | bus.write(&[swap16(cmd)]).await?; | 1287 | }) |
| 1316 | bus.read(&mut buf).await?; | 1288 | .await |
| 1317 | Ok(()) | 1289 | .unwrap(); |
| 1318 | } | ||
| 1319 | }) | ||
| 1320 | .await | ||
| 1321 | .unwrap(); | ||
| 1322 | 1290 | ||
| 1323 | swap16(buf[0]) | 1291 | swap16(buf[0]) |
| 1324 | } | 1292 | } |
| @@ -1326,16 +1294,12 @@ where | |||
| 1326 | async fn write32_swapped(&mut self, addr: u32, val: u32) { | 1294 | async fn write32_swapped(&mut self, addr: u32, val: u32) { |
| 1327 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_BUS, addr, 4); | 1295 | let cmd = cmd_word(WRITE, INC_ADDR, FUNC_BUS, addr, 4); |
| 1328 | 1296 | ||
| 1329 | self.spi | 1297 | transaction!(&mut self.spi, |bus| async { |
| 1330 | .transaction(|bus| { | 1298 | bus.write(&[swap16(cmd), swap16(val)]).await?; |
| 1331 | let bus = unsafe { &mut *bus }; | 1299 | Ok(()) |
| 1332 | async { | 1300 | }) |
| 1333 | bus.write(&[swap16(cmd), swap16(val)]).await?; | 1301 | .await |
| 1334 | Ok(()) | 1302 | .unwrap(); |
| 1335 | } | ||
| 1336 | }) | ||
| 1337 | .await | ||
| 1338 | .unwrap(); | ||
| 1339 | } | 1303 | } |
| 1340 | } | 1304 | } |
| 1341 | 1305 | ||
