mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-29 10:12:35 +00:00
Merge branch 'main' of https://github.com/embassy-rs/embassy into embassy-stm32/rcc-rtc-l4
This commit is contained in:
commit
1255d8a8ce
49
.github/ci/doc.sh
vendored
49
.github/ci/doc.sh
vendored
@ -15,30 +15,31 @@ export BUILDER_COMPRESS=true
|
|||||||
# which makes rustup very sad
|
# which makes rustup very sad
|
||||||
rustc --version > /dev/null
|
rustc --version > /dev/null
|
||||||
|
|
||||||
docserver-builder -i ./embassy-stm32 -o crates/embassy-stm32/git.zup
|
docserver-builder -i ./embassy-stm32 -o webroot/crates/embassy-stm32/git.zup
|
||||||
docserver-builder -i ./embassy-boot/boot -o crates/embassy-boot/git.zup
|
docserver-builder -i ./embassy-boot/boot -o webroot/crates/embassy-boot/git.zup
|
||||||
docserver-builder -i ./embassy-boot/nrf -o crates/embassy-boot-nrf/git.zup
|
docserver-builder -i ./embassy-boot/nrf -o webroot/crates/embassy-boot-nrf/git.zup
|
||||||
docserver-builder -i ./embassy-boot/rp -o crates/embassy-boot-rp/git.zup
|
docserver-builder -i ./embassy-boot/rp -o webroot/crates/embassy-boot-rp/git.zup
|
||||||
docserver-builder -i ./embassy-boot/stm32 -o crates/embassy-boot-stm32/git.zup
|
docserver-builder -i ./embassy-boot/stm32 -o webroot/crates/embassy-boot-stm32/git.zup
|
||||||
docserver-builder -i ./embassy-embedded-hal -o crates/embassy-embedded-hal/git.zup
|
docserver-builder -i ./embassy-embedded-hal -o webroot/crates/embassy-embedded-hal/git.zup
|
||||||
docserver-builder -i ./embassy-executor -o crates/embassy-executor/git.zup
|
docserver-builder -i ./embassy-executor -o webroot/crates/embassy-executor/git.zup
|
||||||
docserver-builder -i ./embassy-futures -o crates/embassy-futures/git.zup
|
docserver-builder -i ./embassy-futures -o webroot/crates/embassy-futures/git.zup
|
||||||
docserver-builder -i ./embassy-lora -o crates/embassy-lora/git.zup
|
docserver-builder -i ./embassy-lora -o webroot/crates/embassy-lora/git.zup
|
||||||
docserver-builder -i ./embassy-net -o crates/embassy-net/git.zup
|
docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup
|
||||||
docserver-builder -i ./embassy-net-driver -o crates/embassy-net-driver/git.zup
|
docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup
|
||||||
docserver-builder -i ./embassy-net-driver-channel -o crates/embassy-net-driver-channel/git.zup
|
docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup
|
||||||
docserver-builder -i ./embassy-nrf -o crates/embassy-nrf/git.zup
|
docserver-builder -i ./embassy-nrf -o webroot/crates/embassy-nrf/git.zup
|
||||||
docserver-builder -i ./embassy-rp -o crates/embassy-rp/git.zup
|
docserver-builder -i ./embassy-rp -o webroot/crates/embassy-rp/git.zup
|
||||||
docserver-builder -i ./embassy-sync -o crates/embassy-sync/git.zup
|
docserver-builder -i ./embassy-sync -o webroot/crates/embassy-sync/git.zup
|
||||||
docserver-builder -i ./embassy-time -o crates/embassy-time/git.zup
|
docserver-builder -i ./embassy-time -o webroot/crates/embassy-time/git.zup
|
||||||
docserver-builder -i ./embassy-usb -o crates/embassy-usb/git.zup
|
docserver-builder -i ./embassy-usb -o webroot/crates/embassy-usb/git.zup
|
||||||
docserver-builder -i ./embassy-usb-driver -o crates/embassy-usb-driver/git.zup
|
docserver-builder -i ./embassy-usb-driver -o webroot/crates/embassy-usb-driver/git.zup
|
||||||
docserver-builder -i ./embassy-usb-logger -o crates/embassy-usb-logger/git.zup
|
docserver-builder -i ./embassy-usb-logger -o webroot/crates/embassy-usb-logger/git.zup
|
||||||
docserver-builder -i ./cyw43 -o crates/cyw43/git.zup
|
docserver-builder -i ./cyw43 -o webroot/crates/cyw43/git.zup
|
||||||
docserver-builder -i ./cyw43-pio -o crates/cyw43-pio/git.zup
|
docserver-builder -i ./cyw43-pio -o webroot/crates/cyw43-pio/git.zup
|
||||||
docserver-builder -i ./embassy-net-w5500 -o crates/embassy-net-w5500/git.zup
|
docserver-builder -i ./embassy-net-w5500 -o webroot/crates/embassy-net-w5500/git.zup
|
||||||
docserver-builder -i ./embassy-stm32-wpan -o crates/embassy-stm32-wpan/git.zup
|
docserver-builder -i ./embassy-stm32-wpan -o webroot/crates/embassy-stm32-wpan/git.zup --output-static webroot/static
|
||||||
|
|
||||||
export KUBECONFIG=/ci/secrets/kubeconfig.yml
|
export KUBECONFIG=/ci/secrets/kubeconfig.yml
|
||||||
POD=$(kubectl -n embassy get po -l app=docserver -o jsonpath={.items[0].metadata.name})
|
POD=$(kubectl -n embassy get po -l app=docserver -o jsonpath={.items[0].metadata.name})
|
||||||
kubectl cp crates $POD:/data
|
kubectl cp webroot/crates $POD:/data
|
||||||
|
kubectl cp webroot/static $POD:/data
|
@ -24,7 +24,7 @@ cortex-m = "0.7.6"
|
|||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] }
|
||||||
|
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.11" }
|
||||||
num_enum = { version = "0.5.7", default-features = false }
|
num_enum = { version = "0.5.7", default-features = false }
|
||||||
|
|
||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
|
@ -345,7 +345,9 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn rx(&mut self, packet: &mut [u8]) {
|
fn rx(&mut self, packet: &mut [u8]) {
|
||||||
let Some((sdpcm_header, payload)) = SdpcmHeader::parse(packet) else { return };
|
let Some((sdpcm_header, payload)) = SdpcmHeader::parse(packet) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
self.update_credit(&sdpcm_header);
|
self.update_credit(&sdpcm_header);
|
||||||
|
|
||||||
@ -353,7 +355,9 @@ where
|
|||||||
|
|
||||||
match channel {
|
match channel {
|
||||||
CHANNEL_TYPE_CONTROL => {
|
CHANNEL_TYPE_CONTROL => {
|
||||||
let Some((cdc_header, response)) = CdcHeader::parse(payload) else { return; };
|
let Some((cdc_header, response)) = CdcHeader::parse(payload) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
trace!(" {:?}", cdc_header);
|
trace!(" {:?}", cdc_header);
|
||||||
|
|
||||||
if cdc_header.id == self.ioctl_id {
|
if cdc_header.id == self.ioctl_id {
|
||||||
@ -417,8 +421,12 @@ where
|
|||||||
let status = event_packet.msg.status;
|
let status = event_packet.msg.status;
|
||||||
let event_payload = match evt_type {
|
let event_payload = match evt_type {
|
||||||
Event::ESCAN_RESULT if status == EStatus::PARTIAL => {
|
Event::ESCAN_RESULT if status == EStatus::PARTIAL => {
|
||||||
let Some((_, bss_info)) = ScanResults::parse(evt_data) else { return };
|
let Some((_, bss_info)) = ScanResults::parse(evt_data) else {
|
||||||
let Some(bss_info) = BssInfo::parse(bss_info) else { return };
|
return;
|
||||||
|
};
|
||||||
|
let Some(bss_info) = BssInfo::parse(bss_info) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
events::Payload::BssInfo(*bss_info)
|
events::Payload::BssInfo(*bss_info)
|
||||||
}
|
}
|
||||||
Event::ESCAN_RESULT => events::Payload::None,
|
Event::ESCAN_RESULT => events::Payload::None,
|
||||||
@ -439,7 +447,9 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CHANNEL_TYPE_DATA => {
|
CHANNEL_TYPE_DATA => {
|
||||||
let Some((_, packet)) = BdcHeader::parse(payload) else { return };
|
let Some((_, packet)) = BdcHeader::parse(payload) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
trace!("rx pkt {:02x}", Bytes(&packet[..packet.len().min(48)]));
|
trace!("rx pkt {:02x}", Bytes(&packet[..packet.len().min(48)]));
|
||||||
|
|
||||||
match self.ch.try_rx_buf() {
|
match self.ch.try_rx_buf() {
|
||||||
|
@ -15,15 +15,18 @@ target = "x86_64-unknown-linux-gnu"
|
|||||||
std = []
|
std = []
|
||||||
# Enable nightly-only features
|
# Enable nightly-only features
|
||||||
nightly = ["embassy-futures", "embedded-hal-async", "embedded-storage-async"]
|
nightly = ["embassy-futures", "embedded-hal-async", "embedded-storage-async"]
|
||||||
|
time = ["dep:embassy-time"]
|
||||||
|
default = ["time"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-futures = { version = "0.1.0", path = "../embassy-futures", optional = true }
|
embassy-futures = { version = "0.1.0", path = "../embassy-futures", optional = true }
|
||||||
embassy-sync = { version = "0.2.0", path = "../embassy-sync" }
|
embassy-sync = { version = "0.2.0", path = "../embassy-sync" }
|
||||||
|
embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true }
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = [
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = [
|
||||||
"unproven",
|
"unproven",
|
||||||
] }
|
] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true }
|
embedded-hal-async = { version = "=0.2.0-alpha.2", optional = true }
|
||||||
embedded-storage = "0.3.0"
|
embedded-storage = "0.3.0"
|
||||||
embedded-storage-async = { version = "0.4.0", optional = true }
|
embedded-storage-async = { version = "0.4.0", optional = true }
|
||||||
nb = "1.0.0"
|
nb = "1.0.0"
|
||||||
|
@ -74,7 +74,21 @@ where
|
|||||||
E: embedded_hal_1::spi::Error + 'static,
|
E: embedded_hal_1::spi::Error + 'static,
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
||||||
{
|
{
|
||||||
async fn transfer<'a>(&'a mut self, read: &'a mut [u8], write: &'a [u8]) -> Result<(), Self::Error> {
|
async fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
|
||||||
|
self.wrapped.write(data)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
|
self.wrapped.transfer(data)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
// Ensure we write the expected bytes
|
// Ensure we write the expected bytes
|
||||||
for i in 0..core::cmp::min(read.len(), write.len()) {
|
for i in 0..core::cmp::min(read.len(), write.len()) {
|
||||||
read[i] = write[i].clone();
|
read[i] = write[i].clone();
|
||||||
@ -83,38 +97,7 @@ where
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn transfer_in_place<'a>(&'a mut self, _: &'a mut [u8]) -> Result<(), Self::Error> {
|
async fn transfer_in_place(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::SpiBusFlush for BlockingAsync<T>
|
|
||||||
where
|
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
|
||||||
{
|
|
||||||
async fn flush(&mut self) -> Result<(), Self::Error> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::SpiBusWrite<u8> for BlockingAsync<T>
|
|
||||||
where
|
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
|
||||||
{
|
|
||||||
async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.write(data)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::SpiBusRead<u8> for BlockingAsync<T>
|
|
||||||
where
|
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
|
||||||
{
|
|
||||||
async fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.transfer(data)?;
|
self.wrapped.transfer(data)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -69,54 +69,39 @@ where
|
|||||||
type Error = T::Error;
|
type Error = T::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> embedded_hal_async::spi::SpiBus<u8> for YieldingAsync<T>
|
impl<T, Word: 'static + Copy> embedded_hal_async::spi::SpiBus<Word> for YieldingAsync<T>
|
||||||
where
|
where
|
||||||
T: embedded_hal_async::spi::SpiBus,
|
T: embedded_hal_async::spi::SpiBus<Word>,
|
||||||
{
|
|
||||||
async fn transfer<'a>(&'a mut self, read: &'a mut [u8], write: &'a [u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.transfer(read, write).await?;
|
|
||||||
yield_now().await;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn transfer_in_place<'a>(&'a mut self, words: &'a mut [u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.transfer_in_place(words).await?;
|
|
||||||
yield_now().await;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> embedded_hal_async::spi::SpiBusFlush for YieldingAsync<T>
|
|
||||||
where
|
|
||||||
T: embedded_hal_async::spi::SpiBusFlush,
|
|
||||||
{
|
{
|
||||||
async fn flush(&mut self) -> Result<(), Self::Error> {
|
async fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
self.wrapped.flush().await?;
|
self.wrapped.flush().await?;
|
||||||
yield_now().await;
|
yield_now().await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> embedded_hal_async::spi::SpiBusWrite<u8> for YieldingAsync<T>
|
async fn write(&mut self, data: &[Word]) -> Result<(), Self::Error> {
|
||||||
where
|
|
||||||
T: embedded_hal_async::spi::SpiBusWrite<u8>,
|
|
||||||
{
|
|
||||||
async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.write(data).await?;
|
self.wrapped.write(data).await?;
|
||||||
yield_now().await;
|
yield_now().await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> embedded_hal_async::spi::SpiBusRead<u8> for YieldingAsync<T>
|
async fn read(&mut self, data: &mut [Word]) -> Result<(), Self::Error> {
|
||||||
where
|
|
||||||
T: embedded_hal_async::spi::SpiBusRead<u8>,
|
|
||||||
{
|
|
||||||
async fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
|
|
||||||
self.wrapped.read(data).await?;
|
self.wrapped.read(data).await?;
|
||||||
yield_now().await;
|
yield_now().await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn transfer(&mut self, read: &mut [Word], write: &[Word]) -> Result<(), Self::Error> {
|
||||||
|
self.wrapped.transfer(read, write).await?;
|
||||||
|
yield_now().await;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn transfer_in_place(&mut self, words: &mut [Word]) -> Result<(), Self::Error> {
|
||||||
|
self.wrapped.transfer_in_place(words).await?;
|
||||||
|
yield_now().await;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -56,62 +56,6 @@ where
|
|||||||
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDeviceRead for SpiDevice<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: spi::SpiBusRead,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
async fn read_transaction(&mut self, operations: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
let mut bus = self.bus.lock().await;
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res: Result<(), BUS::Error> = try {
|
|
||||||
for buf in operations {
|
|
||||||
bus.read(buf).await?;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush().await;
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDeviceWrite for SpiDevice<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: spi::SpiBusWrite,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
async fn write_transaction(&mut self, operations: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
let mut bus = self.bus.lock().await;
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res: Result<(), BUS::Error> = try {
|
|
||||||
for buf in operations {
|
|
||||||
bus.write(buf).await?;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush().await;
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDevice for SpiDevice<'_, M, BUS, CS>
|
impl<M, BUS, CS> spi::SpiDevice for SpiDevice<'_, M, BUS, CS>
|
||||||
where
|
where
|
||||||
M: RawMutex,
|
M: RawMutex,
|
||||||
@ -129,6 +73,12 @@ where
|
|||||||
Operation::Write(buf) => bus.write(buf).await?,
|
Operation::Write(buf) => bus.write(buf).await?,
|
||||||
Operation::Transfer(read, write) => bus.transfer(read, write).await?,
|
Operation::Transfer(read, write) => bus.transfer(read, write).await?,
|
||||||
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf).await?,
|
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf).await?,
|
||||||
|
#[cfg(not(feature = "time"))]
|
||||||
|
Operation::DelayUs(_) => return Err(SpiDeviceError::DelayUsNotSupported),
|
||||||
|
#[cfg(feature = "time")]
|
||||||
|
Operation::DelayUs(us) => {
|
||||||
|
embassy_time::Timer::after(embassy_time::Duration::from_micros(*us as _)).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -172,64 +122,6 @@ where
|
|||||||
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDeviceWrite for SpiDeviceWithConfig<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: spi::SpiBusWrite + SetConfig,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
async fn write_transaction(&mut self, operations: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
let mut bus = self.bus.lock().await;
|
|
||||||
bus.set_config(&self.config);
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res: Result<(), BUS::Error> = try {
|
|
||||||
for buf in operations {
|
|
||||||
bus.write(buf).await?;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush().await;
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDeviceRead for SpiDeviceWithConfig<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: spi::SpiBusRead + SetConfig,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
async fn read_transaction(&mut self, operations: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
let mut bus = self.bus.lock().await;
|
|
||||||
bus.set_config(&self.config);
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res: Result<(), BUS::Error> = try {
|
|
||||||
for buf in operations {
|
|
||||||
bus.read(buf).await?;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush().await;
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M, BUS, CS> spi::SpiDevice for SpiDeviceWithConfig<'_, M, BUS, CS>
|
impl<M, BUS, CS> spi::SpiDevice for SpiDeviceWithConfig<'_, M, BUS, CS>
|
||||||
where
|
where
|
||||||
M: RawMutex,
|
M: RawMutex,
|
||||||
@ -248,6 +140,12 @@ where
|
|||||||
Operation::Write(buf) => bus.write(buf).await?,
|
Operation::Write(buf) => bus.write(buf).await?,
|
||||||
Operation::Transfer(read, write) => bus.transfer(read, write).await?,
|
Operation::Transfer(read, write) => bus.transfer(read, write).await?,
|
||||||
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf).await?,
|
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf).await?,
|
||||||
|
#[cfg(not(feature = "time"))]
|
||||||
|
Operation::DelayUs(_) => return Err(SpiDeviceError::DelayUsNotSupported),
|
||||||
|
#[cfg(feature = "time")]
|
||||||
|
Operation::DelayUs(us) => {
|
||||||
|
embassy_time::Timer::after(embassy_time::Duration::from_micros(*us as _)).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -22,7 +22,7 @@ use core::cell::RefCell;
|
|||||||
use embassy_sync::blocking_mutex::raw::RawMutex;
|
use embassy_sync::blocking_mutex::raw::RawMutex;
|
||||||
use embassy_sync::blocking_mutex::Mutex;
|
use embassy_sync::blocking_mutex::Mutex;
|
||||||
use embedded_hal_1::digital::OutputPin;
|
use embedded_hal_1::digital::OutputPin;
|
||||||
use embedded_hal_1::spi::{self, Operation, SpiBus, SpiBusRead, SpiBusWrite};
|
use embedded_hal_1::spi::{self, Operation, SpiBus};
|
||||||
|
|
||||||
use crate::shared_bus::SpiDeviceError;
|
use crate::shared_bus::SpiDeviceError;
|
||||||
use crate::SetConfig;
|
use crate::SetConfig;
|
||||||
@ -48,58 +48,6 @@ where
|
|||||||
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDeviceRead for SpiDevice<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: SpiBusRead,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
fn read_transaction(&mut self, operations: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
self.bus.lock(|bus| {
|
|
||||||
let mut bus = bus.borrow_mut();
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res = operations.iter_mut().try_for_each(|buf| bus.read(buf));
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush();
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDeviceWrite for SpiDevice<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: SpiBusWrite,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
fn write_transaction(&mut self, operations: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
self.bus.lock(|bus| {
|
|
||||||
let mut bus = bus.borrow_mut();
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res = operations.iter().try_for_each(|buf| bus.write(buf));
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush();
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
Ok(op_res)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDevice for SpiDevice<'_, M, BUS, CS>
|
impl<BUS, M, CS> embedded_hal_1::spi::SpiDevice for SpiDevice<'_, M, BUS, CS>
|
||||||
where
|
where
|
||||||
M: RawMutex,
|
M: RawMutex,
|
||||||
@ -116,6 +64,13 @@ where
|
|||||||
Operation::Write(buf) => bus.write(buf),
|
Operation::Write(buf) => bus.write(buf),
|
||||||
Operation::Transfer(read, write) => bus.transfer(read, write),
|
Operation::Transfer(read, write) => bus.transfer(read, write),
|
||||||
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf),
|
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf),
|
||||||
|
#[cfg(not(feature = "time"))]
|
||||||
|
Operation::DelayUs(_) => Err(SpiDeviceError::DelayUsNotSupported),
|
||||||
|
#[cfg(feature = "time")]
|
||||||
|
Operation::DelayUs(us) => {
|
||||||
|
embassy_time::block_for(embassy_time::Duration::from_micros(*us as _));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
// On failure, it's important to still flush and deassert CS.
|
||||||
@ -199,58 +154,6 @@ where
|
|||||||
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
type Error = SpiDeviceError<BUS::Error, CS::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDeviceRead for SpiDeviceWithConfig<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: SpiBusRead + SetConfig,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
fn read_transaction(&mut self, operations: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
self.bus.lock(|bus| {
|
|
||||||
let mut bus = bus.borrow_mut();
|
|
||||||
bus.set_config(&self.config);
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res = operations.iter_mut().try_for_each(|buf| bus.read(buf));
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush();
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
Ok(op_res)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDeviceWrite for SpiDeviceWithConfig<'_, M, BUS, CS>
|
|
||||||
where
|
|
||||||
M: RawMutex,
|
|
||||||
BUS: SpiBusWrite + SetConfig,
|
|
||||||
CS: OutputPin,
|
|
||||||
{
|
|
||||||
fn write_transaction(&mut self, operations: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
self.bus.lock(|bus| {
|
|
||||||
let mut bus = bus.borrow_mut();
|
|
||||||
bus.set_config(&self.config);
|
|
||||||
self.cs.set_low().map_err(SpiDeviceError::Cs)?;
|
|
||||||
|
|
||||||
let op_res = operations.iter().try_for_each(|buf| bus.write(buf));
|
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
|
||||||
let flush_res = bus.flush();
|
|
||||||
let cs_res = self.cs.set_high();
|
|
||||||
|
|
||||||
let op_res = op_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
flush_res.map_err(SpiDeviceError::Spi)?;
|
|
||||||
cs_res.map_err(SpiDeviceError::Cs)?;
|
|
||||||
Ok(op_res)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<BUS, M, CS> embedded_hal_1::spi::SpiDevice for SpiDeviceWithConfig<'_, M, BUS, CS>
|
impl<BUS, M, CS> embedded_hal_1::spi::SpiDevice for SpiDeviceWithConfig<'_, M, BUS, CS>
|
||||||
where
|
where
|
||||||
M: RawMutex,
|
M: RawMutex,
|
||||||
@ -268,6 +171,13 @@ where
|
|||||||
Operation::Write(buf) => bus.write(buf),
|
Operation::Write(buf) => bus.write(buf),
|
||||||
Operation::Transfer(read, write) => bus.transfer(read, write),
|
Operation::Transfer(read, write) => bus.transfer(read, write),
|
||||||
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf),
|
Operation::TransferInPlace(buf) => bus.transfer_in_place(buf),
|
||||||
|
#[cfg(not(feature = "time"))]
|
||||||
|
Operation::DelayUs(_) => Err(SpiDeviceError::DelayUsNotSupported),
|
||||||
|
#[cfg(feature = "time")]
|
||||||
|
Operation::DelayUs(us) => {
|
||||||
|
embassy_time::block_for(embassy_time::Duration::from_micros(*us as _));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// On failure, it's important to still flush and deassert CS.
|
// On failure, it's important to still flush and deassert CS.
|
||||||
|
@ -30,11 +30,14 @@ where
|
|||||||
/// Error returned by SPI device implementations in this crate.
|
/// Error returned by SPI device implementations in this crate.
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
|
#[non_exhaustive]
|
||||||
pub enum SpiDeviceError<BUS, CS> {
|
pub enum SpiDeviceError<BUS, CS> {
|
||||||
/// An operation on the inner SPI bus failed.
|
/// An operation on the inner SPI bus failed.
|
||||||
Spi(BUS),
|
Spi(BUS),
|
||||||
/// Setting the value of the Chip Select (CS) pin failed.
|
/// Setting the value of the Chip Select (CS) pin failed.
|
||||||
Cs(CS),
|
Cs(CS),
|
||||||
|
/// DelayUs operations are not supported when the `time` Cargo feature is not enabled.
|
||||||
|
DelayUsNotSupported,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<BUS, CS> spi::Error for SpiDeviceError<BUS, CS>
|
impl<BUS, CS> spi::Error for SpiDeviceError<BUS, CS>
|
||||||
@ -46,6 +49,7 @@ where
|
|||||||
match self {
|
match self {
|
||||||
Self::Spi(e) => e.kind(),
|
Self::Spi(e) => e.kind(),
|
||||||
Self::Cs(_) => spi::ErrorKind::Other,
|
Self::Cs(_) => spi::ErrorKind::Other,
|
||||||
|
Self::DelayUsNotSupported => spi::ErrorKind::Other,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ pub trait Peripheral: Sized {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'b, T: Deref> Peripheral for T
|
impl<'b, T: DerefMut> Peripheral for T
|
||||||
where
|
where
|
||||||
T::Target: Peripheral,
|
T::Target: Peripheral,
|
||||||
{
|
{
|
||||||
|
@ -23,8 +23,8 @@ log = { version = "0.4.14", optional = true }
|
|||||||
embassy-time = { version = "0.1.0", path = "../embassy-time" }
|
embassy-time = { version = "0.1.0", path = "../embassy-time" }
|
||||||
embassy-sync = { version = "0.2.0", path = "../embassy-sync" }
|
embassy-sync = { version = "0.2.0", path = "../embassy-sync" }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32", default-features = false, optional = true }
|
embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32", default-features = false, optional = true }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common", default-features = false }
|
embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common", default-features = false }
|
||||||
futures = { version = "0.3.17", default-features = false, features = [ "async-await" ] }
|
futures = { version = "0.3.17", default-features = false, features = [ "async-await" ] }
|
||||||
embedded-hal = { version = "0.2", features = ["unproven"] }
|
embedded-hal = { version = "0.2", features = ["unproven"] }
|
||||||
@ -32,3 +32,6 @@ bit_field = { version = "0.10" }
|
|||||||
|
|
||||||
lora-phy = { version = "1" }
|
lora-phy = { version = "1" }
|
||||||
lorawan-device = { version = "0.10.0", default-features = false, features = ["async"] }
|
lorawan-device = { version = "0.10.0", default-features = false, features = ["async"] }
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
lora-phy = { git = "https://github.com/embassy-rs/lora-phy", rev = "ad289428fd44b02788e2fa2116445cc8f640a265" }
|
||||||
|
@ -12,8 +12,8 @@ embassy-sync = { version = "0.2.0", path = "../embassy-sync"}
|
|||||||
embassy-futures = { version = "0.1.0", path = "../embassy-futures"}
|
embassy-futures = { version = "0.1.0", path = "../embassy-futures"}
|
||||||
embassy-net-driver-channel = { version = "0.1.0", path = "../embassy-net-driver-channel"}
|
embassy-net-driver-channel = { version = "0.1.0", path = "../embassy-net-driver-channel"}
|
||||||
|
|
||||||
embedded-hal = { version = "1.0.0-alpha.10" }
|
embedded-hal = { version = "1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
|
|
||||||
noproto = { git="https://github.com/embassy-rs/noproto", default-features = false, features = ["derive"] }
|
noproto = { git="https://github.com/embassy-rs/noproto", default-features = false, features = ["derive"] }
|
||||||
#noproto = { version = "0.1", path = "/home/dirbaio/noproto", default-features = false, features = ["derive"] }
|
#noproto = { version = "0.1", path = "/home/dirbaio/noproto", default-features = false, features = ["derive"] }
|
||||||
|
@ -54,7 +54,9 @@ impl<'a> Control<'a> {
|
|||||||
})),
|
})),
|
||||||
};
|
};
|
||||||
let resp = self.ioctl(req).await;
|
let resp = self.ioctl(req).await;
|
||||||
let proto::CtrlMsgPayload::RespConnectAp(resp) = resp.payload.unwrap() else { panic!("unexpected resp") };
|
let proto::CtrlMsgPayload::RespConnectAp(resp) = resp.payload.unwrap() else {
|
||||||
|
panic!("unexpected resp")
|
||||||
|
};
|
||||||
debug!("======= {:?}", Debug2Format(&resp));
|
debug!("======= {:?}", Debug2Format(&resp));
|
||||||
assert_eq!(resp.resp, 0);
|
assert_eq!(resp.resp, 0);
|
||||||
self.state_ch.set_link_state(LinkState::Up);
|
self.state_ch.set_link_state(LinkState::Up);
|
||||||
@ -71,7 +73,9 @@ impl<'a> Control<'a> {
|
|||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
let resp = self.ioctl(req).await;
|
let resp = self.ioctl(req).await;
|
||||||
let proto::CtrlMsgPayload::RespGetMacAddress(resp) = resp.payload.unwrap() else { panic!("unexpected resp") };
|
let proto::CtrlMsgPayload::RespGetMacAddress(resp) = resp.payload.unwrap() else {
|
||||||
|
panic!("unexpected resp")
|
||||||
|
};
|
||||||
assert_eq!(resp.resp, 0);
|
assert_eq!(resp.resp, 0);
|
||||||
|
|
||||||
// WHY IS THIS A STRING? WHYYYY
|
// WHY IS THIS A STRING? WHYYYY
|
||||||
@ -100,7 +104,9 @@ impl<'a> Control<'a> {
|
|||||||
payload: Some(proto::CtrlMsgPayload::ReqSetWifiMode(proto::CtrlMsgReqSetMode { mode })),
|
payload: Some(proto::CtrlMsgPayload::ReqSetWifiMode(proto::CtrlMsgReqSetMode { mode })),
|
||||||
};
|
};
|
||||||
let resp = self.ioctl(req).await;
|
let resp = self.ioctl(req).await;
|
||||||
let proto::CtrlMsgPayload::RespSetWifiMode(resp) = resp.payload.unwrap() else { panic!("unexpected resp") };
|
let proto::CtrlMsgPayload::RespSetWifiMode(resp) = resp.payload.unwrap() else {
|
||||||
|
panic!("unexpected resp")
|
||||||
|
};
|
||||||
assert_eq!(resp.resp, 0);
|
assert_eq!(resp.resp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,14 +311,14 @@ where
|
|||||||
fn handle_event(&self, data: &[u8]) {
|
fn handle_event(&self, data: &[u8]) {
|
||||||
let Ok(event) = noproto::read::<CtrlMsg>(data) else {
|
let Ok(event) = noproto::read::<CtrlMsg>(data) else {
|
||||||
warn!("failed to parse event");
|
warn!("failed to parse event");
|
||||||
return
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("event: {:?}", &event);
|
debug!("event: {:?}", &event);
|
||||||
|
|
||||||
let Some(payload) = &event.payload else {
|
let Some(payload) = &event.payload else {
|
||||||
warn!("event without payload?");
|
warn!("event without payload?");
|
||||||
return
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
match payload {
|
match payload {
|
||||||
|
@ -8,8 +8,8 @@ license = "MIT OR Apache-2.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embedded-hal = { version = "1.0.0-alpha.10" }
|
embedded-hal = { version = "1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
embassy-net-driver-channel = { version = "0.1.0", path = "../embassy-net-driver-channel"}
|
embassy-net-driver-channel = { version = "0.1.0", path = "../embassy-net-driver-channel"}
|
||||||
embassy-time = { version = "0.1.0" }
|
embassy-time = { version = "0.1.0" }
|
||||||
embassy-futures = { version = "0.1.0" }
|
embassy-futures = { version = "0.1.0" }
|
||||||
|
@ -22,7 +22,11 @@ impl<SPI: SpiDevice> SpiInterface<SPI> {
|
|||||||
let address_phase = address.to_be_bytes();
|
let address_phase = address.to_be_bytes();
|
||||||
let control_phase = [(block as u8) << 3 | 0b0000_0100];
|
let control_phase = [(block as u8) << 3 | 0b0000_0100];
|
||||||
let data_phase = data;
|
let data_phase = data;
|
||||||
let operations = &[&address_phase[..], &control_phase, &data_phase];
|
let operations = &mut [
|
||||||
self.0.write_transaction(operations).await
|
Operation::Write(&address_phase[..]),
|
||||||
|
Operation::Write(&control_phase),
|
||||||
|
Operation::Write(&data_phase),
|
||||||
|
];
|
||||||
|
self.0.transaction(operations).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-nrf-v$VERSION/embassy-nrf/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-nrf-v$VERSION/embassy-nrf/src/"
|
||||||
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-nrf/src/"
|
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-nrf/src/"
|
||||||
|
|
||||||
features = ["nightly", "defmt", "unstable-pac", "unstable-traits", "gpiote", "time-driver-rtc1"]
|
features = ["nightly", "time", "defmt", "unstable-pac", "unstable-traits", "gpiote", "time-driver-rtc1"]
|
||||||
flavors = [
|
flavors = [
|
||||||
{ regex_feature = "nrf52.*", target = "thumbv7em-none-eabihf" },
|
{ regex_feature = "nrf52.*", target = "thumbv7em-none-eabihf" },
|
||||||
{ regex_feature = "nrf53.*", target = "thumbv8m.main-none-eabihf" },
|
{ regex_feature = "nrf53.*", target = "thumbv8m.main-none-eabihf" },
|
||||||
@ -98,8 +98,8 @@ embassy-embedded-hal = {version = "0.1.0", path = "../embassy-embedded-hal" }
|
|||||||
embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optional=true }
|
embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optional=true }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11", optional = true}
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true}
|
embedded-hal-async = { version = "=0.2.0-alpha.2", optional = true}
|
||||||
embedded-io = { version = "0.4.0", features = ["async"], optional = true }
|
embedded-io = { version = "0.4.0", features = ["async"], optional = true }
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
|
@ -468,25 +468,19 @@ mod eh1 {
|
|||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::SpiBusFlush for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::SpiBus<u8> for Spim<'d, T> {
|
||||||
fn flush(&mut self) -> Result<(), Self::Error> {
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::SpiBusRead<u8> for Spim<'d, T> {
|
|
||||||
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(words, &[])
|
self.blocking_transfer(words, &[])
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::SpiBusWrite<u8> for Spim<'d, T> {
|
|
||||||
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_write(words)
|
self.blocking_write(words)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::SpiBus<u8> for Spim<'d, T> {
|
|
||||||
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(read, write)
|
self.blocking_transfer(read, write)
|
||||||
}
|
}
|
||||||
@ -502,25 +496,19 @@ mod eha {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusFlush for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spim<'d, T> {
|
||||||
async fn flush(&mut self) -> Result<(), Error> {
|
async fn flush(&mut self) -> Result<(), Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusRead<u8> for Spim<'d, T> {
|
|
||||||
async fn read(&mut self, words: &mut [u8]) -> Result<(), Error> {
|
async fn read(&mut self, words: &mut [u8]) -> Result<(), Error> {
|
||||||
self.read(words).await
|
self.read(words).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusWrite<u8> for Spim<'d, T> {
|
|
||||||
async fn write(&mut self, data: &[u8]) -> Result<(), Error> {
|
async fn write(&mut self, data: &[u8]) -> Result<(), Error> {
|
||||||
self.write(data).await
|
self.write(data).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spim<'d, T> {
|
|
||||||
async fn transfer(&mut self, rx: &mut [u8], tx: &[u8]) -> Result<(), Error> {
|
async fn transfer(&mut self, rx: &mut [u8], tx: &[u8]) -> Result<(), Error> {
|
||||||
self.transfer(rx, tx).await
|
self.transfer(rx, tx).await
|
||||||
}
|
}
|
||||||
|
@ -79,9 +79,9 @@ fixed = "1.23.1"
|
|||||||
rp-pac = { version = "6" }
|
rp-pac = { version = "6" }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11", optional = true}
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true}
|
embedded-hal-async = { version = "=0.2.0-alpha.2", optional = true}
|
||||||
embedded-hal-nb = { version = "=1.0.0-alpha.2", optional = true}
|
embedded-hal-nb = { version = "=1.0.0-alpha.3", optional = true}
|
||||||
|
|
||||||
paste = "1.0"
|
paste = "1.0"
|
||||||
pio-proc = {version= "0.2" }
|
pio-proc = {version= "0.2" }
|
||||||
|
@ -545,25 +545,19 @@ mod eh1 {
|
|||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBusFlush for Spi<'d, T, M> {
|
impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBus<u8> for Spi<'d, T, M> {
|
||||||
fn flush(&mut self) -> Result<(), Self::Error> {
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBusRead<u8> for Spi<'d, T, M> {
|
|
||||||
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(words, &[])
|
self.blocking_transfer(words, &[])
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBusWrite<u8> for Spi<'d, T, M> {
|
|
||||||
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_write(words)
|
self.blocking_write(words)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, M: Mode> embedded_hal_1::spi::SpiBus<u8> for Spi<'d, T, M> {
|
|
||||||
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(read, write)
|
self.blocking_transfer(read, write)
|
||||||
}
|
}
|
||||||
@ -578,30 +572,24 @@ mod eh1 {
|
|||||||
mod eha {
|
mod eha {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusFlush for Spi<'d, T, Async> {
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spi<'d, T, Async> {
|
||||||
async fn flush(&mut self) -> Result<(), Self::Error> {
|
async fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusWrite<u8> for Spi<'d, T, Async> {
|
|
||||||
async fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
async fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.write(words).await
|
self.write(words).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusRead<u8> for Spi<'d, T, Async> {
|
|
||||||
async fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
async fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.read(words).await
|
self.read(words).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spi<'d, T, Async> {
|
async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
async fn transfer<'a>(&'a mut self, read: &'a mut [u8], write: &'a [u8]) -> Result<(), Self::Error> {
|
|
||||||
self.transfer(read, write).await
|
self.transfer(read, write).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn transfer_in_place<'a>(&'a mut self, words: &'a mut [u8]) -> Result<(), Self::Error> {
|
async fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.transfer_in_place(words).await
|
self.transfer_in_place(words).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,9 +40,9 @@ embassy-net-driver = { version = "0.1.0", path = "../embassy-net-driver" }
|
|||||||
embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optional = true }
|
embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optional = true }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11", optional = true}
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true}
|
embedded-hal-async = { version = "=0.2.0-alpha.2", optional = true}
|
||||||
embedded-hal-nb = { version = "=1.0.0-alpha.2", optional = true}
|
embedded-hal-nb = { version = "=1.0.0-alpha.3", optional = true}
|
||||||
|
|
||||||
embedded-storage = "0.3.0"
|
embedded-storage = "0.3.0"
|
||||||
embedded-storage-async = { version = "0.4.0", optional = true }
|
embedded-storage-async = { version = "0.4.0", optional = true }
|
||||||
|
@ -348,9 +348,7 @@ fn main() {
|
|||||||
g.extend(quote! {
|
g.extend(quote! {
|
||||||
impl crate::rcc::sealed::RccPeripheral for peripherals::#pname {
|
impl crate::rcc::sealed::RccPeripheral for peripherals::#pname {
|
||||||
fn frequency() -> crate::time::Hertz {
|
fn frequency() -> crate::time::Hertz {
|
||||||
critical_section::with(|_| unsafe {
|
unsafe { crate::rcc::get_freqs().#clk }
|
||||||
crate::rcc::get_freqs().#clk
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
fn enable() {
|
fn enable() {
|
||||||
critical_section::with(|_| {
|
critical_section::with(|_| {
|
||||||
|
@ -264,7 +264,7 @@ impl<'d, T: Instance, Tx> DacCh1<'d, T, Tx> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let tx_request = self.dma.request();
|
let tx_request = self.dma.request();
|
||||||
let dma_channel = &self.dma;
|
let dma_channel = &mut self.dma;
|
||||||
|
|
||||||
let tx_options = crate::dma::TransferOptions {
|
let tx_options = crate::dma::TransferOptions {
|
||||||
circular,
|
circular,
|
||||||
@ -376,7 +376,7 @@ impl<'d, T: Instance, Tx> DacCh2<'d, T, Tx> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let tx_request = self.dma.request();
|
let tx_request = self.dma.request();
|
||||||
let dma_channel = &self.dma;
|
let dma_channel = &mut self.dma;
|
||||||
|
|
||||||
let tx_options = crate::dma::TransferOptions {
|
let tx_options = crate::dma::TransferOptions {
|
||||||
circular,
|
circular,
|
||||||
|
@ -86,6 +86,24 @@ macro_rules! fmc_sdram_constructor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> Fmc<'d, T> {
|
impl<'d, T: Instance> Fmc<'d, T> {
|
||||||
|
fmc_sdram_constructor!(sdram_a12bits_d16bits_4banks_bank1: (
|
||||||
|
bank: stm32_fmc::SdramTargetBank::Bank1,
|
||||||
|
addr: [
|
||||||
|
(a0: A0Pin), (a1: A1Pin), (a2: A2Pin), (a3: A3Pin), (a4: A4Pin), (a5: A5Pin), (a6: A6Pin), (a7: A7Pin), (a8: A8Pin), (a9: A9Pin), (a10: A10Pin), (a11: A11Pin)
|
||||||
|
],
|
||||||
|
ba: [(ba0: BA0Pin), (ba1: BA1Pin)],
|
||||||
|
d: [
|
||||||
|
(d0: D0Pin), (d1: D1Pin), (d2: D2Pin), (d3: D3Pin), (d4: D4Pin), (d5: D5Pin), (d6: D6Pin), (d7: D7Pin),
|
||||||
|
(d8: D8Pin), (d9: D9Pin), (d10: D10Pin), (d11: D11Pin), (d12: D12Pin), (d13: D13Pin), (d14: D14Pin), (d15: D15Pin)
|
||||||
|
],
|
||||||
|
nbl: [
|
||||||
|
(nbl0: NBL0Pin), (nbl1: NBL1Pin)
|
||||||
|
],
|
||||||
|
ctrl: [
|
||||||
|
(sdcke: SDCKE0Pin), (sdclk: SDCLKPin), (sdncas: SDNCASPin), (sdne: SDNE0Pin), (sdnras: SDNRASPin), (sdnwe: SDNWEPin)
|
||||||
|
]
|
||||||
|
));
|
||||||
|
|
||||||
fmc_sdram_constructor!(sdram_a12bits_d32bits_4banks_bank1: (
|
fmc_sdram_constructor!(sdram_a12bits_d32bits_4banks_bank1: (
|
||||||
bank: stm32_fmc::SdramTargetBank::Bank1,
|
bank: stm32_fmc::SdramTargetBank::Bank1,
|
||||||
addr: [
|
addr: [
|
||||||
|
@ -473,11 +473,11 @@ fn init_pll(num: usize, config: Option<Pll>, input: &PllInput) -> PllOutput {
|
|||||||
w.set_divm(0);
|
w.set_divm(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
return PllOutput{
|
return PllOutput {
|
||||||
p: None,
|
p: None,
|
||||||
q: None,
|
q: None,
|
||||||
r: None,
|
r: None,
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
assert!(1 <= config.prediv && config.prediv <= 63);
|
assert!(1 <= config.prediv && config.prediv <= 63);
|
||||||
|
@ -83,12 +83,12 @@ static mut CLOCK_FREQS: MaybeUninit<Clocks> = MaybeUninit::uninit();
|
|||||||
/// Safety: Sets a mutable global.
|
/// Safety: Sets a mutable global.
|
||||||
pub(crate) unsafe fn set_freqs(freqs: Clocks) {
|
pub(crate) unsafe fn set_freqs(freqs: Clocks) {
|
||||||
debug!("rcc: {:?}", freqs);
|
debug!("rcc: {:?}", freqs);
|
||||||
CLOCK_FREQS.as_mut_ptr().write(freqs);
|
CLOCK_FREQS = MaybeUninit::new(freqs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Safety: Reads a mutable global.
|
/// Safety: Reads a mutable global.
|
||||||
pub(crate) unsafe fn get_freqs() -> &'static Clocks {
|
pub(crate) unsafe fn get_freqs() -> &'static Clocks {
|
||||||
&*CLOCK_FREQS.as_ptr()
|
CLOCK_FREQS.assume_init_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "unstable-pac")]
|
#[cfg(feature = "unstable-pac")]
|
||||||
|
@ -852,25 +852,19 @@ mod eh1 {
|
|||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx, Rx> embedded_hal_1::spi::SpiBusFlush for Spi<'d, T, Tx, Rx> {
|
impl<'d, T: Instance, W: Word, Tx, Rx> embedded_hal_1::spi::SpiBus<W> for Spi<'d, T, Tx, Rx> {
|
||||||
fn flush(&mut self) -> Result<(), Self::Error> {
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, W: Word, Tx, Rx> embedded_hal_1::spi::SpiBusRead<W> for Spi<'d, T, Tx, Rx> {
|
|
||||||
fn read(&mut self, words: &mut [W]) -> Result<(), Self::Error> {
|
fn read(&mut self, words: &mut [W]) -> Result<(), Self::Error> {
|
||||||
self.blocking_read(words)
|
self.blocking_read(words)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, W: Word, Tx, Rx> embedded_hal_1::spi::SpiBusWrite<W> for Spi<'d, T, Tx, Rx> {
|
|
||||||
fn write(&mut self, words: &[W]) -> Result<(), Self::Error> {
|
fn write(&mut self, words: &[W]) -> Result<(), Self::Error> {
|
||||||
self.blocking_write(words)
|
self.blocking_write(words)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, W: Word, Tx, Rx> embedded_hal_1::spi::SpiBus<W> for Spi<'d, T, Tx, Rx> {
|
|
||||||
fn transfer(&mut self, read: &mut [W], write: &[W]) -> Result<(), Self::Error> {
|
fn transfer(&mut self, read: &mut [W], write: &[W]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(read, write)
|
self.blocking_transfer(read, write)
|
||||||
}
|
}
|
||||||
@ -895,32 +889,25 @@ mod eh1 {
|
|||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
||||||
mod eha {
|
mod eha {
|
||||||
use super::*;
|
use super::*;
|
||||||
impl<'d, T: Instance, Tx, Rx> embedded_hal_async::spi::SpiBusFlush for Spi<'d, T, Tx, Rx> {
|
|
||||||
|
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>, W: Word> embedded_hal_async::spi::SpiBus<W> for Spi<'d, T, Tx, Rx> {
|
||||||
async fn flush(&mut self) -> Result<(), Self::Error> {
|
async fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx, W: Word> embedded_hal_async::spi::SpiBusWrite<W> for Spi<'d, T, Tx, Rx> {
|
|
||||||
async fn write(&mut self, words: &[W]) -> Result<(), Self::Error> {
|
async fn write(&mut self, words: &[W]) -> Result<(), Self::Error> {
|
||||||
self.write(words).await
|
self.write(words).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>, W: Word> embedded_hal_async::spi::SpiBusRead<W>
|
|
||||||
for Spi<'d, T, Tx, Rx>
|
|
||||||
{
|
|
||||||
async fn read(&mut self, words: &mut [W]) -> Result<(), Self::Error> {
|
async fn read(&mut self, words: &mut [W]) -> Result<(), Self::Error> {
|
||||||
self.read(words).await
|
self.read(words).await
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>, W: Word> embedded_hal_async::spi::SpiBus<W> for Spi<'d, T, Tx, Rx> {
|
async fn transfer(&mut self, read: &mut [W], write: &[W]) -> Result<(), Self::Error> {
|
||||||
async fn transfer<'a>(&'a mut self, read: &'a mut [W], write: &'a [W]) -> Result<(), Self::Error> {
|
|
||||||
self.transfer(read, write).await
|
self.transfer(read, write).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn transfer_in_place<'a>(&'a mut self, words: &'a mut [W]) -> Result<(), Self::Error> {
|
async fn transfer_in_place(&mut self, words: &mut [W]) -> Result<(), Self::Error> {
|
||||||
self.transfer_in_place(words).await
|
self.transfer_in_place(words).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,8 +152,8 @@ defmt = { version = "0.3", optional = true }
|
|||||||
log = { version = "0.4.14", optional = true }
|
log = { version = "0.4.14", optional = true }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11", optional = true}
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true}
|
embedded-hal-async = { version = "=0.2.0-alpha.2", optional = true}
|
||||||
|
|
||||||
futures-util = { version = "0.3.17", default-features = false }
|
futures-util = { version = "0.3.17", default-features = false }
|
||||||
atomic-polyfill = "1.0.1"
|
atomic-polyfill = "1.0.1"
|
||||||
|
@ -16,7 +16,7 @@ const QUEUE_SIZE: usize = 16;
|
|||||||
#[cfg(feature = "generic-queue-32")]
|
#[cfg(feature = "generic-queue-32")]
|
||||||
const QUEUE_SIZE: usize = 32;
|
const QUEUE_SIZE: usize = 32;
|
||||||
#[cfg(feature = "generic-queue-64")]
|
#[cfg(feature = "generic-queue-64")]
|
||||||
const QUEUE_SIZE: usize = 32;
|
const QUEUE_SIZE: usize = 64;
|
||||||
#[cfg(feature = "generic-queue-128")]
|
#[cfg(feature = "generic-queue-128")]
|
||||||
const QUEUE_SIZE: usize = 128;
|
const QUEUE_SIZE: usize = 128;
|
||||||
#[cfg(not(any(
|
#[cfg(not(any(
|
||||||
|
@ -52,4 +52,7 @@ rand = { version = "0.8.4", default-features = false }
|
|||||||
embedded-storage = "0.3.0"
|
embedded-storage = "0.3.0"
|
||||||
usbd-hid = "0.6.0"
|
usbd-hid = "0.6.0"
|
||||||
serde = { version = "1.0.136", default-features = false }
|
serde = { version = "1.0.136", default-features = false }
|
||||||
embedded-hal-async = { version = "0.2.0-alpha.1", optional = true }
|
embedded-hal-async = { version = "0.2.0-alpha.2", optional = true }
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
lora-phy = { git = "https://github.com/embassy-rs/lora-phy", rev = "ad289428fd44b02788e2fa2116445cc8f640a265" }
|
||||||
|
@ -10,6 +10,7 @@ use embassy_nrf::gpio::{AnyPin, Input, Level, Output, OutputDrive, Pin, Pull};
|
|||||||
use embassy_nrf::rng::Rng;
|
use embassy_nrf::rng::Rng;
|
||||||
use embassy_nrf::spim::{self, Spim};
|
use embassy_nrf::spim::{self, Spim};
|
||||||
use embassy_nrf::{bind_interrupts, peripherals};
|
use embassy_nrf::{bind_interrupts, peripherals};
|
||||||
|
use embassy_time::Delay;
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use embedded_io::asynch::Write;
|
use embedded_io::asynch::Write;
|
||||||
use static_cell::make_static;
|
use static_cell::make_static;
|
||||||
@ -24,7 +25,7 @@ bind_interrupts!(struct Irqs {
|
|||||||
async fn wifi_task(
|
async fn wifi_task(
|
||||||
runner: hosted::Runner<
|
runner: hosted::Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_31>>,
|
ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_31>, Delay>,
|
||||||
Input<'static, AnyPin>,
|
Input<'static, AnyPin>,
|
||||||
Output<'static, peripherals::P1_05>,
|
Output<'static, peripherals::P1_05>,
|
||||||
>,
|
>,
|
||||||
@ -55,7 +56,7 @@ async fn main(spawner: Spawner) {
|
|||||||
config.frequency = spim::Frequency::M32;
|
config.frequency = spim::Frequency::M32;
|
||||||
config.mode = spim::MODE_2; // !!!
|
config.mode = spim::MODE_2; // !!!
|
||||||
let spi = spim::Spim::new(p.SPI3, Irqs, sck, miso, mosi, config);
|
let spi = spim::Spim::new(p.SPI3, Irqs, sck, miso, mosi, config);
|
||||||
let spi = ExclusiveDevice::new(spi, cs);
|
let spi = ExclusiveDevice::new(spi, cs, Delay);
|
||||||
|
|
||||||
let (device, mut control, runner) = embassy_net_esp_hosted::new(
|
let (device, mut control, runner) = embassy_net_esp_hosted::new(
|
||||||
make_static!(embassy_net_esp_hosted::State::new()),
|
make_static!(embassy_net_esp_hosted::State::new()),
|
||||||
|
@ -41,8 +41,8 @@ byte-slice-cast = { version = "1.2.0", default-features = false }
|
|||||||
smart-leds = "0.3.0"
|
smart-leds = "0.3.0"
|
||||||
heapless = "0.7.15"
|
heapless = "0.7.15"
|
||||||
|
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = "0.2.0-alpha.1"
|
embedded-hal-async = "0.2.0-alpha.2"
|
||||||
embedded-io = { version = "0.4.0", features = ["async", "defmt"] }
|
embedded-io = { version = "0.4.0", features = ["async", "defmt"] }
|
||||||
embedded-storage = { version = "0.3" }
|
embedded-storage = { version = "0.3" }
|
||||||
static_cell = { version = "1.1", features = ["nightly"]}
|
static_cell = { version = "1.1", features = ["nightly"]}
|
||||||
@ -53,3 +53,6 @@ rand = { version = "0.8.5", default-features = false }
|
|||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
debug = true
|
debug = true
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
lora-phy = { git = "https://github.com/embassy-rs/lora-phy", rev = "ad289428fd44b02788e2fa2116445cc8f640a265" }
|
||||||
|
@ -15,7 +15,7 @@ use embassy_rp::clocks::RoscRng;
|
|||||||
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
||||||
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
||||||
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
||||||
use embassy_time::Duration;
|
use embassy_time::{Delay, Duration};
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use embedded_io::asynch::Write;
|
use embedded_io::asynch::Write;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
@ -26,7 +26,7 @@ use {defmt_rtt as _, panic_probe as _};
|
|||||||
async fn ethernet_task(
|
async fn ethernet_task(
|
||||||
runner: Runner<
|
runner: Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>>,
|
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>, Delay>,
|
||||||
Input<'static, PIN_21>,
|
Input<'static, PIN_21>,
|
||||||
Output<'static, PIN_20>,
|
Output<'static, PIN_20>,
|
||||||
>,
|
>,
|
||||||
@ -54,8 +54,14 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
||||||
let state = make_static!(State::<8, 8>::new());
|
let state = make_static!(State::<8, 8>::new());
|
||||||
let (device, runner) =
|
let (device, runner) = embassy_net_w5500::new(
|
||||||
embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await;
|
mac_addr,
|
||||||
|
state,
|
||||||
|
ExclusiveDevice::new(spi, cs, Delay),
|
||||||
|
w5500_int,
|
||||||
|
w5500_reset,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
unwrap!(spawner.spawn(ethernet_task(runner)));
|
unwrap!(spawner.spawn(ethernet_task(runner)));
|
||||||
|
|
||||||
// Generate random seed
|
// Generate random seed
|
||||||
|
@ -17,7 +17,7 @@ use embassy_rp::clocks::RoscRng;
|
|||||||
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
||||||
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
||||||
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Delay, Duration, Timer};
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use embedded_io::asynch::Write;
|
use embedded_io::asynch::Write;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
@ -28,7 +28,7 @@ use {defmt_rtt as _, panic_probe as _};
|
|||||||
async fn ethernet_task(
|
async fn ethernet_task(
|
||||||
runner: Runner<
|
runner: Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>>,
|
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>, Delay>,
|
||||||
Input<'static, PIN_21>,
|
Input<'static, PIN_21>,
|
||||||
Output<'static, PIN_20>,
|
Output<'static, PIN_20>,
|
||||||
>,
|
>,
|
||||||
@ -57,8 +57,14 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
||||||
let state = make_static!(State::<8, 8>::new());
|
let state = make_static!(State::<8, 8>::new());
|
||||||
let (device, runner) =
|
let (device, runner) = embassy_net_w5500::new(
|
||||||
embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await;
|
mac_addr,
|
||||||
|
state,
|
||||||
|
ExclusiveDevice::new(spi, cs, Delay),
|
||||||
|
w5500_int,
|
||||||
|
w5500_reset,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
unwrap!(spawner.spawn(ethernet_task(runner)));
|
unwrap!(spawner.spawn(ethernet_task(runner)));
|
||||||
|
|
||||||
// Generate random seed
|
// Generate random seed
|
||||||
|
@ -16,7 +16,7 @@ use embassy_rp::clocks::RoscRng;
|
|||||||
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
||||||
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
||||||
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
||||||
use embassy_time::Duration;
|
use embassy_time::{Delay, Duration};
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use embedded_io::asynch::Write;
|
use embedded_io::asynch::Write;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
@ -26,7 +26,7 @@ use {defmt_rtt as _, panic_probe as _};
|
|||||||
async fn ethernet_task(
|
async fn ethernet_task(
|
||||||
runner: Runner<
|
runner: Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>>,
|
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>, Delay>,
|
||||||
Input<'static, PIN_21>,
|
Input<'static, PIN_21>,
|
||||||
Output<'static, PIN_20>,
|
Output<'static, PIN_20>,
|
||||||
>,
|
>,
|
||||||
@ -55,8 +55,14 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
||||||
let state = make_static!(State::<8, 8>::new());
|
let state = make_static!(State::<8, 8>::new());
|
||||||
let (device, runner) =
|
let (device, runner) = embassy_net_w5500::new(
|
||||||
embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await;
|
mac_addr,
|
||||||
|
state,
|
||||||
|
ExclusiveDevice::new(spi, cs, Delay),
|
||||||
|
w5500_int,
|
||||||
|
w5500_reset,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
unwrap!(spawner.spawn(ethernet_task(runner)));
|
unwrap!(spawner.spawn(ethernet_task(runner)));
|
||||||
|
|
||||||
// Generate random seed
|
// Generate random seed
|
||||||
|
@ -16,6 +16,7 @@ use embassy_rp::clocks::RoscRng;
|
|||||||
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
use embassy_rp::gpio::{Input, Level, Output, Pull};
|
||||||
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0};
|
||||||
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
|
||||||
|
use embassy_time::Delay;
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use static_cell::make_static;
|
use static_cell::make_static;
|
||||||
@ -24,7 +25,7 @@ use {defmt_rtt as _, panic_probe as _};
|
|||||||
async fn ethernet_task(
|
async fn ethernet_task(
|
||||||
runner: Runner<
|
runner: Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>>,
|
ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>, Delay>,
|
||||||
Input<'static, PIN_21>,
|
Input<'static, PIN_21>,
|
||||||
Output<'static, PIN_20>,
|
Output<'static, PIN_20>,
|
||||||
>,
|
>,
|
||||||
@ -52,8 +53,14 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00];
|
||||||
let state = make_static!(State::<8, 8>::new());
|
let state = make_static!(State::<8, 8>::new());
|
||||||
let (device, runner) =
|
let (device, runner) = embassy_net_w5500::new(
|
||||||
embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await;
|
mac_addr,
|
||||||
|
state,
|
||||||
|
ExclusiveDevice::new(spi, cs, Delay),
|
||||||
|
w5500_int,
|
||||||
|
w5500_reset,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
unwrap!(spawner.spawn(ethernet_task(runner)));
|
unwrap!(spawner.spawn(ethernet_task(runner)));
|
||||||
|
|
||||||
// Generate random seed
|
// Generate random seed
|
||||||
|
@ -175,7 +175,7 @@ mod touch {
|
|||||||
mod my_display_interface {
|
mod my_display_interface {
|
||||||
use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
|
use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
|
||||||
use embedded_hal_1::digital::OutputPin;
|
use embedded_hal_1::digital::OutputPin;
|
||||||
use embedded_hal_1::spi::SpiDeviceWrite;
|
use embedded_hal_1::spi::SpiDevice;
|
||||||
|
|
||||||
/// SPI display interface.
|
/// SPI display interface.
|
||||||
///
|
///
|
||||||
@ -187,7 +187,7 @@ mod my_display_interface {
|
|||||||
|
|
||||||
impl<SPI, DC> SPIDeviceInterface<SPI, DC>
|
impl<SPI, DC> SPIDeviceInterface<SPI, DC>
|
||||||
where
|
where
|
||||||
SPI: SpiDeviceWrite,
|
SPI: SpiDevice,
|
||||||
DC: OutputPin,
|
DC: OutputPin,
|
||||||
{
|
{
|
||||||
/// Create new SPI interface for communciation with a display driver
|
/// Create new SPI interface for communciation with a display driver
|
||||||
@ -198,7 +198,7 @@ mod my_display_interface {
|
|||||||
|
|
||||||
impl<SPI, DC> WriteOnlyDataCommand for SPIDeviceInterface<SPI, DC>
|
impl<SPI, DC> WriteOnlyDataCommand for SPIDeviceInterface<SPI, DC>
|
||||||
where
|
where
|
||||||
SPI: SpiDeviceWrite,
|
SPI: SpiDevice,
|
||||||
DC: OutputPin,
|
DC: OutputPin,
|
||||||
{
|
{
|
||||||
fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> {
|
fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> {
|
||||||
@ -218,7 +218,7 @@ mod my_display_interface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_u8<T: SpiDeviceWrite>(spi: &mut T, words: DataFormat<'_>) -> Result<(), T::Error> {
|
fn send_u8<T: SpiDevice>(spi: &mut T, words: DataFormat<'_>) -> Result<(), T::Error> {
|
||||||
match words {
|
match words {
|
||||||
DataFormat::U8(slice) => spi.write(slice),
|
DataFormat::U8(slice) => spi.write(slice),
|
||||||
DataFormat::U16(slice) => {
|
DataFormat::U16(slice) => {
|
||||||
|
@ -19,8 +19,8 @@ defmt-rtt = "0.4"
|
|||||||
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
|
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
embedded-nal-async = "0.4.0"
|
embedded-nal-async = "0.4.0"
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
|
@ -19,8 +19,8 @@ defmt-rtt = "0.4"
|
|||||||
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
|
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
embedded-nal-async = "0.4.0"
|
embedded-nal-async = "0.4.0"
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
|
@ -32,3 +32,6 @@ futures = { version = "0.3.17", default-features = false, features = ["async-awa
|
|||||||
heapless = { version = "0.7.5", default-features = false }
|
heapless = { version = "0.7.5", default-features = false }
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
static_cell = "1.1"
|
static_cell = "1.1"
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
lora-phy = { git = "https://github.com/embassy-rs/lora-phy", rev = "ad289428fd44b02788e2fa2116445cc8f640a265" }
|
||||||
|
@ -18,10 +18,11 @@ defmt-rtt = "0.4"
|
|||||||
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] }
|
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] }
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
heapless = { version = "0.7.5", default-features = false }
|
heapless = { version = "0.7.5", default-features = false }
|
||||||
|
chrono = { version = "^0.4", default-features = false }
|
||||||
|
|
||||||
micromath = "2.0.0"
|
micromath = "2.0.0"
|
||||||
|
@ -25,3 +25,6 @@ embedded-storage = "0.3.0"
|
|||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
heapless = { version = "0.7.5", default-features = false }
|
heapless = { version = "0.7.5", default-features = false }
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
lora-phy = { git = "https://github.com/embassy-rs/lora-phy", rev = "ad289428fd44b02788e2fa2116445cc8f640a265" }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Before upgrading check that everything is available on all tier1 targets here:
|
# Before upgrading check that everything is available on all tier1 targets here:
|
||||||
# https://rust-lang.github.io/rustup-components-history
|
# https://rust-lang.github.io/rustup-components-history
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "nightly-2023-05-18"
|
channel = "nightly-2023-07-03"
|
||||||
components = [ "rust-src", "rustfmt", "llvm-tools-preview" ]
|
components = [ "rust-src", "rustfmt", "llvm-tools-preview" ]
|
||||||
targets = [
|
targets = [
|
||||||
"thumbv7em-none-eabi",
|
"thumbv7em-none-eabi",
|
||||||
|
@ -10,12 +10,12 @@ teleprobe-meta = "1"
|
|||||||
embassy-futures = { version = "0.1.0", path = "../../embassy-futures" }
|
embassy-futures = { version = "0.1.0", path = "../../embassy-futures" }
|
||||||
embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["defmt", "nightly"] }
|
embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["defmt", "nightly"] }
|
||||||
embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "defmt", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "defmt", "nightly", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["defmt", "nightly", "defmt-timestamp-uptime"] }
|
embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["defmt", "nightly", "unstable-traits", "defmt-timestamp-uptime"] }
|
||||||
embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nightly", "unstable-traits", "nrf52840", "time-driver-rtc1", "gpiote", "unstable-pac"] }
|
embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nightly", "unstable-traits", "nrf52840", "time-driver-rtc1", "gpiote", "unstable-pac"] }
|
||||||
embedded-io = { version = "0.4.0", features = ["async"] }
|
embedded-io = { version = "0.4.0", features = ["async"] }
|
||||||
embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "tcp", "dhcpv4", "medium-ethernet", "nightly"] }
|
embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "tcp", "dhcpv4", "medium-ethernet", "nightly"] }
|
||||||
embassy-net-esp-hosted = { version = "0.1.0", path = "../../embassy-net-esp-hosted", features = ["defmt"] }
|
embassy-net-esp-hosted = { version = "0.1.0", path = "../../embassy-net-esp-hosted", features = ["defmt"] }
|
||||||
embedded-hal-async = { version = "0.2.0-alpha.1" }
|
embedded-hal-async = { version = "0.2.0-alpha.2" }
|
||||||
static_cell = { version = "1.1", features = [ "nightly" ] }
|
static_cell = { version = "1.1", features = [ "nightly" ] }
|
||||||
|
|
||||||
defmt = "0.3"
|
defmt = "0.3"
|
||||||
|
@ -14,7 +14,7 @@ use embassy_nrf::gpio::{AnyPin, Input, Level, Output, OutputDrive, Pin, Pull};
|
|||||||
use embassy_nrf::rng::Rng;
|
use embassy_nrf::rng::Rng;
|
||||||
use embassy_nrf::spim::{self, Spim};
|
use embassy_nrf::spim::{self, Spim};
|
||||||
use embassy_nrf::{bind_interrupts, peripherals};
|
use embassy_nrf::{bind_interrupts, peripherals};
|
||||||
use embassy_time::{with_timeout, Duration, Timer};
|
use embassy_time::{with_timeout, Delay, Duration, Timer};
|
||||||
use embedded_hal_async::spi::ExclusiveDevice;
|
use embedded_hal_async::spi::ExclusiveDevice;
|
||||||
use static_cell::make_static;
|
use static_cell::make_static;
|
||||||
use {defmt_rtt as _, embassy_net_esp_hosted as hosted, panic_probe as _};
|
use {defmt_rtt as _, embassy_net_esp_hosted as hosted, panic_probe as _};
|
||||||
@ -30,7 +30,7 @@ bind_interrupts!(struct Irqs {
|
|||||||
async fn wifi_task(
|
async fn wifi_task(
|
||||||
runner: hosted::Runner<
|
runner: hosted::Runner<
|
||||||
'static,
|
'static,
|
||||||
ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_31>>,
|
ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_31>, Delay>,
|
||||||
Input<'static, AnyPin>,
|
Input<'static, AnyPin>,
|
||||||
Output<'static, peripherals::P1_05>,
|
Output<'static, peripherals::P1_05>,
|
||||||
>,
|
>,
|
||||||
@ -63,7 +63,7 @@ async fn main(spawner: Spawner) {
|
|||||||
config.frequency = spim::Frequency::M32;
|
config.frequency = spim::Frequency::M32;
|
||||||
config.mode = spim::MODE_2; // !!!
|
config.mode = spim::MODE_2; // !!!
|
||||||
let spi = spim::Spim::new(p.SPI3, Irqs, sck, miso, mosi, config);
|
let spi = spim::Spim::new(p.SPI3, Irqs, sck, miso, mosi, config);
|
||||||
let spi = ExclusiveDevice::new(spi, cs);
|
let spi = ExclusiveDevice::new(spi, cs, Delay);
|
||||||
|
|
||||||
let (device, mut control, runner) = embassy_net_esp_hosted::new(
|
let (device, mut control, runner) = embassy_net_esp_hosted::new(
|
||||||
make_static!(embassy_net_esp_hosted::State::new()),
|
make_static!(embassy_net_esp_hosted::State::new()),
|
||||||
|
@ -22,8 +22,8 @@ defmt-rtt = "0.4"
|
|||||||
cortex-m = { version = "0.7.6" }
|
cortex-m = { version = "0.7.6" }
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
embedded-io = { version = "0.4.0", features = ["async"] }
|
embedded-io = { version = "0.4.0", features = ["async"] }
|
||||||
|
@ -38,8 +38,8 @@ defmt-rtt = "0.4"
|
|||||||
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] }
|
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] }
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" }
|
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
|
||||||
embedded-hal-async = { version = "=0.2.0-alpha.1" }
|
embedded-hal-async = { version = "=0.2.0-alpha.2" }
|
||||||
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
||||||
rand_core = { version = "0.6", default-features = false }
|
rand_core = { version = "0.6", default-features = false }
|
||||||
rand_chacha = { version = "0.3", default-features = false }
|
rand_chacha = { version = "0.3", default-features = false }
|
||||||
|
Loading…
Reference in New Issue
Block a user