aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-09-20 22:01:24 +0200
committerDario Nieuwenhuis <[email protected]>2022-10-02 21:30:43 +0200
commit0d84533bcb25a0d6cbe6aee5418e1ebf2cbbc26a (patch)
treebe1878ad6ecc52e975040d83acad015779938e57 /src
parentc385bbf07dfcadb832d02e91385bcecc45c0ef58 (diff)
Use async spi transaction helper macro.
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs176
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;
23use embassy_sync::channel::Channel; 23use embassy_sync::channel::Channel;
24use embassy_time::{block_for, Duration, Timer}; 24use embassy_time::{block_for, Duration, Timer};
25use embedded_hal_1::digital::OutputPin; 25use embedded_hal_1::digital::OutputPin;
26use embedded_hal_async::spi::{SpiBusRead, SpiBusWrite, SpiDevice}; 26use embedded_hal_async::spi::{transaction, SpiBusRead, SpiBusWrite, SpiDevice};
27 27
28use self::structs::*; 28use self::structs::*;
29use crate::events::Event; 29use 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