Compare commits

..

1699 Commits

Author SHA1 Message Date
a2ebede411 Add half duplex support 2023-12-22 17:03:35 +01:00
4695e46a59 make usb-dfu work with usb serial 2023-12-22 15:29:17 +01:00
595ad10769 erase the whole flash at start of dfu 2023-12-22 11:54:23 +01:00
bde8d435ce Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:28:51 +01:00
46fca02b82 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:26:33 +01:00
48c802859f Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:24:41 +01:00
5a6eaa5f74 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:22:43 +01:00
189fb06ff7 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:22:17 +01:00
cfa7f7aa02 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:20:54 +01:00
ecb018f51c Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:18:43 +01:00
97e73210c6 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:17:38 +01:00
96acde1096 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 18:14:51 +01:00
25aba4bb68 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 17:59:35 +01:00
343d6b99d4 Update embassy-boot/boot/src/firmware_updater/blocking.rs 2023-12-21 17:43:27 +01:00
ab18ba6d90 erase once. write multiple 2023-12-21 17:38:54 +01:00
Dario Nieuwenhuis
87c03037e3
Merge pull request #2342 from embassy-rs/no-more-nightly
ci: use beta, add secondary nightly ci.
2023-12-21 14:44:56 +00:00
Dario Nieuwenhuis
8b36a32ed5 ci: use beta, add secondary nightly ci. 2023-12-21 15:03:57 +01:00
Dario Nieuwenhuis
90aebb5828
Merge pull request #2341 from bugadani/faq
FAQ: Remove Xtensa specifier
2023-12-21 13:34:21 +00:00
Dániel Buga
cf0e5e32ad Remove Xtensa specifier 2023-12-21 14:27:58 +01:00
Ulf Lilleengen
530ead5fde
Merge pull request #2339 from embassy-rs/make-static-remove
Replace make_static! macro usage with non-macro version
2023-12-21 10:02:11 +00:00
Ulf Lilleengen
8442e72589
Merge pull request #2338 from eZioPan/note-on-circular-dma
docs: add a note about circular mode DMA
2023-12-21 09:36:38 +00:00
Ulf Lilleengen
0acf7b09c3 chore: replace make_static! macro usage with non-macro version 2023-12-21 10:29:57 +01:00
eZio Pan
745d618ab7 note on circular mode DMA 2023-12-21 17:03:10 +08:00
Ulf Lilleengen
d832d45c0b
Merge pull request #2337 from embassy-rs/boot-nrf-sd-mbr
fix: remove git dependency in embassy-boot
2023-12-20 14:13:43 +00:00
Dario Nieuwenhuis
03dc624fb1
Merge pull request #2336 from embassy-rs/noproto-cratesio
net-esp-hosted: use released noproto version.
2023-12-20 13:16:33 +00:00
Dario Nieuwenhuis
d6fda686bc net-esp-hosted: use released noproto version. 2023-12-20 14:13:52 +01:00
Ulf Lilleengen
896690c415 fix: remove git dependency in embassy-boot 2023-12-20 13:46:43 +01:00
Ulf Lilleengen
76c600365d
Merge pull request #2334 from embassy-rs/embassy-net-adin1110-docs
docs: embassy-net-adin1110
2023-12-20 12:44:19 +00:00
Ulf Lilleengen
18dac099cb
Merge pull request #2333 from embassy-rs/embassy-net-wiznet-docs
docs: document public apis of wiznet driver
2023-12-20 12:44:16 +00:00
Ulf Lilleengen
49005e955d
Merge pull request #2330 from embassy-rs/embassy-net-esp-hosted-docs
Embassy net esp hosted docs
2023-12-20 12:44:11 +00:00
Ulf Lilleengen
70ea805af3
Merge pull request #2332 from embassy-rs/embassy-net-tuntap-docs
docs: document embassy-net-tuntap
2023-12-20 12:44:06 +00:00
Ulf Lilleengen
93bb34d8d1 fix: expose less 2023-12-20 13:39:45 +01:00
Ulf Lilleengen
51a67cb69a fix: expose less 2023-12-20 13:34:34 +01:00
Dario Nieuwenhuis
c8eb128a56
Merge pull request #2328 from rmja/signal-try-take
feat(embassy-sync): Add try_take() to signal
2023-12-20 12:34:01 +00:00
Dario Nieuwenhuis
22ee868f04
Merge pull request #2335 from embassy-rs/remove-embedded-sdmmc
remove embedded-sdmmc
2023-12-20 12:32:04 +00:00
Ulf Lilleengen
1c3cf347cb remove embedded-sdmmc
Remove support for embedded-sdmmc due to lack of maintainership. Bring
it back once the upstream includes the async functionality.
2023-12-20 13:25:36 +01:00
Ulf Lilleengen
b8777eaea2 better keep missing docs for into 2023-12-20 13:12:32 +01:00
Rasmus Melchior Jacobsen
13c107e815 Put waiting state back if any 2023-12-20 13:09:16 +01:00
Ulf Lilleengen
b0583b17cb fix: make non-public instead 2023-12-20 13:08:06 +01:00
Ulf Lilleengen
246c49621c docs: embassy-net-adin1110 2023-12-20 12:52:35 +01:00
Ulf Lilleengen
c3b827d8cd fix: add readme and fix remaining warnings 2023-12-20 12:24:51 +01:00
Ulf Lilleengen
4dfae9328e add missing guards 2023-12-20 12:18:02 +01:00
Ulf Lilleengen
73f8cd7ade fix: add repository to manifest 2023-12-20 12:16:01 +01:00
Ulf Lilleengen
4a2dd7b944 docs: document public apis of wiznet driver 2023-12-20 12:14:25 +01:00
Ulf Lilleengen
afb01e3fc5 docs: document embassy-net-tuntap 2023-12-20 12:08:26 +01:00
Ulf Lilleengen
89cfdcb9f5 fix suddenly ending comment 2023-12-20 12:06:49 +01:00
Ulf Lilleengen
abea4dde3d docs: document most of esp-hosted driver 2023-12-20 10:15:18 +01:00
Ulf Lilleengen
52a801fdb7
Merge pull request #2329 from embassy-rs/apidoc-embassy-net-driver-channel
docs: document public apis of embassy-net-driver-channel
2023-12-20 09:08:55 +00:00
Ulf Lilleengen
fc6e70caa5 docs: document public apis of embassy-net-driver-channel 2023-12-20 09:24:10 +01:00
Rasmus Melchior Jacobsen
f9d0daad80 feat(embassy-sync): Add try_take() to signal 2023-12-20 08:37:15 +01:00
Dario Nieuwenhuis
97e919ea64
Merge pull request #2326 from embassy-rs/salty-update
Salty update
2023-12-19 21:30:32 +00:00
Dario Nieuwenhuis
c7841a37fa boot: update ed25519-dalek in dev-dependencies. 2023-12-19 22:26:50 +01:00
Dario Nieuwenhuis
589a16b255
Merge pull request #2327 from dragonnn/main
fix stm32 rtc year from 1970 base 2000 to make leap years work
2023-12-19 20:26:01 +00:00
Ulf Lilleengen
4567b87482 cargo fmt 2023-12-19 21:21:52 +01:00
Ulf Lilleengen
12de90e13d fix: update ed25519-dalek to new version 2023-12-19 21:20:30 +01:00
dragonn
871ed538b1 fix stm32 rtc year from 1970 base 2000 2023-12-19 21:17:42 +01:00
Ulf Lilleengen
efd5dbe019 fix: build warnings 2023-12-19 20:25:20 +01:00
Ulf Lilleengen
9d46ee0758 fix: update salty to released version 2023-12-19 20:24:55 +01:00
Dario Nieuwenhuis
e5912972ec
Merge pull request #2325 from embassy-rs/stm32-docs
stm32: finish docs.
2023-12-19 17:07:53 +00:00
Dario Nieuwenhuis
c8c8b89104 stm32: doc everything else. 2023-12-19 18:03:20 +01:00
Dario Nieuwenhuis
189b15c426 stm32/timer: docs. 2023-12-19 17:35:38 +01:00
Dario Nieuwenhuis
41c3c26beb
Merge pull request #2323 from embassy-rs/embassy-usb-stuffs
docs: document usb-logger and usb-dfu
2023-12-19 16:58:46 +01:00
Dario Nieuwenhuis
7ec1ed4de3
Merge pull request #2324 from barnabywalters/stm32-usart-docs
stm32: Documented usart public API
2023-12-19 16:58:27 +01:00
Barnaby Walters
6564c04531 Reset .vscode/settings.json (doh) 2023-12-19 16:42:51 +01:00
Barnaby Walters
f97ef61ef8 Documented usart public API 2023-12-19 16:41:00 +01:00
Ulf Lilleengen
9ddf8b08e4 docs: document usb-logger and usb-dfu 2023-12-19 16:33:05 +01:00
Dario Nieuwenhuis
71584409d9
Merge pull request #2321 from embassy-rs/stm32-docs
stm32: document hrtim, qspi, sdmmc, spi.
2023-12-19 15:29:26 +00:00
Dario Nieuwenhuis
1ea87ec6e7 stm32: document hrtim, qspi, sdmmc, spi. 2023-12-19 16:21:51 +01:00
Dario Nieuwenhuis
7d9a76da00
Merge pull request #2313 from eZioPan/update-metapac6
match up with "DMA cleanup" metapac change
2023-12-19 15:20:15 +00:00
Ulf Lilleengen
c995732b0e
Merge pull request #2320 from embassy-rs/cyw43-docs
docs: document public apis for cyw43 driver
2023-12-19 15:12:45 +00:00
Ulf Lilleengen
39c166ef9b docs: document public apis for cyw43 driver 2023-12-19 16:08:06 +01:00
Ulf Lilleengen
5e76c8b41a
Merge pull request #2317 from embassy-rs/embassy-rp-rustdoc-2
docs: document all embassy-rp public apis
2023-12-19 13:52:21 +00:00
Ulf Lilleengen
f4b77c967f docs: document all embassy-rp public apis
Enable missing doc warnings.
2023-12-19 14:19:46 +01:00
Ulf Lilleengen
ca2e3759ad
Merge pull request #2315 from embassy-rs/embassy-rp-rustdoc-1
docs: embassy-rp rustdoc and refactoring
2023-12-19 11:28:05 +00:00
eZio Pan
3e2e109437 update metapac dep 2023-12-19 19:09:06 +08:00
Dario Nieuwenhuis
6f21f0680e
Merge pull request #2314 from plaes/stm32-i2c-conditional-time
stm32: i2c: Clean up conditional code a bit
2023-12-19 11:00:37 +00:00
Ulf Lilleengen
486b67e895 docs: document spi, rtc and rest of uart for embassy-rp 2023-12-19 11:26:08 +01:00
Ulf Lilleengen
e45e3e76b5 docs: embassy-rp rustdoc and refactoring 2023-12-19 10:56:22 +01:00
Priit Laes
fc724dd707 stm32: i2c: Clean up conditional code a bit
By moving conditional code inside the functions, we can
reduce duplication and in one case we can even eliminate one...
2023-12-19 11:48:58 +02:00
eZio Pan
254d587385 match up with metapac change 2023-12-19 17:12:34 +08:00
Dario Nieuwenhuis
08e9a4d84a
Merge pull request #2310 from embassy-rs/stm32-docs
stm32/sai: docs, cleanup api.
2023-12-19 00:37:49 +01:00
Dario Nieuwenhuis
e1f588f520 stm32/sai: fix typo. 2023-12-19 00:36:50 +01:00
Dario Nieuwenhuis
49534cd405 stm32: more docs. 2023-12-19 00:10:36 +01:00
Dario Nieuwenhuis
138318f611 stm32/sai: docs, remove unused enums. 2023-12-19 00:06:30 +01:00
Dario Nieuwenhuis
c45418787c stm32/sai: remove unused Word trait. 2023-12-19 00:06:30 +01:00
Dario Nieuwenhuis
4deae51e65 stm32/sai: deduplicate code for subblocks A/B. 2023-12-19 00:06:30 +01:00
Dario Nieuwenhuis
c952ae0f49 stm32/sai: remove unimplemented SetConfig. 2023-12-19 00:06:30 +01:00
Dario Nieuwenhuis
4ed7747a98
Merge pull request #2306 from embassy-rs/james/fix-nb
Fix nb on rp uart
2023-12-18 18:32:04 +00:00
Dario Nieuwenhuis
227ace6c3c
Merge pull request #2308 from embassy-rs/stm32-docs
stm32: more docs.
2023-12-18 18:20:07 +00:00
Dario Nieuwenhuis
124478c5e9 stm32: more docs. 2023-12-18 19:11:23 +01:00
Dario Nieuwenhuis
59d2977c0a
Merge pull request #2307 from embassy-rs/stm32-docs
stm32/can: docs, cleanup interrupt handling.y
2023-12-18 17:52:37 +00:00
Dario Nieuwenhuis
87c8d9df94 stm32/can: docs. 2023-12-18 18:44:51 +01:00
Dario Nieuwenhuis
21fce1e195 stm32/can: cleanup interrupt traits. 2023-12-18 18:44:51 +01:00
James Munns
2b497c1e57 Fix nb on rp uart 2023-12-18 18:38:13 +01:00
Dario Nieuwenhuis
3f0920c400
Merge pull request #2304 from embassy-rs/stm32-docs
stm32/i2c: remove _timeout public API, share more code between v1/v2.
2023-12-18 17:30:08 +00:00
Dario Nieuwenhuis
7044e53af4 stm32/i2c: remove _timeout public API, share more code between v1/v2. 2023-12-18 18:24:55 +01:00
Dario Nieuwenhuis
88e77c733c
Merge pull request #2303 from embassy-rs/nor-flash-multiwrite
feat: support multiwrite flash traits if configured
2023-12-18 13:06:53 +00:00
Ulf Lilleengen
2a542bc143 feat: support multiwrite flash traits if configured 2023-12-18 13:58:12 +01:00
Dario Nieuwenhuis
c0cfd68c0c
Merge pull request #2297 from embassy-rs/stm32-docs
stm32: add some docs.
2023-12-17 23:59:29 +00:00
Dario Nieuwenhuis
80c9d04bbd stm32: add some docs. 2023-12-18 00:53:18 +01:00
Dario Nieuwenhuis
9959c8c3e3
Merge pull request #2300 from RobertTDowling/stm32-fix-time-driver-race
STM32: Fix race in alarm setting, which impacted scheduling.
2023-12-17 23:51:43 +00:00
RobertTDowling
b857334f92 STM32: Fix race in alarm setting, which impacted scheduling.
Detect potential race condition (should be rare) and return false back
to caller, allowing them to handle the possibility that either the
alarm was never set because it was in the past (old meaning of false),
or that in fact the alarm was set and may have fired within the race
window (new meaning of false). In either case, the caller needs to
make sure the callback got called.
2023-12-17 15:35:35 -08:00
Dario Nieuwenhuis
a2d4bab2f8
Merge pull request #2281 from dstric-aqueduct/main
allow for optional override of `Suspend` event for a UsbDevice
2023-12-16 13:44:54 +00:00
djstrickland
a5379e708c remove suspendable field from embassy_usb::builder::Config 2023-12-16 08:19:52 -05:00
Ulf Lilleengen
2a7a44477e
Merge pull request #2294 from adamgreig/g4-flash
STM32: Enable flash support for STM32G4
2023-12-16 06:41:21 +00:00
Adam Greig
f6bc96dfbd
STM32: Enable flash support for STM32G4 2023-12-16 03:50:34 +00:00
Dario Nieuwenhuis
ccf602b333
Merge pull request #2293 from esden/fix_qspi_flash_select
STM32 QSPI: Fix flash selection.
2023-12-16 01:00:57 +00:00
Piotr Esden-Tempski
3568e4a5ff STM32 QSPI: Fix flash selection. 2023-12-15 16:47:56 -08:00
Dario Nieuwenhuis
858987263b
Merge pull request #2290 from eZioPan/stm32f4-example-ws2812
add ws2812 example for stm32f4 with PWM and DMA
2023-12-15 23:05:32 +00:00
Dario Nieuwenhuis
b966f55883
Merge pull request #2292 from sourcebox/stm32h7-rm0468-fixes
[embassy-stm32]: Fixes for STM32H7 series MCUs referenced in RM0468
2023-12-15 23:02:42 +00:00
eZio Pan
ea1e1973eb unify channel assign 2023-12-16 02:15:56 +08:00
Oliver Rockstedt
560e728132 STM32H7: adjust flash latency and programming delay for series in RM0468 2023-12-15 14:14:30 +01:00
Oliver Rockstedt
c17fee27bb STM32H7: limit max frequency to 520MHz until cpu frequency boost option is implemented 2023-12-15 13:53:06 +01:00
Oliver Rockstedt
a8d0da91dc STM32H7: adjust frequency limits for series in RM0468 2023-12-15 12:22:17 +01:00
Oliver Rockstedt
e5e85ba02b STM32H7: Allow PLL1 DIVP of 1 for certain series 2023-12-15 11:42:58 +01:00
eZio Pan
77e372e842 cargo fmt 2023-12-15 14:15:45 +08:00
eZio Pan
a165d73eed add ws2812 example for stm32f4 with PWM and DMA 2023-12-15 14:10:11 +08:00
Dario Nieuwenhuis
df0f41c41c
Merge pull request #2289 from embassy-rs/ehm-rc4
use released embedded-hal-mock.
2023-12-14 20:14:37 +00:00
Dario Nieuwenhuis
98481c20fe use released embedded-hal-mock. 2023-12-14 21:11:33 +01:00
Ulf Lilleengen
5ec2fbe3a2
Merge pull request #2284 from Redrield/feature/embassy-usb-dfu
Add embassy-usb-dfu crate, with related modifications to embassy-boot
2023-12-14 19:56:04 +00:00
Kaitlyn Kenwell
33e8943e5b Rename bootloader feature to dfu 2023-12-14 14:16:58 -05:00
Kaitlyn Kenwell
9f9f6e75bb Abstract chip reset logic, add Reset impls for cortex-m and esp32c3 2023-12-14 13:29:26 -05:00
Kaitlyn Kenwell
cbc8ccc51e Adjust stm32wb-dfu example memory maps to fix linker errors 2023-12-14 10:56:16 -05:00
Dario Nieuwenhuis
485765320a
Merge pull request #2288 from embassy-rs/ci-cache-test
ci: fix test job not caching anything.
2023-12-14 15:49:52 +00:00
Kaitlyn Kenwell
27d054aa68 Adjust toml files, fix application example 2023-12-14 10:34:22 -05:00
Dario Nieuwenhuis
e579095a90 ci: fix test job not caching anything. 2023-12-14 16:30:45 +01:00
Kaitlyn Kenwell
a34abd849f Add examples to ci.sh 2023-12-14 10:30:10 -05:00
Dario Nieuwenhuis
138ed87b95
Merge pull request #2287 from embassy-rs/eh-rc3
Update embedded-hal to 1.0.0-rc.3
2023-12-14 15:29:48 +00:00
Dario Nieuwenhuis
d81395fab3 Update embedded-hal to 1.0.0-rc.3 2023-12-14 16:19:32 +01:00
Kaitlyn Kenwell
ef692c5141 SCB::sys_reset has a DSB internally, no need to replicate 2023-12-14 10:06:36 -05:00
Kaitlyn Kenwell
9cc5d8ac89 fmt 2023-12-14 09:38:49 -05:00
Kaitlyn Kenwell
c1438fe87b fmt 2023-12-14 09:38:02 -05:00
Kaitlyn Kenwell
e27e00f628 Address reviews 2023-12-14 09:36:22 -05:00
Dario Nieuwenhuis
7b9b22d7f8
Merge pull request #2286 from eZioPan/update-metapac5
after stm32-metapac update, TIM CR1 ARPE enum to bool
2023-12-14 14:04:55 +00:00
eZio Pan
879c0ad989 after stm32-metapac update, TIM CR1 ARPE enum to bool 2023-12-14 21:33:35 +08:00
Ulf Lilleengen
2c3d399220
Merge pull request #2285 from plaes/boot-partition-formatting-docs-rs
embassy-boot: Fix formatting for tables
2023-12-14 07:44:07 +00:00
Priit Laes
b17f16f0af embassy-boot: Fix formatting for tables
Tables describing the a-b flashing were all garbled up in the
cargo doc output, so fix up the syntax.
2023-12-14 09:12:54 +02:00
Kaitlyn Kenwell
b60b3f4eb8 Last fmt hopefully 2023-12-13 16:19:59 -05:00
Kaitlyn Kenwell
702d2a1a19 Formatting fixes, add example using stm32wb55 2023-12-13 16:08:20 -05:00
Kaitlyn Kenwell
c2942f2727 fmt 2023-12-13 14:53:49 -05:00
djstrickland
6bf70e14fb Update usb.rs
- add check of `dev_resume_from_host` interrupt register to catch wake event
2023-12-13 14:50:13 -05:00
Kaitlyn Kenwell
2afec225e3 Merge branch 'main' into feature/embassy-usb-dfu 2023-12-13 14:42:14 -05:00
Kaitlyn Kenwell
976a7ae22a Add embassy-usb-dfu 2023-12-13 14:40:49 -05:00
Dario Nieuwenhuis
1279a1b7f6
Merge pull request #2283 from embassy-rs/clarify-boot-requirements
docs: more docs in embassy-boot crate documentation
2023-12-13 18:04:56 +00:00
Ulf Lilleengen
876faa5685 docs: more docs in embassy-boot crate documentation 2023-12-13 19:00:26 +01:00
djstrickland
d596a1091d add susependable field to embassy_usb::builder::Config
- allow for optional override of `Suspend` event for a UsbDevice
2023-12-13 10:17:07 -05:00
Ulf Lilleengen
915423fc63
Merge pull request #2280 from plaes/embassy-boot-partition-docs
embassy-boot: Add explanation to dfu vs active size assertion
2023-12-13 09:50:42 +00:00
Priit Laes
6782fb1efa embassy-boot: Add explanation to dfu vs active size assertion 2023-12-13 11:44:16 +02:00
Dario Nieuwenhuis
14f41a71b6
Merge pull request #2276 from cschuhen/stm32f1-can-example
Add example for using CAN with STM32F103 (BluePill) with a real CAN
2023-12-11 11:36:47 +00:00
Corey Schuhen
3626deecaa More formatting. 2023-12-11 21:26:23 +10:00
Corey Schuhen
b34c8e3eb1 Update formatting. 2023-12-11 21:25:05 +10:00
Corey Schuhen
13af76af88 Add example for using CAN with STM32F103 (BluePill) with a real CAN 2023-12-11 21:08:58 +10:00
Dario Nieuwenhuis
2d2bd679ee
Merge pull request #2275 from lights0123/stm32-usart-invert
stm32: usart pin inversion
2023-12-10 23:48:26 +00:00
lights0123
dfba51d3f2
stm32: usart pin inversion 2023-12-10 18:39:45 -05:00
Dario Nieuwenhuis
343be37f39
Merge pull request #2272 from cbruiz/feature/more-gp-timer-driver-candidates
Add GP TIM9 and TIM11 to be used as time_driver candidates
2023-12-09 18:45:51 +00:00
Carlos Barrales Ruiz
78f709a362 * Add GP TIM9 and TIM11 to be used as time_driver 2023-12-09 14:14:34 +01:00
Dario Nieuwenhuis
e99649e37d
Merge pull request #2271 from embassy-rs/update-metapac4
stm32: update stm32-metapac. Fixes USB on STM32WB.
2023-12-08 23:01:26 +00:00
Dario Nieuwenhuis
4051aead0f stm32: update stm32-metapac. Fixes USB on STM32WB. 2023-12-08 23:45:12 +01:00
Dario Nieuwenhuis
e0e5f66c4b
Merge pull request #2270 from Redrield/fix/wb55-usb
Assert CR2.USV on stm32wb55, wb35 series chips
2023-12-08 22:25:51 +00:00
Kaitlyn Kenwell
5973e69244
Conditionally compile line for all stm32wb chips 2023-12-08 17:20:23 -05:00
Kaitlyn Kenwell
4d3fcd8d2d Assert CR2.USV on stm32wb55, wb35 series chips
ref RM0434 p. 175
2023-12-08 17:06:37 -05:00
Ulf Lilleengen
6629c7525b
Merge pull request #2267 from embassy-rs/e-h-internal-docs
docs: document all public apis of embedded-hal-internal
2023-12-08 21:45:12 +00:00
Ulf Lilleengen
02b7a833d9 docs: document all public apis of embedded-hal-internal
* Make some fields and functions non-public where possible.
* Enable doc warnings for missing public API docs.
2023-12-08 22:37:39 +01:00
Dario Nieuwenhuis
a4d53c7cb1
Merge pull request #2268 from embassy-rs/doc-bind-interrupts
Document how to bind multiple interrupts and handlers in `bind_interrupts!`.
2023-12-08 21:55:40 +01:00
Dario Nieuwenhuis
6c746dcf39 Document how to bind multiple interrupts and handlers in bind_interrupts!. 2023-12-08 21:26:28 +01:00
Dario Nieuwenhuis
3ef18ec133
Merge pull request #2263 from embassy-rs/jamesmunns-patch-2
Tweak FAQ size profile suggestions
2023-12-08 20:50:00 +01:00
Dario Nieuwenhuis
4e7b855b2d
Merge pull request #2265 from JuliDi/docs-best-practices
[Docs] Add best practices page
2023-12-08 20:49:45 +01:00
Dario Nieuwenhuis
3f30e87cb5
Merge pull request #2251 from JuliDi/faq-performance-tweaks
[FAQ] Add section about speed optimization
2023-12-08 19:35:32 +00:00
Dario Nieuwenhuis
a9ec623622
Merge pull request #2246 from CaptainMaso/adc_f3_v1_1
stm32: add ADC f3_v1_1
2023-12-08 19:30:50 +00:00
Dario Nieuwenhuis
fe218ed978 tests/stm32: add L1 DAC/ADC test. 2023-12-08 20:24:15 +01:00
Dario Nieuwenhuis
c27459c052 Update stm32-metapac. 2023-12-08 20:07:59 +01:00
Dario Nieuwenhuis
881cb16d28 stm32/adc: move convert resolution from PAC to version-specific mod. 2023-12-08 20:07:06 +01:00
JuliDi
c05149e5e4
add best practices first draft 2023-12-08 13:00:21 +01:00
Ulf Lilleengen
c94a9b8d75
Merge pull request #2260 from barnabywalters/main
Added Embassy in the wild docs page with links to some projects
2023-12-08 09:55:31 +00:00
Ulf Lilleengen
d87864c6a5
Merge pull request #2261 from barnabywalters/installation
Added a step-by-step guide to starting a new embassy project
2023-12-08 07:09:37 +00:00
James Munns
8fa5a6b282
Tweak FAQ size profile suggestions
If we want the smallest binary, we probably want codegen-units = 1, and disable incremental builds.
2023-12-07 14:27:09 +01:00
Dario Nieuwenhuis
83138ce68e
Merge pull request #2262 from embassy-rs/executor-macros
executor: rename macro crate to embassy-executor-macros, bump it.
2023-12-06 23:55:58 +00:00
Barnaby Walters
16e31747cc Changed example project name 2023-12-07 00:54:39 +01:00
Dario Nieuwenhuis
ac2aec4e7a executor: rename macro crate to embassy-executor-macros, bump it. 2023-12-07 00:48:30 +01:00
Dario Nieuwenhuis
ad2d9040d9
Merge pull request #2254 from jessebraham/executor-040
embassy-executor 0.4
2023-12-06 23:31:06 +00:00
Barnaby Walters
536e91d263 Added a step-by-step guide to starting a new embassy project
Based off an example, noting what to copy, what to change and why

Briefly summarizing how to require embassy crates via github

All steps tested and proven working at the time of writing
2023-12-06 23:51:13 +01:00
Barnaby Walters
ecaa62aa42 Fixed merge conflict 2023-12-06 21:55:07 +01:00
Barnaby Walters
7561696a57 Added lora-rs links 2023-12-06 21:47:52 +01:00
Barnaby Walters
195b492158
Update docs/modules/ROOT/pages/embassy_in_the_wild.adoc
Co-authored-by: Dániel Buga <bugadani@gmail.com>
2023-12-06 21:13:56 +01:00
Barnaby Walters
10c9e2e723 Added description for Card/IO 2023-12-06 21:11:34 +01:00
Barnaby Walters
cd62d2cd84 Added embassy in the wild docs page with two projects 2023-12-06 21:10:16 +01:00
Jesse Braham
925f5cbc26 Update all references to embasy-executor to the latest version 2023-12-06 12:05:47 +01:00
Jesse Braham
c5e8a2e834 embassy-executor 0.4 2023-12-06 11:59:22 +01:00
Dario Nieuwenhuis
7703f47c1e
Merge pull request #2255 from badrbouslikhin/main
stm32/h7: fix h7 examples
2023-12-05 21:35:28 +00:00
Badr Bouslikhin
0ffb35a2a1
stm32/eth: add host server command example 2023-12-05 19:50:11 +01:00
Badr Bouslikhin
d2a7322978
stm32/eth: fix h7 examples
The STM32H7 examples enable `dhcpv4` and `dns` features. Both use one
socket, meaning that we need one extra socket for our firmware tcp
socket.
2023-12-05 19:48:03 +01:00
JuliDi
1f6ffdcdd2
fix Cargo.toml and config.toml keys 2023-12-05 10:10:47 +01:00
Ulf Lilleengen
83bed7bca4
Merge pull request #2252 from barnabywalters/wiki2docs
Moved content from the wiki to the docs
2023-12-05 05:21:56 +00:00
Barnaby Walters
a76dd2d70f Moved content from the wiki to the docs
New: delaying_a_task.adoc, copied as-is from the wiki and placed in the
navigation until we have a better place for it (or remove/replace it)

index: Tweaked the structure, added some content from the wiki, and made
some general copy edits to improve clarity.

getting_started.adoc: Corrected various out-of-date information, added
troubleshooting tips from the wiki, added some new information, various
other small edits.

basic_application.adoc: Corrected out-of-date information, various clarifications
and edits.

After these changes, IMO most of the content on the github wiki is no longer
necessary and can be removed for clarity. The few sections I didn‘t integrate
or copy over were either out of date or unfinished.
2023-12-05 01:01:50 +01:00
JuliDi
bf7115cb44
remove unnecessary backtick 2023-12-04 21:20:18 +01:00
JuliDi
0b0ca62a95
add speed optimization 2023-12-04 20:59:08 +01:00
Dario Nieuwenhuis
85d5f42562
Merge pull request #2250 from embassy-rs/jamesmunns-patch-1
Add implementation note for embassy-stm32's time-driver
2023-12-04 16:05:30 +01:00
James Munns
18e89d7410
Add implementation note for embassy-stm32's time-driver
This is a detail I didn't originally understand when hoping to use TIM16/17 as alternative embassy-time driver providers.

Adding my note here to hopefully save the next person a little time.
2023-12-04 15:57:46 +01:00
Dario Nieuwenhuis
5f7cd821b5
Merge pull request #2249 from MathiasKoch/embassy-stm32/revert-day-of-week-fix
fix(embassy-stm32): Revert "fix day of the week conversion"
2023-12-04 13:35:27 +00:00
Dario Nieuwenhuis
d2dcbed920
Merge pull request #2248 from MabezDev/new-releases
embassy-sync 0.5 & embassy-time 0.2
2023-12-04 13:26:32 +00:00
Mathias
e9fa79bd77 Revert "fix day of the week conversion"
This reverts commit 59a5e84df5.
2023-12-04 14:19:30 +01:00
Scott Mabin
334900752a update release version in examples and other crates 2023-12-04 13:15:10 +00:00
Scott Mabin
c7d6ea3c78 embassy-time 0.2 2023-12-04 13:10:41 +00:00
Scott Mabin
a6f4538219 embassy-sync 0.5 2023-12-04 13:10:41 +00:00
Dario Nieuwenhuis
d7eb067b4c Remove embassy-lora from doc build. 2023-12-04 14:01:53 +01:00
Dario Nieuwenhuis
2cba879afc
Merge pull request #2247 from embassy-rs/update-embedded-storage
update embedded-storage{,-async}, remove patch.
2023-12-04 13:57:03 +01:00
Dario Nieuwenhuis
03325ea81b update embedded-storage{,-async}, remove patch. 2023-12-04 13:48:36 +01:00
Dario Nieuwenhuis
52fabbfb46
Merge pull request #2224 from cbruiz/stm32g0-usb_spi
Add support for HSE Oscillator in stm32g0
2023-12-04 12:32:52 +00:00
Carlos Barrales Ruiz
09592ffa6a stm32/rcc: Add support for HSE Oscillator in stm32g0 2023-12-04 13:28:00 +01:00
Sam Mason
35f16c6003 stm32: add ADC f3_v1_1 2023-12-04 14:03:31 +11:00
Dario Nieuwenhuis
b867f9b5b6
Merge pull request #2241 from adamgreig/stm32-uid
STM32: Add UID driver
2023-12-03 23:22:57 +00:00
Adam Greig
198ef8183e
STM32: Add UID driver 2023-12-03 23:17:49 +00:00
Dario Nieuwenhuis
696c703b8c
Merge pull request #2237 from badrbouslikhin/main
stm32/rcc: make h7 rm0399 power supply configurable
2023-12-03 22:47:34 +00:00
Dario Nieuwenhuis
521cdef8a1
Merge pull request #2245 from peter9477/nrf52-qspi-zerolen-fix
nrf52/qspi: avoid infinite busy-wait read/write with zero-len buf
2023-12-03 23:21:32 +01:00
Dario Nieuwenhuis
1dc31c4627
Merge pull request #2244 from embassy-rs/rm-xtensa
executor: remove arch-xtensa.
2023-12-03 23:21:17 +01:00
Peter Hansen
9fb2eb7470 nrf52/qspi: avoid infinite busy-wait on QSPI read/write with zero-len buffer, fixes #2115 2023-12-03 16:35:39 -05:00
Dario Nieuwenhuis
ca3891bb8c executor: remove arch-xtensa.
It's been broken for months and nobody has noticed. The `esp*-hal` crates have
much better support.

Fixes #2234
Closes  #1912
2023-12-03 22:33:27 +01:00
Dario Nieuwenhuis
9ba3aeada4
Merge pull request #2243 from peter9477/nrf52-approtect-fix
minimum build code for new APPROTECT is chip type-specific
2023-12-03 20:27:02 +00:00
Peter Hansen
dd62bb16e5 minimum build code for new APPROTECT is chip type-specific 2023-12-03 13:47:26 -05:00
Badr Bouslikhin
ea43d74780
stm32/rcc: add missing h7 power config 2023-12-02 14:55:00 +01:00
Badr Bouslikhin
22c39fd697
stm32/rcc: refactor h7 rm0455,rm0468 and rm0468 power management 2023-12-02 14:47:36 +01:00
Badr Bouslikhin
87c0f1525d
stm32/rcc: enable power supply configurability for rm0455 and rm0468 2023-12-02 14:45:36 +01:00
Ulf Lilleengen
a31ae52d1a
Merge pull request #2240 from GrantM11235/fix-freq-off-by-one
stm32/timer: Fix frequency off-by-one
2023-12-02 08:13:50 +00:00
Grant Miller
8c0e2748db stm32/timer: Fix frequency off-by-one 2023-12-01 22:09:15 -06:00
Dario Nieuwenhuis
ce4dd67f3b
Merge pull request #2236 from tshepang/patch-2
no_std and no_main can be used on stable
2023-12-01 18:10:27 +01:00
Dario Nieuwenhuis
929fd551de
Merge pull request #2235 from tshepang/patch-1
runtime.adoc: typo
2023-12-01 18:10:15 +01:00
Badr Bouslikhin
c97f65ac60
stm32/rcc: make h7 rm0399 power supply configurable 2023-12-01 15:05:31 +01:00
Tshepang Mbambo
33cfef871d
no_std and no_main can be used on stable 2023-12-01 11:56:35 +02:00
Tshepang Mbambo
270504d87d
runtime.adoc: typo 2023-12-01 08:45:20 +02:00
Dario Nieuwenhuis
fe8c46bce3
Merge pull request #2218 from embassy-rs/stable2
Remove nightly and unstable-traits features in preparation for 1.75.
2023-11-29 17:50:09 +01:00
Dario Nieuwenhuis
c6989dfbca Remove nightly and unstable-traits features in preparation for 1.75. 2023-11-29 17:26:33 +01:00
Dario Nieuwenhuis
384bad7bfa
Merge pull request #2231 from embassy-rs/stable3
Update embedded-(hal,io,nal).
2023-11-29 17:12:30 +01:00
Dario Nieuwenhuis
4634316749 Update embedded-(hal,io,nal). 2023-11-29 17:01:36 +01:00
Dario Nieuwenhuis
1b9925e3da Move embassy-lora, lora examples to lora-phy repo. 2023-11-29 16:26:31 +01:00
Dario Nieuwenhuis
b4bc9ac028
Merge pull request #2225 from bugadani/faq
(FAQ): How to fix issues with multiple crate versions
2023-11-28 11:41:49 +00:00
Dániel Buga
a3c99f0324 Add multiple dependency error faq 2023-11-28 08:12:23 +01:00
Ulf Lilleengen
76f3a11f43
Merge pull request #2229 from jamesmunns/patch-3
(FAQ): Add time driver note
2023-11-28 06:31:35 +00:00
Dario Nieuwenhuis
d63c052f0e
Merge pull request #2228 from MaxiluxSystems/fix/shared-spi-no-time
embassy-embedded-hal: shared_bus/blocking/spi: fix build and behaviour when "time" feature disabled
2023-11-27 23:15:43 +00:00
Torin Cooper-Bennun
2c9f4bce01 shared_bus/blocking/spi: fix build and behaviour when "time" disabled
new behaviour: check for DelayUs presence in operations instead of
shortcircuiting
2023-11-27 23:05:19 +00:00
James Munns
74a6855f01
Update docs/modules/ROOT/pages/faq.adoc 2023-11-27 21:43:05 +01:00
James Munns
f88aa9ce48
(FAQ): Add time driver note 2023-11-27 21:42:10 +01:00
Ulf Lilleengen
3a8a950bb8
Merge pull request #2226 from AdinAck/faq-update-1
FAQ Update (1)
2023-11-27 18:59:53 +00:00
AdinAck
02305451b1
need be -> needed
Co-authored-by: Dániel Buga <bugadani@gmail.com>
2023-11-27 10:51:20 -08:00
AdinAck
a42aef7759
it's -> its
Co-authored-by: Dániel Buga <bugadani@gmail.com>
2023-11-27 10:51:05 -08:00
Adin Ackerman
142f42fe90 ... 2023-11-27 10:44:47 -08:00
Adin Ackerman
5844f5ce2d Update faq.adoc 2023-11-27 10:23:42 -08:00
Dario Nieuwenhuis
e5fdd35bd6
Merge pull request #2223 from embassy-rs/use-executor-arena
tests: use executor task arena instead of TAIT.
2023-11-27 01:27:13 +00:00
Dario Nieuwenhuis
0bd47c779b tests: use executor task arena instead of TAIT. 2023-11-27 01:23:49 +01:00
Dario Nieuwenhuis
4481631326
Merge pull request #2222 from embassy-rs/f446-hil
f446 hil
2023-11-26 23:42:03 +00:00
Dario Nieuwenhuis
cf13f70ea9 stm32/test: add stm32f446 (board not in HIL rig yet) 2023-11-27 00:38:57 +01:00
Dario Nieuwenhuis
6bdacb4f69 stm32/sdmmc: use unwrap to ensure panics get printed to defmt. 2023-11-27 00:35:41 +01:00
Dario Nieuwenhuis
ff3baf1e90
Merge pull request #2220 from jamesmunns/patch-2
Minor readme typo
2023-11-25 22:13:34 +00:00
James Munns
d5dcbadbbe
Minor readme typo 2023-11-25 22:31:03 +01:00
Dario Nieuwenhuis
0ad0d27150
Merge pull request #2219 from embassy-rs/no-concat-bytes
cyw43: remove feature(concat_bytes).
2023-11-25 00:09:02 +00:00
Dario Nieuwenhuis
03d500f548 cyw43: remove feature(concat_bytes). 2023-11-25 01:06:43 +01:00
Dario Nieuwenhuis
8b46343b34
Merge pull request #2199 from adamgreig/stm32-dac
STM32 DAC: update to new PAC, combine ch1/ch2, fix trigger selection
2023-11-24 23:51:07 +00:00
Dario Nieuwenhuis
a3ea01473a stm32: fix dac trait 2023-11-25 00:30:30 +01:00
Adam Greig
cf84c8bfd1 WIP: use generated metapac from corresponding PR for CI 2023-11-25 00:30:29 +01:00
Adam Greig
09d7950313 STM32 DAC: Rework DAC driver, support all families. 2023-11-25 00:29:45 +01:00
Adam Greig
267cbaebe6 STM32 DAC: Disable circular writes with GPDMA as it doesn't yet support circular transfers 2023-11-25 00:29:45 +01:00
Adam Greig
31fc337e2f STM32 DAC: Swap to new TSEL enum entirely in-HAL 2023-11-25 00:29:45 +01:00
Adam Greig
135f350020 STM32 DAC: Use new Mode enum for setting channel mode 2023-11-25 00:29:45 +01:00
Adam Greig
897663e023 STM32: Add cfg to differentiate L4 and L4+ families 2023-11-25 00:29:45 +01:00
Adam Greig
2218d30c80 STM32: Remove vestigal build.rs cfgs, add new flashsize_X and package_X cfgs, use in F3 RCC 2023-11-25 00:29:45 +01:00
Dario Nieuwenhuis
f5c9e3baa6
Merge pull request #2200 from barnabywalters/asynci2cv1
Implemented async I2C for v1
2023-11-24 23:08:47 +00:00
Dario Nieuwenhuis
47bac9df70
Merge pull request #2216 from embassy-rs/stable
executor: add support for main/task macros in stable Rust
2023-11-24 22:57:46 +00:00
Barnaby Walters
3efc3eee57 stm32/i2c: implement async i2c v1. 2023-11-24 23:55:46 +01:00
Dario Nieuwenhuis
bc65b8f7ec stm32/i2c: add async, dual interrupt scaffolding. 2023-11-24 23:55:45 +01:00
Dario Nieuwenhuis
78f8e6112a
Merge pull request #2217 from embassy-rs/no-try
embassy-embedded-hal: don't use feature(try_blocks).
2023-11-24 22:55:02 +00:00
Dario Nieuwenhuis
996c3c1f7e executor: make task arena size configurable. 2023-11-24 23:52:09 +01:00
Dario Nieuwenhuis
171cdb94c7 executor: add support for main/task macros in stable (allocates tasks in an arena) 2023-11-24 23:52:09 +01:00
Dario Nieuwenhuis
1fbc150fd6 executor: add some tests. 2023-11-24 23:52:09 +01:00
Dario Nieuwenhuis
259cf6192b executor: Remove non-functional rtos-trace-interrupt. 2023-11-24 23:52:09 +01:00
Dario Nieuwenhuis
5528c33649 embassy-embedded-hal: don't use feature(try_blocks). 2023-11-24 18:44:55 +01:00
Dario Nieuwenhuis
e8ff5a2baf
Merge pull request #2215 from andresv/stm32-allow-eha-without-time
stm32 i2c: allow EHA traits without time feature
2023-11-24 15:34:44 +00:00
Andres Vahter
4f8c79c911 stm32 i2c: allow EHA traits without time feature 2023-11-24 15:56:19 +02:00
Ulf Lilleengen
738971938a
Merge pull request #2214 from aspizu/patch-1
add faq for deploying to RP2040 using elf2uf2-rs
2023-11-24 12:01:38 +00:00
jan
dec7c1a28b
add faq for deploying to RP2040 using elf2uf2-rs 2023-11-24 04:10:13 +05:30
Dario Nieuwenhuis
e0727fe1f6
Merge pull request #2211 from embassy-rs/cache-lockfiles
ci: cache lockfiles
2023-11-21 16:37:47 +00:00
Dario Nieuwenhuis
ba9cc102e2 ci: cache lockfiles
- Removes the slow "updating crates.io index, updating git" at start of the job.
- Avoids CI being randomly slower if a widely-used dep (like serde) gets bumped causing rebuilding everything.
2023-11-21 17:33:07 +01:00
Ulf Lilleengen
32b59148a8
Merge pull request #2210 from embassy-rs/lulf-patch-1
fix: faq.adoc syntax
2023-11-21 15:04:43 +00:00
Ulf Lilleengen
bd2e6b0422
Update faq.adoc 2023-11-21 16:01:46 +01:00
Dario Nieuwenhuis
85059f693b
Merge pull request #2209 from bugadani/faq
Direct the ESP32 users towards esp-hal
2023-11-21 15:54:04 +01:00
Dániel Buga
c211d51c06 Add note for Xtensa 2023-11-21 15:53:30 +01:00
Dario Nieuwenhuis
7f1fd199bb
Merge pull request #2207 from mickvangelderen/split-can-bus-2
Split can bus 2
2023-11-21 14:45:10 +00:00
Dario Nieuwenhuis
5ddd2cf9a6
Merge pull request #2208 from jamesmunns/add-faq
Add FAQ with one question from chat
2023-11-21 14:42:28 +00:00
Mick van Gelderen
88f893da45
Format 2023-11-21 15:40:07 +01:00
James Munns
aedd41eac4 Add FAQ with one question from chat 2023-11-21 15:38:33 +01:00
Mick van Gelderen
19ba7da3fd
Rename _flush* methods 2023-11-21 15:37:38 +01:00
Tommas Bakker
06a83c0f89
Refactor bxcan split. 2023-11-21 15:34:34 +01:00
Dario Nieuwenhuis
766ec77ec5
Merge pull request #2198 from adamgreig/stm32-opamp
STM32: Don't enable opamps in new(), wait until configured
2023-11-20 22:47:19 +00:00
Adam Greig
d1af696605
STM32 opamp: use impl Peripheral instead of directly taking pins 2023-11-20 21:35:05 +00:00
Adam Greig
2386619f1f
STM32: Disable opamp when OpAmpOutput is dropped, not when the parent OpAmp is dropped 2023-11-20 21:17:09 +00:00
Dario Nieuwenhuis
382949e1ff
Merge pull request #2197 from MabezDev/priority-channel
Priority channel
2023-11-20 11:34:33 +00:00
Scott Mabin
454828accb revert module changes, reexport heapless relevant items 2023-11-20 11:28:31 +00:00
Dario Nieuwenhuis
cf82fa687c
Merge pull request #2192 from RobertTDowling/stm32h7-adc-clock
stm32h7 ADC: Fix stalled clock in default h7 config
2023-11-20 00:00:25 +00:00
RobertTDowling
7f258cd3c4 PR feedback 2023-11-19 15:56:34 -08:00
Dario Nieuwenhuis
3a939fb511
Merge pull request #2204 from Slowki/fix/igmp-compile-error
populate `medium` in DriverAdapter struct in IGMP code
2023-11-19 22:43:55 +00:00
Stephan Wolski
b8e9e00b44
add build with igmp enabled to ci.sh 2023-11-19 17:26:16 -05:00
Dario Nieuwenhuis
ff2f1049b1
Merge pull request #2139 from jamesmunns/patch-1
Update RP2040 memory.x
2023-11-19 22:17:27 +00:00
Stephan Wolski
be17e1b363
populate medium in DriverAdapter struct in IGMP code 2023-11-19 17:11:56 -05:00
James Munns
f3c77e59c4 Add docs, touch all linker fragments 2023-11-19 23:10:11 +01:00
James Munns
30424d83ff Update RP2040 memory.x
The RP2040 has 264KiB of memory, not 256KiB.
2023-11-19 23:10:11 +01:00
Dario Nieuwenhuis
e3be0b957a
Merge pull request #2203 from embassy-rs/h7-sai4only-fix
stm32/sai: fix build on chips with only SAI4 (like stm32h725re), improve sync config.
2023-11-19 21:13:01 +00:00
Dario Nieuwenhuis
5221705495 stm32/sai: fix build on chips with only SAI4 (like stm32h725re), improve sync config. 2023-11-19 22:06:05 +01:00
Adam Greig
814e096d22
STM32: Don't enable opamps in new(), wait until configured. 2023-11-18 19:37:56 +00:00
Scott Mabin
5a60024af7 docs 2023-11-18 15:09:41 +00:00
Scott Mabin
f482a105b8 more clean up, refactor channel into module to share code 2023-11-18 15:01:12 +00:00
Scott Mabin
7589b5e13e reduce duplication further by sharing Dynamic sender/receiver 2023-11-18 14:56:29 +00:00
Scott Mabin
2efa73f431 docs and simple test for priority 2023-11-18 14:37:15 +00:00
Scott Mabin
270ec324b0 Reduce duplication, fix tests 2023-11-18 14:31:09 +00:00
Scott Mabin
ca0d02933b Priority channel using binary heap 2023-11-18 14:21:43 +00:00
Dario Nieuwenhuis
5bc7557826
Merge pull request #2173 from andresv/expose-i2c-async-api-without-time
STM32 I2C: expose async API without needing "time" feature.
2023-11-17 23:47:46 +00:00
RobertTDowling
4947b13615 stm32h7 ADC: Fix stalled clock in default h7 config 2023-11-15 17:11:16 -08:00
Dario Nieuwenhuis
006260fedd
Merge pull request #2184 from sammko/cyw43-multicast-macs
cyw43: Add Control method to add multicast HW address
2023-11-16 00:09:15 +00:00
Samuel Čavoj
e3ee24017d cyw43: Add Control method to add multicast HW address 2023-11-16 00:05:13 +00:00
Dario Nieuwenhuis
467b53076c
Merge pull request #2189 from embassy-rs/executor-hax
executor: add faster ARM-specific impl.
2023-11-15 18:16:40 +00:00
Dario Nieuwenhuis
27e6634c9d executor: add faster ARM-specific impl.
Does a wake+poll in 79 cycles in nrf52840.
2023-11-15 18:47:11 +01:00
Dario Nieuwenhuis
1f9b649f80 executor: release v0.3.3 2023-11-15 18:44:01 +01:00
Dario Nieuwenhuis
bef9b7a853 executor: remove atomic-polyfill. 2023-11-15 18:43:27 +01:00
Dario Nieuwenhuis
50a983fd9b executor: add missing main macro reexport on xtensa. 2023-11-14 18:45:23 +01:00
Ulf Lilleengen
7e5deae589
Merge pull request #2170 from korken89/fix/embassy-net-dns
Fix for embassy net dns entries not being extensible
2023-11-14 07:56:08 +00:00
Emil Fresk
a2c440ef8c Update changelog 2023-11-14 08:50:51 +01:00
Emil Fresk
fd670a9ae5 Use smoltcp constant in results from DNS 2023-11-14 08:50:51 +01:00
Emil Fresk
ef69f386ab Update smoltcp and fix errors from that 2023-11-14 08:50:51 +01:00
Dario Nieuwenhuis
872f1ec4c2
Merge pull request #2183 from embassy-rs/buffereduarte-fix
nrf/buffered_uarte: fix missing hwfc enable.
2023-11-13 23:26:19 +00:00
Dario Nieuwenhuis
6ccd8c051e nrf/buffered_uarte: add test for recovering from buffer full. 2023-11-14 00:22:30 +01:00
Dario Nieuwenhuis
c46418f123 nrf/buffered_uarte: fix hang when buffer full due to PPI missing the endrx event.
Fixes #2181
2023-11-14 00:22:17 +01:00
Dario Nieuwenhuis
19ff043acd nrf/buffered_uarte: fix missing hwfc enable. 2023-11-13 22:37:13 +01:00
Dario Nieuwenhuis
ea99671729
Merge pull request #2180 from MaxiluxSystems/gpdma-drop-fix
stm32/gpdma: fix drop() to use documented method for aborting transfer
2023-11-13 16:53:50 +00:00
Torin Cooper-Bennun
8eff749823 stm32/gpdma: fix drop() to use RM's method for aborting transfer
see e.g. STM32H503 RM section 15.4.4...

1. Write 1 into GPDMA_CxCR.SUSP
2. Poll GPDMA_CxSR.SUSPF until it is 1
3. Write 1 into GPDMA_CxCR.RESET (occurs upon next init, in new_inner())
2023-11-13 16:41:09 +00:00
Ulf Lilleengen
cdcd3e26dd
Merge pull request #2179 from t-moe/features/embassy-futures-bump
Bump embassy-futures 0.1.0 -> 0.1.1
2023-11-13 11:40:09 +00:00
Timo
18c1f9dd56 Bump embassy-futures 0.1.0 -> 0.1.1 2023-11-13 11:25:11 +01:00
Dario Nieuwenhuis
ac7134ed0d
Merge pull request #2178 from embassy-rs/rcc-no-spaghetti
stm32/rcc: unify f2 into f4/f7.
2023-11-13 01:08:27 +00:00
Dario Nieuwenhuis
ace5221080 stm32/rcc: unify f2 into f4/f7. 2023-11-13 01:59:33 +01:00
Dario Nieuwenhuis
2376b3bdfa stm32/rcc: fix pll enum naming on f4, f7. 2023-11-13 01:56:50 +01:00
Dario Nieuwenhuis
f00e97a5f1
Merge pull request #2177 from embassy-rs/rcc-no-spaghetti
stm32/rcc: unify l0l1 and l4l5.
2023-11-13 00:46:43 +00:00
Dario Nieuwenhuis
066dc297ed stm32/rcc: unify l0l1 and l4l5. 2023-11-13 01:05:07 +01:00
Dario Nieuwenhuis
4fe344ebc0 stm32/rcc: consistent casing and naming for PLL enums. 2023-11-13 00:52:01 +01:00
Andres Vahter
0f2208c0af stm32 i2c: remove mod dummy_time 2023-11-11 14:29:24 +02:00
Andres Vahter
6c42885d4a stm32 i2c: remove pub _timeout api 2023-11-11 14:05:58 +02:00
Dario Nieuwenhuis
39c7371621
Merge pull request #2163 from embassy-rs/update-heapless
Update heapless to v0.8
2023-11-10 15:51:33 +00:00
Dario Nieuwenhuis
4647df14b1 Update heapless to v0.8, embedded-nal-async to v0.7 2023-11-10 16:43:53 +01:00
Andres Vahter
3b33cc4691 i2c: expose async api without needing time
This exposes I2C async API without needing "time" feature. With "time" feature additional async API with timeouts is exposed.
2023-11-10 16:04:25 +02:00
xoviat
b3367be9c8
Merge pull request #2161 from xoviat/low-power
add low power for g4
2023-11-09 01:16:02 +00:00
xoviat
da4feb3693 Merge branch 'main' of github.com:embassy-rs/embassy into low-power 2023-11-08 19:13:12 -06:00
xoviat
05a4bb3a4a rustfmt 2023-11-08 19:06:29 -06:00
xoviat
4b4c28d875 stm32: add low power for g4 2023-11-08 19:04:20 -06:00
Dario Nieuwenhuis
1977acdb11
Merge pull request #2164 from embassy-rs/msos-descriptor
usb: remove msos-descriptor feature.
2023-11-08 22:23:37 +00:00
Dario Nieuwenhuis
0b015bd727 usb: remove msos-descriptor feature. 2023-11-08 23:21:52 +01:00
Dario Nieuwenhuis
79acb560ec Pin noproto git rev. 2023-11-08 23:05:00 +01:00
xoviat
94586576a0
Merge pull request #2160 from Nigecat/main
Fix typo in embassy-net docs
2023-11-07 23:56:03 +00:00
Nigecat
a3e200d011
Fix typo in embassy-net docs 2023-11-08 09:28:33 +11:00
xoviat
3bccb67231
Merge pull request #2155 from xoviat/eth
stm32: resolve eth/v2 security bug
2023-11-07 21:42:55 +00:00
xoviat
553f0158c0 stm32: resolve eth/v2 security bug
fixes #2129
2023-11-07 15:39:06 -06:00
Dario Nieuwenhuis
b44a5fcaf6
Merge pull request #2159 from kalkyl/usb-bulk-cleanup
rp: Remove control handler from USB raw bulk example
2023-11-07 19:52:11 +00:00
kalkyl
8effff3383 rp: Remove control handler from USB raw bulk example 2023-11-07 20:45:01 +01:00
Dario Nieuwenhuis
05f983c607
Merge pull request #2158 from kalkyl/usb-bulk
rp: Add USB raw bulk example
2023-11-07 19:22:55 +00:00
kalkyl
d44383e9a7 fmt 2023-11-07 20:19:56 +01:00
kalkyl
37a773c037 Use driver reexport 2023-11-07 20:17:19 +01:00
kalkyl
d1adc93614 rp: Add USB raw bulk example 2023-11-07 19:57:05 +01:00
Dario Nieuwenhuis
78a7ee7ec4
Merge pull request #2157 from kalkyl/usb-raw
rp: Add USB raw example + msos-descriptor to examples and usb-logger
2023-11-07 10:30:52 +00:00
kalkyl
e3fe13e905 Add docs 2023-11-07 10:58:35 +01:00
kalkyl
38bfa6916f Update pio-uart example 2023-11-07 09:15:21 +01:00
kalkyl
50139752bc Add comments 2023-11-07 09:10:18 +01:00
kalkyl
db4cd73894 rp: Add USB raw example + msos descriptor to examples and usb-logger 2023-11-07 09:05:10 +01:00
Dario Nieuwenhuis
8369f7614a
Merge pull request #2156 from adamgreig/usb-raw-example
Update stm32 usb_raw example to use MSOS descriptors for WinUSB
2023-11-07 02:35:59 +00:00
Adam Greig
326bc98bd2
Update stm32 usb_raw example to use MSOS descriptors for WinUSB 2023-11-07 02:34:27 +00:00
Dario Nieuwenhuis
584fc358fd
Merge pull request #2154 from bugadani/executor
Prepare embassy-executor 0.3.2
2023-11-06 20:53:19 +00:00
Dániel Buga
b8f9341edc Prepare embassy-executor 0.3.2 2023-11-06 21:50:40 +01:00
Dario Nieuwenhuis
7ca557b917
Merge pull request #2152 from bugadani/atomic
Executor: Yeet core::sync::atomic from risc-v
2023-11-06 18:46:50 +00:00
Dániel Buga
8d8d50cc7a Yeet core::sync::atomic, remove futures-util dep 2023-11-06 17:35:02 +01:00
Dario Nieuwenhuis
5948d934d3
Merge pull request #2150 from bugadani/block
Ensure TcpIo not blocking when reading into empty slice
2023-11-06 12:44:15 +00:00
Dario Nieuwenhuis
746936f8cd
Merge pull request #2151 from eZioPan/rcc-init-set-vos
check PLL settings before set VOS
2023-11-06 12:43:29 +00:00
eZio Pan
8f543062aa check PLL settings before set VOS 2023-11-06 18:30:59 +08:00
Dániel Buga
15660cfc68 Ensure TcpIo not blocking when reading into empty slice 2023-11-06 09:12:16 +01:00
Dario Nieuwenhuis
74f70dc7b4
Merge pull request #2149 from embassy-rs/usb-fixes3
stm32/otg: fix enumeration on non-f4 chips.
2023-11-06 03:19:50 +00:00
Dario Nieuwenhuis
7084570478 stm32/otg: fix enumeration on non-f4 chips.
Fixes regression from #2148
2023-11-06 04:13:06 +01:00
Dario Nieuwenhuis
58719dcb58
Merge pull request #2148 from embassy-rs/usb-fixes3
stm32/otg: fix CONTROL OUT transfers on F4.
2023-11-06 02:46:38 +00:00
Dario Nieuwenhuis
b4eef6b1ee stm32/otg: fix CONTROL OUT transfers on F4. 2023-11-06 03:38:42 +01:00
Dario Nieuwenhuis
70a700e430 stm32/otg: log TRDT 2023-11-06 03:38:13 +01:00
Dario Nieuwenhuis
b8679c0cc8 stm32/rcc: set highest VOS on some F4s with no overdrive. 2023-11-06 03:37:39 +01:00
xoviat
ad861179cc
Merge pull request #2147 from xoviat/low-power
stm32: update metapac and use stop data
2023-11-06 02:35:57 +00:00
Dario Nieuwenhuis
d9b00c01e0 usb: reject instead of panic on CONTROL OUT longer than the buf. 2023-11-06 03:26:00 +01:00
xoviat
239ad5ebea stm32: update metapac and use stop data 2023-11-05 20:09:33 -06:00
xoviat
46cffcc8d4
Merge pull request #2119 from JuliDi/fmc-sram-adc
STM32: Add raw access to FMC peripheral and fix typo in build.rs
2023-11-06 01:31:56 +00:00
Dario Nieuwenhuis
e6462f1e88
Merge pull request #2146 from adamgreig/stm32g4-opamp
Remove accidentally leftover println
2023-11-06 01:15:55 +00:00
Adam Greig
d464d1a841
Remove accidentally leftover println 2023-11-06 01:11:57 +00:00
xoviat
980c3cf42b
Merge pull request #2142 from adamgreig/stm32g4-opamp
stm32: support internal output on g4 opamps
2023-11-06 00:01:34 +00:00
Adam Greig
28eb4cd817
stm32: support internal output on g4 opamps 2023-11-05 23:57:15 +00:00
Dario Nieuwenhuis
3de01bc223
Merge pull request #2145 from embassy-rs/rcc-no-spaghetti
stm32/rcc: add shared code for hsi48 with crs support.
2023-11-05 22:58:18 +00:00
Dario Nieuwenhuis
0272deb158 stm32/rcc: add shared code for hsi48 with crs support. 2023-11-05 23:52:54 +01:00
xoviat
c4a8b79dbc
Merge pull request #2143 from adamgreig/raw-usb-example
Add raw USB example using control transfers
2023-11-05 17:34:58 +00:00
Adam Greig
fa45dcd034
Add raw USB example using control transfers 2023-11-05 16:46:45 +00:00
Dario Nieuwenhuis
6ff91851b1
Merge pull request #2141 from embassy-rs/l0l1-modernize
stm32/rcc: switch to modern api for l0, l1.
2023-11-05 02:09:48 +00:00
Dario Nieuwenhuis
8911a4d855 stm32/rcc: switch to modern api for l0, l1. 2023-11-05 03:06:13 +01:00
xoviat
056c409443
Merge pull request #2140 from xoviat/low-power
stm32: compute stop mode and workaround rtt test bug
2023-11-04 18:57:44 +00:00
xoviat
3f2abd4fd5 Merge branch 'main' of github.com:embassy-rs/embassy into low-power 2023-11-04 13:51:11 -05:00
xoviat
dc467e89a0 stm32: compute stop mode and workaround rtt test bug 2023-11-04 13:49:54 -05:00
xoviat
655ed3aa88
Merge pull request #2122 from bgamari/wip/low-power-docs
stm32: Add some documentation to `low_power`
2023-11-04 16:26:41 +00:00
Dario Nieuwenhuis
14ec0d27bf
Merge pull request #2138 from kalkyl/pwm-input
rp: Add PWM input example
2023-11-02 23:42:31 +00:00
kalkyl
649f1a122a Cleanup 2023-11-03 00:41:16 +01:00
kalkyl
413b394d31 rp: Add PWM input example 2023-11-03 00:37:58 +01:00
Dario Nieuwenhuis
7ea2c3508a
Merge pull request #2137 from kalkyl/pio-rotary-encoder
rp: Add PIO rotary encoder example
2023-11-02 21:52:01 +00:00
kalkyl
ec744558b2 Cleanup 2023-11-02 22:37:03 +01:00
Dario Nieuwenhuis
1b9292dbcd
Merge pull request #2136 from embassy-rs/static-cell-v2
Upgrade static-cell to v2.0
2023-11-02 21:00:21 +00:00
kalkyl
44486c5b39 rp: Add PIO rotary encoder example 2023-11-02 21:54:20 +01:00
Dario Nieuwenhuis
1f51367eb9 Upgrade static-cell to v2.0 2023-11-02 21:52:07 +01:00
Dario Nieuwenhuis
d6f42eafad
Merge pull request #2135 from newAM/update-ehm
embedded-hal-mock: git -> 0.10.0-rc.1
2023-11-02 01:05:56 +00:00
Alex Martens
dcce8945af embedded-hal-mock: git -> 0.10.0-rc.1 2023-11-01 16:46:15 -07:00
xoviat
d98c064bfe
Merge pull request #2134 from xoviat/revert-rcc
stm32/rcc: revert part of #2106
2023-11-01 22:31:43 +00:00
xoviat
a904538555 stm32/rcc: revert part of #2106 2023-11-01 17:27:33 -05:00
xoviat
4ef3dc5b90
Merge pull request #2099 from xoviat/rtc
stm32/rtc: misc and low-power cleanup
2023-11-01 22:19:03 +00:00
xoviat
bab61f9665 stm32/rtc: misc. cleanup and move to bps by default 2023-11-01 17:17:14 -05:00
Dario Nieuwenhuis
2765f0978f
Merge pull request #2133 from Radiator-Labs/main
Reinstate rcc::Config adc_clock_source field
2023-11-01 20:35:03 +00:00
shakencodes
bc07539133 Fix missed field in cfg'd code 2023-11-01 13:30:04 -07:00
shakencodes
b4a82b7ed4 Correct adc_clock_source for all µprocs in l4l5.rs 2023-11-01 13:22:50 -07:00
shakencodes
e2688dda22 Eliminates redefinition of AdcClockSource 2023-11-01 12:06:19 -07:00
shakencodes
d0d8585e4c Reinstate rcc::Config adc_clock_source field 2023-11-01 11:46:17 -07:00
Dario Nieuwenhuis
729d69246a
Merge pull request #2131 from adamgreig/stm32-exti-high-channels
stm32: Don't try handle EXTI inputs above 16
2023-11-01 04:35:31 +00:00
Adam Greig
e78a6db151 stm32: Don't try handle EXTI inputs above 16 2023-11-01 05:23:34 +01:00
Dario Nieuwenhuis
f8721c3786
Merge pull request #2132 from embassy-rs/update-nightly
Update Rust nightly.
2023-11-01 04:10:03 +00:00
Dario Nieuwenhuis
e519e00265 Update Rust nightly. 2023-11-01 04:56:56 +01:00
Dario Nieuwenhuis
35bb20abe7
Merge pull request #2130 from andresovela/time-mock-driver-fix
time: fix MockDriver::now()
2023-10-31 23:36:56 +00:00
Dario Nieuwenhuis
dd6a29adb2 Release embassy-executor v0.3.1 2023-11-01 00:17:44 +01:00
Andres O. Vela
5f9602d28b time: fix MockDriver::now() 2023-10-31 22:48:52 +01:00
Dario Nieuwenhuis
74683c706b
Merge pull request #2127 from bugadani/release
Prepare embassy-net 0.2.1 and embassy-sync 0.4.0
2023-10-31 15:57:51 +00:00
Dario Nieuwenhuis
2795e1350d
Merge pull request #2128 from bugadani/poll
Drop `futures` dependency in `embassy-nrf`
2023-10-31 15:53:54 +00:00
Dániel Buga
aed3e5674f Drop futures dependency in embassy-nrf 2023-10-31 10:13:27 +01:00
Dániel Buga
d941882066 Prepare embassy-net 0.2.1 and embassy-sync 0.4.0 2023-10-31 09:33:27 +01:00
Dario Nieuwenhuis
3f74ff7235
Merge pull request #2123 from bugadani/feature
Re-add impl_trait_projections
2023-10-31 02:26:51 +01:00
Dario Nieuwenhuis
9cead47212
Merge pull request #2124 from kalkyl/pio-stepper
rp: Add PIO stepper motor driver example
2023-10-31 02:26:38 +01:00
Dario Nieuwenhuis
78739d4aa9
Merge pull request #2120 from andresovela/time-mock-driver
time: add `MockDriver` for testing purposes
2023-10-31 01:10:19 +00:00
Dario Nieuwenhuis
e07e790613
Merge pull request #2125 from MabezDev/fix-rtc-dow
stm32: RTC fix DoW range off-by-one error
2023-10-30 23:20:45 +00:00
Dario Nieuwenhuis
ca283eed0c
Merge pull request #2126 from embassy-rs/disable-stop-test
stm32/tests: disable stop test.
2023-10-30 23:17:53 +00:00
Dario Nieuwenhuis
57edf289ea stm32/tests: disable stop test. 2023-10-31 00:04:15 +01:00
Scott Mabin
3912f5d67b Fix dow range off-by-one error 2023-10-30 20:26:08 +00:00
kalkyl
c9b50e46a5 rp: Add PIO stepper motor driver example 2023-10-30 20:50:37 +01:00
Ben Gamari
aa97fe7cbd stm32: Add some documentation to low_power
This begins to explain the operation of the low-power executor.
2023-10-30 14:36:08 -04:00
Dániel Buga
ad07ea0290 Re-add impl_trait_projections 2023-10-30 19:10:45 +01:00
Andres O. Vela
573734008a Fix test 2023-10-29 20:03:11 +01:00
Andres O. Vela
f4a78e00a7 Remove set_current_time API 2023-10-29 19:52:35 +01:00
Andres O. Vela
0d6094c8b1 time: add MockDriver for testing purposes 2023-10-29 19:49:52 +01:00
JuliDi
b1e5b6ffe1
Add raw fmc access implementation 2023-10-28 13:50:02 +02:00
xoviat
b6fc682117
Merge pull request #2117 from xoviat/rtc-3
stm32/rtc: more rtc cleanup
2023-10-26 00:55:32 +00:00
xoviat
0beb84768e stm32/rtc: more rtc cleanup 2023-10-25 19:50:30 -05:00
xoviat
b98a279367
Merge pull request #2116 from xoviat/rtc-2
stm32/low-power: refactor refcount
2023-10-26 00:11:21 +00:00
xoviat
e8a3cfaed6 stm32/low-power: refactor refcount 2023-10-25 19:07:31 -05:00
Dario Nieuwenhuis
0cc3e18db6
Merge pull request #2112 from AzazKamaz/patch-1
Fix #2100 - function address comparison
2023-10-25 11:53:52 +00:00
Aleksandr Krotov
6b19c0abd1
Fix #2100 - function address comparison 2023-10-25 11:01:35 +03:00
Dario Nieuwenhuis
f956d19e6e
Merge pull request #2111 from yodaldevoid/more-ticks
time: Add tick rates in multiples of 10 kHz
2023-10-24 19:51:24 +00:00
Gabriel Smith
ceb0d0bf08 time: Add tick rates in multiples of 10 kHz 2023-10-24 15:34:39 -04:00
Dario Nieuwenhuis
b3879ec223
Merge pull request #2105 from andresv/fix-stm32-uart-set-config
Fix stm32 uart set_config
2023-10-24 13:13:42 +00:00
Andres Vahter
bda99e59ec stm32: fix uart parity, add comment why it is so 2023-10-24 15:57:03 +03:00
Andres Vahter
25c2a9baaa stm32 uart: remove redundant set_fifoen(true) 2023-10-24 10:11:54 +03:00
Andres Vahter
1e362c750b stm32 uart: use ConfigError instead of () as error 2023-10-24 09:54:17 +03:00
Ulf Lilleengen
1a51a84313
Merge pull request #2109 from rmja/stm32-remove-unsafe-warning
stm32: Remove unneeded unsafe
2023-10-24 06:32:22 +00:00
Andres Vahter
7f72dbdaf2 stm32: fix set_config for buffered uart
In reconfigure() cr1 register is initialised with write (not modify) which means rxneie and idleneie are disabled after reconfiguration.
2023-10-24 09:09:33 +03:00
Rasmus Melchior Jacobsen
e8c162ac03 stm32: Remove unneeded unsafe 2023-10-24 07:44:04 +02:00
xoviat
1aaa19748a
Merge pull request #2107 from embassy-rs/hil-test
stm32/build: deterministically generate data
2023-10-23 23:42:38 +00:00
xoviat
9e230b64a4 stm32/build: deterministically generate data 2023-10-23 18:19:42 -05:00
xoviat
17b4cf8ce7
Merge pull request #2106 from xoviat/fix-stop-2
stm32: fix low-power test
2023-10-23 21:29:36 +00:00
xoviat
df4aa0fe25 stm32: fix low-power test 2023-10-23 16:26:34 -05:00
Andres Vahter
188ee59ba6 stm32: fix setting uart databits 2023-10-23 22:40:24 +03:00
Andres Vahter
591612db7e stm32 uart: return error if rx and tx not enabled 2023-10-23 22:39:24 +03:00
Dario Nieuwenhuis
d673f8a865
Merge pull request #2103 from embassy-rs/rcc-no-spaghetti
stm32/rcc: merge wb into l4/l5.
2023-10-23 16:21:17 +00:00
Dario Nieuwenhuis
82593bd404 stm32/gpio: make port G work on U5. 2023-10-23 18:12:31 +02:00
Dario Nieuwenhuis
a39ae12edc stm32/rcc: misc cleanups. 2023-10-23 17:36:21 +02:00
Dario Nieuwenhuis
0ef1cb29f7 stm32/rcc: merge wb into l4/l5. 2023-10-23 17:36:21 +02:00
Dario Nieuwenhuis
64ab23d17d
Merge pull request #2104 from glaeqen/slow-dhcp
net: Reset DHCP socket when the link up is detected
2023-10-23 09:55:17 +00:00
Gabriel Górski
18c9bcd44a net: Reset DHCP socket when the link up is detected
Previously, because DHCP DISCOVER is sent before the link is
established, socket has to timeout first. Which takes extra 10 s.

Now if the state of the link changed to up, socket is explicitly reset
so the DISCOVER is repeated much earlier and DHCP configuration is
acquired much faster.
2023-10-23 11:07:21 +02:00
Dario Nieuwenhuis
e895ea2d8b
Merge pull request #2102 from embassy-rs/rcc-no-spaghetti
stm32/rcc: merge wl into l4/l5.
2023-10-22 22:48:57 +00:00
Dario Nieuwenhuis
b9e13cb5d1 stm32/rcc: merge wl into l4/l5. 2023-10-23 00:31:36 +02:00
Dario Nieuwenhuis
46ff2c82aa
Merge pull request #2101 from embassy-rs/rcc-no-spaghetti
stm32/tests: add stm32wba52cg, stm32u5a9zj
2023-10-22 21:05:27 +00:00
Dario Nieuwenhuis
a84ad741a4 stm32/tests: add stm32wba52cg, stm32u5a9zj 2023-10-22 22:45:11 +02:00
Dario Nieuwenhuis
412bcad2d1 stm32: rename HSI16 -> HSI 2023-10-22 22:39:55 +02:00
xoviat
e70c531d3d
Merge pull request #2098 from xoviat/doc
stm32: fix opamp bug in docs build
2023-10-21 12:33:47 +00:00
xoviat
7c5f963d1f stm32: fix opamp bug in docs build 2023-10-21 07:32:04 -05:00
Dario Nieuwenhuis
62e1e1637c
Merge pull request #2097 from embassy-rs/rcc-no-spaghetti
stm32/tests: add stm32h753zi, stm32h7a3zi.
2023-10-21 02:49:12 +00:00
Dario Nieuwenhuis
3d03c18d4f stm32/tests: add stm32h753zi, stm32h7a3zi. 2023-10-21 04:46:45 +02:00
xoviat
2157c5a4e3
Merge pull request #2096 from xoviat/rcc
wip: update metapac
2023-10-21 01:23:09 +00:00
xoviat
0fb677aad7 stm32: update metapac 2023-10-20 20:21:53 -05:00
Dario Nieuwenhuis
b1d0947a18
Merge pull request #1991 from diondokter/center-align
stm32: Add the ability to center-align timers
2023-10-20 16:39:30 +00:00
Dion Dokter
5b3f75dc72 Merge branch 'master' into center-align 2023-10-20 14:17:55 +02:00
Dion Dokter
6f2995cd4c Invert assert 2023-10-20 10:41:39 +02:00
Dario Nieuwenhuis
88ada52146
Merge pull request #2017 from ilya-epifanov/rp-adc-div
added sampling frequency setting to adc capture methods on rp2040
2023-10-20 01:47:27 +00:00
Dario Nieuwenhuis
d622181205
Merge pull request #2093 from embassy-rs/net-wiznet-linkupdwon
net-wiznet: report link up/down on cable plug/unplug.
2023-10-19 23:38:44 +00:00
Dario Nieuwenhuis
630443a4d6 net-wiznet: report link up/down on cable plug/unplug. 2023-10-20 01:29:10 +02:00
Ulf Lilleengen
035800bfbd
Merge pull request #2091 from embassy-rs/comment-memory-x
docs: add linker script comments
2023-10-19 08:19:42 +00:00
Ulf Lilleengen
c7803bb8f4
docs: add linker script comments
Existing comment were outdated. Provide an example configuration
for using the softdevice with the nRF52 examples.
2023-10-19 09:29:20 +02:00
Dario Nieuwenhuis
d496a1213c
Merge pull request #2090 from eZioPan/rcc-init-bypass-oden
bypass `ODEN` in `rcc::init()` if chip doesn't have it
2023-10-18 12:15:30 +00:00
eZio Pan
241488ef1c bypass ODEN if chip doesn't have it 2023-10-18 19:42:31 +08:00
Ulf Lilleengen
88b2cdd6a0
Merge pull request #2087 from riley-williams/rp2040-pwm-docs
Add docs to RP2040 PWM config
2023-10-18 06:30:08 +00:00
Dario Nieuwenhuis
35ffdf2143
Merge pull request #2076 from embassy-rs/net-driver-simplify
net/driver: remove Medium, make HardwareAddress non_exhaustive.
2023-10-18 03:39:41 +00:00
Dario Nieuwenhuis
3cbc687424 net/driver: remove Medium, make HardwareAddress non_exhaustive. 2023-10-18 05:28:16 +02:00
Dario Nieuwenhuis
4f7b831676
Merge pull request #2088 from embassy-rs/rcc-no-spaghetti
stm32: rcc no spaghetti
2023-10-18 03:23:47 +00:00
Dario Nieuwenhuis
f20f170b1f stm32/rcc: refactor and unify f4 into f7. 2023-10-18 05:11:31 +02:00
Dario Nieuwenhuis
67010d123c stm32/rcc: refactor f7. 2023-10-18 05:01:11 +02:00
Dario Nieuwenhuis
51708c8ed1
Merge pull request #2089 from artisdom/patch-1
Update basic_application.adoc
2023-10-18 02:59:48 +00:00
Dario Nieuwenhuis
361fde35cf stm32/rcc: wait for mux switch. 2023-10-18 04:32:18 +02:00
Dario Nieuwenhuis
7ce3b19389 stm32/rcc: remove unused enum. 2023-10-18 04:32:18 +02:00
Ted Feng
10f08445e4
Update basic_application.adoc
typo: change "embassy::main" to "embassy_executor::main"
2023-10-18 14:53:49 +13:00
xoviat
f24a1b62bb
Merge pull request #2085 from xoviat/rcc
stm32: update metapac
2023-10-18 01:33:00 +00:00
xoviat
bbd12c9372 stm32: update metapac 2023-10-17 20:31:44 -05:00
Riley Williams
6906cc9c25 remove trailing spaces 2023-10-17 19:30:53 -04:00
Riley Williams
cb211f88d3 Grammar and formatting 2023-10-17 19:17:29 -04:00
Riley Williams
3f262a2603
Add docs to RP2040 PWM 2023-10-17 19:05:35 -04:00
Dario Nieuwenhuis
d94b9fe6fb
Merge pull request #2082 from embassy-rs/stm32wl-hil
stm32/tests: add stm32wl hil.
2023-10-17 14:58:53 +00:00
Dario Nieuwenhuis
b478640463 fix clocks in stm32wl rng example. 2023-10-17 15:57:09 +02:00
Dario Nieuwenhuis
846f2fc6e4 stm32/tests: add stm32wl hil. 2023-10-17 15:57:09 +02:00
xoviat
683d5c3066
Merge pull request #2077 from xoviat/rcc
stm32: update metapac
2023-10-17 01:05:18 +00:00
xoviat
a3574e519a stm32: update metapac 2023-10-16 20:04:10 -05:00
Dario Nieuwenhuis
3e3317e8bd
Merge pull request #2078 from GrantM11235/prefetch
stm32f1: Keep flash prefetch enabled
2023-10-17 00:29:30 +00:00
Grant Miller
e7aeb9b29f stm32f1: Keep flash prefetch enabled 2023-10-16 19:23:01 -05:00
Dario Nieuwenhuis
7fd868ade9
Merge pull request #2068 from barafael/const_usb_config_builder_new
Constify UsbDevice Config::new (and clippy fixes) in embassy-usb
2023-10-16 23:23:10 +00:00
Dario Nieuwenhuis
6e6df22979
Merge pull request #2075 from CBJamo/rosc_example
Add example to show useage of rp2040 rosc
2023-10-16 23:22:06 +00:00
Ulf Lilleengen
f7980885a5
Merge pull request #2066 from bugadani/net
Prepare embassy-net 0.2.0
2023-10-16 21:19:29 +00:00
Caleb Jamison
5a1393aa0b Add example to show useage of rp2040 rosc 2023-10-16 16:17:07 -04:00
Dániel Buga
40e4ca4751 Prepare embassy-net(/-driver,/-driver-channel) 0.2.0 2023-10-16 20:59:06 +02:00
Dario Nieuwenhuis
1d810baa18
Merge pull request #2074 from embassy-rs/rcc-no-spaghetti
time: add `links` key, release v0.1.5.
2023-10-16 18:19:59 +00:00
Dario Nieuwenhuis
213b4c9dca time: add links key, release v0.1.5. 2023-10-16 20:11:35 +02:00
Dario Nieuwenhuis
889d482d2d
Merge pull request #2073 from embassy-rs/rcc-no-spaghetti
nrf/pac: reeport s and ns peripherals always independently of the current mode.
2023-10-16 17:43:13 +00:00
Dario Nieuwenhuis
ea0e83a7f9 nrf/pac: reeport s and ns peripherals always independently of the current mode.
You sometimes need this, for example for using nrf91 modem from S mode
you need to acces IPC_NS.
2023-10-16 19:38:53 +02:00
Dario Nieuwenhuis
f0497039ed
Merge pull request #2071 from embassy-rs/rcc-no-spaghetti
stm32/rng: add test.
2023-10-16 03:37:18 +00:00
Dario Nieuwenhuis
aff77d2b65 stm32/rng: add test. 2023-10-16 05:35:29 +02:00
Dario Nieuwenhuis
a7c6999670
Merge pull request #2070 from embassy-rs/rcc-no-spaghetti
stm32/rcc: unify L4 and L5.
2023-10-16 02:10:37 +00:00
Dario Nieuwenhuis
18e96898ea stm32/rcc: unify L4 and L5. 2023-10-16 04:00:51 +02:00
Dario Nieuwenhuis
870dcc5970
Merge pull request #2069 from embassy-rs/rcc-no-spaghetti
stm32/rcc: add better support for L4/L4+ differences.
2023-10-16 01:41:40 +00:00
Dario Nieuwenhuis
5c5e681819 stm32/rcc: add better support for L4/L4+ differences. 2023-10-16 03:23:43 +02:00
xoviat
f54753beaa
Merge pull request #2067 from xoviat/rcc
rcc: update pll clock naming
2023-10-16 00:52:47 +00:00
xoviat
b24520579a rcc: ahb/apb -> hclk/pclk 2023-10-15 19:51:35 -05:00
Rafael Bachmann
31d4516516 Apply Pedantic Clippy Lints 2023-10-15 23:52:44 +02:00
Rafael Bachmann
66e62e9994 Fix clippy 2023-10-15 22:25:35 +02:00
Rafael Bachmann
eeedaf2e76 Constify Config::new 2023-10-15 22:11:30 +02:00
xoviat
1fc35c753b rcc: update pll clock naming 2023-10-15 15:10:42 -05:00
JuliDi
2aaf4bf96b
fix typo in build.rs that caused fmc ClkPin to not be implemented 2023-10-15 19:14:34 +02:00
xoviat
cd92bc3145
Merge pull request #2060 from xoviat/rcc
stm32: expand rcc mux to g4 and h7
2023-10-15 04:37:36 +00:00
xoviat
4a156df7a1 stm32: expand rcc mux to g4 and h7 2023-10-14 23:33:57 -05:00
Dario Nieuwenhuis
c46e758e2c
Merge pull request #2063 from embassy-rs/rcc-no-spaghetti
stm32/rcc: port L4 to the "flattened" API like h5/h7.
2023-10-15 01:12:46 +00:00
Dario Nieuwenhuis
8a10948ce9 stm32/rcc: port L4 to the "flattened" API like h5/h7. 2023-10-15 03:08:49 +02:00
Dario Nieuwenhuis
7045c53170
Merge pull request #2061 from adamgreig/timer-helpers
Add convenience methods for Timer::after_secs/millis/micros/ticks
2023-10-15 00:34:59 +00:00
Adam Greig
0621e957a0
time: Update examples, tests, and other code to use new Timer::after_x convenience methods 2023-10-15 01:30:12 +01:00
Dario Nieuwenhuis
a818f33658
Merge pull request #2062 from embassy-rs/rcc-no-spaghetti
stm32/rcc: remove unused lse/lsi fields in h7
2023-10-15 01:49:01 +02:00
Dario Nieuwenhuis
3bfbf2697f stm32/rcc: remove unused lse/lsi fields in h7 2023-10-15 01:48:27 +02:00
Adam Greig
7559f9e583
time: Update documentation to use new after_x convenience methods 2023-10-15 00:47:56 +01:00
Adam Greig
c8fdbe19f9
time: Add convenience methods for Timer::after_secs/millis/micros/ticks 2023-10-15 00:47:55 +01:00
Dario Nieuwenhuis
2e50bf667a
Merge pull request #2055 from kalkyl/usb-midi
embassy-usb: Add MIDI class
2023-10-14 23:10:25 +00:00
xoviat
ba62037642
Merge pull request #2058 from xoviat/rcc
rcc: remove mux_prefix from clocks
2023-10-14 17:57:44 +00:00
xoviat
824556c9c8 rcc: remove mux_prefix from clocks 2023-10-14 12:51:45 -05:00
Dario Nieuwenhuis
f7c0ec66d2
Merge pull request #2057 from bugadani/dns
Wake Stack's polling task after queueing a DNS query
2023-10-14 14:17:54 +00:00
Dániel Buga
69bb455c60 Wake stack's task after queueing a DNS query 2023-10-14 13:35:53 +02:00
xoviat
575db17264
Merge pull request #2053 from jr-oss/fix_stm32_advanced_timer_enable_output
STM32: Fix regression in advanced timer to enable output of PWM signa…
2023-10-14 04:09:57 +00:00
xoviat
0aa99e66f7
Merge pull request #2054 from xoviat/rcc-mux
rcc mux: update metapac
2023-10-14 04:07:38 +00:00
xoviat
3264941c1b rcc mux: update metapac 2023-10-13 23:06:32 -05:00
kalkyl
a57d383b1d embassy-usb: Add MIDI class 2023-10-14 04:20:59 +02:00
Ralf
9a7fda87b0 STM32: timer enable_output does not take bool, but just enables the output 2023-10-13 18:52:10 +02:00
Ralf
adc810d24b STM32: Fix regression in advanced timer to enable output of PWM signal by partly reverting commit 74eb519 2023-10-13 17:38:40 +02:00
Dario Nieuwenhuis
75baf186f3
Merge pull request #2051 from MabezDev/stm32/set_config-concrete
make set_config concrete methods public again
2023-10-12 22:06:29 +00:00
Scott Mabin
a6bbb130c5 make set_config concrete methods public again 2023-10-12 23:03:33 +01:00
Ulf Lilleengen
d1ac6d2824
Merge pull request #2050 from embassy-rs/remove-unused-rb
Remove unused ringbuffer
2023-10-12 19:13:12 +00:00
Ulf Lilleengen
636958ff70 fix: correct name in readme 2023-10-12 20:54:38 +02:00
Ulf Lilleengen
7f6fe93f55 fix: remove unused ringbuffer code 2023-10-12 20:54:26 +02:00
Dario Nieuwenhuis
e9b1904db8
Merge pull request #2049 from bugadani/time
(Please) Release embassy-time 0.1.4
2023-10-12 16:40:40 +00:00
Dániel Buga
02d2c06b23 Release embassy-time 0.1.4 2023-10-12 18:14:33 +02:00
Dario Nieuwenhuis
debda2f52c
Merge pull request #2045 from embassy-rs/stm32-cs-spam
Avoid creating many tiny critical sections in embassy-stm32::init
2023-10-12 14:29:23 +00:00
Dario Nieuwenhuis
97ca0e77bf stm32: avoid creating many tiny critical sections in init.
Saves 292 bytes on stm32f0 bilnky with max optimizations (from 3132 to 2840).
2023-10-12 16:20:34 +02:00
Dario Nieuwenhuis
66e399b5c6
Merge pull request #2035 from pbert519/stm_reset_and_enable
STM32: combine RccPeripherals reset() and enable() to enable_and_reset()
2023-10-12 14:09:13 +00:00
Ulf Lilleengen
01eb1a7339
Merge pull request #2033 from andresovela/stm32-add-timeout-to-i2c
stm32: add timeout to I2C driver
2023-10-12 10:44:27 +00:00
Andres Oliva
f0d6ee69bc Add some builds without time feature to CI 2023-10-12 11:25:44 +02:00
pbert
65f81a1f57 Remove critical section for reset 2023-10-12 11:04:45 +02:00
pbert
ecdd7c0e2f enable clock first 2023-10-12 11:04:44 +02:00
pbert
d7d79f3068 Remove workaround for adc v3 2023-10-12 11:04:20 +02:00
pbert
f65a96c541 STM32: combine RccPeripherals reset() and enable() to reset_and_enable() 2023-10-12 11:04:19 +02:00
xoviat
eb368f77a4
Merge pull request #2023 from xoviat/rcc-mux
stm32: add rcc mux for h5
2023-10-12 02:01:27 +00:00
xoviat
57ccc1051a stm32: add initial rcc mux for h5 2023-10-11 20:59:47 -05:00
Dario Nieuwenhuis
ac84631a2a
Merge pull request #2046 from embassy-rs/stm32-remove-polyfill
stm32: remove atomic-polyfill.
2023-10-12 00:14:02 +00:00
Dario Nieuwenhuis
70a91945fc stm32: remove atomic-polyfill. 2023-10-12 02:07:26 +02:00
Dario Nieuwenhuis
32b89eeba1 net: remove atomic-polyfill. 2023-10-12 02:07:26 +02:00
Andres Oliva
063e6f96da Remove outdated comment 2023-10-11 23:56:21 +02:00
Andres Oliva
4cec4b0548 Remove more unused stuff 2023-10-11 23:52:26 +02:00
Andres Oliva
e6c47c3718 cargo fmt 2023-10-11 23:47:24 +02:00
Andres Oliva
2f7c2750d1 Feature guarded more unused stuff 2023-10-11 23:45:47 +02:00
Andres Oliva
032b1f2d59 Fix some issues with unused stuff 2023-10-11 23:42:40 +02:00
Andres Oliva
f76d50e837 cfg! macro didn't work, had to duplicate functions with different guards 2023-10-11 23:39:24 +02:00
Andres Oliva
ee5ea7aa06 cargo fmt 2023-10-11 23:34:02 +02:00
Andres Oliva
251d004708 Try using cfg! macro 2023-10-11 23:32:40 +02:00
Andres Oliva
cd68f85501 Added guards to individual APIs 2023-10-11 23:25:13 +02:00
Andres Oliva
b6c0ddb7df Move the feature gates to the i2c module instead of the pub use statement 2023-10-11 23:05:12 +02:00
Andres Oliva
ee93bbf1d4 Gate pub use _version::* 2023-10-11 22:45:54 +02:00
Andres Oliva
7b1cd42936 Add time feature to CI 2023-10-11 22:20:27 +02:00
Andres Oliva
1cd3ae9bd5 Add comment about feature gate on I2C mod 2023-10-11 22:20:17 +02:00
Andres Oliva
bfcca79c1e Add time feature back and gate i2c on time 2023-10-11 22:12:03 +02:00
Dario Nieuwenhuis
c283e2d1b9
Merge pull request #2044 from embassy-rs/stm32-pac-pll-enums
stm32/rcc: LSE xtal is 32768hz, not 32000hz.
2023-10-11 11:42:27 +00:00
Dario Nieuwenhuis
4a43cd3982 stm32/rcc: LSE xtal is 32768hz, not 32000hz.
Fixes #2043
2023-10-11 13:39:04 +02:00
Dario Nieuwenhuis
0dda888c95
Merge pull request #2041 from embassy-rs/stm32-pac-pll-enums
stm32/rcc: add LSE/LSI to all chips, add RTC to more chips.
2023-10-11 02:18:24 +00:00
Dario Nieuwenhuis
b91d1eaca0 stm32/rcc: add LSE/LSI to all chips, add RTC to more chips. 2023-10-11 04:12:38 +02:00
Dario Nieuwenhuis
5a19d18b9c
Merge pull request #2039 from jcdickinson/rp-i2c-stop-restart
fix (rp i2c): fix restart/stop flags for i2c master methods
2023-10-11 00:40:59 +00:00
Dario Nieuwenhuis
ed7b6056a6
Merge pull request #2038 from jcdickinson/rp-i2c-slew
fix (rp i2c): set i2c slew rate to spec value
2023-10-11 00:38:13 +00:00
Jonathan Dickinson
322f9cb153
fix (rp i2c): fix restart/stop flags for i2c master methods
Update the start and stop flags for all read/write/read_write methods to match
those in the default blocking implementation of these methods (as well as
other RP2040 I2C implementations, and expected I2C behavior).

Also adds a write_read_async method that doesnt require using embedded-hal, as
this is required to use I2C in an idiomatic fashion (see TI Application Report
SLVA704).
2023-10-10 20:24:38 -04:00
Jonathan Dickinson
3ec4e6320a
fix (rp i2c): set i2c slew rate to spec value
The RP2040 datasheet indicates that I2C pins should have a limited
slew rate (Page 440 - 4.3.1.3.). This configures that for both
`I2c` and `I2cSlave`.

In addition, the pin configuration has been centralized to a single
fn.
2023-10-10 20:14:09 -04:00
Dario Nieuwenhuis
233aa1b53a
Merge pull request #2037 from embassy-rs/stm32-pac-pll-enums
stm32/rcc: rename hse32 to hse, unify L0 and L1
2023-10-10 23:37:10 +00:00
Dario Nieuwenhuis
21915a9a3f stm32/rcc: unify L0 and L1. 2023-10-11 01:22:27 +02:00
Dario Nieuwenhuis
d0d0ceec6a stm32/rcc: rename HSE32 to HSE 2023-10-11 01:06:44 +02:00
Dario Nieuwenhuis
9be61a2967
Merge pull request #2036 from embassy-rs/stm32-pac-pll-enums
stm32/rcc: use more PLL etc enums from PAC.
2023-10-10 22:24:08 +00:00
Dario Nieuwenhuis
0cfa8d1bb5 stm32/rcc: use more PLL etc enums from PAC. 2023-10-11 00:12:33 +02:00
Andres Oliva
cd12c9cbce stm32: add timeout to I2C driver 2023-10-10 18:20:46 +02:00
Dario Nieuwenhuis
eff73d6dfa
Merge pull request #2032 from andresv/stm32-check-flash-lock-before-unlocking
stm32 flash: check lock bit before unlocking
2023-10-10 10:12:55 +00:00
Andres Vahter
3616d68aaa stm32 flash: check lock bit before unlocking
It hardfaults if already unlocked flash is unlocked again.
2023-10-10 12:55:43 +03:00
xoviat
904f1cfc7a
Merge pull request #2028 from glaeqen/stm32-eth-station-management
stm32/eth: Move `phy_addr` from `Ethernet` to `PHY`
2023-10-10 01:50:45 +00:00
Gabriel Górski
e62bf6a9fd Patch tests & examples 2023-10-09 13:46:56 +02:00
Gabriel Górski
7526b8edba stm32/eth: Move phy_addr from Ethernet to PHY
Previously, PHY addressing was a concern of the `Ethernet` struct
which limited the `PHY` implementations which very often have to manage
multiple PHYs internally and thus possibly need to address many of them.

This change extends `StationManagement` to allow addressing different
PHY addresses via SMI.
2023-10-09 13:46:56 +02:00
Ilya Epifanov
0c97ce2fcc fixed rp adc tests 2023-10-09 11:46:57 +02:00
Ilya Epifanov
62d6bb6c8a added sampling frequency setting to adc capture methods on rp2040 2023-10-09 10:53:29 +02:00
Dario Nieuwenhuis
c3ef98a73d
Merge pull request #2026 from embassy-rs/stm32-pac-pll-enums
stm32/rcc: use PLL enums from PAC.
2023-10-09 00:58:22 +00:00
Dario Nieuwenhuis
6186fe0807 stm32/rcc: use PLL enums from PAC. 2023-10-09 02:48:22 +02:00
xoviat
c4cff0b79b
Merge pull request #2025 from xoviat/update-pac
stm32: update metapac
2023-10-08 23:35:14 +00:00
xoviat
2e5ab7981e stm32: update metapac 2023-10-08 18:27:36 -05:00
Dario Nieuwenhuis
9d311121f2
Merge pull request #2022 from HelloWorldTeraByte/impl-pwm-trait
Implemented Pwm trait from embedded_hal for simple and complementary pwm
2023-10-07 00:35:05 +00:00
Dario Nieuwenhuis
25c3754cd2
Merge pull request #2019 from embassy-rs/net-hostname
net: add support for dhcp hostname option.
2023-10-07 00:17:35 +00:00
Dario Nieuwenhuis
85c6f23dcb
Merge pull request #2018 from jamesmunns/add-derives
Add some uncontroversial derives to Error types
2023-10-07 00:03:10 +00:00
Dario Nieuwenhuis
9c6a2d9cbd
Merge pull request #1880 from phire/rp_bootsel
rp2040: BOOTSEL button support
2023-10-06 23:56:00 +00:00
Dario Nieuwenhuis
b67b179933 rp/bootsel: add test. 2023-10-07 01:47:25 +02:00
Dario Nieuwenhuis
d4ed8e5779 rp/bootsel: change it to a method on the peripheral. 2023-10-07 01:47:20 +02:00
Scott Mansell
3e054a6f0d rp2040: implement BOOTSEL button support 2023-10-07 01:39:29 +02:00
Scott Mansell
c6d53e7bce rp2040: move in_ram helper outside of Flash's impl
Allow it to be called from other modules.
2023-10-07 01:39:29 +02:00
Dario Nieuwenhuis
3bf8e4de5f
Merge pull request #2015 from willglynn/stm32u5_faster_clocks
stm32: u5: implement >55 MHz clock speeds
2023-10-06 23:38:15 +00:00
Dario Nieuwenhuis
9090a78df4 ci: set target dir if not specified. 2023-10-07 01:34:17 +02:00
James Munns
022d870d61 Add missing derive 2023-10-07 01:33:43 +02:00
Dario Nieuwenhuis
534eb960e9 net: add support for dhcp hostname option. 2023-10-07 01:33:21 +02:00
Dario Nieuwenhuis
7a2b8481f7
Merge pull request #2021 from embassy-rs/stm32-mco
stm32: add MCO for all chips
2023-10-06 23:31:32 +00:00
randi
710874021a Implemented Pwm trait for complementary pwm from embedded_hal 2023-10-07 12:22:31 +13:00
Dario Nieuwenhuis
3a8e0d4a27 stm32: implement MCO for all chips. 2023-10-07 01:15:24 +02:00
randi
b217d147de Implemented Pwm trait from embedded_hal 2023-10-07 11:57:19 +13:00
shakencodes
68c4820dde Add MCO support for stm32wl family 2023-10-06 14:37:36 -07:00
Dario Nieuwenhuis
f30fc949ff
Merge pull request #2012 from mattico/h7-rtc
H7: support LSE, LSI, LSEBYP, and RTCCLKSEL
2023-10-06 21:27:04 +00:00
Dario Nieuwenhuis
75c1a9a3aa disable flaky f2 eth test 2023-10-06 23:25:39 +02:00
Matt Ickstadt
4075ac84e1 h7: enable rtc test 2023-10-06 14:12:57 -05:00
Matt Ickstadt
f01609036f h7: implement RTC and LSE clock configuration 2023-10-06 13:28:30 -05:00
James Munns
930b8f3495 Add some uncontroversial derives to Error types 2023-10-06 17:45:35 +02:00
Will Glynn
38e7709a24 stm32: u5: implement >55 MHz clock speeds
This commit allows STM32U5 devices to operate at 160 MHz.

On STM32U5, MSIS can run at 48 MHz and HSE can reach 50 MHz. Faster
clocks require using PLL1's R output, though PLL1 can serve other
functions besides using the R output for the system clock. This commit
extracts a public `PllConfig` struct, primarily to place associated
constructors on that type, but also with an eye towards enabling the P
and Q outputs in a later commit.

STM32U5 PLLs have various frequency requirements on each stage: after
the `m` prescaler, after the `n` multiplier, and after the `r` divider.
This commit implements the associated checks as assertions.

This commit fixes clock calculation and PLL register configuration
errors in PLL initialization.

STM32U5 has a PWR peripheral which can be configured to push Vcore into
different voltage ranges. System clocks exceeding 55 MHz require range
2, and system clocks exceeding 110 MHz require range 1. This commit
adds `voltage_range` to `Config` and configures PWR as directed.

The voltage range implies different performance limits on various clock
signals, including inside a PLL. This commit implements voltage range
<-> frequency range checks as assertions, and extracts the
otherwise-repeated MSIS, HSI16, and HSE initialization into private
methods on `Config`.

STM32U5 frequencies above 55 MHz require using the PWR EPOD booster.
The EPOD booster requires configuring a second `m` term for PLL1,
`mboost`, such that it falls in a particular range. (Recall that >50
MHz cannot be reached without PLL1, so there is no scenario where EPOD
is needed but PLL1 is not.) This commit configures and enables the EPOD
booster automatically as required.
2023-10-05 22:13:27 -05:00
Ulf Lilleengen
65ed19aae2
Merge pull request #2014 from bugadani/udp
Reexport IpListenEndpoint for TCP
2023-10-05 16:13:10 +00:00
Dániel Buga
be9c05fbc9 Reexport IpListenEndpoint for TCP 2023-10-05 17:02:25 +02:00
xoviat
42176b1a3a
Merge pull request #2013 from xoviat/opamp
stm32: update metapac and fix opamp ch
2023-10-04 21:20:42 +00:00
xoviat
e1a0635ca3 stm32: update metapac and fix opamp ch 2023-10-04 16:15:08 -05:00
xoviat
b887b7516e
Merge pull request #2011 from glaeqen/input-pin
stm32/gpio: Implement `eh1::digital::InputPin` for `OutputOpenDrain`
2023-10-04 17:36:26 +00:00
Gabriel Górski
c6513f93fe stm32/gpio: Implement eh1::digital::InputPin for OutputOpenDrain
Pins in open-drain mode are outputs and inputs simultaneously.
2023-10-04 18:20:25 +02:00
Dario Nieuwenhuis
59f706ee2f
Merge pull request #2006 from embassy-rs/update-eio
update embedded-io, embedded-nal-async.
2023-10-03 22:27:06 +00:00
Dario Nieuwenhuis
ba7d74ac16 tests/stm32: increase tickrate for better precision. 2023-10-04 00:17:33 +02:00
Dario Nieuwenhuis
0324cee0ca update embedded-io, embedded-nal-async. 2023-10-04 00:10:55 +02:00
xoviat
8ac5c1a963
Merge pull request #1973 from xoviat/opamp
stm32: add opamp
2023-10-03 22:01:46 +00:00
xoviat
e7ab044935 ci: remove wpan tests again 2023-10-03 16:59:18 -05:00
xoviat
0c4cddfafb Merge branch 'main' of github.com:embassy-rs/embassy into opamp 2023-10-03 16:44:44 -05:00
xoviat
e561e673c2 stm32: add opamp mod and update pac 2023-10-03 16:34:13 -05:00
xoviat
09dfcd6b66
Merge pull request #2008 from xoviat/wpan
wpan: re-enable HIL tests
2023-10-03 21:02:48 +00:00
xoviat
bb8a1b7f1f wpan: re-enable HIL tests 2023-10-03 15:53:22 -05:00
Dario Nieuwenhuis
b012a67df7
Merge pull request #2007 from embassy-rs/unverbose
Remove a few ultra-verbose logs.
2023-10-03 20:28:44 +00:00
Dario Nieuwenhuis
40f30fa4cd Remove a few ultra-verbose logs.
They're heavily spamming logs for HIL tests, and I don't believe
they're valuable now that the thing they helped debug in their young
age is now solid and mature.
2023-10-03 22:22:16 +02:00
Dario Nieuwenhuis
f197aa9419
Merge pull request #2005 from embassy-rs/minor-doc-improvs
docs: minor doc improvements and cleanup
2023-10-03 19:37:39 +00:00
Ulf Lilleengen
80a740bc72 docs: minor doc improvements and cleanup 2023-10-03 21:35:31 +02:00
Dario Nieuwenhuis
ad524373ed
Merge pull request #1926 from m5p3nc3r/async_dtr
Add a signal for when the CDC control state changes
2023-10-03 02:13:12 +00:00
Dario Nieuwenhuis
9badf740d8
Merge pull request #2001 from embassy-rs/stm32-more-hil
stm32/hil: add f2, f3, f7, l49
2023-10-03 02:07:00 +00:00
Dario Nieuwenhuis
6e901846df
Merge pull request #1995 from JuliDi/quadspi
[STM32] QUADSPI support bank 2
2023-10-03 01:55:27 +00:00
Dario Nieuwenhuis
c0a6c78a14 stm32/hil: add f2, f3, f7, l49 2023-10-03 02:11:58 +02:00
xoviat
58280048e3
Merge pull request #2002 from embassy-rs/fix-stop
stm32: fix stop
2023-10-02 23:56:33 +00:00
xoviat
00824af82b ci: remove wpan tests 2023-10-02 18:55:31 -05:00
xoviat
adf9ffb109 tests/stm32: use default clock config 2023-10-02 18:51:59 -05:00
xoviat
bc203ebe4b Merge branch 'main' of github.com:embassy-rs/embassy into fix-stop 2023-10-02 18:30:41 -05:00
xoviat
e042b3056d stm32: fix stop 2023-10-02 18:11:03 -05:00
Dario Nieuwenhuis
9dc927250c
Merge pull request #1959 from embassy-rs/test-eth
stm32: add eth tests
2023-10-02 20:41:31 +00:00
Dario Nieuwenhuis
b856d760f4 stm32/rcc: reset backup domain before enabling LSE. 2023-10-02 22:12:50 +02:00
Dario Nieuwenhuis
a742a80171
Merge pull request #1999 from KingCol13/rp-wifi-examples-fixes
cyw43: Update examples
2023-10-02 20:07:45 +00:00
Dion Dokter
a9dc887060 Added clarifying comment 2023-10-02 21:41:30 +02:00
Dion Dokter
137e47f98d Do affect the frequency 2023-10-02 21:14:44 +02:00
KingCol13
90ade1b311 Add wait for DHCP in rp wifi_tcp_server 2023-10-02 20:10:52 +01:00
KingCol13
a931dfd9ad Update firmware size in rp wifi examples 2023-10-02 20:10:45 +01:00
Dario Nieuwenhuis
eff61648fe tests/stm32: add eth test. 2023-10-02 20:40:11 +02:00
Dario Nieuwenhuis
9228a6334b
Merge pull request #1996 from embassy-rs/update-nightly
Update Nightly.
2023-10-02 17:29:21 +00:00
Dario Nieuwenhuis
3c9dfbbc9d enable wifi_esp_hosted_perf test, disable stm32f4 stop test. 2023-10-02 19:05:41 +02:00
Dario Nieuwenhuis
ce0add61f8
Merge pull request #1997 from dzamlo/main
stm32: avoid useless endian conversion in rng
2023-10-02 15:31:13 +00:00
Loïc Damien
bf6e06060b
stm32: avoid useless endian conversion in rng 2023-10-02 17:20:58 +02:00
Dario Nieuwenhuis
eb12114345 Remove impl_trait_projections. 2023-10-02 14:00:49 +02:00
Dario Nieuwenhuis
4b252586e5 Update Nightly. 2023-10-02 13:51:13 +02:00
Dario Nieuwenhuis
5f6a915a32
Merge pull request #1994 from jcdickinson/pin_params
feat (rp2040): allow schmitt, slew, and drive strength be set from Flex, Input, Output
2023-10-02 10:44:19 +00:00
JuliDi
923f1851ee
remove debug logging in build.rs 2023-10-02 09:36:11 +02:00
JuliDi
bd267a6479
move stm32h7 specific import 2023-10-02 09:34:59 +02:00
JuliDi
f3aa0cfe5a
remove debug code, add some comments 2023-10-02 09:33:10 +02:00
JuliDi
6ea5aa347d
feature-gate errata workaround for h7 2023-10-02 09:30:58 +02:00
JuliDi
8c13126cff
make push/pull settings for pins explicit 2023-10-02 09:30:58 +02:00
JuliDi
81da9ca621
Bump stm32-metapac, add flash selection 2023-10-02 09:30:58 +02:00
JuliDi
729338875c
support QSPI BK2 2023-10-02 09:30:57 +02:00
Jonathan Dickinson
f98c8886b2
feat: allow schmitt, slew, and drive strength be set from Flex, Input, Output
Allows the schmitt, slew and drive strength to be set from Flex. Input and Output[OpenDrain] also expose the appropriate setters.
2023-10-01 21:49:14 -04:00
Dion Dokter
05a9b11316 Fix examples 2023-10-01 23:39:53 +02:00
Dario Nieuwenhuis
a1036e111e
Merge pull request #1990 from embassy-rs/stm32f4-rcc-fix
stm32f4: fix rcc build on stm32f446
2023-10-01 21:16:09 +00:00
Dion Dokter
561126b0d6 stm32: Add the ability to center-align timers 2023-10-01 23:09:01 +02:00
Dario Nieuwenhuis
2af97e7595 rcc/f4: fix build on stm32f446
fixes #1989
2023-10-01 23:01:58 +02:00
Dario Nieuwenhuis
2008030a8b ci: add all stm32f4 2023-10-01 23:01:35 +02:00
xoviat
480328d07e
Merge pull request #1984 from xoviat/set-config
stm32: require use of setconfig to set config
2023-10-01 14:41:52 +00:00
xoviat
05218a52e6 stm32: update set_config 2023-10-01 09:39:10 -05:00
xoviat
d2a2734752 nrf, rp: update set_config 2023-10-01 09:37:42 -05:00
xoviat
5ad34404af eh: update set_config and add get_config 2023-10-01 09:37:20 -05:00
xoviat
a7b1e51650
Merge pull request #1987 from tyler-gilbert/issue-1986-add-sai-receiver-driver
Issue 1986 add sai receiver driver
2023-10-01 14:06:25 +00:00
xoviat
70005c3956
Merge pull request #1988 from JuliDi/expose-analog-switch-pins-rebased
[STM32] Handle STM32H7 "_C" pins (rebased)
2023-10-01 12:36:21 +00:00
JuliDi
93adbb9922
update stm32-metapac 2023-10-01 12:41:08 +02:00
JuliDi
e80df91e02
update stm32-metapac revision 2023-10-01 12:34:26 +02:00
JuliDi
5cb58754d4
skip _C pins for pin impls if split_feature not enabled. 2023-10-01 12:32:47 +02:00
JuliDi
5c83179071
change split_features from array to Vec 2023-10-01 12:32:47 +02:00
JuliDi
49608714aa
cleanup, fix pushing to pins_table 2023-10-01 12:32:47 +02:00
JuliDi
f116ca83e0
check whether split-feature is valid 2023-10-01 12:32:47 +02:00
JuliDi
6e5f3f9515
update to testing pr #1889 2023-10-01 12:32:46 +02:00
JuliDi
5924cc8b49
handle _C pins 2023-10-01 12:30:34 +02:00
Tyler Gilbert
0d49aaf8ca Issue #1986 fix ci build errors 2023-09-30 22:51:23 -05:00
Tyler Gilbert
5dd9e9b3b7 issue #1986 separate blocks to prevent unsafe user code 2023-09-30 22:48:49 -05:00
Tyler Gilbert
d42cfda2db Issue #1986 add PartialEq to SyncEnable to fix build error on sai_v4 2023-09-30 19:51:00 -05:00
Tyler Gilbert
d1f4511cd1 Issue #1986 update the SAI driver with receiver capability 2023-09-30 19:43:44 -05:00
Tyler
fa8d5da4a5
Merge pull request #5 from embassy-rs/main
Merge latest including SAI driver
2023-09-30 16:06:11 -06:00
xoviat
7bc57ca3f7
Merge pull request #1975 from tyler-gilbert/issue-1974-add-sai-driver
Issue 1974 add sai driver
2023-09-30 20:04:26 +00:00
xoviat
7ad102695d
Merge pull request #1981 from xoviat/fix-traits
Fix traits
2023-09-30 17:57:22 +00:00
xoviat
4999de6f82 rustfmt 2023-09-30 12:53:17 -05:00
Daniel Berlin
9b8bdad403 Fix clippy error exposed by moving out of macros 2023-09-30 13:07:11 -04:00
Daniel Berlin
3c3fb0a529 Remove unused imports 2023-09-30 12:20:31 -04:00
Daniel Berlin
dc4c27aead Move one more method out of macros 2023-09-30 12:16:47 -04:00
Daniel Berlin
74eb519810 Move trait impls out of macros 2023-09-30 12:14:20 -04:00
Daniel Berlin
61dc36b1f2 Fix small formatting issue 2023-09-30 11:36:32 -04:00
Daniel Berlin
55a0a15be2 Fix trait inconsistency between sealed traits and implementations 2023-09-30 11:19:09 -04:00
Dario Nieuwenhuis
fc8f96fea5
Merge pull request #1976 from elasticdotventures/feature/examples
fix typo / update wasm example
2023-09-30 10:55:08 +00:00
brian horakh
08175f191a bump wasm-pack version 2023-09-30 05:42:59 +00:00
brian horakh
8da987cfbb typo 2023-09-30 05:34:22 +00:00
Tyler Gilbert
1be5f193c3 #Issue 1974 more whitespace fixes 2023-09-29 21:53:01 -05:00
Tyler Gilbert
4a632e08b7 #Issue 1974 fix extra whitespace 2023-09-29 21:46:19 -05:00
Tyler Gilbert
6cdee93934 #Issue 1974 fix more warnings treated as errors 2023-09-29 21:27:15 -05:00
Tyler Gilbert
5c8c1b2146 #Issue 1974 fix warnings 2023-09-29 21:16:20 -05:00
Tyler Gilbert
2addfc4b86 Merge branch 'issue-1974-add-sai-driver' of https://github.com/tyler-gilbert/embassy into issue-1974-add-sai-driver 2023-09-29 21:08:21 -05:00
Tyler Gilbert
92df87781d Issue 1974 add sai/mod file 2023-09-29 21:08:07 -05:00
Tyler
a35d149cb1
Revert metapac change in Cargo.toml 2023-09-29 21:07:09 -05:00
Tyler
c52320f467
Merge pull request #4 from embassy-rs/main
Pull latest from embassy main
2023-09-29 20:03:31 -06:00
Tyler
2f9b59c5cf
Merge branch 'main' into issue-1974-add-sai-driver 2023-09-29 20:02:24 -06:00
Tyler Gilbert
ce91fb2bfc Issue #1974 add SAI driver 2023-09-29 20:57:59 -05:00
Dario Nieuwenhuis
95b3d9eb3b
Merge pull request #1972 from embassy-rs/rtc-lse-fix
stm32/rtc: enable lse in examples.
2023-09-29 22:23:42 +00:00
Dario Nieuwenhuis
f1e7205055 stm32/rtc: enable lse in examples. 2023-09-30 00:18:30 +02:00
xoviat
6627824c02
Merge pull request #1970 from dberlin/revert-1969-main
Revert "Forgot set_count_direction and set_clock_division in 32 bit instance"
2023-09-29 17:32:37 +00:00
Dario Nieuwenhuis
d62533879c
Merge pull request #1971 from oro-os/enc28j60-mac-addr
enc28j60: expose a the MAC address via `address()` getter
2023-09-29 15:49:07 +00:00
Josh Junon
e1a8caffa4 enc28j60: expose a the MAC address via address() getter 2023-09-29 17:23:39 +02:00
Daniel Berlin
dffdb9268b
Revert "Forgot set_count_direction and set_clock_division in 32 bit instance" 2023-09-28 21:56:18 -04:00
Dario Nieuwenhuis
22e820b743
Merge pull request #1969 from dberlin/main
Forgot set_count_direction and set_clock_division in 32 bit instance
2023-09-29 00:38:45 +00:00
xoviat
aa14f18d3f
Merge pull request #1968 from xoviat/sbs
update metapac and rename sbs
2023-09-29 00:25:55 +00:00
xoviat
39f1b26a39 stm32: update metapac and remove sbs 2023-09-28 19:21:02 -05:00
Daniel Berlin
e70143ef8f Forgot set_count_direction and set_clock_division in 32 bit instance 2023-09-28 20:01:04 -04:00
xoviat
d6654bf8b5
Merge pull request #1966 from xoviat/hrtim
stm32/hrtim: move traits out of macro def'n
2023-09-28 20:53:55 +00:00
xoviat
322a4a8401 stm32/hrtim: move traits out of macro def'n 2023-09-28 15:48:46 -05:00
xoviat
ee5591017b
Merge pull request #1964 from dberlin/main
Add support for STM32 input capture filter
2023-09-28 20:37:48 +00:00
Dario Nieuwenhuis
b1b32f079b
Merge pull request #1962 from bugadani/esp32s2
Add 80MHz tick rate
2023-09-28 17:07:26 +00:00
Dániel Buga
e8a462768e Add more tick rates 2023-09-28 19:06:38 +02:00
Dario Nieuwenhuis
ce0d787781
Merge pull request #1965 from oro-os/return-len-receive-enc28j60
enc28j60: return packet length from receive() instead of mut slice
2023-09-28 16:32:22 +00:00
Josh Junon
fa2e63f74b enc28j60: return packet length from receive() instead of mut slice 2023-09-28 18:28:46 +02:00
Daniel Berlin
23f3889167 Add support for STM32 input capture filter 2023-09-28 09:35:43 -04:00
xoviat
a72a91ab06
Merge pull request #1963 from Mirror0/restore-f7-rtc
Restore RTC configuration for `STM32F7` boards
2023-09-28 11:32:50 +00:00
Dániel Buga
b9ef831ff7 Add 80MHz tick rate 2023-09-28 09:41:35 +02:00
Dario Nieuwenhuis
e538aeacc8
Merge pull request #1960 from embassy-rs/test-eth-2
Net fixes
2023-09-28 03:39:10 +00:00
Dario Nieuwenhuis
6b3745fc47 temporarily disable wifi_esp_hosted_perf test. 2023-09-28 05:34:19 +02:00
Dario Nieuwenhuis
6200d22438 stm32/eth: fix receiving large frames on v2. 2023-09-28 05:12:35 +02:00
xoviat
901d31e8f8
Merge pull request #1933 from xoviat/adc
stm32: more adc cleanup
2023-09-28 01:59:51 +00:00
xoviat
79146c4bd5 stm32/adc: cleanup f1, f3, v1, and v2 2023-09-27 20:58:46 -05:00
Dario Nieuwenhuis
d9eae79f3e test: deduplicate net perf test code. 2023-09-28 03:47:14 +02:00
Dario Nieuwenhuis
3d1b4116ec test: set DEFMT_LOG not too verbose so net perf tests pass with cargo run. 2023-09-28 03:47:14 +02:00
Dario Nieuwenhuis
901f0257bd net: allow non-'static drivers. 2023-09-28 03:47:14 +02:00
xoviat
fec4194ae6
Merge pull request #1958 from dberlin/main
Add support for input capture function
2023-09-28 01:00:36 +00:00
Daniel Berlin
f866735802 Add support for input capture function 2023-09-27 20:15:57 -04:00
Dario Nieuwenhuis
20ea76c19c
Merge pull request #1953 from embassy-rs/stm32l-tests
tests/stm32: add L0, L1, L4, L4+, L5
2023-09-27 19:37:04 +00:00
Mateusz Butkiewicz
e1951f3ddf feat(stm32f7): restore rtc configuration for stm32f7 series 2023-09-27 16:08:05 +02:00
Dario Nieuwenhuis
8b5fb254c0 tests/stm32: add L0, L1, L4, L4+, L5 2023-09-26 05:30:50 +02:00
Dario Nieuwenhuis
624f786203
Merge pull request #1952 from embassy-rs/stm32-test-cleanup
stm32 rcc fixes.
2023-09-26 03:24:53 +00:00
Dario Nieuwenhuis
a57e48459e stm32/rcc: remove bad limits on l5. 2023-09-26 05:15:09 +02:00
Dario Nieuwenhuis
c604d8a8f1 stm32/rcc: add voltage_scale, flash waitstates. 2023-09-26 05:15:09 +02:00
Dario Nieuwenhuis
be0c52bf5e
Merge pull request #1951 from embassy-rs/stm32-test-cleanup
stm32/usart: enable fifo mode on usartv4.
2023-09-26 02:42:11 +00:00
Dario Nieuwenhuis
44bb405683 stm32/usart: enable fifo mode on usartv4. 2023-09-26 04:38:53 +02:00
Dario Nieuwenhuis
e8587e2fba
Merge pull request #1950 from embassy-rs/stm32-test-cleanup
stm32/usart: return error instead of panicking on bad baudrate.
2023-09-25 22:21:29 +00:00
Dario Nieuwenhuis
5d8817d109 stm32/usart: return error instead of panicking on bad baudrate. 2023-09-26 00:19:27 +02:00
xoviat
c79a84a98a
Merge pull request #1949 from xoviat/rtc
stm32/rtc: cleanup and fixes
2023-09-25 21:40:05 +00:00
xoviat
96edbd84fb rtc: use enable on known working chips only 2023-09-25 16:38:30 -05:00
xoviat
dc400a0539 stm32/rtc: always set wakeup alarm 2023-09-25 16:27:08 -05:00
xoviat
04b09a2acb stm32/rtc: use rccperi enable 2023-09-25 16:26:29 -05:00
Dario Nieuwenhuis
481d2998ef
Merge pull request #1948 from embassy-rs/stm32-test-cleanup
tests/stm32: centralize pin configuration.
2023-09-25 20:44:57 +00:00
Dario Nieuwenhuis
4b695120fc tests/stm32: centralize pin configuration. 2023-09-25 22:41:22 +02:00
Dario Nieuwenhuis
bd9021ca1d Make irq token Copy+Clone 2023-09-25 22:35:31 +02:00
Dario Nieuwenhuis
6e63c8d4bf
Merge pull request #1947 from ceekdee/rust-lorawan-lora-phy-v2
Update rust-lorawan and embassy to use lora-phy version 2
2023-09-25 16:20:50 +00:00
ceekdee
70acc093dd Update rust-lorawan crate versions. 2023-09-25 10:45:53 -05:00
Chuck Davis
f7c2db245f
Merge branch 'embassy-rs:main' into rust-lorawan-lora-phy-v2 2023-09-24 19:09:04 -05:00
xoviat
2543bcafaf
Merge pull request #1945 from xoviat/bd-2
stm32: fix bd lsi
2023-09-24 23:41:04 +00:00
xoviat
9f2fc04caa stm32: fix bd lsi 2023-09-24 18:37:09 -05:00
Dario Nieuwenhuis
f32bfafa61
Merge pull request #1943 from embassy-rs/centralize-pwr-syscfg
stm32: centralize enabling pwr, syscfg, flash.
2023-09-24 23:15:25 +00:00
Dario Nieuwenhuis
e03239e88d stm32: centralize enabling pwr, syscfg, flash. 2023-09-25 01:07:55 +02:00
ceekdee
7d5e62d4a7 Update for rust-lorawan and lora-phy version 2. 2023-09-24 10:33:03 -05:00
Dario Nieuwenhuis
65d36f9f99
Merge pull request #1940 from luveti/patch-1
stm32: fix rtc example
2023-09-24 09:30:08 +00:00
luveti
347ff18644
stm32: fix rtc example
lsi must be enabled otherwise a assertion fails
2023-09-24 01:11:58 -04:00
Dario Nieuwenhuis
1e80fd81f7
Merge pull request #1939 from nilfit/spim-anomaly-109
spim: Fix nRF52832 SPIM with polling executors
2023-09-23 11:14:16 +00:00
xoviat
52e269edbb
Merge pull request #1938 from xoviat/low-power
stm32/lp: clamp requested_duration
2023-09-22 20:39:54 +00:00
xoviat
c849620cd6 stm32/lp: clamp requested_duration to avoid overflow 2023-09-22 15:35:20 -05:00
Priit Laes
6f83acc010 Add separate work-around specific flag for DMA errata on NRF52832 2023-09-22 17:02:21 +02:00
Nils Fitinghoff
2b7b7a917d spim: Fix SPIM with polling executors
Co-authored-by: Priit Laes <plaes@plaes.org>
2023-09-22 17:02:21 +02:00
xoviat
f1488864eb
Merge pull request #1937 from xoviat/low-power
stm32/low-power: create one critical-section for all time ops
2023-09-22 00:36:21 +00:00
xoviat
7cf327130e stm32/low-power: create one critical-section for all time ops 2023-09-21 19:32:48 -05:00
Dario Nieuwenhuis
02b0523199
Merge pull request #1935 from embassy-rs/stm32-update-metapacgc
stm32: update metapac.
2023-09-21 22:26:53 +00:00
Dario Nieuwenhuis
47175198c0 stm32: update metapac. 2023-09-22 00:13:57 +02:00
Dario Nieuwenhuis
4b20e6c258
Merge pull request #1927 from embassy-rs/stm32-rcc-unify-h
stm32/rcc: unify h5 and h7.
2023-09-21 22:05:01 +00:00
Dario Nieuwenhuis
83b4c01273 stm32/rcc: unify h5 and h7. 2023-09-21 23:47:56 +02:00
xoviat
e313ca4ae8
Merge pull request #1934 from chrenderle/low-power-l0
fix low-power: APB1 needed for LSE
2023-09-21 17:40:11 +00:00
Christian Enderle
ad64d7b20b fix low-power: APB1 needed for LSE 2023-09-21 17:17:58 +02:00
xoviat
5626a28af2
Merge pull request #1930 from xoviat/adc
stm32/adc: make v1 async
2023-09-20 22:45:51 +00:00
Dario Nieuwenhuis
766ae724cb
Merge pull request #1932 from embassy-rs/h7fix
stm32/h7: fix bad PWR reg versions.
2023-09-20 22:28:09 +00:00
Dario Nieuwenhuis
00b9f9acef stm32/h7: fix bad PWR reg versions. 2023-09-21 00:23:56 +02:00
xoviat
d46920dce6 stm32/adc: make v1 async and leave en 2023-09-20 16:07:35 -05:00
Dario Nieuwenhuis
e1ed492577
Merge pull request #1929 from sgoll/exti-level
stm32/exti: Add get_level() to ExtiInput
2023-09-19 22:44:19 +00:00
Sebastian Goll
2405aff11f Add get_level() to ExtiInput 2023-09-20 00:03:39 +02:00
Matt Spencer
a402aed3d1 Add async interface for CDC control changes
Signed-off-by: Matt Spencer <matthew@thespencers.me.uk>
2023-09-19 15:42:26 +01:00
Dario Nieuwenhuis
c573959a95
Merge pull request #1928 from sgoll/fix-r2-voltage-range
stm32/f2: Fix typo in RCC voltage range docs
2023-09-19 12:03:40 +00:00
Sebastian Goll
561696dfad Fix typo in F2 RCC voltage ranges 2023-09-19 10:20:25 +02:00
xoviat
b1abaa380f
Merge pull request #1919 from xoviat/adc
adc/f3: add async conversion
2023-09-18 21:32:59 +00:00
xoviat
e640933e2f stm32/adc: add async conversion 2023-09-18 16:31:20 -05:00
Dario Nieuwenhuis
183824fbdd
Merge pull request #1924 from embassy-rs/rp-remove-paste
rp: remove paste macro.
2023-09-18 01:33:55 +00:00
Dario Nieuwenhuis
5d0c40f61d rp: remove paste macro. 2023-09-18 03:30:17 +02:00
Dario Nieuwenhuis
fdfe12fe1c
Merge pull request #1923 from embassy-rs/pac-vos
stm32: use PAC enums for VOS.
2023-09-18 01:23:40 +00:00
Dario Nieuwenhuis
4bfbcd6c72 stm32: use PAC enums for VOS. 2023-09-18 03:15:15 +02:00
xoviat
0da793e5de
Merge pull request #1921 from xoviat/rtc
stm32: update configure_ls and misc cleanup
2023-09-18 00:04:32 +00:00
xoviat
0dcb34fc7d ci: fix tests 2023-09-17 19:03:45 -05:00
xoviat
feaeee1e83 stm32: misc. cleanup 2023-09-17 18:47:22 -05:00
xoviat
a6ef314be1 stm32: update configure_ls as agreed 2023-09-17 18:41:45 -05:00
Dario Nieuwenhuis
daeb497045
Merge pull request #1917 from MabezDev/set-config-uart
stm32: Implement `set_config` for Uart structs
2023-09-17 21:33:18 +00:00
Scott Mabin
88eb5cca71 stm32: Implement set_config for Uart structs 2023-09-17 18:38:03 +01:00
xoviat
cd128c20fa
Merge pull request #1920 from MabezDev/rtc-time-provider
stm32: Add RtcTimeProvider struct to Rtc module
2023-09-17 17:32:56 +00:00
Scott Mabin
087ef918bf stm32: Add RtcTimeProvider struct to Rtc module
This struct allows users to acquire the current time without putting `Rtc`
in a mutex and passing that around. This is allowed because reading from the
rtc registers is atomic.
2023-09-17 18:04:05 +01:00
Dario Nieuwenhuis
75cae09e79
Merge pull request #1918 from embassy-rs/stm32wba
stm32/rcc: use AHBPrescaler div impls in stm32wba
2023-09-17 00:39:26 +00:00
Dario Nieuwenhuis
bbe1d96045 stm32/rcc: use AHBPrescaler div impls in stm32wba 2023-09-17 02:30:50 +02:00
xoviat
3ddc9cd110
Merge pull request #1915 from xoviat/rcc
stm32/rcc: convert bus prescalers to pac enums
2023-09-16 22:59:26 +00:00
xoviat
de2773afdd stm32/rcc: convert bus prescalers to pac enums 2023-09-16 17:41:11 -05:00
xoviat
2930be5e17
Merge pull request #1916 from wkf/main
Update stm32wb examples to use ble/mac firmware.
2023-09-16 20:43:02 +00:00
Will Farrell
09f087e53e Update stm32wb examples to use ble/mac firmware. 2023-09-16 16:32:25 -04:00
xoviat
044b837caa
Merge pull request #1914 from xoviat/fix-wpan
stm32: fix  wpan_ble test
2023-09-16 15:20:55 +00:00
xoviat
ad0a306ea5 stm32: fix wpan_ble test 2023-09-16 10:19:09 -05:00
xoviat
b5fffbf66f
Merge pull request #1913 from xoviat/doc
update docs
2023-09-16 13:20:39 +00:00
xoviat
537e2f3b44 update docs 2023-09-16 08:19:49 -05:00
Dario Nieuwenhuis
80d7193b5b
Merge pull request #1911 from embassy-rs/stm32wba
stm32: add stm32wba support.
2023-09-16 02:06:22 +00:00
Dario Nieuwenhuis
8315cf064e stm32: add stm32wba support. 2023-09-16 04:04:45 +02:00
Dario Nieuwenhuis
a2a26f489b ci: set net.git-fetch-with-cli=true 2023-09-16 02:16:33 +02:00
xoviat
f27620cc0b
Merge pull request #1909 from xoviat/adc
stm32: generate adc_common and misc.
2023-09-15 23:49:41 +00:00
xoviat
2911774849
Merge pull request #1910 from xoviat/rtc
stm32: rtc/low-power cleanup
2023-09-15 23:49:36 +00:00
xoviat
6da75ea285 stm32: rtc/low-power cleanup 2023-09-15 18:41:33 -05:00
xoviat
aa2fa29b89 stm32: fix adc f3 startup time
closes #1888.
2023-09-15 17:36:21 -05:00
xoviat
c28a6bdd0b stm32: generate adc_common 2023-09-15 17:35:53 -05:00
Dario Nieuwenhuis
5a158b94bd
Merge pull request #1896 from haileys/inline-never-for-rvo
Write to TaskStorage::future via never-inlined fn to encourage RVO
2023-09-15 18:45:21 +00:00
xoviat
c091ed2f63
Merge pull request #1908 from chrenderle/low-power-l0
Fix low-power feature for STM32L0
2023-09-15 14:50:19 +00:00
Christian Enderle
45e9e51bdc Fix low-power feature for STM32L0 2023-09-15 16:36:51 +02:00
Dario Nieuwenhuis
7c77d2bd94 ci: reenable stm32 docs. 2023-09-15 03:43:46 +02:00
xoviat
f76d94098d
Merge pull request #1906 from xoviat/pwr-l0
update metapac and add low-power for l0
2023-09-15 00:21:24 +00:00
xoviat
07233ca5b4 ci: build low-power on l0 2023-09-14 19:09:35 -05:00
xoviat
9fb14379c3 stm32: add lp to l0 2023-09-14 18:53:27 -05:00
xoviat
309c3d6b47 update metapac 2023-09-14 18:36:03 -05:00
Ulf Lilleengen
f1f4943ca5
Merge pull request #1903 from embassy-rs/bump-embassy-sync
feat: bump embassy-sync version to 0.3.0
2023-09-14 16:36:59 +00:00
Ulf Lilleengen
1b20ba27b1 feat: bump embassy-sync version to 0.3.0
Update changelog in preparation for release
2023-09-14 18:26:00 +02:00
Dario Nieuwenhuis
f5e96a9d60
Merge pull request #1902 from diondokter/gpiote-fix
Fix gpiote when waking up from systemoff
2023-09-14 16:02:14 +00:00
Dion Dokter
e8b961232b Fix gpiote when waking up from systemoff 2023-09-14 17:24:28 +02:00
Dario Nieuwenhuis
85a9f5816f
Merge pull request #1901 from FuzzyLitchi/patch-1
Fix doc typo
2023-09-14 14:10:21 +00:00
Polly
7bcc7e8962
Fix doc typo 2023-09-14 16:08:37 +02:00
Dario Nieuwenhuis
b118c4cc1b
Merge pull request #1899 from tarfu/bump-fmc
stm32: bump fmc version
2023-09-14 12:34:19 +00:00
Dario Nieuwenhuis
f090a38dde
Merge pull request #1898 from MathiasKoch/embassy-stm32/uart-blocking-embedded-io
feature(embassy-stm32): implement blocking embedded-io::Write for Uart & UartTx
2023-09-14 12:33:51 +00:00
Tobias Breitwieser
dcd1a91966 stm32: bump fmc version 2023-09-14 14:07:15 +02:00
Mathias
49847ff432 Implement blocking embedded-io::Write for Uart & UartTx 2023-09-14 10:09:09 +02:00
Hailey Somerville
b9d4b18f14 update UninitCell::write call in arch::wasm too 2023-09-14 13:59:24 +10:00
Hailey Somerville
3a1ed823f8 write to TaskStorage::future via inline(never) fn to encourage RVO 2023-09-14 13:42:11 +10:00
xoviat
9c647dd0e8
Merge pull request #1892 from cumthugo/usart-not-wakeup
stm32/usart: fix read_until_idle not wake up issue
2023-09-13 17:29:13 +00:00
cumthugo
582ef90994 stm32/usart: fix usart not wake up issue 2023-09-13 23:47:46 +08:00
Dario Nieuwenhuis
5e381d49da
Merge pull request #1893 from ceekdee/main
Wait for high for DIO1 for rp2040-based LoRa boards
2023-09-12 23:00:25 +00:00
ceekdee
af59fa0a7e Wait for high for DIO1 for rp2040-based LoRa boards. 2023-09-12 17:53:27 -05:00
Ulf Lilleengen
4907ccaa4d
Merge pull request #1839 from Frostie314159/embassy-time-next
embassy-time: Introduce reset function for Ticker.
2023-09-12 22:11:21 +00:00
xoviat
2c38dd17b9
Merge pull request #1887 from xoviat/adc
adc/f3: fix delay calculation
2023-09-11 23:54:26 +00:00
xoviat
d36e7abb71 adc/f3: fix delay calculation 2023-09-11 18:52:52 -05:00
Dario Nieuwenhuis
e11db9fa59 ci: disable stm32 docs build temporarily because it's bringing CI down for some reason. 2023-09-12 01:43:57 +02:00
Dario Nieuwenhuis
f877a5889d ci: fix colliding files warning. 2023-09-12 01:43:19 +02:00
xoviat
db54edf56c
Merge pull request #1886 from xoviat/adc
add g4 adc345, adc etc.
2023-09-11 22:50:53 +00:00
xoviat
4072a16af6 ci: remove wpan_ble for hil 2023-09-11 17:50:08 -05:00
xoviat
44a5c32ea4 adc/f3: fix startup bug 2023-09-11 17:27:47 -05:00
xoviat
b9889ad3b5 stm32: add g4 adc345 and misc. 2023-09-11 17:12:54 -05:00
Frostie314159
527bdc57b9
Fixed formating. 2023-09-11 08:04:06 +02:00
Dario Nieuwenhuis
1133cbf90e
Merge pull request #1834 from dave-andersen/main
Fix timing on RP2040 pio_ws2812.rs example
2023-09-10 21:21:06 +00:00
Dario Nieuwenhuis
77c357e744
Merge pull request #1870 from plaes/nrf-setconfig-trait-internally
nrf: Use SetConfig trait internally where possible
2023-09-10 21:19:15 +00:00
Priit Laes
521970535e nrf: twim: Use SetConfig trait to reduce code duplication 2023-09-10 23:17:30 +02:00
Priit Laes
93d4cfe7c1 nrf: spis: Use SetConfig trait internally to reduce duplication 2023-09-10 23:17:30 +02:00
Priit Laes
8413a89752 nrf: spim: Use SetConfig trait internally to reduce duplication 2023-09-10 23:17:30 +02:00
Priit Laes
db717d9c81 nrf: Remove unneeded include from Temp's example
Fixes doctest when `time` feature is not enabled.
2023-09-10 23:17:30 +02:00
Dario Nieuwenhuis
808fa9dce6
Merge pull request #1871 from plaes/dma-anomaly-109-spim-workaround
nrf: spim: Anomaly 109 workaround for SPIM peripheral (#460)
2023-09-10 21:12:02 +00:00
Dario Nieuwenhuis
ceb13def19
Merge pull request #1850 from CBJamo/i2cdev
rp2040: I2cDevice
2023-09-10 21:02:32 +00:00
Dario Nieuwenhuis
5cf494113f tests/rp: add teleprobe meta. 2023-09-10 23:01:15 +02:00
Caleb Jamison
8edb7bb012 Test cleanup 2023-09-10 23:01:15 +02:00
Caleb Jamison
8900f5f52b Fixing my git-based mistakes 2023-09-10 23:01:15 +02:00
Caleb Jamison
8201979d71 Add example, fix small bug in respond_and_fill 2023-09-10 23:01:15 +02:00
Caleb Jamison
2d9f50addc I2c slave take 2
refactored to split modules
renamed to match upstream docs
slight improvement to slave error handling
2023-09-10 23:01:15 +02:00
Caleb Jamison
18da91e252 Rename to match upstream docs 2023-09-10 23:01:15 +02:00
Caleb Jamison
28e2570533 Remove debug prints 2023-09-10 23:01:15 +02:00
Caleb Jamison
26e0823c35 rp2040 I2cDevice
Move i2c to mod, split device and controller

Remove mode generic:
I don't think it's reasonable to use the i2c in device mode while
blocking, so I'm cutting the generic.
2023-09-10 23:01:15 +02:00
Dario Nieuwenhuis
ceca8b4336
Merge pull request #1883 from JuliDi/net-socket-bind-error
embassy-net: Improve error when socket is not bound
2023-09-10 20:33:29 +00:00
xoviat
e308286f3c
Merge pull request #1881 from MabezDev/sdmmc-stbiterr
Handle stbiterr in 4bit wide mode for sdmmc_v1
2023-09-10 19:52:47 +00:00
Scott Mabin
268da2fcde Handle stbiterr in 4bit wide mode for sdmmc_v1 2023-09-10 20:27:38 +01:00
xoviat
a992d4895d
Merge pull request #1884 from xoviat/doc
stm32: fix docs
2023-09-10 18:52:42 +00:00
xoviat
1bae34d37c stm32: fix docs 2023-09-10 13:50:28 -05:00
xoviat
aac42e3209
Merge pull request #1882 from xoviat/rcc-f3
stm32/f3: add high res for hrtim and misc.
2023-09-10 18:35:33 +00:00
xoviat
08415e001e stm32/f3: add high res for hrtim and misc. 2023-09-10 13:33:17 -05:00
JuliDi
d6a1b567ee
add SocketNotBound error message 2023-09-10 20:13:56 +02:00
xoviat
a47fb42962
Merge pull request #1878 from xoviat/adc
stm32: fix adc f3 and example
2023-09-10 03:02:42 +00:00
xoviat
70a4a193c5 stm32: fix adc f3 and example 2023-09-09 22:01:51 -05:00
Dario Nieuwenhuis
2132afb48b
Merge pull request #1874 from JuliDi/eth-getstatus-async
embassy-net: add async wait_config_up
2023-09-09 20:06:52 +00:00
Julian
0e9131fd14
yield -> return
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2023-09-09 12:36:57 +02:00
JuliDi
40a18b075d
improve docstring 2023-09-09 09:50:24 +02:00
xoviat
f17f09057d
Merge pull request #1877 from xoviat/rcc
rcc: more cleanup
2023-09-08 23:22:39 +00:00
xoviat
11a78fb1e4 rcc: more cleanup 2023-09-08 18:20:58 -05:00
Dario Nieuwenhuis
48154e18bf
Merge pull request #1873 from vDorst/adin1110-pr3
Adin1110: documents and comment fixes
2023-09-08 18:11:47 +00:00
JuliDi
cf2d4eca7c
add wait_config_up to examples 2023-09-08 17:40:20 +02:00
JuliDi
3e0b752bef
fix poll_fn, add documentation 2023-09-08 17:26:01 +02:00
JuliDi
6070d61d8c
fix typos 2023-09-08 15:59:46 +02:00
JuliDi
a4f8d82ef5
wait_config_up first steps 2023-09-08 15:58:47 +02:00
René van Dorst
c27b0296fe Add more documentation and comment 2023-09-07 22:32:20 +02:00
René van Dorst
336ae54a56 mdio: reenable and async the tests 2023-09-07 21:25:53 +02:00
René van Dorst
d6a1118406 fix some spelling 2023-09-07 21:02:33 +02:00
Priit Laes
9de08d56a0 nrf: spim: Anomaly 109 workaround for SPIM peripheral (#460)
This implements SPIM TX workaround suggested from section 3.8.1
from Anomaly 109 addendum.

In workaround case we first keep track of original maxcnt values,
then initiate "fake" transfer with zero-length maxcnt values.
Once the "fake" transfer is triggered, we handle it, fill in the
original maxcnt values and restart the transmission.
2023-09-07 18:58:22 +03:00
xoviat
26740bb3ef
Merge pull request #1869 from xoviat/rcc-bd
add rcc bd lsi/lse abstraction
2023-09-06 23:24:24 +00:00
xoviat
4550452f43 rustfmt 2023-09-06 17:53:02 -05:00
xoviat
08410432b5 stm32: fix rcc merge 2023-09-06 17:51:40 -05:00
xoviat
3cf3caa3ab
Merge branch 'main' into rcc-bd 2023-09-06 17:49:29 -05:00
xoviat
c21ad04c2e stm32: extract lse/lsi into bd mod 2023-09-06 17:48:12 -05:00
xoviat
d097c99719 stm32/rcc: add lsi and lse bd abstraction 2023-09-06 17:33:56 -05:00
Dario Nieuwenhuis
af7c93abba
Merge pull request #1864 from oll3/feat/stm32wl-adc
ADC support for STM32WLx
2023-09-06 16:32:12 +00:00
Olle Sandberg
c356585a59 update metapac tag 2023-09-06 11:49:18 +02:00
Olle Sandberg
0d3ff34d80 adc: enable ADC and clock selection for STM32WLx 2023-09-06 06:57:30 +02:00
Olle Sandberg
bb2d6c8542 adc_v3: replace cfg(stm32g0) + friends with cfg(adc_g0)
Since any MCU (not just STM32G0) using adc_g0 should probably be handled the same way.
2023-09-06 06:57:28 +02:00
xoviat
a05afc5426
Merge pull request #1867 from xoviat/adc-g4
Adc g4
2023-09-05 23:31:03 +00:00
xoviat
50116e5b27 remove paste dependency 2023-09-05 18:20:17 -05:00
xoviat
a80acf686e
Merge pull request #1868 from MabezDev/f2-rtc-clocks
[F2] Allow the RTC clock source to be configured with the new RTC mechanism
2023-09-05 23:13:57 +00:00
Scott Mabin
6770d8e8a6 Allow the RTC clock source to be configured with the new RTC mechanism 2023-09-06 00:04:09 +01:00
xoviat
7307098780 stm32: don't generate adc5 2023-09-05 17:50:45 -05:00
xoviat
f4601af2a4 stm32: don't generate adc4 for g4 2023-09-05 17:48:20 -05:00
xoviat
fd22f4fac5 stm32: remove paste and use refcount statics 2023-09-05 17:45:52 -05:00
xoviat
7622d2eb61 stm32: fix merge issues 2023-09-05 17:10:15 -05:00
xoviat
7573160077 Merge branch 'main' of https://github.com/embassy-rs/embassy into adc-g4 2023-09-05 17:02:28 -05:00
xoviat
7e18e5e0c1 Merge branch 'stm32g4_adc' of https://github.com/daehyeok/embassy into adc-g4 2023-09-05 16:50:33 -05:00
xoviat
9d76a6e933
Merge pull request #1849 from xoviat/adc-f3
Add adc f3
2023-09-05 21:48:44 +00:00
xoviat
f502271940 stm32: add initial adc f3 impl 2023-09-05 16:46:57 -05:00
Dario Nieuwenhuis
e2f8bf19ea
Merge pull request #1865 from embassy-rs/esp-hosted-status
net-esp-hosted: add get_status()
2023-09-05 18:33:22 +00:00
Dario Nieuwenhuis
1180e1770d net-esp-hosted: add get_status() 2023-09-05 19:50:21 +02:00
Daehyeok Mun
49ba9c3da2 initial support for STM32G4 ADC 2023-09-04 23:36:41 -07:00
Dario Nieuwenhuis
ce662766be
Merge pull request #1771 from rubdos/zero-copy-channel
embassy_sync::zero_copy_channel
2023-09-04 23:38:11 +02:00
Dario Nieuwenhuis
a03b6be693
Merge pull request #1862 from xoviat/rcc-refcount
stm32: refcount peripheral enable/disable
2023-09-04 23:37:59 +02:00
Dario Nieuwenhuis
87d3086533
Merge pull request #1863 from embassy-rs/reenable-test
Revert "ci: remove failing tests"
2023-09-04 23:20:00 +02:00
xoviat
d19e1c1dd1 stm32: only refcount usart and use kind direclty 2023-09-04 16:18:31 -05:00
Dario Nieuwenhuis
8a55adbfd8 Revert "ci: remove failing tests"
This reverts commit c5732ce285.
2023-09-04 23:16:48 +02:00
xoviat
6dc56d2b35 stm32: include uart-named peripherals 2023-09-04 16:04:29 -05:00
xoviat
394503ab69 ci: run HIL 2023-09-04 15:54:23 -05:00
xoviat
bfb4cf775a remove adc refcount 2023-09-04 15:54:00 -05:00
xoviat
274f63a879 stm32: fix refcounts for usart, spi, and i2c 2023-09-04 15:47:33 -05:00
Dario Nieuwenhuis
615882ebd6 Rename zero_copy -> zerocopy. 2023-09-04 22:16:28 +02:00
Ruben De Smet
6e38b07642 Add docs to zero-copy-channel 2023-09-04 22:13:27 +02:00
Ruben De Smet
1eb03dc41a Prefer receive over recv 2023-09-04 22:13:27 +02:00
Ruben De Smet
a2656f402b Move embassy-net-driver-channel::zerocopy_channel to embassy_sync::zero_copy_channel 2023-09-04 22:13:27 +02:00
xoviat
3466c9cfa9 stm32: refcount peripheral enable/disable 2023-09-04 13:47:02 -05:00
xoviat
3295ec94e5
Merge pull request #1858 from xoviat/psc-cleanup
stm32: cleanup psc design
2023-09-03 16:49:27 +00:00
xoviat
c5732ce285 ci: remove failing tests 2023-09-03 11:48:41 -05:00
xoviat
2e6f4237f2 stm32: cleanup psc design 2023-09-03 11:40:34 -05:00
Dario Nieuwenhuis
ac11635b0b
Merge pull request #1856 from embassy-rs/teleprobe-cache
Add teleprobe cache.
2023-09-03 01:45:28 +02:00
Dario Nieuwenhuis
9dd58660c3 Add teleprobe cache. 2023-09-03 01:41:52 +02:00
Dario Nieuwenhuis
9baa3bafb0
Merge pull request #1854 from bugadani/str
embassy-{net, sync, time}: Use fmt::unwrap
2023-09-03 00:35:21 +02:00
Dániel Buga
360286e67c Fix bootloader application examples 2023-09-02 08:50:03 +02:00
Dániel Buga
0c66636d00 Use fmt::unwrap 2023-09-02 08:39:52 +02:00
Dario Nieuwenhuis
9d8c527308
Merge pull request #1831 from vDorst/adin1110-part2
embassy-net-adin1110 more improvements
2023-09-02 00:49:17 +02:00
xoviat
1d87ec9cc3
stm32/qei: fix struct naming (#1852)
Co-authored-by: xoviat <xoviat@users.noreply.github.com>
2023-09-02 00:30:27 +02:00
Dario Nieuwenhuis
b74645e259
Delete .github/bors.toml 2023-09-01 00:21:01 +02:00
xoviat
56351cedcb
Merge pull request #1844 from xoviat/rtc
stm32/rtc: autocompute prescalers
2023-08-30 23:28:00 +00:00
xoviat
0823d9dc93
Merge pull request #1845 from xoviat/qei
stm32: add qei
2023-08-30 23:16:33 +00:00
xoviat
c10fb7c1c4 stm32: implement qei 2023-08-30 18:10:26 -05:00
Dario Nieuwenhuis
a2ce3aa1a1
Merge pull request #1848 from kalkyl/rp-write-size
rp: Fix write size in embassy-boot example app
2023-08-30 21:34:34 +00:00
kalkyl
3769447382 rp: Fix write size in embassy-boot example app 2023-08-30 23:20:38 +02:00
Dario Nieuwenhuis
2c6b428ed4
Merge pull request #1847 from mvniekerk/main
RP2040: XOSC delay multiplier
2023-08-30 20:00:40 +00:00
Michael van Niekerk
83a976cf4b RP2040: Fixes as per PR 2023-08-30 21:59:41 +02:00
Michael van Niekerk
a76ff53fb3 RP2040: Fixes as per PR 2023-08-30 21:58:36 +02:00
Michael van Niekerk
f69e8459c9 RP2040: Fixes as per PR 2023-08-30 21:52:03 +02:00
Michael van Niekerk
891f1758bc RP2040: XOSC delay multiplier 2023-08-30 21:43:57 +02:00
Michael van Niekerk
ae174fd0e0 RP2040: XOSC delay multiplier 2023-08-30 21:42:27 +02:00
Dario Nieuwenhuis
5c936d33d4
Merge pull request #1846 from diondokter/stm32-timer-prevent-hardfault
Stm32 timer prevent hardfault when frequency is 0
2023-08-30 17:40:06 +00:00
Dion Dokter
36ec9bcc1d Stm32 timer prevent hardfault 2023-08-30 19:35:15 +02:00
Dario Nieuwenhuis
5adc80f6d9
Merge pull request #1838 from Frostie314159/cyw43-next
cyw43: Add utility functions.
2023-08-30 14:04:27 +00:00
Frostie314159
98f55fa54d
Reverted patch for lint fix. 2023-08-30 09:59:47 +02:00
xoviat
416ecc73d8 add qei draft 2023-08-29 20:06:53 -05:00
xoviat
27dfced285 stm32: fix rcc wb 2023-08-29 19:51:21 -05:00
xoviat
21681d8b4e rustfmt 2023-08-29 19:44:43 -05:00
xoviat
989c98f316 stm32/rtc: autocompute prescalers 2023-08-29 19:41:03 -05:00
Dario Nieuwenhuis
fdb2c4946a
Merge pull request #1843 from embassy-rs/fmt-sync
Sync all fmt.rs files.
2023-08-29 23:42:59 +00:00
Dario Nieuwenhuis
5e613d9abb Sync all fmt.rs files. 2023-08-30 01:37:18 +02:00
Dario Nieuwenhuis
40b576584e
Merge pull request #1832 from embassy-rs/pipe-bufread
sync/pipe: impl BufRead.
2023-08-29 23:12:06 +00:00
Dario Nieuwenhuis
aa7752020e
Merge pull request #1842 from embassy-rs/ppp-terminate
net-ppp: return error when PPP link gets terminated by the peer.
2023-08-29 23:09:30 +00:00
Dario Nieuwenhuis
6c165f8dc0 sync/pipe: impl BufRead. 2023-08-30 01:06:41 +02:00
Dario Nieuwenhuis
975f2f23c0 net-ppp: return error when PPP link gets terminated by the peer. 2023-08-30 01:04:43 +02:00
Frostie314159
0eeefd3dbf
cyw43: Make Scanner public. 2023-08-29 23:05:05 +02:00
Frostie314159
de01fe352b
Removed unnecessary newline. 2023-08-29 08:35:29 +02:00
Frostie314159
70662ec4ba
embassy-time: Introduced reset function for Ticker 2023-08-29 08:29:38 +02:00
xoviat
a4d78a6552
Merge pull request #1835 from oll3/fix/stm32-rng
stm32: fix wait for RNG data
2023-08-28 21:38:54 +00:00
xoviat
f503417f4c
Merge pull request #1833 from xoviat/rtc
stm32: misc rtc fixes
2023-08-28 21:18:42 +00:00
xoviat
6b8b145266 stm32: revert changes to rcc f4 2023-08-28 16:17:42 -05:00
xoviat
e07f943562 rustfmt 2023-08-28 15:52:13 -05:00
xoviat
70a5221b2e stm32/bd: consolidate enable_rtc 2023-08-28 15:34:08 -05:00
xoviat
b315c28d4e stm32/rtc: remove rtc-debug and asbtract exti wakeup 2023-08-28 15:30:29 -05:00
Frostie314159
e025693914
cyw43: Create leave function on Control struct.
Create a function, which disassociates us, from the currently connected infra.
2023-08-28 21:34:14 +02:00
Frostie314159
05ee02b593
cyw43: Introduce seperate up/down functions.
Create two helper functions, for setting the interface up/down.
2023-08-28 21:32:31 +02:00
Frostie314159
4098a61ef0
cyw43: Fix warning in event.rs.
Allow non_upper_case_globals, to prevent the compiler from spitting out a warning about the Event enum.
2023-08-28 21:02:38 +02:00
René van Dorst
1db00f5439 embassy-net-adin1110: Add basic benchmark results. 2023-08-28 20:11:56 +02:00
René van Dorst
7fc17bc150 embassy-net-adin1110 bump deps. 2023-08-28 19:29:32 +02:00
René van Dorst
6e616a6fe6 Update comment about turn around byte. 2023-08-28 19:23:15 +02:00
René van Dorst
d02886786e Show the error type 2023-08-28 19:00:00 +02:00
René van Dorst
2db4d01198
Merge branch 'embassy-rs:main' into adin1110-part2 2023-08-28 16:45:17 +00:00
Dario Nieuwenhuis
a36ee75d19
Merge pull request #1836 from jessebraham/feature/release
Release embassy-time v0.1.3
2023-08-28 15:05:11 +00:00
Jesse Braham
1f63bf4153 Release embassy-time v0.1.3 2023-08-28 08:00:18 -07:00
Olle Sandberg
fd739250ea stm32: fix wait for RNG data
If no data was available to read then the loop would wait for an interrupt and skip to the next chunk without writing the current one.
This could cause the given slice to only be partially filled with random data.

Fixed by moving the wait to before actually writing data to the chunk.
2023-08-28 11:44:05 +02:00
Dave Andersen
71c4e7e4d2 Fix timing on RP2040 pio_ws2812.rs example
The example spins too fast so it doesn't appear to change;
it's delaying for microseconds instead of milliseconds.
This commit slows it down and adds a comment noting the pin
mapping for the Adafruit feather rp2040+RFM95 LoRA module,
which has its Neopixel on pin 4 instead of 16.
2023-08-27 22:39:44 -04:00
xoviat
2c80784fe6 stm32/rtc: feature-gate instant 2023-08-27 21:26:29 -05:00
xoviat
538001a4bc stm32/rtc: fix psc div 2023-08-27 21:24:16 -05:00
xoviat
e981cd4968 stm32: fix rtc wakeup timing and add dbg 2023-08-27 21:15:57 -05:00
René van Dorst
91bb3aae3f stm32l4: bump embassy-net-adin1110 to v0.2.0 2023-08-28 00:32:05 +02:00
René van Dorst
e08dbcd027 embassy-net-adin1110: bump version v0.2.0 2023-08-28 00:32:05 +02:00
René van Dorst
5c27265a21 Add fmt.rs to improve log/debug and embbed and PC
Also add `defmt` to the features list.
2023-08-28 00:31:51 +02:00
René van Dorst
2c36199dea stm32l4: Update adin1110 example add FCS option 2023-08-28 00:28:45 +02:00
René van Dorst
13a0be6289 Validate FCS in fifo_read() and refactor tests.
Adding TestHarnass to declutter the tests.
Also added a test for FCS and SPI_CRC.
2023-08-28 00:28:40 +02:00
xoviat
9f928010a8 stm32/rtc: use psc to compute instants 2023-08-27 16:06:33 -05:00
xoviat
88146eb53e
Merge pull request #1830 from xoviat/rtc
stm32: move backup domain in rcc mod
2023-08-27 20:26:41 +00:00
xoviat
326e78757b rustfmt 2023-08-27 15:25:12 -05:00
xoviat
f77a7fe4bf Merge branch 'main' of https://github.com/aidant/embassy into rtc 2023-08-27 15:23:25 -05:00
xoviat
cbc92dce05 stm32/bd: fix errors 2023-08-27 15:18:34 -05:00
xoviat
531f51d0eb rcc/bd: consolidate mod 2023-08-27 15:01:09 -05:00
xoviat
f28ab18d7b stm32: fix l4 re-export 2023-08-27 09:50:02 -05:00
xoviat
3bf6081eb5 stm32: fix wl re-export 2023-08-27 09:41:31 -05:00
xoviat
fb942e6675 stm32: re-export rtcclocksource 2023-08-27 09:25:14 -05:00
xoviat
10ea068027 stm32/bd: allow dead code 2023-08-27 09:12:04 -05:00
xoviat
4caa8497fc stm32: extract backupdomain into mod 2023-08-27 09:07:34 -05:00
xoviat
48085939e7 stm32/rcc: rename common to bus 2023-08-27 08:35:13 -05:00
René van Dorst
7f7256050c Don't let the MAC add FCS when it is done by app
The application can append FSC to outgoing packets and the MAC can detect
and report when a bitflip has occurred.

But the MAC can also add FSC if we want, but we can´t do both.
When adding FSC by the application and MAC results in the packet drop by
the MAC when the TX packet size > (MTU - 4).
Having the application append the FSC is preferred.

So set the right config bits.
2023-08-27 10:37:45 +02:00
René van Dorst
4b6538c8a8 Fix read_fifo() better readout and more checks
read_fifo() used part of the frame buffer to readout non-frame data.
This results in incorrect readout of the fifo buffer but also the full
MTU could not be used.

Also added some more tests to check this and that the readout is a
multipule of 4 bytes.
2023-08-27 10:37:45 +02:00
aidant
db6f9afa2e fix hanging on rtc example 2023-08-27 18:37:10 +10:00
aidant
59a5e84df5 fix day of the week conversion 2023-08-27 18:36:35 +10:00
xoviat
13f0501673
Merge pull request #1822 from xoviat/rtc-lp
stm32: get stop mode working
2023-08-27 01:47:46 +00:00
xoviat
94de1a5353 stm32: feature-gate wakeup alarm 2023-08-26 20:40:21 -05:00
xoviat
db71887817 tests/stm32: add stop and cleanpu 2023-08-26 20:37:01 -05:00
xoviat
1e430f7413 stm32: complete stop impl. 2023-08-26 20:31:12 -05:00
xoviat
2897670f24 stm32: get the basic lp working 2023-08-26 19:23:25 -05:00
Dario Nieuwenhuis
ca738d6c99
Merge pull request #1826 from bugadani/warn
Avoid dead code warning
2023-08-26 11:05:03 +00:00
Dániel Buga
d33246b072 Add new feature/arch combinations to executor CI check 2023-08-26 12:54:23 +02:00
Dániel Buga
54e2e17520 Avoid dead code warning 2023-08-26 12:53:39 +02:00
xoviat
3023e70ccf stm32: clenaup lp executor 2023-08-25 18:41:51 -05:00
Dániel Buga
f8299d10f7
Prepare executor and macros for release (#1825)
* Set release date, bump macros version

* Add pool_size change to changelog
2023-08-25 23:32:00 +02:00
Dario Nieuwenhuis
8339423a2f
Merge pull request #1821 from embassy-rs/net-ppp
Add embassy-net-ppp driver.
2023-08-25 18:50:10 +00:00
Dario Nieuwenhuis
295542f4d3
Merge pull request #1792 from vDorst/adin1110-pr
Added support and example for Analog ADIN1110 SPE SPI ethernet chip.
2023-08-25 18:47:32 +00:00
Dario Nieuwenhuis
d812cc5745 net-ppp: add std example. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
623f37a273 net-ppp: add callback for IP configuration. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
a026db3f57 net-ppp: use From and ? to handle write errors. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
c2d601abef net-ppp: take serial port and config in run(), allow calling it multiple times. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
2303382dfd net-ppp: nicer processing loop structure that can't deadlock. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
aacf14b62a net-ppp: Add it. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
100200d021 net-driver-channel: do not hardcode medium to ethernet. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
b5748524f8 net: improve error message on unsupported medium. 2023-08-25 20:45:23 +02:00
Dario Nieuwenhuis
6d3377e6a6
Merge pull request #1824 from embassy-rs/net-change-config
net: allow changing IP config at runtime.
2023-08-25 18:35:14 +00:00
Dario Nieuwenhuis
cc8961034e net: allow changing IP config at runtime. 2023-08-25 20:26:46 +02:00
xoviat
cda4047310 stm32: flesh out lp executor 2023-08-24 19:29:11 -05:00
Tyler
f033089625
Merge pull request #3 from embassy-rs/main
Update to embassy head
2023-08-24 17:38:04 -06:00
xoviat
2a6b743b9e
Merge pull request #1814 from xoviat/rtc-lp
stm32: add low-power mod
2023-08-24 01:30:17 +00:00
xoviat
ecc305bbfe stm32: fix executor version 2023-08-23 20:28:41 -05:00
xoviat
9c94eac919 Merge branch 'main' of https://github.com/embassy-rs/embassy into rtc-lp 2023-08-23 20:27:23 -05:00
xoviat
00aadf6085 stm32/lp: pipe through lp ready 2023-08-23 20:22:11 -05:00
xoviat
83f224e140 stm32/lp: add refcount 2023-08-23 20:18:34 -05:00
xoviat
e987259716 rtc: cleanup 2023-08-23 20:01:35 -05:00
xoviat
fc04d2a33c rtc: get wakup irq working 2023-08-23 19:52:32 -05:00
René van Dorst
1d4d11ba25 refactor write_fifo(), don´t copy frame data
Now this function uses frame data directly in the SPI transaction
instead making a copy of it.
Also fixing some length calculations and refactor/add tests to test this
function.
2023-08-24 00:52:21 +02:00
René van Dorst
5f5e3bcd18 Replace size_align_u32() with next_multiple_of()
Currently next_multiple_of() is behinged a Feature gate: int_rounding.
See https://github.com/rust-lang/rust/issues/88581
But it seems that this function is stablized in rust 1.73.
See https://github.com/rust-lang/rust/pull/94455

Currently Embassy is still using nightly for many other unstable
features. So I do see an issue to use this function.
2023-08-24 00:52:21 +02:00
René van Dorst
4b6045d446 Remove the SPI::Error as a generic parameter. 2023-08-24 00:52:21 +02:00
René van Dorst
ca588f901f add embassy-net-adin1110 to .github/ci/doc.sh 2023-08-24 00:52:21 +02:00
René van Dorst
681165e84c add embassy-net-adin1110 to .github/ci/test.sh 2023-08-24 00:52:21 +02:00
René van Dorst
0a7c061ddc rustfmt 2023-08-24 00:52:21 +02:00
René van Dorst
1ded213ae9 remove the type_alias_impl_trait feature 2023-08-24 00:52:21 +02:00
René van Dorst
0e9524de62 more clippy fixes 2023-08-24 00:52:21 +02:00
René van Dorst
e082cd0cda Remove unneeded files. 2023-08-24 00:52:21 +02:00
René van Dorst
10bf33dcac Fix linting.
I like program with deny(clippy::pedantic) but it was set as allowed, so
I did get less linting errors/hints. Now it is corrected and also fix
the lint errors and hints.

Also fixes some comment and demagic some values.

Rename `FEC` to more appropriate name `FSC`.
2023-08-24 00:52:21 +02:00
René van Dorst
46ddf7013a update README.md after review 2023-08-24 00:52:21 +02:00
René van Dorst
577d644e22 fix warning 2023-08-24 00:52:21 +02:00
René van Dorst
2cf6a59114 stm32l4: Add EVAL-ADIN1110EBZ example with basic http server
Page show the current temperature and auto refresh every 1s.
2023-08-24 00:52:06 +02:00
René van Dorst
e19f7d9a76 Add embassy-net-adin1110
This add a library for Analog ADIN1110 SPE SPI chip.
This library is inspired by `embassy-net-w5500`.
2023-08-24 00:43:51 +02:00
Ulf Lilleengen
bed1f07c15
Merge pull request #1817 from bugadani/executor-release
Bump executor crate version to 0.3.0
2023-08-23 19:05:50 +00:00
Dániel Buga
a2c718f61c Bump executor crate version to 0.3.0 2023-08-23 20:34:37 +02:00
Dario Nieuwenhuis
0568738f77
Merge pull request #1815 from embassy-rs/esp-hosted-oopsie
net-esp-hosted: fix oopsie
2023-08-23 09:42:32 +00:00
Dario Nieuwenhuis
a6d22e199a net-esp-hosted: fix set link down on disconnect. 2023-08-23 11:37:50 +02:00
xoviat
1ea4c58c39 stm32: impl. draft cfgr pwr 2023-08-22 20:00:00 -05:00
xoviat
faab2d0d53 stm32: add executor to low-power mod 2023-08-22 17:31:40 -05:00
xoviat
6d35bcc3d9 stm32: add low-power mod 2023-08-22 17:00:00 -05:00
xoviat
7d6edd7b15 Merge branch 'main' of https://github.com/embassy-rs/embassy into rtc-lp 2023-08-22 16:58:43 -05:00
xoviat
9e3266b745 rtc: make fns private 2023-08-22 16:58:19 -05:00
xoviat
7bff2ebab3
Merge pull request #1766 from xoviat/rtc-w
stm32/rtc: add start/stop wakeup
2023-08-22 21:50:53 +00:00
xoviat
048bdf6968 stm32/rtc: allow dead code 2023-08-22 16:48:08 -05:00
Dario Nieuwenhuis
b3212ae383
Merge pull request #1763 from rubdos/sender-receiver-with-ctx
Refactor Channel/Sender/Receiver poll methods
2023-08-22 21:25:29 +00:00
Dario Nieuwenhuis
b436aad2a0
Merge pull request #1810 from soypat/write_wlan-fix
rp::wlan_write: avoid ineffectual writing of entire buffer over spi
2023-08-22 21:20:59 +00:00
Dario Nieuwenhuis
31c5bdfa29
Merge pull request #1812 from bugadani/storage
Make `AvailableTask` public
2023-08-22 21:14:29 +00:00
Dario Nieuwenhuis
906ab06a6e
Merge pull request #1813 from diondokter/stm32-brr-u32
Modified the STM Uart baud calculation to be fully 32-bit
2023-08-22 19:56:04 +00:00
Dion Dokter
a5484cd119 Modified the brr calculation to be fully 32-bit 2023-08-22 20:52:02 +02:00
Ruben De Smet
c39671266e
Deprecate *recv* in favor of *receive* 2023-08-22 16:58:31 +02:00
xoviat
8878ce046c rtc: fix rtcinstant delay computation 2023-08-21 18:33:10 -05:00
xoviat
5bfddfc9b6 stm32/rcc: add rtc to f410 2023-08-21 18:10:10 -05:00
xoviat
7148397771 stm32/rtc: misc fixes 2023-08-21 18:00:49 -05:00
xoviat
8c12453544 stm32/rcc: set rtc clock on f4 2023-08-21 17:50:18 -05:00
xoviat
f723982bec rtc: impl. draft rtcinstant api 2023-08-21 17:44:38 -05:00
Dániel Buga
0a73c84df0 Make AvailableTask public, deduplicate 2023-08-21 18:12:41 +02:00
soypat
977ae5e3e4 don't pay for what you don't use 2023-08-20 20:16:23 -03:00
Dario Nieuwenhuis
2687008242
Merge pull request #1805 from embassy-rs/update-nightly-6
Update Nightly.
2023-08-20 09:05:14 +00:00
Dario Nieuwenhuis
6ef888d73e
Merge pull request #1807 from romixlab/main
Fix hardcoded buffer length in USB NCM causing broken link on USB 2.0.
2023-08-20 09:05:07 +00:00
Dario Nieuwenhuis
67ca88d5a0 stm32/can: make latency assertion more lenient. 2023-08-20 10:57:28 +02:00
Isaikin Roman
17e9a8ebe1 Fix hardcoded buffer length in USB NCM causing broken link on USB 2.0. 2023-08-20 07:42:54 +02:00
Dario Nieuwenhuis
0032f8a2ec rustfmt. 2023-08-19 19:45:55 +02:00
Dario Nieuwenhuis
2d980068c0 Update Nightly. 2023-08-19 19:31:49 +02:00
Dario Nieuwenhuis
6babd5752e
Merge pull request #1804 from embassy-rs/fix-f37x
stm32: fix f37x build.
2023-08-18 23:21:39 +00:00
Dario Nieuwenhuis
5d4da78c94 Fix lora docs build. 2023-08-19 01:15:32 +02:00
Dario Nieuwenhuis
cc400aa178 stm32: fix f37x build.
originally broke in https://github.com/embassy-rs/embassy/pull/1762
2023-08-19 01:15:32 +02:00
Dario Nieuwenhuis
7b3cb2ce04
Merge pull request #1802 from avlec/error-translation
Add error translation to tcp errors
2023-08-18 21:58:27 +00:00
Dario Nieuwenhuis
afd8be416e
Merge pull request #1803 from randomplum/flash_h7ab
configure flash latency after axi clock and  handle different flash on STM32H7A/B devices
2023-08-18 21:53:21 +00:00
Dominik Sliwa
5bc0175be9 configure flash latency after axi clock and handle different flash in STM32H7A/B devices 2023-08-18 23:44:56 +02:00
Alec Cox
eb05a18c45 add error translation to tcp errors
Translation of tpc client ConnectError and Error to the appropriate
embedded_io_async errors
2023-08-18 14:43:44 -07:00
Dario Nieuwenhuis
97da34595c
Merge pull request #1798 from aurelj/stm32_pwm_polarity
stm32: allow setting the PWM output polarity
2023-08-18 14:51:48 +00:00
Aurelien Jacobs
2ea17d2783 stm32: allow setting the PWM output polarity 2023-08-18 16:45:50 +02:00
Dario Nieuwenhuis
8754a1d378
Merge pull request #1779 from MabezDev/forward-capacity-impls
Forward capacity impls
2023-08-18 14:21:48 +00:00
Dario Nieuwenhuis
d327b626e3
Merge pull request #1788 from embassy-rs/esp-hosted-cleanup
net-esp-hosted: misc improvements.
2023-08-18 14:21:10 +00:00
Dario Nieuwenhuis
f48d13a16a
Merge pull request #1796 from embassy-rs/enc28j60-fixes
enc28j60: add HIL test, workaround RX buffer corruption.
2023-08-18 14:20:44 +00:00
Dario Nieuwenhuis
4c11fffc90
Merge pull request #1797 from aurelj/stm32_pwm_max_duty
stm32: allow setting PWM duty cycle to 100%
2023-08-18 14:20:32 +00:00
Dario Nieuwenhuis
7f97efd922 net-enc28j60: add HIL test. 2023-08-18 16:11:18 +02:00
Aurélien Jacobs
78bb261246 stm32: allow setting PWM duty cycle to 100%
Setting the compare_value to max_compare_value make the PWM output
go low when the timer reach the max_compare_value and go high again
on the next timer clock, when the value roll back to 0.
So to allow a 100% PWM that never goes low, the compare_value must
be set to max_compare_value + 1.
2023-08-18 16:10:49 +02:00
Dario Nieuwenhuis
73942f50cb net-enc28j60: reset rx logic when buffer corrupts. 2023-08-18 15:51:48 +02:00
Dario Nieuwenhuis
3ebb93e47d net-enc28j60: remove useless 1ms sleep. 2023-08-18 15:44:52 +02:00
Dario Nieuwenhuis
5329f234ba
Merge pull request #1795 from kext/msos-multisz-terminator
embassy-usb: Fixed the final null terminator for RegMultiSz.
2023-08-18 11:28:06 +00:00
Dario Nieuwenhuis
2cc82ef660
Merge pull request #1794 from embassy-rs/rp-flash-naming
rp/flash: change naming to `blocking_*`, `new_blocking`.
2023-08-18 11:24:27 +00:00
Dario Nieuwenhuis
b948e37769 rp/flash: change naming to blocking_*, new_blocking.
- Needed for consistency with other drivers.
- Having two `new()` functions sometimes resulted in 'multiple applicable methods' errors.
2023-08-18 13:21:21 +02:00
Lukas Joeressen
91b10dd799 Fixed the final null terminator for RegMultiSz.
The RegMultiSz value should be terminated by an empty UTF-16 string, i.e. 2 null bytes.
2023-08-18 13:09:27 +02:00
Dario Nieuwenhuis
94fa95c699
Merge pull request #1793 from ARizzo35/stm32l4-rtc-pwren
stm32l4: set pwren in rcc regardless of clock source
2023-08-18 10:19:54 +00:00
Adam Rizkalla
62e66cdda3 stm32l4: set pwren in rcc regardless of clock source 2023-08-17 19:16:03 -05:00
Dario Nieuwenhuis
1cb76e0d99 net-esp-hosted: enable heartbeats from esp32 to detect if it crashes. 2023-08-17 01:03:12 +02:00
Dario Nieuwenhuis
ef7523e5b7 net-esp-hosted: put link down on wifi disconnect. 2023-08-17 01:03:12 +02:00
Dario Nieuwenhuis
065b0f34af net-esp-hosted: sane error handling in control requests. 2023-08-17 01:03:12 +02:00
Dario Nieuwenhuis
2a4ebdc150
Merge pull request #1787 from embassy-rs/nrf-internal-defmt
nrf: enable defmt for embassy-hal-internal.
2023-08-16 21:42:55 +00:00
Dario Nieuwenhuis
bb275f7e25 nrf: enable defmt for embassy-hal-internal. 2023-08-16 23:37:40 +02:00
Dario Nieuwenhuis
4f453d7ed6
Merge pull request #1786 from embassy-rs/net-w5100s-hil
net-wiznet: add HIL test using w5100s.
2023-08-16 15:57:10 +00:00
Dario Nieuwenhuis
8a9f49c163 net-wiznet: add HIL test using w5100s. 2023-08-16 17:51:47 +02:00
Dario Nieuwenhuis
19b1e32c2c
Merge pull request #1785 from oll3/fix/set-rtc-clock-source
stm32-wl: set RTC clock source on RCC init
2023-08-16 15:02:24 +00:00
Olle Sandberg
c80c323634 stm32-wl: set RTC clock source on RCC init 2023-08-16 14:41:00 +02:00
Dario Nieuwenhuis
dd5a886830
Merge pull request #1784 from sgoll/check-rcc-before-apply
stm32f2: Check RCC settings before applying
2023-08-16 12:17:38 +00:00
Sebastian Goll
df6952648e Make sure to check RCC settings for compatibility before applying 2023-08-16 14:11:09 +02:00
Dario Nieuwenhuis
f26dd54f63
Update embedded-hal to 1.0.0-rc.1 (#1783) 2023-08-16 00:40:56 +02:00
Dario Nieuwenhuis
ffe9688952
Merge pull request #1525 from embassy-rs/w5100s
wip: w5100s
2023-08-15 21:15:52 +00:00
Dario Nieuwenhuis
11b66a73b4 net-wiznet: rename from embassy-net-w5500. 2023-08-15 23:05:55 +02:00
Dario Nieuwenhuis
1d4b941d52 net-w5500: add w5100s support. 2023-08-15 22:53:22 +02:00
Dario Nieuwenhuis
76276c326a net-w5500: extract chip-specific stuff to a trait. 2023-08-15 22:52:37 +02:00
Dario Nieuwenhuis
a436bd068f net-w5500: inline socket into device. 2023-08-15 22:52:37 +02:00
Dario Nieuwenhuis
c367b84ee5 net-w5500: add Address type. 2023-08-15 22:52:37 +02:00
Dario Nieuwenhuis
46f671ae42 rp: fix async spi read sometimes hanging. 2023-08-15 22:47:58 +02:00
Dario Nieuwenhuis
96e0ace89e
Merge pull request #1781 from bugadani/typo
Fix typo
2023-08-15 17:24:28 +00:00
Dániel Buga
8655ba110c Fix typo 2023-08-15 19:13:36 +02:00
Dario Nieuwenhuis
7d24e433d8
Merge pull request #1780 from embassy-rs/w5500-simplify
net-w5500: simplify rx logic.
2023-08-15 15:32:29 +00:00
Dario Nieuwenhuis
098fcb14b5 net-w5500: simplify rx logic. 2023-08-15 16:47:45 +02:00
Scott Mabin
c114ea024a Add udp capacity impls 2023-08-15 15:31:23 +01:00
Scott Mabin
b1ef009c6b Add tcp capacity impls 2023-08-15 15:31:23 +01:00
Dario Nieuwenhuis
b6b4448045 ci/docs: build embassy-net-enc28j60. 2023-08-15 15:13:03 +02:00
Dario Nieuwenhuis
cb3644856d
Merge pull request #1777 from MabezDev/embassy-net/async-send-recv
embassy-net:tcp:write_with/read_with
2023-08-15 13:08:05 +00:00
Dario Nieuwenhuis
03576b9e83
Merge pull request #1746 from embassy-rs/enc28j60-v2
wip: enc28j60 driver.
2023-08-15 12:34:19 +00:00
Dario Nieuwenhuis
ea9f887ee1 net-enc28j60: add docs, readme. 2023-08-15 14:27:31 +02:00
Dario Nieuwenhuis
f7f75167ac cleanup vscode settings. 2023-08-15 14:15:29 +02:00
Dario Nieuwenhuis
253b28deba net-enc28j60: fix PHY read unreliable due to missing dummy byte. 2023-08-15 14:09:36 +02:00
Dario Nieuwenhuis
4af1cf88d2 net-enc28j60: add example. 2023-08-15 14:09:36 +02:00
Dario Nieuwenhuis
2c1402843a wip: enc28j60 driver. 2023-08-15 14:09:36 +02:00
Dario Nieuwenhuis
0fd9d7400b Build stm32 docs last. 2023-08-15 00:19:17 +02:00
Dario Nieuwenhuis
bd58b5002a
Merge pull request #1774 from bugadani/executor
Allow custom executors without indirection
2023-08-14 20:43:51 +00:00
Dániel Buga
890f29ccfe Update docs 2023-08-14 17:57:01 +02:00
Dániel Buga
e4f3979ec8 Don't check context if only thread-mode is enabled 2023-08-14 16:46:02 +02:00
Dániel Buga
07c3600127 Hide Pender 2023-08-14 16:35:48 +02:00
Dániel Buga
da4f15d944 Fix fn name 2023-08-14 16:34:10 +02:00
Scott Mabin
fbec797d64 embassy-net:tcp:send/recv
- Add async versions of smoltcp's `send` and `recv` closure based API.
2023-08-14 15:33:02 +01:00
Dániel Buga
9954346143 Remove interrupt executor, remove PenderContext 2023-08-14 16:04:11 +02:00
Dániel Buga
3a51e2d9ca Make PenderContext actually pointer-size 2023-08-14 15:45:43 +02:00
Dániel Buga
986a63ebb8 Remove the non-specific thread-mode executor 2023-08-14 15:41:53 +02:00
Dániel Buga
4c4b12c307 Make PenderContext opaque 2023-08-14 15:16:40 +02:00
Dániel Buga
f6007869bf Remove the Pender enum 2023-08-14 09:00:08 +02:00
Dániel Buga
454a7cbf4c Remove pender-callback 2023-08-14 08:32:26 +02:00
Dániel Buga
ec6bd27df6 Remove thread-context feature 2023-08-14 08:22:22 +02:00
Dániel Buga
6ab0d71d92 Tweak identifiers and comments 2023-08-12 22:42:50 +02:00
Dániel Buga
d5e66f6f87 Lift thread-context feature restrictions 2023-08-12 22:20:11 +02:00
Dániel Buga
bce250bbdc Remove unnecessary !Send markers 2023-08-12 22:17:03 +02:00
Dániel Buga
fbf50cdae8 Remove Pender wrapper 2023-08-12 22:13:08 +02:00
Dániel Buga
675b7fb605 POC: allow custom executors 2023-08-12 18:29:56 +02:00
Ulf Lilleengen
0727f8690c
Merge pull request #1773 from embassy-rs/boot-improvs
boot: release flash after prepare and refactor api
2023-08-11 19:49:33 +00:00
Ulf Lilleengen
55ff397c0c boot: release flash after prepare and refactor api
This refactoring of the chip specific bootloader creates the internal boot instance and aligned
buffer in the prepare stage, so that they are automatically dropped after. This unlocks a use
case where peripherals owning the flash need to be Drop'ed before load() happens.
2023-08-11 20:58:31 +02:00
Ruben De Smet
b1ec460b9a
Implement Channel::poll_receive(..) -> Poll<T> 2023-08-11 13:22:56 +02:00
Ruben De Smet
f9d251cd5c
Channel poll methods return Poll instead of bool 2023-08-11 12:13:46 +02:00
Ruben De Smet
b658f10db9
Expose poll_ready_to_{send,receive} in Sender/Receiver 2023-08-11 12:13:42 +02:00
xoviat
3a3f3b492f rustfmt 2023-08-10 19:14:55 -05:00
xoviat
b69861013a stm32/rtc: implement stop_wakeup_alarm 2023-08-10 19:13:48 -05:00
xoviat
a0c69ffe02 stm32/rtc: autocompute wakeup psc. 2023-08-10 18:59:18 -05:00
Dario Nieuwenhuis
c1da2c0219
Merge pull request #1769 from embassy-rs/spim-disable-irq-on-drop
fix: ensure spi irq is disabled when dropped
2023-08-10 21:46:06 +00:00
Dario Nieuwenhuis
611e82711a
Merge pull request #1770 from bugadani/exec
Executor: prepare 0.2.1 release
2023-08-10 21:26:09 +00:00
Dániel Buga
baef856206 Bump version 2023-08-10 23:20:31 +02:00
Dániel Buga
858d520882 Executor: Add changelog 2023-08-10 23:15:02 +02:00
Ulf Lilleengen
7d8e3951ba fix: ensure spi irq is disabled when dropped 2023-08-10 22:26:56 +02:00
Dario Nieuwenhuis
3b43b00867
Merge pull request #1762 from dreilly1982/adc-f3-build-rs-updates
don't generate adc peripheral for f3 series
2023-08-10 15:45:21 +00:00
Dario Nieuwenhuis
95262ad559
Merge pull request #1743 from xoviat/dma-2
stm32/dma: consolidate ringbuf
2023-08-10 15:21:31 +00:00
Dario Nieuwenhuis
43e2edfbda
Merge pull request #1748 from lorislibralato/main
Avoid calling pend() when waking expired timers
2023-08-10 15:10:10 +00:00
Dario Nieuwenhuis
fb49e03eda
Merge pull request #1768 from smartelfi/main
fix rng ced toggling sequence on reset.
2023-08-10 15:09:31 +00:00
Don Reilly
c312884692 added exclusion for adc v4 as well 2023-08-10 08:21:03 -05:00
Lucas Granberg
bc156afbb2 fix rng ced toggling sequence on reset. 2023-08-10 16:16:45 +03:00
Don Reilly
8a9622ec2e update metapac tag 2023-08-10 08:03:35 -05:00
xoviat
0705152105 stm32/rtc: add start/stop wakeup 2023-08-09 20:15:14 -05:00
Dario Nieuwenhuis
8d71fbd032
Merge pull request #1765 from embassy-rs/fmt-not-pub
fmt mod must not be public.
2023-08-09 17:06:28 +00:00
Dario Nieuwenhuis
820852be28 fmt mod must not be public. 2023-08-09 18:33:20 +02:00
xoviat
fcb77f3f96
Merge pull request #1753 from xoviat/rtc-wb
stm32/rtc: enable in rcc mod
2023-08-09 01:48:11 +00:00
xoviat
32fdd4c787 tests/stm32: fix rtc test 2023-08-08 20:33:24 -05:00
xoviat
6a73ab1afa stm32/l4: set rtc clock source in rcc 2023-08-08 19:58:03 -05:00
xoviat
6fc5c608f8 stm32/rtc: remove generics and segregate clock sel 2023-08-08 19:47:01 -05:00
Dario Nieuwenhuis
b7114fb951
Merge pull request #1761 from sgoll/fuse-ticker
Mark `Ticker` stream as fused
2023-08-08 23:14:24 +00:00
xoviat
d375c46590
Merge pull request #1751 from oro-os/add-pin-drop-docs
stm32: add note about Output/OutputOpenDrain drop behavior
2023-08-08 23:05:12 +00:00
Sebastian Goll
c40b944da6 Mark Ticker stream as FusedStream 2023-08-09 00:17:02 +02:00
Don Reilly
e31545860e don't generate adc peripheral for f3 series 2023-08-08 16:46:30 -05:00
Dario Nieuwenhuis
47b8e04b1c
Merge pull request #1760 from sinewave-ee/master
embassy-sync: manual Copy impls for channel and pipe
2023-08-08 09:41:03 +00:00
Sam Lakerveld
2ab9a07b64
embassy-sync: manual Copy impls for channel and pipe 2023-08-08 11:22:01 +02:00
Dario Nieuwenhuis
5d5cd23715
Update to embedded-io 0.5 (#1752) 2023-08-07 13:43:09 +02:00
Dario Nieuwenhuis
77844e2055
Merge pull request #1755 from GrantM11235/clippy-fixes
embassy-stm32: Misc clippy fixes
2023-08-06 23:38:32 +00:00
Dario Nieuwenhuis
28eb3b95b0
Merge pull request #1756 from dhylands/fix-usb-logger
Make usb-logger read and discard input data
2023-08-06 23:35:53 +00:00
Dave Hylands
8b837fae07 Make usb-logger read and discard input data
This allows normal linux terminal emulators, like screen or picocom
to be used with the usb_logger. Without this, calling `tcsetattr` with
`TCSAFLUSH` will hang.
2023-08-06 13:08:08 -07:00
Grant Miller
d49f40dd5c embassy-stm32: Misc clippy fixes 2023-08-06 15:00:39 -05:00
Ulf Lilleengen
477a90b8e3
Merge pull request #1739 from embassy-rs/refactor-fw-updater
Refactor firmware updater
2023-08-06 18:06:18 +00:00
Ulf Lilleengen
a34331ae5f Refactor firmware updater
* Allow manipulating state without accessing DFU partition.
* Provide aligned buffer when creating updater to reduce potential wrong parameters passed.
2023-08-06 19:46:53 +02:00
xoviat
b555af1c5d stm32/rtc: fix exampel 2023-08-06 12:12:18 -05:00
xoviat
ae608cf2fa stm32: fix rtc and examples 2023-08-06 12:06:29 -05:00
xoviat
28618d12a1 stm32/rtc: restructure 2023-08-06 11:58:28 -05:00
xoviat
66c1712118 stm32/rtc: enable in rcc mod 2023-08-06 11:11:53 -05:00
Josh Junon
7b3d7a3826 stm32: add note about Output/OutputOpenDrain drop behavior 2023-08-06 05:58:38 +02:00
loris libralato
d7031fbe92
Merge branch 'embassy-rs:main' into main 2023-08-05 21:05:53 +02:00
loris
02fcb07aa9 Merge branch 'main' of github.com:lorislibralato/embassy 2023-08-05 21:05:10 +02:00
loris
66faba2df7 add wake_task_no_pend for expired timer enqueue inside run_queue 2023-08-05 21:04:51 +02:00
xoviat
766b5fc6f6
Merge pull request #1747 from xoviat/fix-spi
stm32: update metapac version
2023-08-05 00:17:05 +00:00
xoviat
a2fd7108ff stm32: update metapac version 2023-08-04 19:08:53 -05:00
Dario Nieuwenhuis
630372b183
Merge pull request #1745 from pennae/rp-dormant-sleep
rp: add generic dormant-sleep functionality
2023-08-04 22:59:03 +00:00
pennae
3c5f011245 rp: add generic dormant-sleep functionality
this is "generic" in that it doesn't require the user to set up anything
specific to go to dormant sleep, unlike the C sdk which requires clock
sources to be configured explicitly and doesn't much care about PLLs. we
will instead take a snapshot of the current clock configuration, switch
to a known clock source (very slow rosc, in this case), go to sleep, and
on wakeup undo everything we've done (ensuring stability of PLLs and
such).

tested locally, but adding tests to HIL seems infeasible. we'd need at
least another pico or extensive modifications to teleprobe since
dormant-sleep breaks SWD (except to rescue-dp), neither of which is
feasible at this point. if we *did* want to add tests we should check
for both rtc wakeups (with an external rtc clock source) and gpio wakeups.
2023-08-05 00:57:29 +02:00
xoviat
e80db42061 stm32/dma: minor cleanup, optmization 2023-08-04 17:15:56 -05:00
xoviat
7e269f6f17 stm32/dma: consolidate ringbuf 2023-08-03 21:12:34 -05:00
Dario Nieuwenhuis
30358c435e
Merge pull request #1741 from pennae/rp-adc-test
rp: fix adc test flakiness
2023-08-03 21:39:04 +00:00
pennae
55e07712e5 rp: fix adc test flakiness
GP29 is connected to the cyw43 SCK pin. cyw43 is selected by
default (due to rp2040 pins being input/pulldown by default), so the
wifi chip is always selected and watches the SCK pin. this little bit of
load on the SCK pin is enough to disturb the 300k voltage divider used
for VSYS sensing, making the test flaky.
2023-08-03 23:38:23 +02:00
xoviat
293edc5772
Merge pull request #1740 from adamgreig/stm32f334-examples
Fix package name for stm32f334-examples
2023-08-03 21:05:28 +00:00
Adam Greig
dc5acc687f
Fix package name for stm32f334-examples 2023-08-03 21:57:29 +01:00
Dario Nieuwenhuis
a40daa923b
Merge pull request #1715 from pennae/rp-dormant-input
rp: add dormant-wake functionality for Input
2023-08-03 17:30:07 +00:00
pennae
9dfda46e0c rp: add dormant-wake functionality for Input
this temporarily takes ownership of pins because we need to clear edge
interrupts before waiting for them (otherwise we may wait indefinitely),
we want to clean up the dormant-wake bits after a wakeup, and doing
anything *else* with the input while we're waiting for a wakeup isn't
possible at all. doing it like this lets us not impose any cost on those
who don't use dormant wakes without entangling dormant waits too badly
with regular interrupt waits.
2023-08-03 19:22:47 +02:00
Dario Nieuwenhuis
4d60c715e6
net: move tuntap from std example to separate crate. (#1737) 2023-08-03 14:23:11 +02:00
Dario Nieuwenhuis
2c96fe917d
Merge pull request #1675 from pennae/rp-adc
rp: add dma-from-adc
2023-08-03 11:25:51 +00:00
xoviat
b42a7ebd8c
Merge pull request #1733 from jannic/fix-link
Fix link to embassy-time in embassy-net/README.md
2023-08-02 21:21:36 +00:00
Ulf Lilleengen
9b1bdc3099
Merge pull request #1734 from embassy-rs/generic-nrf-watchdog-flash
feat: make nrf bootloader watchdog generic for any flash
2023-08-02 21:06:14 +00:00
Ulf Lilleengen
bcaef1de18 feat: make nrf bootloader watchdog generic for any flash 2023-08-02 22:57:42 +02:00
Jan Niehusmann
33778d3772 Fix link to embassy-time in embassy-net/README.md 2023-08-02 20:13:48 +00:00
pennae
a6b8f3d994 rp: add single-channel dma from adc
with uniform treatment of adc inputs it's easy enough to add a new
sampling method. dma sampling only supports one channel at the moment,
though round-robin sampling would be a simple extension (probably a new
trait that's implemented for Channel and &[Channel]). continuous dma as
proposed in #1608 also isn't done here, we'd expect that to be a
compound dma::Channel that internally splits a buffer in half and
dispatches callbacks or something like that.
2023-08-02 17:04:32 +02:00
pennae
b166ed6b78 rp: generalize adc inputs from pins to channels
this lets us treat pins and the temperature sensor uniformly using the
same interface. uniformity in turn lets us add more adc features without
combinatorial explosion of methods and types needed to handle them all.
2023-08-01 18:31:28 +02:00
pennae
54d31c98fe rp: remove AdcChannel::channel
we're not using it, and actually using it is more trouble than it's
worth. remove the false assurance instead.
2023-08-01 18:31:28 +02:00
pennae
48eac0b146 rp: add AdcChannel trait
this is more general than AdcPin and can also cover the temperature
sensor.
2023-08-01 18:31:28 +02:00
Dario Nieuwenhuis
0d8a9b1e7a
Merge pull request #1729 from mattico/i2c-async-timeout
stm32: add async timeout functions to I2c and TimeoutI2c
2023-08-01 08:20:48 +00:00
Dario Nieuwenhuis
ef3b1f46a9
Merge pull request #1728 from pennae/rp-gpio-banks
rp: fix qspi gpio interrupts, make qspi gpio optional
2023-08-01 08:18:39 +00:00
Dario Nieuwenhuis
5e4f65fe1f
Merge pull request #1730 from bartekkowalski/main
LSE requires setting PWREN bit on STM32L4
2023-08-01 08:07:55 +00:00
Bartek
5fcebd28f4 Fix unlocking the backup domain when enabling LSE
Set PWREN bit to enable the power interface clock before enabling access to the backup domain.
2023-08-01 13:46:34 +09:30
xoviat
a1fce1b554
Merge pull request #1714 from xoviat/dma
stm32/dma: add writable ringbuf
2023-07-31 22:57:30 +00:00
xoviat
bbc8424a5b stm32/dma: remove trace 2023-07-31 17:55:25 -05:00
Matt Ickstadt
036bc669cd stm32: only enable async TimeoutI2c on V2 I2C peripheral 2023-07-31 14:17:50 -05:00
Matt Ickstadt
26cc0e634d stm32: add async timeout functions to I2c and TimeoutI2c 2023-07-31 13:47:03 -05:00
Matt Ickstadt
1b0f4ee653 stm32: add outlives bounds to TimeoutI2c impl blocks
This should make usage and error messages more clear.
2023-07-31 13:35:06 -05:00
pennae
f3ad0c6ade rp: fix qspi gpio interrupts
so far only bank0 interrupts were processed and configured, even if a
qspi pin was given. this is obviously not the right thing to do, so
let's rectify that. the fact that no problems have shown up so far does
suggest that most, if not all, applications don't use this functionality
at all.
2023-07-31 20:02:06 +02:00
Dario Nieuwenhuis
4da9743317
Merge pull request #1690 from Sizurka/rp-flash-ptr-fix
rp: Fix ROM cache ptr() returning the trampoline
2023-07-31 17:26:59 +00:00
pennae
dca1777a2f rp: make QSPI gpio support optional
this will be mostly not useful to anyone since flash is attached to
qspi, and using flash chips that don't use the *entire* qspi interface
will severly slow down the chip. the code overhead is minimal right now,
but if we also fix interrupt support on qspi pins this will
change (adding more code to potentially hot paths, using more memory for
wakers that are never used, and preventing the qspi gpio irq from being
used in software interrupts as RTIC applications may want to do).
2023-07-31 19:13:10 +02:00
xoviat
4a9df60a7b
Merge pull request #1727 from embassy-rs/hrtim-v2
stm32: add hrtim v2
2023-07-31 17:04:51 +00:00
pennae
2c6fcdbd3f rp: add gpio::Pin::io() for access to io banks 2023-07-31 18:36:37 +02:00
pennae
e6d4043279 rp: rename gpio::Pin::io to gpio::Pin::gpio
we'll need access to the pin io bank registers for an upcoming fix, and
having both `io` and `io_bank` or similar can get confusing quickly.
rename `io` to `gpio` to avoid this, and also match the type while there.
2023-07-31 18:28:31 +02:00
Dario Nieuwenhuis
5c2ba3b212 stm32: add hrtim v2 2023-07-31 15:42:03 +02:00
Dario Nieuwenhuis
ebc173ea75
Merge pull request #1726 from rubdos/doc-ieee802154
Enable IEEE802.15.4 doc building
2023-07-31 13:04:40 +00:00
Ruben De Smet
b394cc3394
Enable IEEE802.15.4 doc building 2023-07-31 15:02:55 +02:00
Dario Nieuwenhuis
6caf627262
Merge pull request #1704 from rubdos/ieee802154-fixes
Expose IEEE802.15.4 address in Driver
2023-07-31 12:30:33 +00:00
Ruben De Smet
3d68d42132
CI: ip, ethernet and ieee802.15.4 should be able to co-exist 2023-07-31 14:21:27 +02:00
Ruben De Smet
bdd59b8988
Only skip default-gateway assignment with Medium::Ip 2023-07-31 14:21:27 +02:00
Ruben De Smet
9f55228be0
Use hardware_address() for all media 2023-07-31 14:21:26 +02:00
Ruben De Smet
83ff3cbc69
Add Ip hardware address to Driver 2023-07-31 14:21:26 +02:00
Ruben De Smet
4afdce4ec5
Introduce driver::HardwareAddress without smoltcp dependency 2023-07-31 14:21:26 +02:00
Dario Nieuwenhuis
71fcea159f
Merge pull request #1725 from embassy-rs/flash-pointless-set-bits
stm32/flash: avoid pointless "if flag is set, set it".
2023-07-31 10:55:30 +00:00
Dario Nieuwenhuis
036e00113e stm32/flash: avoid pointless "if flag is set, set it". 2023-07-31 12:48:52 +02:00
Dario Nieuwenhuis
958cace36d
Merge pull request #1724 from bguruprasath5/stm32g0-flash-support
Added STM32G0 Flash Support
2023-07-31 10:35:28 +00:00
Dario Nieuwenhuis
2568c714c8
Merge pull request #1687 from chemicstry/bxcan_timestamp
stm32/can: implement proper RX timestamps
2023-07-31 10:28:05 +00:00
chemicstry
83ab8e057a stm32/can: Fix latency measurement in tests 2023-07-31 13:24:50 +03:00
dev-guruprasath
0ddabf0423 changed ADDR variable to addr 2023-07-31 15:37:01 +05:30
dev-guruprasath
b4d0f24bf9 changed ADDR variable to addr 2023-07-31 15:36:25 +05:30
dev-guruprasath
5a2f61a031 added working example for flash 2023-07-31 15:29:26 +05:30
dev-guruprasath
5b4c099afc added working example for flash 2023-07-31 15:06:15 +05:30
dev-guruprasath
c3357f884a added working example for flash 2023-07-31 14:45:23 +05:30
Ulf Lilleengen
eff2d71f28
Merge pull request #1723 from JuliDi/patch-1
Fix probe-rs chip type in stm32h7 example
2023-07-31 08:29:30 +00:00
dev-guruprasath
42b21fd7ae added flash support 2023-07-31 13:56:16 +05:30
Julian
027801db60
Fix probe chip type in stm32h7 example 2023-07-31 10:17:44 +02:00
chemicstry
ad85beb677 stm32/can: Add more derives for CAN Envelope 2023-07-31 10:32:17 +03:00
chemicstry
780569c08a Merge remote-tracking branch 'origin/main' into bxcan_timestamp 2023-07-31 10:29:20 +03:00
xoviat
ffa0c08140 stm32/dma: fix condition check 2023-07-30 20:22:14 -05:00
xoviat
c38c85ef1f stm32/dma: add traces 2023-07-30 19:39:17 -05:00
Dario Nieuwenhuis
6c6bd11c1a
Merge pull request #1606 from JcBernack/rng-update
STM32: RNG update
2023-07-30 23:44:11 +00:00
Dario Nieuwenhuis
4999b045df stm32/rng: use bind_interrupts!. 2023-07-31 01:41:12 +02:00
Dario Nieuwenhuis
105aa8f452
Merge pull request #1718 from copterust/stm32-spi-set-freq-in-config
Move frequency to SPI config
2023-07-30 22:05:22 +00:00
bofh
d8f02e151b Set frequency in stm32 SPI examples 2023-07-31 00:02:50 +02:00
Dario Nieuwenhuis
3aef5999d5
Merge pull request #1716 from xoviat/rcc-p
stm32/rcc: extract and combine ahb/apb prescalers
2023-07-30 20:43:54 +00:00
Dario Nieuwenhuis
3c3a1d89b5
Merge pull request #1721 from MabezDev/rtc-f2-dont-reset-bd
stm32f2: Avoid resetting RTC backup domain
2023-07-30 20:26:27 +00:00
Scott Mabin
e8d3e86591 stm32f2: Avoid resetting rtc backup domain
Also ensure the pwr is enabled before trying to initialize. For the F2
series this is in a seperate clock control register.
2023-07-30 21:22:48 +01:00
Jan Christoph Bernack
d6c5c1772c improve RNG polling 2023-07-30 22:19:34 +02:00
Jan Christoph Bernack
b65406791a add RNG conditioning 2023-07-30 22:16:42 +02:00
Dario Nieuwenhuis
f3237d7a2c
Merge pull request #1720 from mvniekerk/main
Uart pio fix zeros
2023-07-30 20:15:12 +00:00
Michael van Niekerk
56b21ad429
Uart pio fix zeros
Prevent UART from only getting 0s from the output
2023-07-30 22:13:27 +02:00
xoviat
538cf2bc24 stm32/dma: fix condition check 2023-07-30 14:02:41 -05:00
bofh
d8420ed5a0 Remove unused imports 2023-07-30 19:34:27 +02:00
bofh
04ed45941a Fix format in stm32 SPI examples 2023-07-30 19:31:22 +02:00
bofh
55fb1d5126 Fix more stm32 SPI examples 2023-07-30 19:26:24 +02:00
bofh
4f791799a9 Fix formatting 2023-07-30 19:12:49 +02:00
bofh
d2127f6b82 Fix stm32 SPI examples 2023-07-30 18:58:40 +02:00
bofh
1d815f4ba0 Fix typo 2023-07-30 18:20:36 +02:00
bofh
aef93246b4 Fix Spi::new_internal call in i2s 2023-07-30 18:11:39 +02:00
bofh
6b1d802caa Move frequency to SPI config 2023-07-30 18:01:34 +02:00
xoviat
6f30e92c7a stm32/dma: don't write to full ringbuf 2023-07-30 10:57:17 -05:00
xoviat
39c1cc9f00
Merge pull request #1717 from OueslatiGhaith/wpan
wpan: fix examples
2023-07-30 15:53:28 +00:00
GhaithOueslati
73057ee241 wpan: fix examples 2023-07-30 16:46:33 +01:00
xoviat
a8a491212b stm32/rcc: cleanup merge 2023-07-30 10:18:54 -05:00
xoviat
2f18770e27 stm32/rcc: extract and combine ahb/apb prescalers 2023-07-30 09:52:30 -05:00
xoviat
087e649bc2 stm32/dma: fix typos 2023-07-30 09:28:02 -05:00
xoviat
fd9b6487e1 stm32/dma: impl. wringbuf for bdma 2023-07-30 09:25:58 -05:00
xoviat
603c4cb4fa stm32/dma: complete initial ringbuf impl. 2023-07-30 09:18:33 -05:00
Dario Nieuwenhuis
8bed573b88
Merge pull request #1713 from MabezDev/stm32f2-pll-overflow
stm32f2 PLL overflow with crystal
2023-07-30 12:16:52 +00:00
Dario Nieuwenhuis
2a004251a7
Merge pull request #1712 from xoviat/pwm
stm32/pwm: add output type control
2023-07-30 12:15:47 +00:00
xoviat
8064f4bfe0 stm32/dma: add draft writable dma buf 2023-07-29 20:10:29 -05:00
xoviat
6256a6c57c fix comments 2023-07-29 19:27:16 -05:00
xoviat
bae31ebce7 stm32/dma: rename ringbuf 2023-07-29 19:25:18 -05:00
Scott Mabin
e0ce7fcde7 stm32f2 pll overflow with crystal
With a large enough HSE input frequency, the vco clock calculation will
overflow a u32. Therefore, in this specific case we have to use the
inner value and cast to u64 to ensure the mul isn't clipped before
applying the divider.
2023-07-30 01:00:53 +01:00
xoviat
a9f6e30bcd rustfmt 2023-07-29 12:03:01 -05:00
xoviat
0d7b005252 stm32/pwm: add output type control 2023-07-29 12:01:32 -05:00
Dario Nieuwenhuis
fcbfd224a7
Merge pull request #1706 from mattico/timeouti2c-lifetime
TimeoutI2c: allow ref to live shorter than peripheral
2023-07-28 23:08:06 +00:00
Dario Nieuwenhuis
eb097b9d03
Merge pull request #1710 from Sizurka/rp-async-flash
rp: add async flash
2023-07-28 22:56:33 +00:00
Derek Hageman
7ed9e29326 rp: add async flash
Implement an async flash mode using the XIP background best effort
read interface.  Only reads are actually async, write and erase remain
blocking.
2023-07-28 16:50:54 -06:00
Dario Nieuwenhuis
bdc4aa4a3b
Merge pull request #1582 from xoviat/hrtim
Add the high resolution timer
2023-07-28 22:44:03 +00:00
xoviat
5bb5654d84 stm32/hrtim: pub instance 2023-07-28 17:39:01 -05:00
xoviat
a8d3bcbb75 stm32/hrtim: shorten names 2023-07-28 17:37:14 -05:00
xoviat
ec787d3518 stm32/hrtim: cleanup merge issues 2023-07-28 17:27:15 -05:00
xoviat
c7c701b3e3 Merge branch 'main' of https://github.com/embassy-rs/embassy into hrtim 2023-07-28 17:18:22 -05:00
xoviat
e495d606ec stm32/hrtim: extract traits 2023-07-28 17:16:46 -05:00
xoviat
28136579e9 stm32/hrtim: extract into mod 2023-07-28 17:07:08 -05:00
Dario Nieuwenhuis
cc414e63d3
Merge pull request #1709 from brandonros/cyw43-firmware-sync
sync latest cyw43-firmware
2023-07-28 21:59:53 +00:00
Dario Nieuwenhuis
fd47445d75 cyw43: Update firmware in HIL test. 2023-07-28 23:58:47 +02:00
Dario Nieuwenhuis
d39404cdda fix flaky test wifi_esp_hosted_perf 2023-07-28 23:49:37 +02:00
Dario Nieuwenhuis
29acc46501
core::fmt devours your RAM and flash and explodes your stack. (#1708) 2023-07-28 23:47:07 +02:00
Brandon Ros
cffb819e61 changelog 2023-07-28 17:34:07 -04:00
Brandon Ros
b344c843c4 sync latest cyw43-firmware 2023-07-28 17:25:07 -04:00
Dario Nieuwenhuis
e3cc0d168c
Merge pull request #1707 from pennae/rp-pio-load
rp: relocate programs implicitly during load
2023-07-28 17:47:34 +00:00
pennae
cbc8871a0b rp: relocate programs implicitly during load
this removed the RelocatedProgram construction step from pio uses.
there's not all that much to be said for the extra step because the
origin can be set on the input program itself, and the remaining
information exposed by RelocatedProgram can be exposed from
LoadedProgram instead (even though it's already available on the pio_asm
programs, albeit perhaps less convenient). we do lose access to the
relocated instruction iterator, but we also cannot think of anything
this iterator would actually be useful for outside of program loading.
2023-07-28 19:33:02 +02:00
Dario Nieuwenhuis
e97b14c068
Merge pull request #1705 from JuliDi/stm32h7-dac-dma-example
[STM32] H7 DAC DMA example and feature documentation
2023-07-28 17:07:05 +00:00
Matt Ickstadt
5a8704b4d8 TimeoutI2c: allow ref to live shorter than peripheral 2023-07-28 11:16:43 -05:00
JuliDi
6dd2fc5941
add document-features 2023-07-28 16:59:13 +02:00
Ruben De Smet
69c0a89aa5
Use HardwareAddress in Driver 2023-07-28 16:40:15 +02:00
JuliDi
937a63ce28
remove memory.x files for other stm32 examples 2023-07-28 16:38:02 +02:00
JuliDi
b57ba84da5
add dac-dma example for h7, remove memory.x 2023-07-28 16:34:20 +02:00
Ruben De Smet
c3ba08ffb6
Add IEEE802.15.4 address to embassy net Stack 2023-07-28 16:22:03 +02:00
Ruben De Smet
c52d1d11f9
Expose IEEE802.15.4 address in Driver 2023-07-28 15:55:10 +02:00
Dario Nieuwenhuis
d752a3f980
Merge pull request #1702 from rubdos/ieee802154-fixes
Allow ethernet and 802.15.4 to coexist
2023-07-28 13:47:49 +00:00
Ruben De Smet
973b152375
CI: ethernet and ieee802.15.4 should be able to co-exist 2023-07-28 15:41:45 +02:00
Dario Nieuwenhuis
3690af9bea
stm32/timer: merge pwm module into timer. (#1703)
The traits there are applicable to timer use cases other than PWM.
It doesn't make sense to keep them separated.
2023-07-28 15:29:27 +02:00
Ruben De Smet
f81ee103bf
Allow ethernet and 802.15.4 to coexist
Co-authored-by: Thibaut Vandervelden <thvdveld@vub.be>
2023-07-28 15:11:24 +02:00
Dario Nieuwenhuis
b124222649
Merge pull request #1699 from mvniekerk/main
RP2040: PIO UART example
2023-07-28 11:58:07 +00:00
Dario Nieuwenhuis
8d8c642845
Merge pull request #1701 from chemicstry/bxcan_methods2
stm32/can: implement more convenience methods
2023-07-28 11:44:30 +00:00
Dario Nieuwenhuis
d5f9d17b7c Make pipes local vars. 2023-07-28 13:38:26 +02:00
Dario Nieuwenhuis
036e6ae30c
Rename embassy-hal-common to embassy-hal-internal, document it's for internal use only. (#1700) 2023-07-28 13:23:22 +02:00
chemicstry
38b5d1ee2b stm32/can: implement more convenience methods 2023-07-28 14:22:24 +03:00
Michael van Niekerk
146c744223 Fixes as per PR 2023-07-28 12:56:31 +02:00
Dario Nieuwenhuis
0ced8400d0
Merge pull request #1674 from pennae/rp-stack-guards
Rp stack guards
2023-07-28 10:43:54 +00:00
Dario Nieuwenhuis
2e4f89068a
Merge pull request #1686 from xoviat/usart
stm32/usart: fix error msg for lptim
2023-07-28 10:42:32 +00:00
Dario Nieuwenhuis
f9dd751b6b
Merge pull request #1697 from JuliDi/dac-adc-hil-test
[STM32] Add DAC HIL test with ADC
2023-07-28 10:41:27 +00:00
Michael van Niekerk
6b6acc256d Merge remote-tracking branch 'origin/main' 2023-07-28 11:57:50 +02:00
Michael van Niekerk
91338adc15 Don't include embedded-hal-common 2023-07-28 11:56:59 +02:00
Michael van Niekerk
1d4e1092c4
Merge branch 'embassy-rs:main' into main 2023-07-28 11:38:45 +02:00
Michael van Niekerk
0f1ff77fcc Comments 2023-07-28 11:38:08 +02:00
Michael van Niekerk
e947aa0153 Comments 2023-07-28 11:37:38 +02:00
xoviat
44c8db2911
Merge pull request #1681 from alexferro/feature/stm32-dma-read-exact
Add a STM32/DMARingBuffer::read_exact helper
2023-07-28 01:16:48 +00:00
JuliDi
93864610ce
Add DAC HIL test with ADC 2023-07-27 19:04:43 +02:00
xoviat
bbd2563e13
Merge pull request #1696 from OueslatiGhaith/hci
wpan: update stm32wb-hci to version 0.1.4
2023-07-27 15:08:53 +00:00
goueslati
a6543cef16 wpan: update stm32wb-hci 2023-07-27 15:00:01 +01:00
Chuck Davis
2815540167
Merge pull request #1694 from ceekdee/main
Use lora-phy v1.2.1; modify embassy-lora dependencies
2023-07-27 13:55:37 +00:00
Chuck Davis
8f1ea85938
Merge branch 'main' into main 2023-07-27 08:50:53 -05:00
Dario Nieuwenhuis
3ee3f0e21c
Merge pull request #1693 from esden/ex-enable-release-debug
Added debug=2 in release profile to all examples.
2023-07-27 10:56:42 +00:00
ceekdee
13acca624f Correct embassy-lora time feature 2023-07-26 22:23:02 -05:00
ceekdee
c54ae73d49 Use lora-phy v1.2.1; modify embassy-lora dependencies. 2023-07-26 21:51:09 -05:00
Piotr Esden-Tempski
858ddf6777 Added debug=2 in release profile to all examples.
This makes rtt output work right when using `cargo run` in release mode.

Debug was already enabled for release builds in some of the examples but
not all.
2023-07-26 18:32:40 -07:00
Derek Hageman
a5f2152077 rp: Fix ROM cache ptr() returning the trampoline
Make sure that the ptr() function for ROM functions always returns
the actual ROM pointer.  This allows the use of flash I/O while the
function cache is enabled.
2023-07-26 06:50:43 -06:00
chemicstry
a56ef685f3 stm32: forward defmt feature to embassy-time 2023-07-25 12:19:42 +03:00
chemicstry
62ab0bf2e7 stm32/can: implement proper RX timestamps 2023-07-25 12:12:45 +03:00
xoviat
77e34c5e8a
Merge pull request #1684 from xoviat/wpan
stm32/rcc: move rcc logic from ipcc
2023-07-25 01:22:07 +00:00
xoviat
270d1d59a0 stm32/rcc: use wpan default only for wpan 2023-07-24 18:25:15 -05:00
xoviat
3c41784de8 stm32/usart: fix error msg for lptim 2023-07-24 18:08:23 -05:00
xoviat
1425dda0a7 stm32/rcc: fix minor issues 2023-07-24 17:19:45 -05:00
Michael van Niekerk
a60d92cfbb Tx and Rx setup 2023-07-24 22:20:00 +02:00
Dario Nieuwenhuis
9f898c460f
Merge pull request #1685 from chemicstry/bxcan_async_enable
stm32/can: bxcan async enable
2023-07-24 15:24:18 +00:00
chemicstry
2a0fe73045 stm32/can: bxcan async enable 2023-07-24 17:53:23 +03:00
Dario Nieuwenhuis
8d50f8a3d3
Merge pull request #1678 from JuliDi/dac-v3
Add DAC v3
2023-07-24 14:42:15 +00:00
Julian
622fcb0e10
Merge branch 'embassy-rs:main' into dac-v3 2023-07-24 16:40:05 +02:00
Dario Nieuwenhuis
7fc138c91e
Merge pull request #1676 from adamgreig/fix-dac-example
stm32: Fix DAC examples
2023-07-24 14:18:37 +00:00
Julian
5b32db7564
Merge branch 'embassy-rs:main' into dac-v3 2023-07-24 12:51:18 +02:00
xoviat
bd60f003e0 stm32/rcc: move rcc logic from ipcc 2023-07-23 17:01:34 -05:00
Alex Ferro
4883fdd154 Add a STM32/DMARingBuffer::read_exact helper
This provides a helper function with an async implementation, that
will only return (or error) when it was able to read that many bytes,
sleeping until ready.

Additionally, corrected the documentation for Ringbuffer functions to use
"elements" instead of "bytes" as the types were already generic over the
word/element size.
2023-07-22 17:17:01 -06:00
xoviat
18b9b6c780
Merge pull request #1679 from adamgreig/examples-chip-name
Add notes about setting chip name correctly for examples
2023-07-22 22:07:29 +00:00
xoviat
fbcc587eca
update readme 2023-07-22 17:06:04 -05:00
Adam Greig
fbe30b2453
Add notes about setting chip name correctly for examples. 2023-07-22 21:58:29 +01:00
xoviat
d42dff45de Merge branch 'main' of https://github.com/embassy-rs/embassy into hrtim 2023-07-22 14:49:31 -05:00
JuliDi
8e230bf6ec
add missing TransferOptions fields for DMA 2023-07-22 21:36:03 +02:00
Dario Nieuwenhuis
603ea9f310
Merge pull request #1677 from xoviat/update-metapac
stm32: update metapac
2023-07-22 18:35:09 +00:00
JuliDi
a56b3e9a44
update feature gates for v3 2023-07-22 19:47:36 +02:00
JuliDi
0378366e29
Merge remote-tracking branch 'xoviat/update-metapac' into fix-dac-example 2023-07-22 19:26:20 +02:00
JuliDi
80ce6d1fb7
update DAC triggers to incorporate v3 2023-07-22 19:25:02 +02:00
xoviat
ba8e5d8589 rustfmt 2023-07-22 12:10:50 -05:00
xoviat
192cdc2f85 stm32: suppress adc f3 2023-07-22 12:07:02 -05:00
xoviat
64f8a779ca stm32: add dac fix 2023-07-22 11:54:54 -05:00
xoviat
5693ed1178 stm32: add minimal fdcan impl 2023-07-22 11:50:30 -05:00
xoviat
19c6c698b5 stm32: update metapac 2023-07-22 11:43:14 -05:00
Adam Greig
224fbc8125
stm32: remove duplicate features from stm32f4 examples Cargo.toml 2023-07-22 13:19:29 +01:00
Adam Greig
e5b4641f9e
stm32/dac: set pin mode to analog (ref #334) 2023-07-22 13:19:26 +01:00
Adam Greig
c83552eadc
stm32: fix DAC examples
The DAC driver defaults to enabling the channel trigger, but leaves it
at the default value of TIM6 TRGO, then performs a software trigger
after writing the new output value. We could change the trigger
selection to software trigger, but for this example it's simpler to just
disable the trigger.
2023-07-22 12:57:49 +01:00
xoviat
4db63677f6
Merge pull request #1658 from xoviat/mac
implement most infra for wpan mac
2023-07-21 22:29:15 +00:00
xoviat
f4d6a23f92 wpan/mac: misc fixes 2023-07-21 17:02:36 -05:00
xoviat
2cdd593290 Merge branch 'main' of https://github.com/embassy-rs/embassy into mac 2023-07-21 16:24:48 -05:00
xoviat
c675208b8a wpan: complete prelim. command impl. 2023-07-21 16:10:34 -05:00
pennae
e9445ec72d rp: allow for MPU-based stack guards on core 0 as well
using these will require some linker script intervention. setting the
core0 stack needs linker intervention anyway (to provide _stack_start),
having it also provide _stack_end for the guard to use is not that much
of a stretch.
2023-07-21 18:51:35 +02:00
xoviat
899a68325c wpan: impl. draft control scheme 2023-07-20 20:51:49 -05:00
xoviat
c80c232a72 wpan: impl. debug for structs 2023-07-20 19:52:36 -05:00
xoviat
83ff626c47 wpan/mac: incr. runner msdu handle 2023-07-20 17:00:03 -05:00
xoviat
809d3476aa wpan: further optimize mac event 2023-07-20 16:45:04 -05:00
Dario Nieuwenhuis
4d1d125f41
Merge pull request #1673 from pennae/rp-disable-adc
rp: disable adc hardware on Adc drop
2023-07-20 14:21:40 +00:00
pennae
4d6b3c57b1 rp: fix multicore stack guard setup
the region field of the register is four bits wide followed by the valid
bit that causes the rnr update we rely on for the rasr write. 0x08 is
just a bit short to reach the valid bit, and since rp2040 has only 8
regions it (at best) doesn't do anything at all.
2023-07-20 16:08:59 +02:00
pennae
a3d4ae85b0 rp: disable adc hardware on Adc drop
the adc constantly pulls a small but significant amount of current while
the hardware is enabled. this can have quite an effect on sleeping
devices that also use the adc.
2023-07-20 15:48:59 +02:00
xoviat
02d57afd51 rustfmt 2023-07-19 17:52:07 -05:00
xoviat
28254842db - optimize event to parse opcode only once
- optimze channels
- return mut ref for smoltcp rx
2023-07-19 17:49:08 -05:00
Dario Nieuwenhuis
3382ca1a54
Merge pull request #1667 from quentinmit/nrf-pdm
nrf/pdm: Add continuous sampling API
2023-07-19 10:15:39 +00:00
Dario Nieuwenhuis
07a9a4ffd8
Merge pull request #1671 from alepez/uart-swap
stm32/uart: add swap_rx_tx
2023-07-19 10:12:49 +00:00
Alessandro Pezzato
36ff688fab stm32/uart: optimize swap_rx_tx 2023-07-19 10:50:40 +02:00
Alessandro Pezzato
3df2c71e6c stm32/uart: add swap_rx_tx 2023-07-19 10:26:47 +02:00
xoviat
ca1d4179a7 wpan: implement initial event loop 2023-07-18 20:52:03 -05:00
xoviat
890d113b85 wpan: fully implement initial draft concept 2023-07-18 18:28:12 -05:00
Quentin Smith
7555a1e302 cargo fmt 2023-07-18 18:32:19 -04:00
Quentin Smith
be7fbe50d7 Update pdm driver to build with all the PACs 2023-07-18 18:31:32 -04:00
Quentin Smith
2c01f277c2 cargo fmt 2023-07-18 17:17:04 -04:00
Quentin Smith
c333d855fc Remove merge error 2023-07-18 17:14:25 -04:00
Quentin Smith
42de1c3a06 Merge remote-tracking branch 'origin/main' into nrf-pdm 2023-07-18 17:13:00 -04:00
Dario Nieuwenhuis
a1d3bc30fa net-esp-hosted: build docs. 2023-07-18 18:15:35 +02:00
ivmarkov
98576c17b6
Fix multicast support (#1670) 2023-07-18 17:35:20 +02:00
Dario Nieuwenhuis
27a3d2cd0b
Merge pull request #1669 from embassy-rs/nocrlf
ci: add check for no CRLF line endings.
2023-07-18 12:33:14 +00:00
Dario Nieuwenhuis
10f5966787 Convert files to LF endings. 2023-07-18 14:24:58 +02:00
Dario Nieuwenhuis
48957dce87 Add gitattributes to control crlf conversion. 2023-07-18 14:23:37 +02:00
Dario Nieuwenhuis
fc901f9856 ci: add check for no CRLF line endings. 2023-07-18 14:23:37 +02:00
Dario Nieuwenhuis
13964c7fca
Merge pull request #1668 from bjoernQ/fix-embassy-net-dual-stack
Make dual-stack work in embassy-net
2023-07-18 11:30:27 +00:00
Dario Nieuwenhuis
a1cc3f2c60
Merge pull request #1666 from alexferro/possible-1664-fix
Embassy-rp I2C: Fix 1664 (async transaction failure)
2023-07-18 11:24:52 +00:00
Dario Nieuwenhuis
15a6e04887
Merge pull request #1665 from xoviat/eth
stm32/eth: fix cfg(not(time))
2023-07-18 11:22:42 +00:00
bjoernQ
6bf4717b0a cfg-gate unapply_config_v4 2023-07-18 10:57:05 +02:00
bjoernQ
f581831b86 Make dual-stack work in embassy-net 2023-07-18 10:39:29 +02:00
Quentin Smith
6f02403184 Merge remote-tracking branch 'origin/main' into nrf-pdm 2023-07-17 21:31:43 -04:00
xoviat
d040871f7a wpan: fix comp errors and impl. some of runner 2023-07-17 20:14:06 -05:00
xoviat
8f23b6faa6 wpan: refactor control, driver 2023-07-17 19:26:58 -05:00
xoviat
1d2c47273d Merge branch 'master' into mac 2023-07-17 16:38:46 -05:00
xoviat
55ac480cb0 stm32/eth: fix cfg(not(time)) 2023-07-17 16:24:09 -05:00
Alex Ferro
e4ad1aa542 Embassy-rp I2C: Fix 1664
Change embassy-rp i2c.rs impl of embedded_hal_async::i2c::I2c::transaction
to only do the call to setup() for address once per call to transactions.
Calling setup multiple times results in I2C transactions being skipped
on the bus, even across calls to transaction() or devices.
2023-07-16 19:59:35 -06:00
Tyler
6d8a5c6c20
Merge pull request #2 from embassy-rs/main
Pull changes from base embassy repo
2023-07-16 19:08:01 -05:00
xoviat
6b5df4523a
Merge pull request #1662 from xoviat/mac-2
wpan/mac: use slice view to avoid copy
2023-07-17 00:01:27 +00:00
xoviat
7b34f5e866 wpan: make dataind fields private 2023-07-16 18:54:11 -05:00
xoviat
fe1e7c4d76 wpan: fix datarequest 2023-07-16 18:07:05 -05:00
xoviat
34217ea797 wpan: add slice data view 2023-07-16 17:28:34 -05:00
xoviat
a0515ca7ac wpan: add repr(c) to mac responses 2023-07-16 16:16:56 -05:00
xoviat
28b419d65e wpan/mac: use lifetimes to control events 2023-07-16 15:09:30 -05:00
xoviat
7c465465c1 wpan: use builtin conversion methods 2023-07-16 13:59:15 -05:00
xoviat
e95a7dc555 wpan/mac: use slice view to avoid copy 2023-07-16 12:41:57 -05:00
xoviat
582006c75c wpan/mac: further cleanup 2023-07-16 09:32:54 -05:00
Dario Nieuwenhuis
c7ec45a004
Merge pull request #1659 from maximedeboeck/hid-tests
Add usb-hid keyboard example for rp pico.
2023-07-16 11:17:49 +00:00
maximedeboeck
88d1976e81 Added usb-hid keyboard example for rp pico. 2023-07-16 12:31:56 +02:00
xoviat
cd592cb055 wpan: add files from cyw43 2023-07-15 19:15:01 -05:00
xoviat
0b63af3313 wpan: prepare net impl. 2023-07-15 19:02:04 -05:00
Dario Nieuwenhuis
25197308e3
Merge pull request #1653 from xoviat/eth
stm32/eth: solve busy-loop polling
2023-07-15 21:18:03 +00:00
xoviat
cf278ea1b6
Merge pull request #1656 from xoviat/mac-4
wpan: factor mac logic into other mod
2023-07-15 19:49:16 +00:00
xoviat
4db4200c37 wpan: factor mac logic into other mod 2023-07-15 14:47:34 -05:00
xoviat
758862f4b1
Merge pull request #1655 from xoviat/mac-3
wpan: add mac
2023-07-15 19:39:06 +00:00
xoviat
3705b4f40d rustfmt 2023-07-15 14:38:02 -05:00
xoviat
1f63fdbb15 stm32/tests: fix cargo 2023-07-15 14:31:35 -05:00
xoviat
d11a94e2a7 wpan: add mac test 2023-07-15 14:28:42 -05:00
xoviat
d6dd5ea5d3 revert toolchain changes 2023-07-15 14:19:32 -05:00
xoviat
8a146a50ec Merge branch 'master' into mac-3 2023-07-15 14:18:01 -05:00
xoviat
17d5e1c470 stm32/eth: add set_poll_interval 2023-07-15 12:02:08 -05:00
xoviat
975a780efe stm32/eth: impl. poll interval 2023-07-15 09:57:09 -05:00
xoviat
c3774607a5 stm32/eth: convert static metho 2023-07-15 09:37:25 -05:00
xoviat
bb24cfd1e8 stm32/eth: add f4 example 2023-07-15 09:32:44 -05:00
xoviat
48b37aa2bf stm32/eth: refactor genericsmi 2023-07-15 09:32:36 -05:00
Dario Nieuwenhuis
0bde4992ea
Merge pull request #1652 from OueslatiGhaith/wpan_hci
wpan: update `stm32wb-hci`
2023-07-15 14:00:18 +00:00
Ghaith Oueslati
7ec7d1bbcc
fix ci issue 2023-07-15 14:56:26 +01:00
GhaithOueslati
0628dd997f fix test 2023-07-15 13:52:04 +01:00
GhaithOueslati
283ec756a9 stm32wb: add gatt server example 2023-07-15 13:37:41 +01:00
GhaithOueslati
5b076cb0dd wpan: update stm32wb-hci to version 0.1.3 2023-07-15 13:33:10 +01:00
Phil Markgraf
3bae533066
Enable RTC on STM32WL chips (#1645)
* Add clippy allow to not report if same then branch

* Support enabling RTC clock on STM32WL

* Add clippy allow to not report if same then branch

* Support enabling RTC clock on STM32WL

* Add rtc example for stm32wl

* Address code review feedback
2023-07-15 13:40:23 +02:00
Dario Nieuwenhuis
7b36fe049d
Merge pull request #1649 from simmsb/master
rp: Check intrstatus before signalling suspended
2023-07-14 18:52:53 +00:00
Dario Nieuwenhuis
4b3fda4f96
Merge pull request #1650 from henrikberg/rp_examples_doc
RP examples gets file description
2023-07-14 18:45:34 +00:00
Henrik Berg
56ca179475 Round temp to make more sense. 2023-07-13 22:47:03 +02:00
Ben Simms
460cdc9e0f
Check intrstatus before signalling suspended 2023-07-13 19:29:09 +01:00
goueslati
f90b170dad cleanup 2023-07-13 16:29:29 +01:00
goueslati
68792bb918 final structs
unchecked
2023-07-13 15:48:15 +01:00
goueslati
3f0c8bafb0 make it work, disgustingly 2023-07-13 15:20:50 +01:00
Henrik Berg
588c0479f5 Add descriptions to all RP2040 examples. Some need hardware that was not specified. 2023-07-13 11:16:11 +02:00
Dario Nieuwenhuis
d979841f17
Merge pull request #1644 from embassy-rs/remove-atompoly
Remove trivial to remove uses of atomic-polyfill.
2023-07-12 16:35:00 +00:00
Dario Nieuwenhuis
dff9bd9711 Remove trivial to remove uses of atomic-polyfill. 2023-07-12 18:30:43 +02:00
goueslati
eccd2ecebf change MacAddress to a union instead of an enum 2023-07-12 16:49:37 +01:00
Dario Nieuwenhuis
ed86fc175f
Merge pull request #1637 from ShakenCodes/main
Ensure I2C master_stop() called after error
2023-07-12 15:46:28 +00:00
Dario Nieuwenhuis
132327a40d
Merge pull request #1642 from henrikberg/rtc_rp_hb
RP2040 Rtc update with example
2023-07-12 15:46:00 +00:00
Dario Nieuwenhuis
a615a70eda
Merge pull request #1643 from bugadani/clear_timer
Reset `expires_at` of finished task
2023-07-12 15:40:10 +00:00
Dániel Buga
a2501bd5c1 Allow clearing finished task from timer queue 2023-07-12 16:56:02 +02:00
Henrik Berg
ff2daaff67 RP: Watchdog scratch set/get with index: usize. 2023-07-12 16:41:35 +02:00
goueslati
d5a4457b5e parsing MAC structs 2023-07-12 15:06:56 +01:00
Henrik Berg
6d402fe393 RP: Don't reset RTC in Clock::init. Updated example. 2023-07-12 15:16:56 +02:00
Henrik Berg
466a391b52 RP: Add save/restore to Rtc. Example use. 2023-07-12 14:22:48 +02:00
Henrik Berg
a93714327e RP: Rename Rtc to match STM32 impl. Remove setting RTC in new(). 2023-07-12 14:22:48 +02:00
Henrik Berg
029b156563 RP: Add scratchN registers to watchdog. Add Clone and Debug to DateTime 2023-07-12 14:22:48 +02:00
Henrik Berg
55a5e9b3a5 RP: Add RTC example to rp2040. 2023-07-12 14:22:48 +02:00
Dario Nieuwenhuis
d8c7c3fc4b
Merge pull request #1641 from royb3/poll_udp_socket
Adding polling functions for udp send_to and recv_from.
2023-07-12 10:46:08 +00:00
Roy Buitenhuis
f192f44018 fmt 2023-07-12 11:32:02 +02:00
Roy Buitenhuis
b81c14f442 Add polling fn's for send_to and recv_from in UdpSocket. 2023-07-12 11:32:02 +02:00
Roy Buitenhuis
f54e1cea90 Add poll functions on UdpSocket. 2023-07-12 11:32:02 +02:00
goueslati
fbddfcbfb7 wip: added MAC indications 2023-07-11 17:19:32 +01:00
goueslati
67b14e6e7a wip: added MAC responses 2023-07-11 16:54:48 +01:00
goueslati
6f4172fbc1 wip: added MAC commands 2023-07-11 16:07:33 +01:00
Dario Nieuwenhuis
c6e2f4a90b
Merge pull request #1639 from embassy-rs/rp-gpio-set-low-fix
rp/gpio: fix is_set_high/is_set_low, expand tests.
2023-07-11 13:16:27 +02:00
Dario Nieuwenhuis
91c1d17f16 rp/gpio: fix is_set_high/is_set_low, expand tests. 2023-07-11 12:40:07 +02:00
shakencodes
29f3d5b68d Ensure I2C master_stop() called after error 2023-07-10 16:40:33 -07:00
goueslati
4aca7c8811 wip 2023-07-10 16:54:48 +01:00
Dario Nieuwenhuis
8a811cfcf7
Merge pull request #1632 from xoviat/wpan
wpan: get mac working
2023-07-09 22:18:16 +00:00
xoviat
bf4493dbdf rustfmt 2023-07-09 16:08:39 -05:00
xoviat
c1bf5aee24 mac: move table initialization after sys ready 2023-07-09 16:01:13 -05:00
xoviat
735d676a72 wpan: update alignment control 2023-07-09 15:50:01 -05:00
Dario Nieuwenhuis
37c103b5f3
Merge pull request #1630 from jamwaffles/fix-embassy-time-std
Enable `critical-section/std` when using `std` feature of `embassy-time`
2023-07-08 16:25:58 +00:00
James Waples
05c524a7db Enable critical-section/std when using std feature of embassy-time 2023-07-08 11:20:26 +01:00
xoviat
758a2c528f
Merge pull request #1629 from davidpurser/stm32h7-pll-fix
Correctly calculate target VCO frequency from multipliers
2023-07-08 02:42:52 +00:00
David Purser
69b4e898b3
Correctly calculate target VCO frequency from multipliers 2023-07-07 20:52:44 -05:00
Dario Nieuwenhuis
b0da6318f3
Merge pull request #1623 from pennae/rp-adc
rp/adc: rewrite the module
2023-07-07 15:52:48 +00:00
pennae
972cdd4265 rp/adc: rewrite the module
- don't require an irq binding for blocking-only adc
- abstract adc pins into an AnyPin like interface, erasing the actual
  peripheral type at runtime.
- add pull-up/pull-down functions for adc pins
- add a test (mostly a copy of the example, to be honest)
- configure adc pads according to datasheet
- report conversion errors (although they seem exceedingly rare?)
- drop embedded-hal interfaces. embedded-hal channels can do neither
  AnyPin nor pullup/pulldown without encoding both into the type
2023-07-07 17:46:35 +02:00
Dario Nieuwenhuis
f9aebfce01
Merge pull request #1628 from royb3/reexport_ipendpoint
Re-export smoltcp::wire::IpEndpoint
2023-07-07 14:51:27 +00:00
Roy Buitenhuis
151557fec3 Re-export smoltcp::wire::IpEndpoint 2023-07-07 16:38:56 +02:00
Dario Nieuwenhuis
7d68ca1f3b
Merge pull request #1627 from pennae/rp-pio-irq
rp/pio: use bind_interrupts for irqs
2023-07-07 14:31:09 +00:00
pennae
4b63829110 rp/pio: use bind_interrupts for irqs
closes #1338
2023-07-07 16:27:10 +02:00
Dario Nieuwenhuis
e196387e69
Merge pull request #1626 from embassy-rs/otg-read-disable
stm32/otg: implement `EndpointError::Disabled` for reads.
2023-07-07 01:58:39 +00:00
Dario Nieuwenhuis
f8d608093f stm32/otg: implement EndpointError::Disabled for reads.
It was implemented only for writes.
2023-07-07 03:55:57 +02:00
Dario Nieuwenhuis
ffeb40ff43 stm32/otg: change some info logs to trace. 2023-07-06 13:49:19 +02:00
Dario Nieuwenhuis
47305c2bf2 ci: build doc with 4 threads instead of 6, to avoid running out of disk space. 2023-07-06 02:32:49 +02:00
Dario Nieuwenhuis
c421b7f5f0
Merge pull request #1624 from embassy-rs/release-embassy-time-v0.1.2
Release embassy-time v0.1.2
2023-07-05 23:34:04 +00:00
Dario Nieuwenhuis
d137286981 Release embassy-time v0.1.2 2023-07-06 01:29:44 +02:00
xoviat
864202a23a
Merge pull request #1578 from schphil/can-split
stm32 can split method
2023-07-05 23:27:53 +00:00
Dario Nieuwenhuis
a77fb0f630
Merge pull request #1622 from embassy-rs/misc-fixes
Downgrade nightly, misc fixes
2023-07-05 17:44:46 +00:00
Dario Nieuwenhuis
a42ac86f1b Remove wifi envvars. They're annoying, they cause rust-analyzer errors when opening the examples. 2023-07-05 19:20:49 +02:00
Dario Nieuwenhuis
c6cd69887c Downgrade nightly.
Newer nightlies have a bad perf regression https://github.com/rust-lang/rust/issues/113372
2023-07-05 19:14:11 +02:00
Dario Nieuwenhuis
d1711036db stm32-wpan: fix wrong src_base 2023-07-05 19:13:46 +02:00
Dario Nieuwenhuis
8313b7315a
Merge pull request #1600 from ilikepi63/main
feature(1354): Added lifetimes to Event + Tasks
2023-07-05 17:13:26 +00:00
Cameron Harris
d7ecf6f593
Update embassy-nrf/src/ppi/mod.rs
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2023-07-05 19:10:43 +02:00
Cameron Harris
082147939d
Update embassy-nrf/src/ppi/ppi.rs
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2023-07-05 19:10:30 +02:00
Cameron Harris
67c4d165c7
Update embassy-nrf/src/ppi/ppi.rs
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2023-07-05 19:10:22 +02:00
Cameron Harris
fb3e6a2b40
Update embassy-nrf/src/ppi/mod.rs
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2023-07-05 19:10:16 +02:00
Cameron
8ee2f50b8c Removed unnecessary lifetime naming 2023-07-05 19:01:28 +02:00
Dario Nieuwenhuis
46a4600952
Merge pull request #1607 from MathiasKoch/embassy-stm32/rcc-rtc-l4
feature(embassy-stm32): L4 enable APB to allow RTC to work
2023-07-05 14:17:35 +00:00
Dario Nieuwenhuis
27992d9c07
Merge pull request #1621 from rasmuspeders1/main
Remove bad semicolon in time driver example struct declaration
2023-07-05 15:45:27 +02:00
Rasmus Pedersen
a0dc87d64e Remove semicolon in time driver example struct declaration
The semicolon is not allowed with struct declarations with braces.
The doc test compiles fine for some reason!?
2023-07-05 14:07:05 +02:00
Mathias
1255d8a8ce Merge branch 'main' of https://github.com/embassy-rs/embassy into embassy-stm32/rcc-rtc-l4 2023-07-05 12:36:42 +02:00
Cameron
7d3eb6463a Removed unnecessary space 2023-07-05 11:34:33 +02:00
Cameron
ab7fcf1d5b Removed unnecessary changes 2023-07-05 09:23:39 +02:00
Cameron
2c5146f19f Fixed Lifetimes in Events & Tasks 2023-07-05 09:20:56 +02:00
Dario Nieuwenhuis
3341b53eb4
Merge pull request #1619 from embassy-rs/nrf-time
nrf: build docs with `time` feature.
2023-07-04 22:40:52 +00:00
Dario Nieuwenhuis
70c05c62e4 nrf: build docs with time feature. 2023-07-05 00:35:22 +02:00
Dario Nieuwenhuis
eb57bb298f
Merge pull request #1617 from xoviat/const-rcc
stm32/rcc: allow const-propagation
2023-07-04 22:31:55 +00:00
xoviat
953c745ed8 stm32/rcc: allow const-propagation 2023-07-04 16:29:46 -05:00
Dario Nieuwenhuis
ce73c29246
Merge pull request #1616 from embassy-rs/update-nightly
Update nightly
2023-07-04 19:44:55 +00:00
Dario Nieuwenhuis
9c4df46c46 rustfmt. 2023-07-04 21:34:55 +02:00
Dario Nieuwenhuis
2a035a24a6 Update nightly. 2023-07-04 20:15:30 +02:00
Dario Nieuwenhuis
10c0174903 doc: upload statics too. 2023-07-04 20:15:30 +02:00
Dario Nieuwenhuis
d26a247a32
Merge pull request #1615 from embassy-rs/update-eh2
update embedded-hal crates.
2023-07-04 18:03:05 +00:00
Dario Nieuwenhuis
a101d9078d update embedded-hal crates. 2023-07-04 19:59:36 +02:00
Ulf Lilleengen
b2f843a4ce
Merge pull request #1614 from cumthugo/fix_queue_size
time: fix queue size
2023-07-04 13:17:14 +00:00
cumthugo
40d25da793 time: fix queue size 2023-07-04 21:13:31 +08:00
Dario Nieuwenhuis
b956d5d06c
Merge pull request #1613 from diondokter/fix-nrf-spim-nightly
Fix nrf spim nightly error
2023-07-04 10:55:15 +00:00
Dario Nieuwenhuis
0845eab8a0
Merge pull request #1612 from wyager/fmc-bank1-16bit
Add stm32 FMC support for bank 1 16-bit RAM
2023-07-04 10:45:17 +00:00
Dion Dokter
582c721aec Add lifetimes to the functions 2023-07-04 11:48:59 +02:00
William Yager
0c4180cdd0 fmt 2023-07-03 19:39:58 -04:00
William Yager
d9824dfd64 Add bank 1 16 bit 2023-07-03 19:39:51 -04:00
Philipp Scheff
a088c4bee6 fix stm32 can test 2023-07-04 00:39:10 +02:00
Philipp Scheff
8359d8c020 make stm32 can test work 2023-07-04 00:34:24 +02:00
Philipp Scheff
1869fe02ba make stm32f4 example work 2023-07-04 00:21:08 +02:00
Philipp Scheff
e3e8d82933 remove unused imports from example 2023-07-03 23:52:52 +02:00
Philipp Scheff
a96f30edf4 allow deed code can rx & clippy 2023-07-03 23:48:07 +02:00
Philipp Scheff
af15b49bfe fmt 2023-07-03 22:57:33 +02:00
Mathias
60b2f075dc Merge branch 'main' of https://github.com/embassy-rs/embassy into embassy-stm32/rcc-rtc-l4 2023-07-03 19:33:26 +02:00
xoviat
0c49e6747c wip 2023-07-02 22:00:50 -05:00
Dario Nieuwenhuis
99b4ea7c1d
Merge pull request #1609 from embassy-rs/fix-peripheral-deref
hal-common: require DerefMut for peripherals, not just Deref.
2023-07-02 20:20:47 +00:00
Dario Nieuwenhuis
c9b9be5b81 hal-common: require DerefMut for peripherals, not just Deref.
Otherwise you can create multiple drivers on the same singleton like this:

```rust
let mut input = Input::new(&pin, Pull::None);
let mut output = Output::new(&pin, Level::Low, Speed::Low);
input.is_high();
output.set_high();
input.is_high();
output.set_high();
```

Thanks @pennae for reporting.
2023-07-02 22:16:01 +02:00
xoviat
2e6b813225 hrtim: add guardrails on bridge sec. duty 2023-07-02 09:17:12 -05:00
xoviat
aceba1c03f hrtim: fix example and auto adjust psc. 2023-07-01 21:47:44 -05:00
xoviat
8141d53d94 Merge branch 'main' of https://github.com/embassy-rs/embassy into hrtim 2023-07-01 17:32:25 -05:00
xoviat
21a8653195 hrtim: minor cleanup 2023-07-01 17:32:16 -05:00
Tyler
3aedbce5c2
Merge pull request #1 from embassy-rs/main
Pull changes from embassy main
2023-07-01 15:41:11 -05:00
Mathias
d372df7ddb L4: Switch to MSI to prevent problems with PLL configuration, and enable power to AHB bus clock to allow RTC to run 2023-07-01 12:16:23 +02:00
xoviat
6e13f5b387 rustfmt 2023-06-30 18:33:22 -05:00
xoviat
c07854fed8 stm32/hrtim: minor fixes 2023-06-30 18:22:02 -05:00
xoviat
8c4997c5fc stm32/hrtim: impl. bridge, dead-time part. res. 2023-06-30 18:22:01 -05:00
xoviat
3252eaa060 stm32/hrtim: add example impl. 2023-06-30 18:21:59 -05:00
xoviat
348019e37f stm32/hrtim: impl channel alloc type system 2023-06-30 18:21:58 -05:00
xoviat
b9eb3dfad7 stm32/hrtim: add api concept 2023-06-30 18:21:57 -05:00
xoviat
71513ccb39 stm32/hrtim: impl. draft frequency computation 2023-06-30 18:21:57 -05:00
xoviat
cdb3fb059f stm32/hrtim: first draft 2023-06-30 18:21:42 -05:00
Cameron
93caf97a04 Formatting stuff 2023-06-30 11:54:37 +02:00
Cameron
bca2c54948 Adjusted build issue 2023-06-30 11:50:27 +02:00
Cameron
81cbb0fc32 Attempt to fix certain borrowing rule issues 2023-06-30 11:47:20 +02:00
Cameron
c69f2929c0 Build failures 2023-06-30 11:37:53 +02:00
Cameron
4d23ea554b Build failures 2023-06-30 11:34:13 +02:00
Cameron
d6fde756a8 Build failures 2023-06-30 11:32:11 +02:00
Dario Nieuwenhuis
ba43444292
Merge pull request #1601 from embassy-rs/net-release
Release embassy-net v0.1
2023-06-29 20:01:10 +02:00
Dario Nieuwenhuis
6eac49186d Release embassy-net v0.1 2023-06-29 19:55:32 +02:00
Cameron
2432cece38 Lifetimes in dppi 2023-06-29 18:36:12 +02:00
Cameron
fef338f5c2 Lifetime groups 2023-06-29 18:13:46 +02:00
Cameron
24e186e684 feature(1354): Added lifetimes to Event + 2023-06-29 18:09:26 +02:00
Dario Nieuwenhuis
4feabb13bf
Merge pull request #1599 from ilikepi63/main
feature(1355): Add trigger to task, triggered + clear to Event
2023-06-29 15:53:11 +00:00
Cameron
3f19879f41 PR Fixes 2023-06-29 17:44:46 +02:00
Cameron
e90f47aba3 Fixed Pointer Updates 2023-06-29 17:37:51 +02:00
Cameron
2aa2b843ce feature(1355): Add trigger to task, triggered + clear to Event 2023-06-29 17:11:36 +02:00
Ulf Lilleengen
fa2cda81db
Merge pull request #1598 from kaspar030/patch-1
embassy-boot/nrf/README.md: typo fix
2023-06-29 12:57:55 +00:00
Kaspar Schleiser
837d3bcdbb
embassy-boot/nrf/README.md: typo fix 2023-06-29 14:43:31 +02:00
Dario Nieuwenhuis
9f50f34547
Merge pull request #1597 from embassy-rs/usb-missing-reexports
usb: add missing builder reexports.
2023-06-29 10:24:25 +00:00
Dario Nieuwenhuis
f0b17675d8 usb: add missing builder reexports.
Fixes #1176
cc #1596
2023-06-29 12:20:51 +02:00
Dario Nieuwenhuis
6eb46c419c
Merge pull request #1565 from JuliDi/main
Implement DMA for DAC on STM32
2023-06-29 08:54:28 +00:00
Julian
96f1525ffe
Revert changes to dma.rs 2023-06-29 09:20:25 +02:00
Dario Nieuwenhuis
01101e3df0 Update readme 2023-06-29 03:11:22 +02:00
Dario Nieuwenhuis
b95e5a4ea6
Merge pull request #1595 from embassy-rs/probe-rs
Update probe-rs-cli -> probe-rs
2023-06-29 00:43:44 +00:00
Dario Nieuwenhuis
f7ec579c18 Update probe-rs-cli -> probe-rs 2023-06-29 02:39:28 +02:00
Dario Nieuwenhuis
4f0aca481f
Merge pull request #1594 from embassy-rs/update-rp-pac
Update rp-pac.
2023-06-29 00:15:13 +00:00
Dario Nieuwenhuis
ce889900d6 Update rp-pac. 2023-06-29 02:09:51 +02:00
Dario Nieuwenhuis
8a0a7c81b6
Merge pull request #1593 from embassy-rs/metapac-update
Update stm32-metapac, includes chiptool changes to use real Rust enums.
2023-06-29 00:06:44 +00:00
Dario Nieuwenhuis
e892014b65 Update stm32-metapac, includes chiptool changes to use real Rust enums now. 2023-06-29 02:01:33 +02:00
Dario Nieuwenhuis
8cbe5b8e20
Merge pull request #1592 from kevswims/feature/stm32g4-usb-crs
WIP: Working CRS USB Example
2023-06-28 22:55:11 +00:00
Kevin Lannen
5666c56903 STM32G4: Add CRS support to RCC
Create working CRS USB Example
2023-06-28 16:53:16 -06:00
JuliDi
d5898c11eb
remove need for StaticCell in dac_dma example for stm32l4 2023-06-28 16:40:50 +02:00
JuliDi
daedfbbd87
add dma is_running change doc 2023-06-28 15:39:36 +02:00
JuliDi
bf7e24e9d7
revert to STM32L4S5VI 2023-06-28 15:37:29 +02:00
JuliDi
02f367f733
attempt at fixing ci 2023-06-28 15:28:10 +02:00
JuliDi
f2e7a23148
attempt at fixing ci 2023-06-28 15:25:57 +02:00
JuliDi
27a89019ad
add doc 2023-06-28 15:21:24 +02:00
Dario Nieuwenhuis
2eb7a67c70
Merge pull request #1591 from bugadani/patch-1
Make StackResources::new() const
2023-06-28 13:16:27 +00:00
Dániel Buga
59f829c6cc
Make StackResources::new() const 2023-06-28 15:03:57 +02:00
JuliDi
91c31d5e43
Update DAC examples, add DAC + DMA example 2023-06-28 11:58:25 +02:00
Dario Nieuwenhuis
9b5d7ec061
Merge pull request #1589 from embassy-rs/otg-fixes
stm32/otg: implement VBUS detection, misc fixes so plug/unplug works.
2023-06-27 22:39:00 +00:00
Dario Nieuwenhuis
ed493be869 stm32: update metapac, includes fix for OTG with 9 endpoints (H7) 2023-06-27 23:58:32 +02:00
Dario Nieuwenhuis
f5ca687e9b sync/pipe: fix doc typos. 2023-06-27 23:49:12 +02:00
JuliDi
9c81d63155
fix warnings 2023-06-27 22:33:17 +02:00
JuliDi
60c54107ce
fix sdmmc bdma transferconfig fields 2023-06-27 21:58:56 +02:00
JuliDi
56dd22f0ac
feature-gate set_channel_mode, undo dma.rs changes 2023-06-27 21:23:47 +02:00
JuliDi
afec1b439b
feature-gate dma write, make trigger not return a result 2023-06-27 18:17:51 +02:00
Dario Nieuwenhuis
219ef5b37a stm32/otg: add VBUS detection.
Fixes #1442.
2023-06-27 12:52:37 +02:00
Dario Nieuwenhuis
a2d1e7f02c rp/usb: add TODO: implement VBUS detection. 2023-06-27 04:29:01 +02:00
Dario Nieuwenhuis
5e6e18b310 stm32/usb: add TODO: implement VBUS detection. 2023-06-27 04:29:01 +02:00
Dario Nieuwenhuis
80407aa930 stm32/otg: set tx fifo num in IN endpoints on configure. 2023-06-27 02:12:33 +02:00
Dario Nieuwenhuis
a575e40a35 stm32/otg: clear NAK bit on endpoint enable. 2023-06-27 02:12:06 +02:00
Dario Nieuwenhuis
28fb492c40 stm32/otg: flush fifos on reconfigure and on ep disable. 2023-06-27 00:42:24 +02:00
JuliDi
e7bc84dda8
fix issues when DAC2 present, add additional options to DMA (NOT YET WORKING with STM32H7A3ZI) 2023-06-26 09:42:25 +02:00
JuliDi
8cafaa1f3c
add docs, cleanup 2023-06-25 11:54:25 +02:00
JuliDi
df944edeef
fix minor issues with splitting channels etc 2023-06-25 10:53:35 +02:00
JuliDi
388d3e273d
first attempt at fixing the 2nd channel problem 2023-06-24 13:10:59 +02:00
JuliDi
915f79c974
allow independent use of ch1 and ch2 on dac 2023-06-23 12:14:40 +02:00
JuliDi
ea04a0277b
change dma complete transfer IR default to true 2023-06-23 12:14:26 +02:00
schphil
71afa40a69
Merge branch 'embassy-rs:main' into can-split 2023-06-23 10:19:30 +02:00
Philipp Scheff
89fbb02979 add as_mut 2023-06-22 17:49:33 +02:00
Philipp Scheff
76a334bd7c add as_mut & set loopback true in example 2023-06-22 17:47:58 +02:00
Philipp Scheff
f47a148f51 add stm32f7 can example 2023-06-22 17:18:55 +02:00
Philipp Scheff
5ecf9ec7bc split can 2023-06-22 17:17:51 +02:00
JuliDi
78736328a0
update docs and update to new dma interface 2023-06-22 10:44:08 +02:00
JuliDi
8d0095c618
add option to enable/disable complete transfer interrupt 2023-06-22 10:43:45 +02:00
JuliDi
fdb3c3d6ff
Merge remote-tracking branch 'upstream/main' 2023-06-21 11:52:53 +02:00
JuliDi
56ab6d9f14
remove write_X variants 2023-06-19 13:54:22 +02:00
JuliDi
88052480b1
fix typo, minor cleanup 2023-06-19 13:50:17 +02:00
JuliDi
218b102b28
remove Alignment and make Value and Value array look the same 2023-06-19 13:46:17 +02:00
JuliDi
fe7b72948a
add ValueArray type and respective write functions 2023-06-19 13:42:25 +02:00
JuliDi
e0747e937f
remove unsafe for circular dma reg access 2023-06-19 11:15:09 +02:00
JuliDi
320e2cf35b
Merge branch 'main' of github.com:embassy-rs/embassy 2023-06-19 11:14:48 +02:00
JuliDi
f8ee33abb9
add half transfer interrupt and circular dma 2023-06-18 18:51:36 +02:00
JuliDi
78a2ca8a0e
remove unnecessary use, disable DAC and DMA after transfer 2023-06-17 11:51:57 +02:00
JuliDi
f5d084552d
implement mwe of a DMA write() method for DAC 2023-06-17 11:48:21 +02:00
Quentin Smith
d896f80405 util -> sync rename 2022-08-23 23:02:48 -04:00
Quentin Smith
2900ab79e7 Merge remote-tracking branch 'origin/master' into nrf-pdm 2022-08-23 23:01:51 -04:00
Quentin Smith
14eae9ca06 Optimize pdm_continuous example 2022-08-21 12:40:51 -04:00
Quentin Smith
64154fec8c Demonstrate FFT in example 2022-08-21 02:43:13 -04:00
Quentin Smith
ed97e61dbe PDM clock frequency control 2022-08-21 02:16:26 -04:00
Quentin Smith
029713eca0 Stop PDM sampling when future is dropped 2022-08-21 02:04:11 -04:00
Quentin Smith
3d26573c6b Discard the first N samples due to transients 2022-08-21 01:44:04 -04:00
Quentin Smith
0963b5f92c Add continuous PDM sampling with example 2022-08-20 17:58:54 -04:00
Quentin Smith
530f192acc Set gain at runtime 2022-08-20 17:08:29 -04:00
Quentin Smith
a46f33b214 Initial PDM driver 2022-08-20 16:37:51 -04:00
944 changed files with 46337 additions and 22520 deletions

41
.gitattributes vendored Normal file
View File

@ -0,0 +1,41 @@
* text=auto
*.adoc text
*.html text
*.in text
*.json text
*.md text
*.proto text
*.py text
*.rs text
*.service text
*.sh text
*.toml text
*.txt text
*.x text
*.yml text
*.raw binary
*.bin binary
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.mov binary
*.mp4 binary
*.mp3 binary
*.flv binary
*.fla binary
*.swf binary
*.gz binary
*.zip binary
*.7z binary
*.ttf binary
*.eot binary
*.woff binary
*.pyc binary
*.pdf binary
*.ez binary
*.bz2 binary
*.swp binary

4
.github/bors.toml vendored
View File

@ -1,4 +0,0 @@
status = [
"all",
]
delete_merged_branches = true

29
.github/ci/build-nightly.sh vendored Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
## on push branch~=gh-readonly-queue/main/.*
## on pull_request
set -euo pipefail
export RUSTUP_HOME=/ci/cache/rustup
export CARGO_HOME=/ci/cache/cargo
export CARGO_TARGET_DIR=/ci/cache/target
mv rust-toolchain-nightly.toml rust-toolchain.toml
# needed for "dumb HTTP" transport support
# used when pointing stm32-metapac to a CI-built one.
export CARGO_NET_GIT_FETCH_WITH_CLI=true
# Restore lockfiles
if [ -f /ci/cache/lockfiles.tar ]; then
echo Restoring lockfiles...
tar xf /ci/cache/lockfiles.tar
fi
hashtime restore /ci/cache/filetime.json || true
hashtime save /ci/cache/filetime.json
./ci-nightly.sh
# Save lockfiles
echo Saving lockfiles...
find . -type f -name Cargo.lock -exec tar -cf /ci/cache/lockfiles.tar '{}' \+

15
.github/ci/build.sh vendored
View File

@ -11,9 +11,24 @@ if [ -f /ci/secrets/teleprobe-token.txt ]; then
echo Got teleprobe token! echo Got teleprobe token!
export TELEPROBE_HOST=https://teleprobe.embassy.dev export TELEPROBE_HOST=https://teleprobe.embassy.dev
export TELEPROBE_TOKEN=$(cat /ci/secrets/teleprobe-token.txt) export TELEPROBE_TOKEN=$(cat /ci/secrets/teleprobe-token.txt)
export TELEPROBE_CACHE=/ci/cache/teleprobe_cache.json
fi
# needed for "dumb HTTP" transport support
# used when pointing stm32-metapac to a CI-built one.
export CARGO_NET_GIT_FETCH_WITH_CLI=true
# Restore lockfiles
if [ -f /ci/cache/lockfiles.tar ]; then
echo Restoring lockfiles...
tar xf /ci/cache/lockfiles.tar
fi fi
hashtime restore /ci/cache/filetime.json || true hashtime restore /ci/cache/filetime.json || true
hashtime save /ci/cache/filetime.json hashtime save /ci/cache/filetime.json
./ci.sh ./ci.sh
# Save lockfiles
echo Saving lockfiles...
find . -type f -name Cargo.lock -exec tar -cf /ci/cache/lockfiles.tar '{}' \+

17
.github/ci/crlf.sh vendored Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
## on push branch~=gh-readonly-queue/main/.*
## on pull_request
set -euo pipefail
FILES_WITH_CRLF=$(find ! -path "./.git/*" -not -type d | xargs file -N | (grep " CRLF " || true))
if [ -z "$FILES_WITH_CRLF" ]; then
echo -e "No files with CRLF endings found."
exit 0
else
NR_FILES=$(echo "$FILES_WITH_CRLF" | wc -l)
echo -e "ERROR: Found ${NR_FILES} files with CRLF endings."
echo "$FILES_WITH_CRLF"
exit "$NR_FILES"
fi

60
.github/ci/doc.sh vendored
View File

@ -6,7 +6,7 @@ set -euo pipefail
export RUSTUP_HOME=/ci/cache/rustup export RUSTUP_HOME=/ci/cache/rustup
export CARGO_HOME=/ci/cache/cargo export CARGO_HOME=/ci/cache/cargo
export CARGO_TARGET_DIR=/ci/cache/target export CARGO_TARGET_DIR=/ci/cache/target
export BUILDER_THREADS=6 export BUILDER_THREADS=4
export BUILDER_COMPRESS=true export BUILDER_COMPRESS=true
# force rustup to download the toolchain before starting building. # force rustup to download the toolchain before starting building.
@ -15,30 +15,40 @@ 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-boot/boot -o webroot/crates/embassy-boot/git.zup
docserver-builder -i ./embassy-boot/boot -o crates/embassy-boot/git.zup docserver-builder -i ./embassy-boot/nrf -o webroot/crates/embassy-boot-nrf/git.zup
docserver-builder -i ./embassy-boot/nrf -o crates/embassy-boot-nrf/git.zup docserver-builder -i ./embassy-boot/rp -o webroot/crates/embassy-boot-rp/git.zup
docserver-builder -i ./embassy-boot/rp -o crates/embassy-boot-rp/git.zup docserver-builder -i ./embassy-boot/stm32 -o webroot/crates/embassy-boot-stm32/git.zup
docserver-builder -i ./embassy-boot/stm32 -o crates/embassy-boot-stm32/git.zup docserver-builder -i ./embassy-embedded-hal -o webroot/crates/embassy-embedded-hal/git.zup
docserver-builder -i ./embassy-embedded-hal -o crates/embassy-embedded-hal/git.zup docserver-builder -i ./embassy-executor -o webroot/crates/embassy-executor/git.zup
docserver-builder -i ./embassy-executor -o crates/embassy-executor/git.zup docserver-builder -i ./embassy-futures -o webroot/crates/embassy-futures/git.zup
docserver-builder -i ./embassy-futures -o crates/embassy-futures/git.zup docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup
docserver-builder -i ./embassy-lora -o crates/embassy-lora/git.zup docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup
docserver-builder -i ./embassy-net -o crates/embassy-net/git.zup docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup
docserver-builder -i ./embassy-net-driver -o crates/embassy-net-driver/git.zup docserver-builder -i ./embassy-nrf -o webroot/crates/embassy-nrf/git.zup
docserver-builder -i ./embassy-net-driver-channel -o crates/embassy-net-driver-channel/git.zup docserver-builder -i ./embassy-rp -o webroot/crates/embassy-rp/git.zup
docserver-builder -i ./embassy-nrf -o crates/embassy-nrf/git.zup docserver-builder -i ./embassy-sync -o webroot/crates/embassy-sync/git.zup
docserver-builder -i ./embassy-rp -o crates/embassy-rp/git.zup docserver-builder -i ./embassy-time -o webroot/crates/embassy-time/git.zup
docserver-builder -i ./embassy-sync -o crates/embassy-sync/git.zup docserver-builder -i ./embassy-usb -o webroot/crates/embassy-usb/git.zup
docserver-builder -i ./embassy-time -o crates/embassy-time/git.zup docserver-builder -i ./embassy-usb-driver -o webroot/crates/embassy-usb-driver/git.zup
docserver-builder -i ./embassy-usb -o crates/embassy-usb/git.zup docserver-builder -i ./embassy-usb-logger -o webroot/crates/embassy-usb-logger/git.zup
docserver-builder -i ./embassy-usb-driver -o crates/embassy-usb-driver/git.zup docserver-builder -i ./cyw43 -o webroot/crates/cyw43/git.zup
docserver-builder -i ./embassy-usb-logger -o crates/embassy-usb-logger/git.zup docserver-builder -i ./cyw43-pio -o webroot/crates/cyw43-pio/git.zup
docserver-builder -i ./cyw43 -o crates/cyw43/git.zup docserver-builder -i ./embassy-net-wiznet -o webroot/crates/embassy-net-wiznet/git.zup
docserver-builder -i ./cyw43-pio -o crates/cyw43-pio/git.zup docserver-builder -i ./embassy-net-enc28j60 -o webroot/crates/embassy-net-enc28j60/git.zup
docserver-builder -i ./embassy-net-w5500 -o crates/embassy-net-w5500/git.zup docserver-builder -i ./embassy-net-esp-hosted -o webroot/crates/embassy-net-esp-hosted/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
docserver-builder -i ./embassy-net-adin1110 -o webroot/crates/embassy-net-adin1110/git.zup
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
# build and upload stm32 last
# so that it doesn't prevent other crates from getting docs updates when it breaks.
rm -rf webroot
docserver-builder -i ./embassy-stm32 -o webroot/crates/embassy-stm32/git.zup
POD=$(kubectl -n embassy get po -l app=docserver -o jsonpath={.items[0].metadata.name})
kubectl cp webroot/crates $POD:/data

View File

@ -7,10 +7,6 @@ set -euo pipefail
export RUSTUP_HOME=/ci/cache/rustup export RUSTUP_HOME=/ci/cache/rustup
export CARGO_HOME=/ci/cache/cargo export CARGO_HOME=/ci/cache/cargo
export CARGO_TARGET_DIR=/ci/cache/target export CARGO_TARGET_DIR=/ci/cache/target
mv rust-toolchain-nightly.toml rust-toolchain.toml
hashtime restore /ci/cache/filetime.json || true find . -name '*.rs' -not -path '*target*' | xargs rustfmt --check --skip-children --unstable-features --edition 2021
hashtime save /ci/cache/filetime.json
sed -i 's/channel.*/channel = "stable"/g' rust-toolchain.toml
./ci_stable.sh

13
.github/ci/test-nightly.sh vendored Executable file
View File

@ -0,0 +1,13 @@
#!/bin/bash
## on push branch~=gh-readonly-queue/main/.*
## on pull_request
set -euo pipefail
export RUSTUP_HOME=/ci/cache/rustup
export CARGO_HOME=/ci/cache/cargo
export CARGO_TARGET_DIR=/ci/cache/target
mv rust-toolchain-nightly.toml rust-toolchain.toml
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml --features nightly

22
.github/ci/test.sh vendored
View File

@ -8,23 +8,21 @@ export RUSTUP_HOME=/ci/cache/rustup
export CARGO_HOME=/ci/cache/cargo export CARGO_HOME=/ci/cache/cargo
export CARGO_TARGET_DIR=/ci/cache/target export CARGO_TARGET_DIR=/ci/cache/target
hashtime restore /ci/cache/filetime.json || true
hashtime save /ci/cache/filetime.json
cargo test --manifest-path ./embassy-sync/Cargo.toml cargo test --manifest-path ./embassy-sync/Cargo.toml
cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml
cargo test --manifest-path ./embassy-hal-common/Cargo.toml cargo test --manifest-path ./embassy-hal-internal/Cargo.toml
cargo test --manifest-path ./embassy-time/Cargo.toml --features generic-queue cargo test --manifest-path ./embassy-time/Cargo.toml --features generic-queue
cargo test --manifest-path ./embassy-boot/boot/Cargo.toml cargo test --manifest-path ./embassy-boot/boot/Cargo.toml
cargo test --manifest-path ./embassy-boot/boot/Cargo.toml --features nightly cargo test --manifest-path ./embassy-boot/boot/Cargo.toml --features ed25519-dalek
cargo test --manifest-path ./embassy-boot/boot/Cargo.toml --features nightly,ed25519-dalek cargo test --manifest-path ./embassy-boot/boot/Cargo.toml --features ed25519-salty
cargo test --manifest-path ./embassy-boot/boot/Cargo.toml --features nightly,ed25519-salty
cargo test --manifest-path ./embassy-nrf/Cargo.toml --no-default-features --features nightly,nrf52840,time-driver-rtc1,gpiote cargo test --manifest-path ./embassy-nrf/Cargo.toml --no-default-features --features nrf52840,time-driver-rtc1,gpiote
cargo test --manifest-path ./embassy-rp/Cargo.toml --no-default-features --features nightly,time-driver cargo test --manifest-path ./embassy-rp/Cargo.toml --no-default-features --features time-driver
cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features nightly,stm32f429vg,exti,time-driver-any,exti cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features stm32f429vg,exti,time-driver-any,exti
cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features nightly,stm32f732ze,exti,time-driver-any,exti cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features stm32f732ze,exti,time-driver-any,exti
cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features nightly,stm32f769ni,exti,time-driver-any,exti cargo test --manifest-path ./embassy-stm32/Cargo.toml --no-default-features --features stm32f769ni,exti,time-driver-any,exti
cargo test --manifest-path ./embassy-net-adin1110/Cargo.toml

19
.vscode/settings.json vendored
View File

@ -3,19 +3,23 @@
"[toml]": { "[toml]": {
"editor.formatOnSave": false "editor.formatOnSave": false
}, },
"[markdown]": {
"editor.formatOnSave": false
},
"rust-analyzer.check.allTargets": false, "rust-analyzer.check.allTargets": false,
"rust-analyzer.check.noDefaultFeatures": true, "rust-analyzer.check.noDefaultFeatures": true,
"rust-analyzer.cargo.noDefaultFeatures": true, "rust-analyzer.cargo.noDefaultFeatures": true,
"rust-analyzer.showUnlinkedFileNotification": false,
// uncomment the target of your chip.
//"rust-analyzer.cargo.target": "thumbv6m-none-eabi",
//"rust-analyzer.cargo.target": "thumbv7m-none-eabi",
"rust-analyzer.cargo.target": "thumbv7em-none-eabi", "rust-analyzer.cargo.target": "thumbv7em-none-eabi",
//"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf", //"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf",
"rust-analyzer.cargo.features": [
"nightly",
],
"rust-analyzer.linkedProjects": [ "rust-analyzer.linkedProjects": [
// Declare for the target you wish to develop // Uncomment ONE line for the chip you want to work on.
// "embassy-executor/Cargo.toml", // This makes rust-analyzer work on the example crate and all its dependencies.
// "embassy-sync/Cargo.toml", "examples/stm32l4/Cargo.toml",
"examples/nrf52840/Cargo.toml", // "examples/nrf52840-rtic/Cargo.toml",
// "examples/nrf5340/Cargo.toml", // "examples/nrf5340/Cargo.toml",
// "examples/nrf-rtos-trace/Cargo.toml", // "examples/nrf-rtos-trace/Cargo.toml",
// "examples/rp/Cargo.toml", // "examples/rp/Cargo.toml",
@ -25,6 +29,7 @@
// "examples/stm32f1/Cargo.toml", // "examples/stm32f1/Cargo.toml",
// "examples/stm32f2/Cargo.toml", // "examples/stm32f2/Cargo.toml",
// "examples/stm32f3/Cargo.toml", // "examples/stm32f3/Cargo.toml",
// "examples/stm32f334/Cargo.toml",
// "examples/stm32f4/Cargo.toml", // "examples/stm32f4/Cargo.toml",
// "examples/stm32f7/Cargo.toml", // "examples/stm32f7/Cargo.toml",
// "examples/stm32g0/Cargo.toml", // "examples/stm32g0/Cargo.toml",

View File

@ -33,9 +33,10 @@ The <a href="https://docs.embassy.dev/embassy-net/">embassy-net</a> network stac
- **Bluetooth** - - **Bluetooth** -
The <a href="https://github.com/embassy-rs/nrf-softdevice">nrf-softdevice</a> crate provides Bluetooth Low Energy 4.x and 5.x support for nRF52 microcontrollers. The <a href="https://github.com/embassy-rs/nrf-softdevice">nrf-softdevice</a> crate provides Bluetooth Low Energy 4.x and 5.x support for nRF52 microcontrollers.
The <a href="https://github.com/embassy-rs/embassy/tree/main/embassy-stm32-wpan">embassy-stm32-wpan</a> crate provides Bluetooth Low Energy 5.x support for stm32wb microcontrollers.
- **LoRa** - - **LoRa** -
<a href="https://docs.embassy.dev/embassy-lora/">embassy-lora</a> supports LoRa networking. <a href="hthttps://github.com/lora-rs/lora-rs">The lora-rs project</a> provides an async LoRa and LoRaWAN stack that works well on Embassy.
- **USB** - - **USB** -
<a href="https://docs.embassy.dev/embassy-usb/">embassy-usb</a> implements a device-side USB stack. Implementations for common classes such as USB serial (CDC ACM) and USB HID are available, and a rich builder API allows building your own. <a href="https://docs.embassy.dev/embassy-usb/">embassy-usb</a> implements a device-side USB stack. Implementations for common classes such as USB serial (CDC ACM) and USB HID are available, and a rich builder API allows building your own.
@ -61,9 +62,9 @@ async fn blink(pin: AnyPin) {
loop { loop {
// Timekeeping is globally available, no need to mess with hardware timers. // Timekeeping is globally available, no need to mess with hardware timers.
led.set_high(); led.set_high();
Timer::after(Duration::from_millis(150)).await; Timer::after_millis(150).await;
led.set_low(); led.set_low();
Timer::after(Duration::from_millis(150)).await; Timer::after_millis(150).await;
} }
} }
@ -99,10 +100,10 @@ Examples are found in the `examples/` folder seperated by the chip manufacturer
### Running examples ### Running examples
- Install `probe-rs-cli` with defmt support. - Install `probe-rs`.
```bash ```bash
cargo install probe-rs-cli cargo install probe-rs --features cli
``` ```
- Change directory to the sample's base directory. For example: - Change directory to the sample's base directory. For example:
@ -111,6 +112,12 @@ cargo install probe-rs-cli
cd examples/nrf52840 cd examples/nrf52840
``` ```
- Ensure `Cargo.toml` sets the right feature for the name of the chip you are programming.
If this name is incorrect, the example may fail to run or immediately crash
after being programmed.
- Ensure `.cargo/config.toml` contains the name of the chip you are programming.
- Run the example - Run the example
For example: For example:
@ -119,6 +126,8 @@ For example:
cargo run --release --bin blinky cargo run --release --bin blinky
``` ```
For more help getting started, see [Getting Started][1] and [Running the Examples][2].
## Developing Embassy with Rust Analyzer based editors ## Developing Embassy with Rust Analyzer based editors
The [Rust Analyzer](https://rust-analyzer.github.io/) is used by [Visual Studio Code](https://code.visualstudio.com/) The [Rust Analyzer](https://rust-analyzer.github.io/) is used by [Visual Studio Code](https://code.visualstudio.com/)
@ -151,3 +160,5 @@ This work is licensed under either of
at your option. at your option.
[1]: https://github.com/embassy-rs/embassy/wiki/Getting-Started
[2]: https://github.com/embassy-rs/embassy/wiki/Running-the-Examples

30
ci-nightly.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/bash
set -eo pipefail
export RUSTFLAGS=-Dwarnings
export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info
if [[ -z "${CARGO_TARGET_DIR}" ]]; then
export CARGO_TARGET_DIR=target_ci
fi
cargo batch \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,log \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,defmt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32 \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread,integrated-timers \
--- build --release --manifest-path examples/nrf52840-rtic/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840-rtic \

226
ci.sh
View File

@ -1,13 +1,12 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -eo pipefail
export RUSTFLAGS=-Dwarnings export RUSTFLAGS=-Dwarnings
export DEFMT_LOG=trace,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info
if [[ -z "${CARGO_TARGET_DIR}" ]]; then
# needed by wifi examples export CARGO_TARGET_DIR=target_ci
export WIFI_NETWORK=x fi
export WIFI_PASSWORD=x
TARGET=$(rustc -vV | sed -n 's|host: ||p') TARGET=$(rustc -vV | sed -n 's|host: ||p')
@ -16,85 +15,112 @@ if [ $TARGET = "x86_64-unknown-linux-gnu" ]; then
BUILD_EXTRA="--- build --release --manifest-path examples/std/Cargo.toml --target $TARGET --out-dir out/examples/std" BUILD_EXTRA="--- build --release --manifest-path examples/std/Cargo.toml --target $TARGET --out-dir out/examples/std"
fi fi
find . -name '*.rs' -not -path '*target*' | xargs rustfmt --check --skip-children --unstable-features --edition 2021
cargo batch \ cargo batch \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,log \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features log \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,defmt \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features defmt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \
--- build --release --manifest-path embassy-sync/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-time/Cargo.toml --target thumbv6m-none-eabi --features nightly,unstable-traits,defmt,defmt-timestamp-uptime,tick-hz-32_768,generic-queue-8 \ --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32 \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,integrated-timers \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,executor-thread \
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,executor-thread,integrated-timers \
--- build --release --manifest-path embassy-sync/Cargo.toml --target thumbv6m-none-eabi --features defmt \
--- build --release --manifest-path embassy-time/Cargo.toml --target thumbv6m-none-eabi --features defmt,defmt-timestamp-uptime,tick-hz-32_768,generic-queue-8 \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,igmp,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet,unstable-traits \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet,dhcpv4-hostname \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet,nightly \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet,unstable-traits,nightly \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ieee802154 \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet,medium-ieee802154 \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet,unstable-traits \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet,nightly \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet,unstable-traits,nightly \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ethernet \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ethernet,unstable-traits \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ip \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ethernet,nightly \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ip,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ethernet,unstable-traits,nightly \ --- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,proto-ipv6,medium-ip,medium-ethernet,medium-ieee802154 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52805,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52805,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52810,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52810,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52811,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52811,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52820,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52820,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52832,gpiote,time-driver-rtc1,reset-pin-as-gpio \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52832,gpiote,time-driver-rtc1,reset-pin-as-gpio \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52833,gpiote,time-driver-rtc1,unstable-traits,nfc-pins-as-gpio \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52833,gpiote,time-driver-rtc1,nfc-pins-as-gpio \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,nrf9160-s,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-s,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,nrf9160-ns,gpiote,time-driver-rtc1,unstable-traits \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-ns,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,nrf5340-app-s,gpiote,time-driver-rtc1,unstable-traits \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-s,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,nrf5340-app-ns,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-ns,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,nrf5340-net,gpiote,time-driver-rtc1,unstable-traits \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-net,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52840,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52840,log,gpiote,time-driver-rtc1 \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,log,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nightly,nrf52840,defmt,gpiote,time-driver-rtc1,unstable-traits \ --- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,defmt,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features nightly,unstable-traits,defmt \ --- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features defmt \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features nightly,unstable-traits,log \ --- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features log \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features nightly,unstable-traits \ --- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features intrinsics \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features nightly \ --- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features qspi-as-gpio \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features nightly,intrinsics \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time-driver-any \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f401ve,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,exti,time-driver-any \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f405zg,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,time-driver-any \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f407zg,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f401ve,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,exti \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f405zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt,exti,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f407zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,nightly,defmt \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f410tb,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32f410tb,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f411ce,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32f411ce,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f412zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32f413vh,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f413vh,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32f429zi,log,exti,time-driver-any,unstable-traits,embedded-sdmmc \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f415zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32f730i8,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f417zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32h755zi-cm7,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f423zh,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32h7b3ai,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f427zi,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32l476vg,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32l422cb,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f437zi,log,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32wb15cc,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f439zi,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features nightly,stm32l072cz,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f446ze,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features nightly,stm32l041f6,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f469zi,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32l151cb-a,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f479zi,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32f398ve,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f730i8,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features nightly,stm32g0c1ve,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h753zi,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32f217zg,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h735zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features nightly,stm32l552ze,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features nightly,stm32wl54jc-cm0p,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h725re,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features nightly,stm32wle5jb,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h7b3ai,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32f107vc,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32f103re,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l422cb,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32f100c4,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb15cc,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32h503rb,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features nightly,stm32h562ag,defmt,exti,time-driver-any,unstable-traits \ --- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l041f6,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l073cz,defmt,exti,time-driver-any,low-power,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f398ve,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f378cc,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32g0c1ve,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f217zg,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32wl54jc-cm0p,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wle5jb,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g474pe,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f107vc,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f103re,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f100c4,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32h503rb,defmt,exti,time-driver-any,time \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32h562ag,defmt,exti,time-driver-any,time \
--- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features ''\ --- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features ''\
--- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'log' \ --- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'log' \
--- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'defmt' \ --- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'defmt' \
@ -102,23 +128,23 @@ cargo batch \
--- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'defmt,firmware-logs' \ --- build --release --manifest-path cyw43/Cargo.toml --target thumbv6m-none-eabi --features 'defmt,firmware-logs' \
--- build --release --manifest-path cyw43-pio/Cargo.toml --target thumbv6m-none-eabi --features '' \ --- build --release --manifest-path cyw43-pio/Cargo.toml --target thumbv6m-none-eabi --features '' \
--- build --release --manifest-path cyw43-pio/Cargo.toml --target thumbv6m-none-eabi --features 'overclock' \ --- build --release --manifest-path cyw43-pio/Cargo.toml --target thumbv6m-none-eabi --features 'overclock' \
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840,nightly \ --- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns,nightly \ --- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \
--- build --release --manifest-path embassy-boot/rp/Cargo.toml --target thumbv6m-none-eabi --features nightly \ --- build --release --manifest-path embassy-boot/rp/Cargo.toml --target thumbv6m-none-eabi \
--- build --release --manifest-path embassy-boot/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4,nightly \ --- build --release --manifest-path embassy-boot/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \
--- build --release --manifest-path docs/modules/ROOT/examples/basic/Cargo.toml --target thumbv7em-none-eabi \ --- build --release --manifest-path docs/modules/ROOT/examples/basic/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-pac/Cargo.toml --target thumbv7em-none-eabi \ --- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-pac/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-hal/Cargo.toml --target thumbv7em-none-eabi \ --- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-hal/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-irq/Cargo.toml --target thumbv7em-none-eabi \ --- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-irq/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-async/Cargo.toml --target thumbv7em-none-eabi \ --- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-async/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840 \ --- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840 \
--- build --release --manifest-path examples/nrf52840-rtic/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840-rtic \
--- build --release --manifest-path examples/nrf5340/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/nrf5340 \ --- build --release --manifest-path examples/nrf5340/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/nrf5340 \
--- build --release --manifest-path examples/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/rp \ --- build --release --manifest-path examples/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/rp \
--- build --release --manifest-path examples/stm32f0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32f0 \ --- build --release --manifest-path examples/stm32f0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32f0 \
--- build --release --manifest-path examples/stm32f1/Cargo.toml --target thumbv7m-none-eabi --out-dir out/examples/stm32f1 \ --- build --release --manifest-path examples/stm32f1/Cargo.toml --target thumbv7m-none-eabi --out-dir out/examples/stm32f1 \
--- build --release --manifest-path examples/stm32f2/Cargo.toml --target thumbv7m-none-eabi --out-dir out/examples/stm32f2 \ --- build --release --manifest-path examples/stm32f2/Cargo.toml --target thumbv7m-none-eabi --out-dir out/examples/stm32f2 \
--- build --release --manifest-path examples/stm32f3/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32f3 \ --- build --release --manifest-path examples/stm32f3/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32f3 \
--- build --release --manifest-path examples/stm32f334/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32f334 \
--- build --release --manifest-path examples/stm32f4/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/stm32f4 \ --- build --release --manifest-path examples/stm32f4/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/stm32f4 \
--- build --release --manifest-path examples/stm32f7/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32f7 \ --- build --release --manifest-path examples/stm32f7/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32f7 \
--- build --release --manifest-path examples/stm32c0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32c0 \ --- build --release --manifest-path examples/stm32c0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32c0 \
@ -132,9 +158,10 @@ cargo batch \
--- build --release --manifest-path examples/stm32l5/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/stm32l5 \ --- build --release --manifest-path examples/stm32l5/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/stm32l5 \
--- build --release --manifest-path examples/stm32u5/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/stm32u5 \ --- build --release --manifest-path examples/stm32u5/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/stm32u5 \
--- build --release --manifest-path examples/stm32wb/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32wb \ --- build --release --manifest-path examples/stm32wb/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32wb \
--- build --release --manifest-path examples/stm32wba/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/stm32wba \
--- build --release --manifest-path examples/stm32wl/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32wl \ --- build --release --manifest-path examples/stm32wl/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/stm32wl \
--- build --release --manifest-path examples/boot/application/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840,skip-include --out-dir out/examples/boot/nrf \ --- build --release --manifest-path examples/boot/application/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840,skip-include --out-dir out/examples/boot/nrf52840 \
--- build --release --manifest-path examples/boot/application/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns,skip-include --out-dir out/examples/boot/nrf \ --- build --release --manifest-path examples/boot/application/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns,skip-include --out-dir out/examples/boot/nrf9160 \
--- build --release --manifest-path examples/boot/application/rp/Cargo.toml --target thumbv6m-none-eabi --features skip-include --out-dir out/examples/boot/rp \ --- build --release --manifest-path examples/boot/application/rp/Cargo.toml --target thumbv6m-none-eabi --features skip-include --out-dir out/examples/boot/rp \
--- build --release --manifest-path examples/boot/application/stm32f3/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32f3 \ --- build --release --manifest-path examples/boot/application/stm32f3/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32f3 \
--- build --release --manifest-path examples/boot/application/stm32f7/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32f7 \ --- build --release --manifest-path examples/boot/application/stm32f7/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32f7 \
@ -143,26 +170,55 @@ cargo batch \
--- build --release --manifest-path examples/boot/application/stm32l1/Cargo.toml --target thumbv7m-none-eabi --features skip-include --out-dir out/examples/boot/stm32l1 \ --- build --release --manifest-path examples/boot/application/stm32l1/Cargo.toml --target thumbv7m-none-eabi --features skip-include --out-dir out/examples/boot/stm32l1 \
--- build --release --manifest-path examples/boot/application/stm32l4/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32l4 \ --- build --release --manifest-path examples/boot/application/stm32l4/Cargo.toml --target thumbv7em-none-eabi --features skip-include --out-dir out/examples/boot/stm32l4 \
--- build --release --manifest-path examples/boot/application/stm32wl/Cargo.toml --target thumbv7em-none-eabihf --features skip-include --out-dir out/examples/boot/stm32wl \ --- build --release --manifest-path examples/boot/application/stm32wl/Cargo.toml --target thumbv7em-none-eabihf --features skip-include --out-dir out/examples/boot/stm32wl \
--- build --release --manifest-path examples/boot/application/stm32wb-dfu/Cargo.toml --target thumbv7em-none-eabihf --out-dir out/examples/boot/stm32wb-dfu \
--- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \ --- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \
--- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \ --- build --release --manifest-path examples/boot/bootloader/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \
--- build --release --manifest-path examples/boot/bootloader/rp/Cargo.toml --target thumbv6m-none-eabi \ --- build --release --manifest-path examples/boot/bootloader/rp/Cargo.toml --target thumbv6m-none-eabi \
--- build --release --manifest-path examples/boot/bootloader/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \ --- build --release --manifest-path examples/boot/bootloader/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \
--- build --release --manifest-path examples/boot/bootloader/stm32wb-dfu/Cargo.toml --target thumbv7em-none-eabihf \
--- build --release --manifest-path examples/wasm/Cargo.toml --target wasm32-unknown-unknown --out-dir out/examples/wasm \ --- build --release --manifest-path examples/wasm/Cargo.toml --target wasm32-unknown-unknown --out-dir out/examples/wasm \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f103c8 --out-dir out/tests/stm32f103c8 \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f103c8 --out-dir out/tests/stm32f103c8 \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi --out-dir out/tests/stm32f429zi \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi --out-dir out/tests/stm32f429zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f446re --out-dir out/tests/stm32f446re \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g491re --out-dir out/tests/stm32g491re \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g491re --out-dir out/tests/stm32g491re \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32g071rb --out-dir out/tests/stm32g071rb \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32g071rb --out-dir out/tests/stm32g071rb \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32c031c6 --out-dir out/tests/stm32c031c6 \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32c031c6 --out-dir out/tests/stm32c031c6 \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi --out-dir out/tests/stm32h755zi \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi --out-dir out/tests/stm32h755zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h753zi --out-dir out/tests/stm32h753zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h7a3zi --out-dir out/tests/stm32h7a3zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55rg --out-dir out/tests/stm32wb55rg \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55rg --out-dir out/tests/stm32wb55rg \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h563zi --out-dir out/tests/stm32h563zi \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h563zi --out-dir out/tests/stm32h563zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585ai --out-dir out/tests/stm32u585ai \ --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585ai --out-dir out/tests/stm32u585ai \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u5a5zj --out-dir out/tests/stm32u5a5zj \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wba52cg --out-dir out/tests/stm32wba52cg \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l073rz --out-dir out/tests/stm32l073rz \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l152re --out-dir out/tests/stm32l152re \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l4a6zg --out-dir out/tests/stm32l4a6zg \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l4r5zi --out-dir out/tests/stm32l4r5zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv8m.main-none-eabihf --features stm32l552ze --out-dir out/tests/stm32l552ze \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f767zi --out-dir out/tests/stm32f767zi \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f207zg --out-dir out/tests/stm32f207zg \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f303ze --out-dir out/tests/stm32f303ze \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l496zg --out-dir out/tests/stm32l496zg \
--- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wl55jc --out-dir out/tests/stm32wl55jc \
--- build --release --manifest-path tests/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/tests/rpi-pico \ --- build --release --manifest-path tests/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/tests/rpi-pico \
--- build --release --manifest-path tests/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/nrf52840-dk \ --- build --release --manifest-path tests/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/nrf52840-dk \
--- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \ --- build --release --manifest-path tests/riscv32/Cargo.toml --target riscv32imac-unknown-none-elf \
$BUILD_EXTRA $BUILD_EXTRA
rm out/tests/stm32wb55rg/wpan_mac
rm out/tests/stm32wb55rg/wpan_ble
# not in CI yet.
rm -rf out/tests/stm32f446re
# unstable, I think it's running out of RAM?
rm out/tests/stm32f207zg/eth
# doesn't work, gives "noise error", no idea why. usart_dma does pass.
rm out/tests/stm32u5a5zj/usart
if [[ -z "${TELEPROBE_TOKEN-}" ]]; then if [[ -z "${TELEPROBE_TOKEN-}" ]]; then
echo No teleprobe token found, skipping running HIL tests echo No teleprobe token found, skipping running HIL tests
exit exit

View File

@ -1,73 +0,0 @@
#!/bin/bash
set -euo pipefail
export RUSTFLAGS=-Dwarnings
export DEFMT_LOG=trace
cargo batch \
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \
--- build --release --manifest-path embassy-boot/rp/Cargo.toml --target thumbv6m-none-eabi \
--- build --release --manifest-path embassy-boot/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features log \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features defmt \
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet,unstable-traits \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet \
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet,unstable-traits \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52805,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52810,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52811,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52820,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52832,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52833,gpiote,time-driver-rtc1,unstable-traits \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-s,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-ns,gpiote,time-driver-rtc1,unstable-traits \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-s,gpiote,time-driver-rtc1,unstable-traits \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-ns,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-net,gpiote,time-driver-rtc1,unstable-traits \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,log,gpiote,time-driver-rtc1 \
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,defmt,gpiote,time-driver-rtc1,unstable-traits \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features unstable-traits,defmt \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features unstable-traits,log \
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g473cc,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g491re,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585zi,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55vy,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wl55cc-cm4,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l4r9zi,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f303vc,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f411ce,defmt,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f411ce,defmt,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f410tb,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f410tb,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f217zg,defmt,exti,time-driver-any \
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f217zg,defmt,exti,time-driver-any,unstable-traits \
--- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --no-default-features --out-dir out/examples/nrf52840 --bin raw_spawn \
--- build --release --manifest-path examples/stm32l0/Cargo.toml --target thumbv6m-none-eabi --no-default-features --out-dir out/examples/stm32l0 --bin raw_spawn \

Binary file not shown.

Binary file not shown.

View File

@ -3,3 +3,7 @@
Firmware obtained from https://github.com/Infineon/wifi-host-driver/tree/master/WiFi_Host_Driver/resources/firmware/COMPONENT_43439 Firmware obtained from https://github.com/Infineon/wifi-host-driver/tree/master/WiFi_Host_Driver/resources/firmware/COMPONENT_43439
Licensed under the [Infineon Permissive Binary License](./LICENSE-permissive-binary-license-1.0.txt) Licensed under the [Infineon Permissive Binary License](./LICENSE-permissive-binary-license-1.0.txt)
## Changelog
* 2023-07-28: synced with `ad3bad0` - Update 43439 fw from 7.95.55 ot 7.95.62

17
cyw43-pio/README.md Normal file
View File

@ -0,0 +1,17 @@
# cyw43-pio
RP2040 PIO driver for the nonstandard half-duplex SPI used in the Pico W. The PIO driver offloads SPI communication with the WiFi chip and improves throughput.
## Minimum supported Rust version (MSRV)
Embassy is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release.
## License
This work is licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
<http://www.apache.org/licenses/LICENSE-2.0>)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
at your option.

View File

@ -1,18 +1,19 @@
#![no_std] #![no_std]
#![allow(incomplete_features)] #![allow(async_fn_in_trait)]
#![feature(async_fn_in_trait)] #![doc = include_str!("../README.md")]
#![warn(missing_docs)]
use core::slice; use core::slice;
use cyw43::SpiBusCyw43; use cyw43::SpiBusCyw43;
use embassy_rp::dma::Channel; use embassy_rp::dma::Channel;
use embassy_rp::gpio::{Drive, Level, Output, Pin, Pull, SlewRate}; use embassy_rp::gpio::{Drive, Level, Output, Pin, Pull, SlewRate};
use embassy_rp::pio::{Common, Config, Direction, Instance, Irq, PioPin, ShiftDirection, StateMachine}; use embassy_rp::pio::{instr, Common, Config, Direction, Instance, Irq, PioPin, ShiftDirection, StateMachine};
use embassy_rp::relocate::RelocatedProgram; use embassy_rp::{Peripheral, PeripheralRef};
use embassy_rp::{pio_instr_util, Peripheral, PeripheralRef};
use fixed::FixedU32; use fixed::FixedU32;
use pio_proc::pio_asm; use pio_proc::pio_asm;
/// SPI comms driven by PIO.
pub struct PioSpi<'d, CS: Pin, PIO: Instance, const SM: usize, DMA> { pub struct PioSpi<'d, CS: Pin, PIO: Instance, const SM: usize, DMA> {
cs: Output<'d, CS>, cs: Output<'d, CS>,
sm: StateMachine<'d, PIO, SM>, sm: StateMachine<'d, PIO, SM>,
@ -27,6 +28,7 @@ where
CS: Pin, CS: Pin,
PIO: Instance, PIO: Instance,
{ {
/// Create a new instance of PioSpi.
pub fn new<DIO, CLK>( pub fn new<DIO, CLK>(
common: &mut Common<'d, PIO>, common: &mut Common<'d, PIO>,
mut sm: StateMachine<'d, PIO, SM>, mut sm: StateMachine<'d, PIO, SM>,
@ -88,8 +90,6 @@ where
".wrap" ".wrap"
); );
let relocated = RelocatedProgram::new(&program.program);
let mut pin_io: embassy_rp::pio::Pin<PIO> = common.make_pio_pin(dio); let mut pin_io: embassy_rp::pio::Pin<PIO> = common.make_pio_pin(dio);
pin_io.set_pull(Pull::None); pin_io.set_pull(Pull::None);
pin_io.set_schmitt(true); pin_io.set_schmitt(true);
@ -102,7 +102,8 @@ where
pin_clk.set_slew_rate(SlewRate::Fast); pin_clk.set_slew_rate(SlewRate::Fast);
let mut cfg = Config::default(); let mut cfg = Config::default();
cfg.use_program(&common.load_program(&relocated), &[&pin_clk]); let loaded_program = common.load_program(&program.program);
cfg.use_program(&loaded_program, &[&pin_clk]);
cfg.set_out_pins(&[&pin_io]); cfg.set_out_pins(&[&pin_io]);
cfg.set_in_pins(&[&pin_io]); cfg.set_in_pins(&[&pin_io]);
cfg.set_set_pins(&[&pin_io]); cfg.set_set_pins(&[&pin_io]);
@ -142,10 +143,11 @@ where
sm, sm,
irq, irq,
dma: dma.into_ref(), dma: dma.into_ref(),
wrap_target: relocated.wrap().target, wrap_target: loaded_program.wrap.target,
} }
} }
/// Write data to peripheral and return status.
pub async fn write(&mut self, write: &[u32]) -> u32 { pub async fn write(&mut self, write: &[u32]) -> u32 {
self.sm.set_enable(false); self.sm.set_enable(false);
let write_bits = write.len() * 32 - 1; let write_bits = write.len() * 32 - 1;
@ -155,10 +157,10 @@ where
defmt::trace!("write={} read={}", write_bits, read_bits); defmt::trace!("write={} read={}", write_bits, read_bits);
unsafe { unsafe {
pio_instr_util::set_x(&mut self.sm, write_bits as u32); instr::set_x(&mut self.sm, write_bits as u32);
pio_instr_util::set_y(&mut self.sm, read_bits as u32); instr::set_y(&mut self.sm, read_bits as u32);
pio_instr_util::set_pindir(&mut self.sm, 0b1); instr::set_pindir(&mut self.sm, 0b1);
pio_instr_util::exec_jmp(&mut self.sm, self.wrap_target); instr::exec_jmp(&mut self.sm, self.wrap_target);
} }
self.sm.set_enable(true); self.sm.set_enable(true);
@ -173,6 +175,7 @@ where
status status
} }
/// Send command and read response into buffer.
pub async fn cmd_read(&mut self, cmd: u32, read: &mut [u32]) -> u32 { pub async fn cmd_read(&mut self, cmd: u32, read: &mut [u32]) -> u32 {
self.sm.set_enable(false); self.sm.set_enable(false);
let write_bits = 31; let write_bits = 31;
@ -182,10 +185,10 @@ where
defmt::trace!("write={} read={}", write_bits, read_bits); defmt::trace!("write={} read={}", write_bits, read_bits);
unsafe { unsafe {
pio_instr_util::set_y(&mut self.sm, read_bits as u32); instr::set_y(&mut self.sm, read_bits as u32);
pio_instr_util::set_x(&mut self.sm, write_bits as u32); instr::set_x(&mut self.sm, write_bits as u32);
pio_instr_util::set_pindir(&mut self.sm, 0b1); instr::set_pindir(&mut self.sm, 0b1);
pio_instr_util::exec_jmp(&mut self.sm, self.wrap_target); instr::exec_jmp(&mut self.sm, self.wrap_target);
} }
// self.cs.set_low(); // self.cs.set_low();

View File

@ -11,11 +11,10 @@ log = ["dep:log"]
firmware-logs = [] firmware-logs = []
[dependencies] [dependencies]
embassy-time = { version = "0.1.0", path = "../embassy-time"} embassy-time = { version = "0.2", path = "../embassy-time"}
embassy-sync = { version = "0.2.0", path = "../embassy-sync"} embassy-sync = { version = "0.5.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.2.0", path = "../embassy-net-driver-channel"}
atomic-polyfill = "0.1.5"
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }
log = { version = "0.4.17", optional = true } log = { version = "0.4.17", optional = true }
@ -24,7 +23,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-rc.3" }
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]

View File

@ -1,6 +1,6 @@
# cyw43 # cyw43
WIP driver for the CYW43439 wifi chip, used in the Raspberry Pi Pico W. Implementation based on [Infineon/wifi-host-driver](https://github.com/Infineon/wifi-host-driver). Rust driver for the CYW43439 wifi chip, used in the Raspberry Pi Pico W. Implementation based on [Infineon/wifi-host-driver](https://github.com/Infineon/wifi-host-driver).
## Current status ## Current status
@ -19,18 +19,18 @@ Working:
TODO: TODO:
- Setting a custom MAC address. - Setting a custom MAC address.
- Bus sleep (unclear what the benefit is. Is it needed for IRQs? or is it just power consumption optimization?) - Bus sleep (for power consumption optimization)
## Running the examples ## Running the examples
- `cargo install probe-rs-cli` - `cargo install probe-rs --features cli`
- `cd examples/rpi-pico-w` - `cd examples/rp`
### Example 1: Scan the wifi stations ### Example 1: Scan the wifi stations
- `cargo run --release --bin wifi_scan` - `cargo run --release --bin wifi_scan`
### Example 2: Create an access point (IP and credentials in the code) ### Example 2: Create an access point (IP and credentials in the code)
- `cargo run --release --bin tcp_server_ap` - `cargo run --release --bin wifi_ap_tcp_server`
### Example 3: Connect to an existing network and create a server ### Example 3: Connect to an existing network and create a server
- `WIFI_NETWORK=MyWifiNetwork WIFI_PASSWORD=MyWifiPassword cargo run --release` - `cargo run --release --bin wifi_tcp_server`
After a few seconds, you should see that DHCP picks up an IP address like this After a few seconds, you should see that DHCP picks up an IP address like this
``` ```
@ -45,6 +45,10 @@ nc 192.168.0.250 1234
``` ```
Send it some data, you should see it echoed back and printed in the firmware's logs. Send it some data, you should see it echoed back and printed in the firmware's logs.
## Minimum supported Rust version (MSRV)
Embassy is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release.
## License ## License
This work is licensed under either of This work is licensed under either of

View File

@ -1,5 +1,5 @@
use embassy_futures::yield_now; use embassy_futures::yield_now;
use embassy_time::{Duration, Timer}; use embassy_time::Timer;
use embedded_hal_1::digital::OutputPin; use embedded_hal_1::digital::OutputPin;
use futures::FutureExt; use futures::FutureExt;
@ -51,9 +51,9 @@ where
pub async fn init(&mut self) { pub async fn init(&mut self) {
// Reset // Reset
self.pwr.set_low().unwrap(); self.pwr.set_low().unwrap();
Timer::after(Duration::from_millis(20)).await; Timer::after_millis(20).await;
self.pwr.set_high().unwrap(); self.pwr.set_high().unwrap();
Timer::after(Duration::from_millis(250)).await; Timer::after_millis(250).await;
while self while self
.read32_swapped(REG_BUS_TEST_RO) .read32_swapped(REG_BUS_TEST_RO)
@ -102,7 +102,7 @@ where
cmd_buf[0] = cmd; cmd_buf[0] = cmd;
cmd_buf[1..][..buf.len()].copy_from_slice(buf); cmd_buf[1..][..buf.len()].copy_from_slice(buf);
self.status = self.spi.cmd_write(&cmd_buf).await; self.status = self.spi.cmd_write(&cmd_buf[..buf.len() + 1]).await;
} }
#[allow(unused)] #[allow(unused)]

View File

@ -96,6 +96,7 @@ pub(crate) const IOCTL_CMD_UP: u32 = 2;
pub(crate) const IOCTL_CMD_DOWN: u32 = 3; pub(crate) const IOCTL_CMD_DOWN: u32 = 3;
pub(crate) const IOCTL_CMD_SET_SSID: u32 = 26; pub(crate) const IOCTL_CMD_SET_SSID: u32 = 26;
pub(crate) const IOCTL_CMD_SET_CHANNEL: u32 = 30; pub(crate) const IOCTL_CMD_SET_CHANNEL: u32 = 30;
pub(crate) const IOCTL_CMD_DISASSOC: u32 = 52;
pub(crate) const IOCTL_CMD_ANTDIV: u32 = 64; pub(crate) const IOCTL_CMD_ANTDIV: u32 = 64;
pub(crate) const IOCTL_CMD_SET_AP: u32 = 118; pub(crate) const IOCTL_CMD_SET_AP: u32 = 118;
pub(crate) const IOCTL_CMD_SET_VAR: u32 = 263; pub(crate) const IOCTL_CMD_SET_VAR: u32 = 263;

View File

@ -1,10 +1,10 @@
use core::cmp::{max, min}; use core::cmp::{max, min};
use core::iter::zip;
use ch::driver::LinkState;
use embassy_net_driver_channel as ch; use embassy_net_driver_channel as ch;
use embassy_time::{Duration, Timer}; use embassy_net_driver_channel::driver::{HardwareAddress, LinkState};
use embassy_time::Timer;
pub use crate::bus::SpiBusCyw43;
use crate::consts::*; use crate::consts::*;
use crate::events::{Event, EventSubscriber, Events}; use crate::events::{Event, EventSubscriber, Events};
use crate::fmt::Bytes; use crate::fmt::Bytes;
@ -12,11 +12,23 @@ use crate::ioctl::{IoctlState, IoctlType};
use crate::structs::*; use crate::structs::*;
use crate::{countries, events, PowerManagementMode}; use crate::{countries, events, PowerManagementMode};
/// Control errors.
#[derive(Debug)] #[derive(Debug)]
pub struct Error { pub struct Error {
/// Status code.
pub status: u32, pub status: u32,
} }
/// Multicast errors.
#[derive(Debug)]
pub enum AddMulticastAddressError {
/// Not a multicast address.
NotMulticast,
/// No free address slots.
NoFreeSlots,
}
/// Control driver.
pub struct Control<'a> { pub struct Control<'a> {
state_ch: ch::StateRunner<'a>, state_ch: ch::StateRunner<'a>,
events: &'a Events, events: &'a Events,
@ -32,6 +44,7 @@ impl<'a> Control<'a> {
} }
} }
/// Initialize WiFi controller.
pub async fn init(&mut self, clm: &[u8]) { pub async fn init(&mut self, clm: &[u8]) {
const CHUNK_SIZE: usize = 1024; const CHUNK_SIZE: usize = 1024;
@ -87,22 +100,22 @@ impl<'a> Control<'a> {
self.set_iovar("country", &country_info.to_bytes()).await; self.set_iovar("country", &country_info.to_bytes()).await;
// set country takes some time, next ioctls fail if we don't wait. // set country takes some time, next ioctls fail if we don't wait.
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
// Set antenna to chip antenna // Set antenna to chip antenna
self.ioctl_set_u32(IOCTL_CMD_ANTDIV, 0, 0).await; self.ioctl_set_u32(IOCTL_CMD_ANTDIV, 0, 0).await;
self.set_iovar_u32("bus:txglom", 0).await; self.set_iovar_u32("bus:txglom", 0).await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
//self.set_iovar_u32("apsta", 1).await; // this crashes, also we already did it before...?? //self.set_iovar_u32("apsta", 1).await; // this crashes, also we already did it before...??
//Timer::after(Duration::from_millis(100)).await; //Timer::after_millis(100).await;
self.set_iovar_u32("ampdu_ba_wsize", 8).await; self.set_iovar_u32("ampdu_ba_wsize", 8).await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
self.set_iovar_u32("ampdu_mpdu", 4).await; self.set_iovar_u32("ampdu_mpdu", 4).await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
//self.set_iovar_u32("ampdu_rx_factor", 0).await; // this crashes //self.set_iovar_u32("ampdu_rx_factor", 0).await; // this crashes
//Timer::after(Duration::from_millis(100)).await; //Timer::after_millis(100).await;
// evts // evts
let mut evts = EventMask { let mut evts = EventMask {
@ -121,23 +134,34 @@ impl<'a> Control<'a> {
self.set_iovar("bsscfg:event_msgs", &evts.to_bytes()).await; self.set_iovar("bsscfg:event_msgs", &evts.to_bytes()).await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
// set wifi up // set wifi up
self.ioctl(IoctlType::Set, IOCTL_CMD_UP, 0, &mut []).await; self.up().await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
self.ioctl_set_u32(110, 0, 1).await; // SET_GMODE = auto self.ioctl_set_u32(110, 0, 1).await; // SET_GMODE = auto
self.ioctl_set_u32(142, 0, 0).await; // SET_BAND = any self.ioctl_set_u32(142, 0, 0).await; // SET_BAND = any
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
self.state_ch.set_ethernet_address(mac_addr); self.state_ch.set_hardware_address(HardwareAddress::Ethernet(mac_addr));
debug!("INIT DONE"); debug!("INIT DONE");
} }
/// Set the WiFi interface up.
async fn up(&mut self) {
self.ioctl(IoctlType::Set, IOCTL_CMD_UP, 0, &mut []).await;
}
/// Set the interface down.
async fn down(&mut self) {
self.ioctl(IoctlType::Set, IOCTL_CMD_DOWN, 0, &mut []).await;
}
/// Set power management mode.
pub async fn set_power_management(&mut self, mode: PowerManagementMode) { pub async fn set_power_management(&mut self, mode: PowerManagementMode) {
// power save mode // power save mode
let mode_num = mode.mode(); let mode_num = mode.mode();
@ -150,6 +174,7 @@ impl<'a> Control<'a> {
self.ioctl_set_u32(86, 0, mode_num).await; self.ioctl_set_u32(86, 0, mode_num).await;
} }
/// Join an unprotected network with the provided ssid.
pub async fn join_open(&mut self, ssid: &str) -> Result<(), Error> { pub async fn join_open(&mut self, ssid: &str) -> Result<(), Error> {
self.set_iovar_u32("ampdu_ba_wsize", 8).await; self.set_iovar_u32("ampdu_ba_wsize", 8).await;
@ -167,6 +192,7 @@ impl<'a> Control<'a> {
self.wait_for_join(i).await self.wait_for_join(i).await
} }
/// Join an protected network with the provided ssid and passphrase.
pub async fn join_wpa2(&mut self, ssid: &str, passphrase: &str) -> Result<(), Error> { pub async fn join_wpa2(&mut self, ssid: &str, passphrase: &str) -> Result<(), Error> {
self.set_iovar_u32("ampdu_ba_wsize", 8).await; self.set_iovar_u32("ampdu_ba_wsize", 8).await;
@ -175,7 +201,7 @@ impl<'a> Control<'a> {
self.set_iovar_u32x2("bsscfg:sup_wpa2_eapver", 0, 0xFFFF_FFFF).await; self.set_iovar_u32x2("bsscfg:sup_wpa2_eapver", 0, 0xFFFF_FFFF).await;
self.set_iovar_u32x2("bsscfg:sup_wpa_tmo", 0, 2500).await; self.set_iovar_u32x2("bsscfg:sup_wpa_tmo", 0, 2500).await;
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
let mut pfi = PassphraseInfo { let mut pfi = PassphraseInfo {
len: passphrase.len() as _, len: passphrase.len() as _,
@ -234,16 +260,19 @@ impl<'a> Control<'a> {
} }
} }
/// Set GPIO pin on WiFi chip.
pub async fn gpio_set(&mut self, gpio_n: u8, gpio_en: bool) { pub async fn gpio_set(&mut self, gpio_n: u8, gpio_en: bool) {
assert!(gpio_n < 3); assert!(gpio_n < 3);
self.set_iovar_u32x2("gpioout", 1 << gpio_n, if gpio_en { 1 << gpio_n } else { 0 }) self.set_iovar_u32x2("gpioout", 1 << gpio_n, if gpio_en { 1 << gpio_n } else { 0 })
.await .await
} }
/// Start open access point.
pub async fn start_ap_open(&mut self, ssid: &str, channel: u8) { pub async fn start_ap_open(&mut self, ssid: &str, channel: u8) {
self.start_ap(ssid, "", Security::OPEN, channel).await; self.start_ap(ssid, "", Security::OPEN, channel).await;
} }
/// Start WPA2 protected access point.
pub async fn start_ap_wpa2(&mut self, ssid: &str, passphrase: &str, channel: u8) { pub async fn start_ap_wpa2(&mut self, ssid: &str, passphrase: &str, channel: u8) {
self.start_ap(ssid, passphrase, Security::WPA2_AES_PSK, channel).await; self.start_ap(ssid, passphrase, Security::WPA2_AES_PSK, channel).await;
} }
@ -256,13 +285,13 @@ impl<'a> Control<'a> {
} }
// Temporarily set wifi down // Temporarily set wifi down
self.ioctl(IoctlType::Set, IOCTL_CMD_DOWN, 0, &mut []).await; self.down().await;
// Turn off APSTA mode // Turn off APSTA mode
self.set_iovar_u32("apsta", 0).await; self.set_iovar_u32("apsta", 0).await;
// Set wifi up again // Set wifi up again
self.ioctl(IoctlType::Set, IOCTL_CMD_UP, 0, &mut []).await; self.up().await;
// Turn on AP mode // Turn on AP mode
self.ioctl_set_u32(IOCTL_CMD_SET_AP, 0, 1).await; self.ioctl_set_u32(IOCTL_CMD_SET_AP, 0, 1).await;
@ -287,7 +316,7 @@ impl<'a> Control<'a> {
if security != Security::OPEN { if security != Security::OPEN {
self.set_iovar_u32x2("bsscfg:wpa_auth", 0, 0x0084).await; // wpa_auth = WPA2_AUTH_PSK | WPA_AUTH_PSK self.set_iovar_u32x2("bsscfg:wpa_auth", 0, 0x0084).await; // wpa_auth = WPA2_AUTH_PSK | WPA_AUTH_PSK
Timer::after(Duration::from_millis(100)).await; Timer::after_millis(100).await;
// Set passphrase // Set passphrase
let mut pfi = PassphraseInfo { let mut pfi = PassphraseInfo {
@ -307,6 +336,54 @@ impl<'a> Control<'a> {
self.set_iovar_u32x2("bss", 0, 1).await; // bss = BSS_UP self.set_iovar_u32x2("bss", 0, 1).await; // bss = BSS_UP
} }
/// Add specified address to the list of hardware addresses the device
/// listens on. The address must be a Group address (I/G bit set). Up
/// to 10 addresses are supported by the firmware. Returns the number of
/// address slots filled after adding, or an error.
pub async fn add_multicast_address(&mut self, address: [u8; 6]) -> Result<usize, AddMulticastAddressError> {
// The firmware seems to ignore non-multicast addresses, so let's
// prevent the user from adding them and wasting space.
if address[0] & 0x01 != 1 {
return Err(AddMulticastAddressError::NotMulticast);
}
let mut buf = [0; 64];
self.get_iovar("mcast_list", &mut buf).await;
let n = u32::from_le_bytes(buf[..4].try_into().unwrap()) as usize;
let (used, free) = buf[4..].split_at_mut(n * 6);
if used.chunks(6).any(|a| a == address) {
return Ok(n);
}
if free.len() < 6 {
return Err(AddMulticastAddressError::NoFreeSlots);
}
free[..6].copy_from_slice(&address);
let n = n + 1;
buf[..4].copy_from_slice(&(n as u32).to_le_bytes());
self.set_iovar_v::<80>("mcast_list", &buf).await;
Ok(n)
}
/// Retrieve the list of configured multicast hardware addresses.
pub async fn list_mulistcast_addresses(&mut self, result: &mut [[u8; 6]; 10]) -> usize {
let mut buf = [0; 64];
self.get_iovar("mcast_list", &mut buf).await;
let n = u32::from_le_bytes(buf[..4].try_into().unwrap()) as usize;
let used = &buf[4..][..n * 6];
for (addr, output) in zip(used.chunks(6), result.iter_mut()) {
output.copy_from_slice(addr)
}
n
}
async fn set_iovar_u32x2(&mut self, name: &str, val1: u32, val2: u32) { async fn set_iovar_u32x2(&mut self, name: &str, val1: u32, val2: u32) {
let mut buf = [0; 8]; let mut buf = [0; 8];
buf[0..4].copy_from_slice(&val1.to_le_bytes()); buf[0..4].copy_from_slice(&val1.to_le_bytes());
@ -423,15 +500,21 @@ impl<'a> Control<'a> {
events: &self.events, events: &self.events,
} }
} }
/// Leave the wifi, with which we are currently associated.
pub async fn leave(&mut self) {
self.ioctl(IoctlType::Set, IOCTL_CMD_DISASSOC, 0, &mut []).await;
info!("Disassociated")
}
} }
/// WiFi network scanner.
pub struct Scanner<'a> { pub struct Scanner<'a> {
subscriber: EventSubscriber<'a>, subscriber: EventSubscriber<'a>,
events: &'a Events, events: &'a Events,
} }
impl Scanner<'_> { impl Scanner<'_> {
/// wait for the next found network /// Wait for the next found network.
pub async fn next(&mut self) -> Option<BssInfo> { pub async fn next(&mut self) -> Option<BssInfo> {
let event = self.subscriber.next_message_pure().await; let event = self.subscriber.next_message_pure().await;
if event.header.status != EStatus::PARTIAL { if event.header.status != EStatus::PARTIAL {

View File

@ -83,14 +83,17 @@ macro_rules! todo {
}; };
} }
#[cfg(not(feature = "defmt"))]
macro_rules! unreachable { macro_rules! unreachable {
($($x:tt)*) => { ($($x:tt)*) => {
{ ::core::unreachable!($($x)*)
#[cfg(not(feature = "defmt"))] };
::core::unreachable!($($x)*); }
#[cfg(feature = "defmt")]
::defmt::unreachable!($($x)*); #[cfg(feature = "defmt")]
} macro_rules! unreachable {
($($x:tt)*) => {
::defmt::unreachable!($($x)*)
}; };
} }
@ -226,7 +229,8 @@ impl<T, E> Try for Result<T, E> {
} }
} }
pub struct Bytes<'a>(pub &'a [u8]); #[allow(unused)]
pub(crate) struct Bytes<'a>(pub &'a [u8]);
impl<'a> Debug for Bytes<'a> { impl<'a> Debug for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {

View File

@ -1,8 +1,9 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
#![allow(incomplete_features)] #![allow(async_fn_in_trait)]
#![feature(async_fn_in_trait, type_alias_impl_trait, concat_bytes)]
#![deny(unused_must_use)] #![deny(unused_must_use)]
#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
// This mod MUST go first, so that the others see its macros. // This mod MUST go first, so that the others see its macros.
pub(crate) mod fmt; pub(crate) mod fmt;
@ -27,7 +28,7 @@ use ioctl::IoctlState;
use crate::bus::Bus; use crate::bus::Bus;
pub use crate::bus::SpiBusCyw43; pub use crate::bus::SpiBusCyw43;
pub use crate::control::{Control, Error as ControlError}; pub use crate::control::{AddMulticastAddressError, Control, Error as ControlError, Scanner};
pub use crate::runner::Runner; pub use crate::runner::Runner;
pub use crate::structs::BssInfo; pub use crate::structs::BssInfo;
@ -103,6 +104,7 @@ const CHIP: Chip = Chip {
chanspec_ctl_sb_mask: 0x0700, chanspec_ctl_sb_mask: 0x0700,
}; };
/// Driver state.
pub struct State { pub struct State {
ioctl_state: IoctlState, ioctl_state: IoctlState,
ch: ch::State<MTU, 4, 4>, ch: ch::State<MTU, 4, 4>,
@ -110,6 +112,7 @@ pub struct State {
} }
impl State { impl State {
/// Create new driver state holder.
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
ioctl_state: IoctlState::new(), ioctl_state: IoctlState::new(),
@ -119,6 +122,7 @@ impl State {
} }
} }
/// Power management modes.
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PowerManagementMode { pub enum PowerManagementMode {
/// Custom, officially unsupported mode. Use at your own risk. /// Custom, officially unsupported mode. Use at your own risk.
@ -204,8 +208,13 @@ impl PowerManagementMode {
} }
} }
/// Embassy-net driver.
pub type NetDriver<'a> = ch::Device<'a, MTU>; pub type NetDriver<'a> = ch::Device<'a, MTU>;
/// Create a new instance of the CYW43 driver.
///
/// Returns a handle to the network device, control handle and a runner for driving the low level
/// stack.
pub async fn new<'a, PWR, SPI>( pub async fn new<'a, PWR, SPI>(
state: &'a mut State, state: &'a mut State,
pwr: PWR, pwr: PWR,
@ -216,7 +225,7 @@ where
PWR: OutputPin, PWR: OutputPin,
SPI: SpiBusCyw43, SPI: SpiBusCyw43,
{ {
let (ch_runner, device) = ch::new(&mut state.ch, [0; 6]); let (ch_runner, device) = ch::new(&mut state.ch, ch::driver::HardwareAddress::Ethernet([0; 6]));
let state_ch = ch_runner.state_runner(); let state_ch = ch_runner.state_runner();
let mut runner = Runner::new(ch_runner, Bus::new(pwr, spi), &state.ioctl_state, &state.events); let mut runner = Runner::new(ch_runner, Bus::new(pwr, spi), &state.ioctl_state, &state.events);

View File

@ -1,54 +1,48 @@
macro_rules! nvram { pub static NVRAM: &'static [u8] = b"
($($s:literal,)*) => { NVRAMRev=$Rev$\x00\
concat_bytes!($($s, b"\x00",)* b"\x00\x00") manfid=0x2d0\x00\
}; prodid=0x0727\x00\
} vendid=0x14e4\x00\
devid=0x43e2\x00\
pub static NVRAM: &'static [u8] = &*nvram!( boardtype=0x0887\x00\
b"NVRAMRev=$Rev$", boardrev=0x1100\x00\
b"manfid=0x2d0", boardnum=22\x00\
b"prodid=0x0727", macaddr=00:A0:50:b5:59:5e\x00\
b"vendid=0x14e4", sromrev=11\x00\
b"devid=0x43e2", boardflags=0x00404001\x00\
b"boardtype=0x0887", boardflags3=0x04000000\x00\
b"boardrev=0x1100", xtalfreq=37400\x00\
b"boardnum=22", nocrc=1\x00\
b"macaddr=00:A0:50:b5:59:5e", ag0=255\x00\
b"sromrev=11", aa2g=1\x00\
b"boardflags=0x00404001", ccode=ALL\x00\
b"boardflags3=0x04000000", pa0itssit=0x20\x00\
b"xtalfreq=37400", extpagain2g=0\x00\
b"nocrc=1", pa2ga0=-168,6649,-778\x00\
b"ag0=255", AvVmid_c0=0x0,0xc8\x00\
b"aa2g=1", cckpwroffset0=5\x00\
b"ccode=ALL", maxp2ga0=84\x00\
b"pa0itssit=0x20", txpwrbckof=6\x00\
b"extpagain2g=0", cckbw202gpo=0\x00\
b"pa2ga0=-168,6649,-778", legofdmbw202gpo=0x66111111\x00\
b"AvVmid_c0=0x0,0xc8", mcsbw202gpo=0x77711111\x00\
b"cckpwroffset0=5", propbw202gpo=0xdd\x00\
b"maxp2ga0=84", ofdmdigfilttype=18\x00\
b"txpwrbckof=6", ofdmdigfilttypebe=18\x00\
b"cckbw202gpo=0", papdmode=1\x00\
b"legofdmbw202gpo=0x66111111", papdvalidtest=1\x00\
b"mcsbw202gpo=0x77711111", pacalidx2g=45\x00\
b"propbw202gpo=0xdd", papdepsoffset=-30\x00\
b"ofdmdigfilttype=18", papdendidx=58\x00\
b"ofdmdigfilttypebe=18", ltecxmux=0\x00\
b"papdmode=1", ltecxpadnum=0x0102\x00\
b"papdvalidtest=1", ltecxfnsel=0x44\x00\
b"pacalidx2g=45", ltecxgcigpio=0x01\x00\
b"papdepsoffset=-30", il0macaddr=00:90:4c:c5:12:38\x00\
b"papdendidx=58", wl0id=0x431b\x00\
b"ltecxmux=0", deadman_to=0xffffffff\x00\
b"ltecxpadnum=0x0102", muxenab=0x100\x00\
b"ltecxfnsel=0x44", spurconfig=0x3\x00\
b"ltecxgcigpio=0x01", glitch_based_crsmin=1\x00\
b"il0macaddr=00:90:4c:c5:12:38", btc_mode=1\x00\
b"wl0id=0x431b", \x00";
b"deadman_to=0xffffffff",
b"muxenab=0x100",
b"spurconfig=0x3",
b"glitch_based_crsmin=1",
b"btc_mode=1",
);

View File

@ -34,6 +34,7 @@ impl Default for LogState {
} }
} }
/// Driver communicating with the WiFi chip.
pub struct Runner<'a, PWR, SPI> { pub struct Runner<'a, PWR, SPI> {
ch: ch::Runner<'a, MTU>, ch: ch::Runner<'a, MTU>,
bus: Bus<PWR, SPI>, bus: Bus<PWR, SPI>,
@ -222,6 +223,7 @@ where
} }
} }
/// Run the
pub async fn run(mut self) -> ! { pub async fn run(mut self) -> ! {
let mut buf = [0; 512]; let mut buf = [0; 512];
loop { loop {
@ -345,7 +347,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 +357,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 +423,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 +449,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() {
@ -545,14 +557,14 @@ where
self.bus.bp_write8(base + AI_RESETCTRL_OFFSET, 0).await; self.bus.bp_write8(base + AI_RESETCTRL_OFFSET, 0).await;
Timer::after(Duration::from_millis(1)).await; Timer::after_millis(1).await;
self.bus self.bus
.bp_write8(base + AI_IOCTRL_OFFSET, AI_IOCTRL_BIT_CLOCK_EN) .bp_write8(base + AI_IOCTRL_OFFSET, AI_IOCTRL_BIT_CLOCK_EN)
.await; .await;
let _ = self.bus.bp_read8(base + AI_IOCTRL_OFFSET).await; let _ = self.bus.bp_read8(base + AI_IOCTRL_OFFSET).await;
Timer::after(Duration::from_millis(1)).await; Timer::after_millis(1).await;
} }
async fn core_is_up(&mut self, core: Core) -> bool { async fn core_is_up(&mut self, core: Core) -> bool {

View File

@ -4,13 +4,16 @@ use crate::fmt::Bytes;
macro_rules! impl_bytes { macro_rules! impl_bytes {
($t:ident) => { ($t:ident) => {
impl $t { impl $t {
/// Bytes consumed by this type.
pub const SIZE: usize = core::mem::size_of::<Self>(); pub const SIZE: usize = core::mem::size_of::<Self>();
/// Convert to byte array.
#[allow(unused)] #[allow(unused)]
pub fn to_bytes(&self) -> [u8; Self::SIZE] { pub fn to_bytes(&self) -> [u8; Self::SIZE] {
unsafe { core::mem::transmute(*self) } unsafe { core::mem::transmute(*self) }
} }
/// Create from byte array.
#[allow(unused)] #[allow(unused)]
pub fn from_bytes(bytes: &[u8; Self::SIZE]) -> &Self { pub fn from_bytes(bytes: &[u8; Self::SIZE]) -> &Self {
let alignment = core::mem::align_of::<Self>(); let alignment = core::mem::align_of::<Self>();
@ -23,6 +26,7 @@ macro_rules! impl_bytes {
unsafe { core::mem::transmute(bytes) } unsafe { core::mem::transmute(bytes) }
} }
/// Create from mutable byte array.
#[allow(unused)] #[allow(unused)]
pub fn from_bytes_mut(bytes: &mut [u8; Self::SIZE]) -> &mut Self { pub fn from_bytes_mut(bytes: &mut [u8; Self::SIZE]) -> &mut Self {
let alignment = core::mem::align_of::<Self>(); let alignment = core::mem::align_of::<Self>();
@ -204,6 +208,7 @@ pub struct EthernetHeader {
} }
impl EthernetHeader { impl EthernetHeader {
/// Swap endianness.
pub fn byteswap(&mut self) { pub fn byteswap(&mut self) {
self.ether_type = self.ether_type.to_be(); self.ether_type = self.ether_type.to_be();
} }
@ -472,19 +477,26 @@ impl ScanResults {
#[repr(C, packed(2))] #[repr(C, packed(2))]
#[non_exhaustive] #[non_exhaustive]
pub struct BssInfo { pub struct BssInfo {
/// Version.
pub version: u32, pub version: u32,
/// Length.
pub length: u32, pub length: u32,
/// BSSID.
pub bssid: [u8; 6], pub bssid: [u8; 6],
/// Beacon period.
pub beacon_period: u16, pub beacon_period: u16,
/// Capability.
pub capability: u16, pub capability: u16,
/// SSID length.
pub ssid_len: u8, pub ssid_len: u8,
/// SSID.
pub ssid: [u8; 32], pub ssid: [u8; 32],
// there will be more stuff here // there will be more stuff here
} }
impl_bytes!(BssInfo); impl_bytes!(BssInfo);
impl BssInfo { impl BssInfo {
pub fn parse(packet: &mut [u8]) -> Option<&mut Self> { pub(crate) fn parse(packet: &mut [u8]) -> Option<&mut Self> {
if packet.len() < BssInfo::SIZE { if packet.len() < BssInfo::SIZE {
return None; return None;
} }

View File

@ -6,9 +6,9 @@ version = "0.1.0"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
embassy-executor = { version = "0.2.0", path = "../../../../../embassy-executor", features = ["defmt", "nightly", "integrated-timers", "arch-cortex-m", "executor-thread"] } embassy-executor = { version = "0.4.0", path = "../../../../../embassy-executor", features = ["defmt", "integrated-timers", "arch-cortex-m", "executor-thread"] }
embassy-time = { version = "0.1.0", path = "../../../../../embassy-time", features = ["defmt", "nightly"] } embassy-time = { version = "0.2.0", path = "../../../../../embassy-time", features = ["defmt"] }
embassy-nrf = { version = "0.1.0", path = "../../../../../embassy-nrf", features = ["defmt", "nrf52840", "time-driver-rtc1", "gpiote", "nightly"] } embassy-nrf = { version = "0.1.0", path = "../../../../../embassy-nrf", features = ["defmt", "nrf52840", "time-driver-rtc1", "gpiote"] }
defmt = "0.3" defmt = "0.3"
defmt-rtt = "0.3" defmt-rtt = "0.3"

View File

@ -1,6 +1,5 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
#![feature(type_alias_impl_trait)]
use defmt::*; use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;

View File

@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0"
cortex-m = "0.7" cortex-m = "0.7"
cortex-m-rt = "0.7" cortex-m-rt = "0.7"
embassy-stm32 = { version = "0.1.0", features = ["stm32l475vg", "memory-x", "exti"] } embassy-stm32 = { version = "0.1.0", features = ["stm32l475vg", "memory-x", "exti"] }
embassy-executor = { version = "0.2.0", features = ["nightly", "arch-cortex-m", "executor-thread"] } embassy-executor = { version = "0.4.0", features = ["arch-cortex-m", "executor-thread"] }
defmt = "0.3.0" defmt = "0.3.0"
defmt-rtt = "0.3.0" defmt-rtt = "0.3.0"

View File

@ -1,6 +1,5 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
#![feature(type_alias_impl_trait)]
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::exti::ExtiInput; use embassy_stm32::exti::ExtiInput;

View File

@ -9,7 +9,7 @@ use {defmt_rtt as _, panic_probe as _};
fn main() -> ! { fn main() -> ! {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let mut led = Output::new(p.PB14, Level::High, Speed::VeryHigh); let mut led = Output::new(p.PB14, Level::High, Speed::VeryHigh);
let button = Input::new(p.PC13, Pull::Up); let mut button = Input::new(p.PC13, Pull::Up);
loop { loop {
if button.is_low() { if button.is_low() {

View File

@ -1,10 +1,18 @@
* xref:getting_started.adoc[Getting started] * xref:getting_started.adoc[Getting started]
** xref:basic_application.adoc[Basic application] ** xref:basic_application.adoc[Basic application]
** xref:layer_by_layer.adoc[Layer by Layer] ** xref:project_structure.adoc[Project Structure]
** xref:new_project.adoc[Starting a new Embassy project]
** xref:best_practices.adoc[Best Practices]
* xref:layer_by_layer.adoc[Bare metal to async]
* xref:runtime.adoc[Executor] * xref:runtime.adoc[Executor]
* xref:delaying_a_task.adoc[Delaying a Task]
* xref:hal.adoc[HAL] * xref:hal.adoc[HAL]
** xref:nrf.adoc[nRF] ** xref:nrf.adoc[nRF]
** xref:stm32.adoc[STM32] ** xref:stm32.adoc[STM32]
* xref:bootloader.adoc[Bootloader] * xref:bootloader.adoc[Bootloader]
* xref:examples.adoc[Examples] * xref:examples.adoc[Examples]
* xref:developer.adoc[Developer Docs]
** xref:developer_stm32.adoc[Developer Docs: STM32]
* xref:embassy_in_the_wild.adoc[Embassy in the wild]
* xref:faq.adoc[Frequently Asked Questions]

View File

@ -6,13 +6,24 @@ So you've got one of the xref:examples.adoc[examples] running, but what now? Let
The full example can be found link:https://github.com/embassy-rs/embassy/tree/master/docs/modules/ROOT/examples/basic[here]. The full example can be found link:https://github.com/embassy-rs/embassy/tree/master/docs/modules/ROOT/examples/basic[here].
=== Rust Nightly NOTE: If youre using VS Code and rust-analyzer to view and edit the examples, you may need to make some changes to `.vscode/settings.json` to tell it which project were working on. Follow the instructions commented in that file to get rust-analyzer working correctly.
The first thing you'll notice is a few declarations stating that Embassy requires some nightly features: === Bare metal
The first thing youll notice are two attributes at the top of the file. These tells the compiler that program has no access to std, and that there is no main function (because it is not run by an OS).
[source,rust] [source,rust]
---- ----
include::example$basic/src/main.rs[lines="1..3"] include::example$basic/src/main.rs[lines="1..2"]
----
=== Rust Nightly
The next declaration is a Rust Unstable feature, which means that Embassy requires Rust Nightly:
[source,rust]
----
include::example$basic/src/main.rs[lines="3"]
---- ----
=== Dealing with errors === Dealing with errors
@ -39,19 +50,18 @@ NOTE: Notice that there is no busy waiting going on in this task. It is using th
=== Main === Main
The main entry point of an Embassy application is defined using the `#[embassy_executor::main]` macro. The entry point is also required to take a `Spawner` and a `Peripherals` argument. The main entry point of an Embassy application is defined using the `#[embassy_executor::main]` macro. The entry point is passed a `Spawner`, which it can use to spawn other tasks.
The `Spawner` is the way the main application spawns other tasks. The `Peripherals` type comes from the HAL and holds all peripherals that the application may use. In this case, we want to configure one of the pins as a GPIO output driving the LED: We then initialize the HAL with a default config, which gives us a `Peripherals` struct we can use to access the MCUs various peripherals. In this case, we want to configure one of the pins as a GPIO output driving the LED:
[source,rust] [source,rust]
---- ----
include::example$basic/src/main.rs[lines="22..-1"] include::example$basic/src/main.rs[lines="22..-1"]
---- ----
What happens when the `blinker` task has been spawned and main returns? Well, the main entry point is actually just like any other task, except that you can only have one and it takes some specific type arguments. The magic lies within the `#[embassy::main]` macro. The macro does the following: What happens when the `blinker` task has been spawned and main returns? Well, the main entry point is actually just like any other task, except that you can only have one and it takes some specific type arguments. The magic lies within the `#[embassy_executor::main]` macro. The macro does the following:
. Creates an Embassy Executor . Creates an Embassy Executor
. Initializes the microcontroller HAL to get the `Peripherals`
. Defines a main task for the entry point . Defines a main task for the entry point
. Runs the executor spawning the main task . Runs the executor spawning the main task

View File

@ -0,0 +1,53 @@
= Best Practices
Over time, a couple of best practices have emerged. The following list should serve as a guideline for developers writing embedded software in _Rust_, especially in the context of the _Embassy_ framework.
== Passing Buffers by Reference
It may be tempting to pass arrays or wrappers, like link:https://docs.rs/heapless/latest/heapless/[`heapless::Vec`], to a function or return one just like you would with a `std::Vec`. However, in most embedded applications you don't want to spend ressources on an allocator and end up placing buffers on the stack.
This, however, can easily blow up your stack if you are not careful.
Consider the following example:
[,rust]
----
fn process_buffer(mut buf: [u8; 1024]) -> [u8; 1024] {
// do stuff and return new buffer
for elem in buf.iter_mut() {
*elem = 0;
}
buf
}
pub fn main() -> () {
let buf = [1u8; 1024];
let buf_new = process_buffer(buf);
// do stuff with buf_new
()
}
----
When calling `process_buffer` in your program, a copy of the buffer you pass to the function will be created,
consuming another 1024 bytes.
After the processing, another 1024 byte buffer will be placed on the stack to be returned to the caller.
(You can check the assembly, there will be two memcopy operations, e.g., `bl __aeabi_memcpy` when compiling for a Cortex-M processor.)
*Possible Solution:*
Pass the data by reference and not by value on both, the way in and the way out.
For example, you could return a slice of the input buffer as the output.
Requiring the lifetime of the input slice and the output slice to be the same, the memory safetly of this procedure will be enforced by the compiler.
[,rust]
----
fn process_buffer<'a>(buf: &'a mut [u8]) -> &'a mut[u8] {
for elem in buf.iter_mut() {
*elem = 0;
}
buf
}
pub fn main() -> () {
let mut buf = [1u8; 1024];
let buf_new = process_buffer(&mut buf);
// do stuff with buf_new
()
}
----

View File

@ -45,6 +45,8 @@ The BOOTLOADER_STATE partition must be big enough to store one word per page in
The bootloader has a platform-agnostic part, which implements the power fail safe swapping algorithm given the boundaries set by the partitions. The platform-specific part is a minimal shim that provides additional functionality such as watchdogs or supporting the nRF52 softdevice. The bootloader has a platform-agnostic part, which implements the power fail safe swapping algorithm given the boundaries set by the partitions. The platform-specific part is a minimal shim that provides additional functionality such as watchdogs or supporting the nRF52 softdevice.
NOTE: The linker scripts for the application and bootloader look similar, but the FLASH region must point to the BOOTLOADER partition for the bootloader, and the ACTIVE partition for the application.
=== FirmwareUpdater === FirmwareUpdater
The `FirmwareUpdater` is an object for conveniently flashing firmware to the DFU partition and subsequently marking it as being ready for swapping with the active partition on the next reset. Its principle methods are `write_firmware`, which is called once per the size of the flash "write block" (typically 4KiB), and `mark_updated`, which is the final call. The `FirmwareUpdater` is an object for conveniently flashing firmware to the DFU partition and subsequently marking it as being ready for swapping with the active partition on the next reset. Its principle methods are `write_firmware`, which is called once per the size of the flash "write block" (typically 4KiB), and `mark_updated`, which is the final call.

View File

@ -0,0 +1,28 @@
= Delaying a Task
In an embedded program, delaying a task is one of the most common actions taken. In an event loop, delays will need to be inserted to ensure
that other tasks have a chance to run before the next iteration of the loop is called, if no other I/O is performed. Embassy provides an abstraction
to delay the current task for a specified interval of time.
Timing is serviced by the `embassy::time::Timer` struct, which provides two timing methods.
`Timer::at` creates a future that completes at the specified `Instant`, relative to the system boot time.
`Timer::after` creates a future that completes after the specified `Duration`, relative to when the future was created.
An example of a delay is provided as follows:
[,rust]
----
use embassy::executor::{task, Executor};
use embassy::time::{Duration, Timer};
#[task]
/// Task that ticks periodically
async fn tick_periodic() -> ! {
loop {
rprintln!("tick!");
// async sleep primitive, suspends the task for 500ms.
Timer::after(Duration::from_millis(500)).await;
}
}
----

View File

@ -0,0 +1 @@
= Developer Documentation

View File

@ -0,0 +1,79 @@
= Developer Documentation: STM32
== Understanding metapac
When a project that imports `embassy-stm32` is compiled, that project selects the feature corresponding to the chip that project is using. Based on that feature, `embassy-stm32` selects supported link:https://anysilicon.com/ip-intellectual-property-core-semiconductors/[IP] for the chip, and enables the corresponding HAL implementations. But how does `embassy-stm32` know what IP the chip contains, out of the hundreds of chips that we support? It's a long story that starts with `stm32-data-sources`.
== `stm32-data-sources`
link:https://github.com/embassy-rs/stm32-data-sources[`stm32-data-sources`] is as mostly barren repository. It has no README, no documentation, and few watchers. But it's the core of what makes `embassy-stm32` possible. The data for every chip that we support is taken in part from a corresponding XML file like link:https://github.com/embassy-rs/stm32-data-sources/blob/b8b85202e22a954d6c59d4a43d9795d34cff05cf/cubedb/mcu/STM32F051K4Ux.xml[`STM32F051K4Ux.xml`]. In that file, you'll see lines like the following:
[source,xml]
----
<IP InstanceName="I2C1" Name="I2C" Version="i2c2_v1_1_Cube"/>
<!-- snip -->
<IP ConfigFile="TIM-STM32F0xx" InstanceName="TIM1" Name="TIM1_8F0" Version="gptimer2_v2_x_Cube"/>
----
These lines indicate that this chip has an i2c, and that it's version is "v1_1". It also indicates that it has a general purpose timer that with a version of "v2_x". From this data, it's possible to determine which implementations should be included in `embassy-stm32`. But actually doing that is another matter.
== `stm32-data`
While all users of this project are familiar with `embassy-stm32`, fewer are familiar with the project that powers it: `stm32-data`. This project doesn't just aim to generate data for `embassy-stm32`, but for machine consumption in general. To acheive this, information from multiple files from the `stm32-data-sources` project are combined and parsed to assign register block implementations for each supported IP. The core of this matching resides in `chips.rs`:
[source,rust]
----
(".*:I2C:i2c2_v1_1", ("i2c", "v2", "I2C")),
// snip
(r".*TIM\d.*:gptimer.*", ("timer", "v1", "TIM_GP16")),
----
In this case, the i2c version corresponds to our "v2" and the general purpose timer version corresponds to our "v1". Therefore, the `i2c_v2.yaml` and `timer_v1.yaml` register block implementations are assigned to those IP, respectively. The result is that these lines arr generated in `STM32F051K4.json`:
[source,json]
----
{
"name": "I2C1",
"address": 1073763328,
"registers": {
"kind": "i2c",
"version": "v2",
"block": "I2C"
},
// snip
}
// snip
{
"name": "TIM1",
"address": 1073818624,
"registers": {
"kind": "timer",
"version": "v1",
"block": "TIM_ADV"
},
// snip
}
----
In addition to register blocks, data for pin and RCC mapping is also generated and consumed by `embassy-stm32`. `stm32-metapac-gen` is used to package and publish the data as a crate.
== `embassy-stm32`
In the `lib.rs` file located in the root of `embassy-stm32`, you'll see this line:
[source,rust]
----
#[cfg(i2c)]
pub mod i2c;
----
And in the `mod.rs` of the i2c mod, you'll see this:
[source,rust]
----
#[cfg_attr(i2c_v2, path = "v2.rs")]
----
Because i2c is supported for STM32F051K4 and its version corresponds to our "v2", the `i2c` and `i2c_v2`, configuration directives will be present, and `embassy-stm32` will include these files, respectively. This and other configuration directives and tables are generated from the data for chip, allowing `embassy-stm32` to expressively and clearly adapt logic and implementations to what is required for each chip. Compared to other projects across the embedded ecosystem, `embassy-stm32` is the only project that can re-use code across the entire stm32 lineup and remove difficult-to-implement unsafe logic to the HAL.

View File

@ -0,0 +1,9 @@
= Embassy in the wild!
Here are known examples of real-world projects which make use of Embassy. Feel free to link:https://github.com/embassy-rs/embassy/blob/main/docs/modules/ROOT/pages/embassy_in_the_wild.adoc[add more]!
* link:https://github.com/cbruiz/printhor/[Printhor: The highly reliable but not necessarily functional 3D printer firmware]
** Targets some STM32 MCUs
* link:https://github.com/card-io-ecg/card-io-fw[Card/IO firmware] - firmware for an open source ECG device
** Targets the ESP32-S3 or ESP32-C6 MCU
* The link:https://github.com/lora-rs/lora-rs[lora-rs] project includes link:https://github.com/lora-rs/lora-rs/tree/main/examples/stm32l0/src/bin[various standalone examples] for NRF52840, RP2040, STM32L0 and STM32WL

View File

@ -0,0 +1,155 @@
= Frequently Asked Questions
These are a list of unsorted, commonly asked questions and answers.
Please feel free to add items to link:https://github.com/embassy-rs/embassy/edit/main/docs/modules/ROOT/pages/faq.adoc[this page], especially if someone in the chat answered a question for you!
== How to deploy to RP2040 without a debugging probe.
Install link:https://github.com/JoNil/elf2uf2-rs[elf2uf2-rs] for converting the generated elf binary into a uf2 file.
Configure the runner to use this tool, add this to `.cargo/config.toml`:
[source,toml]
----
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = "elf2uf2-rs --deploy --serial --verbose"
----
The command-line parameters `--deploy` will detect your device and upload the binary, `--serial` starts a serial connection. See the documentation for more info.
== Missing main macro
If you see an error like this:
[source,rust]
----
#[embassy_executor::main]
| ^^^^ could not find `main` in `embassy_executor`
----
You are likely missing some features of the `embassy-executor` crate.
For Cortex-M targets, consider making sure that ALL of the following features are active in your `Cargo.toml` for the `embassy-executor` crate:
* `arch-cortex-m`
* `executor-thread`
* `nightly`
For ESP32, consider using the executors and `#[main]` macro provided by your appropriate link:https://crates.io/crates/esp-hal-common[HAL crate].
== Why is my binary so big?
The first step to managing your binary size is to set up your link:https://doc.rust-lang.org/cargo/reference/profiles.html[profiles].
[source,toml]
----
[profile.release]
debug = false
lto = true
opt-level = "s"
incremental = false
codegen-units = 1
----
All of these flags are elaborated on in the Rust Book page linked above.
=== My binary is still big... filled with `std::fmt` stuff!
This means your code is sufficiently complex that `panic!` invocation's formatting requirements could not be optimized out, despite your usage of `panic-halt` or `panic-reset`.
You can remedy this by adding the following to your `.cargo/config.toml`:
[source,toml]
----
[unstable]
build-std = ["core"]
build-std-features = ["panic_immediate_abort"]
----
This replaces all panics with a `UDF` (undefined) instruction.
Depending on your chipset, this will exhibit different behavior.
Refer to the spec for your chipset, but for `thumbv6m`, it results in a hardfault. Which can be configured like so:
[source,rust]
----
#[exception]
unsafe fn HardFault(_frame: &ExceptionFrame) -> ! {
SCB::sys_reset() // <- you could do something other than reset
}
----
Refer to cortex-m's link:https://docs.rs/cortex-m-rt/latest/cortex_m_rt/attr.exception.html[exception handling] for more info.
== `embassy-time` throws linker errors
If you see linker error like this:
[source,text]
----
= note: rust-lld: error: undefined symbol: _embassy_time_now
>>> referenced by driver.rs:127 (src/driver.rs:127)
>>> embassy_time-846f66f1620ad42c.embassy_time.4f6a638abb75dd4c-cgu.0.rcgu.o:(embassy_time::driver::now::hefb1f99d6e069842) in archive Devel/Embedded/pogodyna/target/thumbv7em-none-eabihf/debug/deps/libembassy_time-846f66f1620ad42c.rlib
rust-lld: error: undefined symbol: _embassy_time_allocate_alarm
>>> referenced by driver.rs:134 (src/driver.rs:134)
>>> embassy_time-846f66f1620ad42c.embassy_time.4f6a638abb75dd4c-cgu.0.rcgu.o:(embassy_time::driver::allocate_alarm::hf5145b6bd46706b2) in archive Devel/Embedded/pogodyna/target/thumbv7em-none-eabihf/debug/deps/libembassy_time-846f66f1620ad42c.rlib
rust-lld: error: undefined symbol: _embassy_time_set_alarm_callback
>>> referenced by driver.rs:139 (src/driver.rs:139)
>>> embassy_time-846f66f1620ad42c.embassy_time.4f6a638abb75dd4c-cgu.0.rcgu.o:(embassy_time::driver::set_alarm_callback::h24f92388d96eafd2) in archive Devel/Embedded/pogodyna/target/thumbv7em-none-eabihf/debug/deps/libembassy_time-846f66f1620ad42c.rlib
rust-lld: error: undefined symbol: _embassy_time_set_alarm
>>> referenced by driver.rs:144 (src/driver.rs:144)
>>> embassy_time-846f66f1620ad42c.embassy_time.4f6a638abb75dd4c-cgu.0.rcgu.o:(embassy_time::driver::set_alarm::h530a5b1f444a6d5b) in archive Devel/Embedded/pogodyna/target/thumbv7em-none-eabihf/debug/deps/libembassy_time-846f66f1620ad42c.rlib
----
You probably need to enable a time driver for your HAL (not in `embassy-time`!). For example with `embassy-stm32`, you might need to enable `time-driver-any`:
[source,toml]
----
[dependencies.embassy-stm32]
version = "0.1.0"
features = [
# ...
"time-driver-any", # Add this line!
# ...
]
----
== Error: `Only one package in the dependency graph may specify the same links value.`
You have multiple versions of the same crate in your dependency tree. This means that some of your
embassy crates are coming from crates.io, and some from git, each of them pulling in a different set
of dependencies.
To resolve this issue, make sure to only use a single source for all your embassy crates! To do this,
you should patch your dependencies to use git sources using `[patch.crates.io]` and maybe `[patch.'https://github.com/embassy-rs/embassy.git']`.
Example:
[source,toml]
----
[patch.crates-io]
embassy-time = { git = "https://github.com/embassy-rs/embassy.git", rev = "e5fdd35" }
----
Note that the git revision should match any other embassy patches or git dependencies that you are using!
== How can I optimize the speed of my embassy-stm32 program?
* Make sure RCC is set up to go as fast as possible
* Make sure link:https://docs.rs/cortex-m/latest/cortex_m/peripheral/struct.SCB.html[flash cache] is enabled
* build with `--release`
* Set the following keys for the release profile in your `Cargo.toml`:
** `opt-level = "s"`
** `lto = "fat"`
* Set the following keys in the `[unstable]` section of your `.cargo/config.toml`
** `build-std = ["core"]`
** `build-std-features = ["panic_immediate_abort"]`
* Enable feature `embassy-time/generic-queue`, disable feature `embassy-executor/integrated-timers`
* When using `InterruptExecutor`:
** disable `executor-thread`
** make `main`` spawn everything, then enable link:https://docs.rs/cortex-m/latest/cortex_m/peripheral/struct.SCB.html#method.set_sleeponexit[SCB.SLEEPONEXIT] and `loop { cortex_m::asm::wfi() }`
** *Note:* If you need 2 priority levels, using 2 interrupt executors is better than 1 thread executor + 1 interrupt executor.

View File

@ -3,13 +3,15 @@
So you want to try Embassy, great! To get started, there are a few tools you need to install: So you want to try Embassy, great! To get started, there are a few tools you need to install:
* link:https://rustup.rs/[rustup] - the Rust toolchain is needed to compile Rust code. * link:https://rustup.rs/[rustup] - the Rust toolchain is needed to compile Rust code.
* link:https://crates.io/crates/probe-run[probe-run] - to flash the firmware on your device. If you already have other tools like `OpenOCD` setup, you can use that as well. * link:https://crates.io/crates/probe-rs[probe-rs] - to flash the firmware on your device. If you already have other tools like `OpenOCD` setup, you can use that as well.
If you don't have any supported board, don't worry: you can also run embassy on your PC using the `std` examples. If you don't have any supported board, don't worry: you can also run embassy on your PC using the `std` examples.
== Getting a board with examples == Getting a board with examples
Embassy supports many microcontroller families, but the easiest ways to get started is if you have one of the more common development kits. Embassy supports many microcontroller families, but the quickest way to get started is by using a board which Embassy has existing example code for.
This list is non-exhaustive. If your board isnt included here, check the link:https://github.com/embassy-rs/embassy/tree/main/examples[examples folder] to see if example code has been written for it.
=== nRF kits === nRF kits
@ -30,28 +32,94 @@ Embassy supports many microcontroller families, but the easiest ways to get star
* link:https://www.raspberrypi.com/products/raspberry-pi-pico/[Raspberry Pi Pico] * link:https://www.raspberrypi.com/products/raspberry-pi-pico/[Raspberry Pi Pico]
=== ESP32
* link:https://github.com/esp-rs/esp-rust-board[ESP32C3]
== Running an example == Running an example
First you need to clone the [github repository]; First you need to clone the link:https://github.com/embassy-rs/embassy[github repository];
[source, bash] [source, bash]
---- ----
git clone https://github.com/embassy-rs/embassy.git git clone https://github.com/embassy-rs/embassy.git
cd embassy cd embassy
git submodule update --init
---- ----
You can run an example by opening a terminal and entering the following commands: Once you have a copy of the repository, find examples folder for your board and, and build an example program. `blinky` is a good choice as all it does is blink an LED the embedded worlds equivalent of “Hello World”.
[source, bash] [source, bash]
---- ----
cd examples/nrf52840 cd examples/nrf52840
cargo build --bin blinky --release
----
Once youve confirmed you can build the example, connect your computer to your board with a debug probe and run it on hardware:
[source, bash]
----
cargo run --bin blinky --release cargo run --bin blinky --release
---- ----
If everything worked correctly, you should see a blinking LED on your board, and debug output similar to this on your computer:
[source]
----
Finished dev [unoptimized + debuginfo] target(s) in 1m 56s
Running `probe-run --chip STM32F407VGTx target/thumbv7em-none-eabi/debug/blinky`
(HOST) INFO flashing program (71.36 KiB)
(HOST) INFO success!
────────────────────────────────────────────────────────────────────────────────
0 INFO Hello World!
└─ blinky::__embassy_main::task::{generator#0} @ src/bin/blinky.rs:18
1 INFO high
└─ blinky::__embassy_main::task::{generator#0} @ src/bin/blinky.rs:23
2 INFO low
└─ blinky::__embassy_main::task::{generator#0} @ src/bin/blinky.rs:27
3 INFO high
└─ blinky::__embassy_main::task::{generator#0} @ src/bin/blinky.rs:23
4 INFO low
└─ blinky::__embassy_main::task::{generator#0} @ src/bin/blinky.rs:27
----
NOTE: How does the `cargo run` command know how to connect to our board and program it? In each `examples` folder, theres a `.cargo/config.toml` file which tells cargo to use link:https://probe.rs/[probe-rs] as the runner for ARM binaries in that folder. probe-rs handles communication with the debug probe and MCU. In order for this to work, probe-rs needs to know which chip its programming, so youll have to edit this file if you want to run examples on other chips.
=== It didnt work!
If you hare having issues when running `cargo run --release`, please check the following:
* You are specifying the correct `--chip on the command line``, OR
* You have set `.cargo/config.toml`'s run line to the correct chip, AND
* You have changed `examples/Cargo.toml`'s HAL (e.g. embassy-stm32) dependency's feature to use the correct chip (replace the existing stm32xxxx feature)
At this point the project should run. If you do not see a blinky LED for blinky, for example, be sure to check the code is toggling your board's LED pin.
If you are trying to run an example with `cargo run --release` and you see the following output:
[source]
----
0.000000 INFO Hello World!
└─ <invalid location: defmt frame-index: 14>
0.000000 DEBUG rcc: Clocks { sys: Hertz(80000000), apb1: Hertz(80000000), apb1_tim: Hertz(80000000), apb2: Hertz(80000000), apb2_tim: Hertz(80000000), ahb1: Hertz(80000000), ahb2: Hertz(80000000), ahb3: Hertz(80000000) }
└─ <invalid location: defmt frame-index: 124>
0.000061 TRACE allocating type=Interrupt mps=8 interval_ms=255, dir=In
└─ <invalid location: defmt frame-index: 68>
0.000091 TRACE index=1
└─ <invalid location: defmt frame-index: 72>
----
To get rid of the frame-index error add the following to your `Cargo.toml`:
[source,toml]
----
[profile.release]
debug = 2
----
If youre still having problems, check the link:https://embassy.dev/book/dev/faq.html[FAQ], or ask for help in the link:https://matrix.to/#/#embassy-rs:matrix.org[Embassy Chat Room].
== What's next? == What's next?
Congratulations, you have your first Embassy application running! Here are some alternatives on where to go from here: Congratulations, you have your first Embassy application running! Here are some suggestions for where to go from here:
* Read more about the xref:runtime.adoc[executor]. * Read more about the xref:runtime.adoc[executor].
* Read more about the xref:hal.adoc[HAL]. * Read more about the xref:hal.adoc[HAL].

View File

@ -7,4 +7,6 @@ Embassy provides HALs for several microcontroller families:
* `embassy-rp` for the Raspberry Pi RP2040 microcontrollers * `embassy-rp` for the Raspberry Pi RP2040 microcontrollers
These HALs implement async/await functionality for most peripherals while also implementing the These HALs implement async/await functionality for most peripherals while also implementing the
async traits in `embedded-hal-async`. You can also use these HALs with another executor. async traits in `embedded-hal` and `embedded-hal-async`. You can also use these HALs with another executor.
For the ESP32 series, there is an link:https://github.com/esp-rs/esp-hal[esp-hal] which you can use.

View File

@ -4,31 +4,61 @@ Embassy is a project to make async/await a first-class option for embedded devel
== What is async? == What is async?
Software written without async may block on I/O operations. In an std environment, such as a PC, software can handle this either by using threads or non-blocking operations. When handling I/O, software must call functions that block program execution until the I/O operation completes. When running inside of an OS such as Linux, such functions generally transfer control to the kernel so that another task (known as a “thread”) can be executed if available, or the CPU can be put to sleep until another task is ready.
With threads, one thread blocks on an I/O operation, another is able to take its place. However, even on a PC, threads are relatively heavy, and therefore some programming languages, such as Go, have implemented a concept called coroutines or 'goroutines' that are much lighter and less-intensive than threads. Because an OS cannot presume that threads will behave cooperatively, threads are relatively resource-intensive, and may be forcibly interrupted they do not transfer control back to the kernel within an allotted time. If tasks could be presumed to behave cooperatively, or at least not maliciously, it would be possible to create tasks that appear to be almost free when compared to a traditional OS thread.
The other way to handle blocking I/O operations is to support polling the state of the underlying peripherals to check whether it is available to perform the requested operation. In programming languages without builtin async support, In other programming languages, these lightweight tasks are known as “coroutines” or ”goroutines”. In Rust, they are implemented with async. Async-await works by transforming each async function into an object called a future. When a future blocks on I/O the future yields, and the scheduler, called an executor, can select a different future to execute.
this requires building a complex loop checking for events.
In Rust, non-blocking operations can be implemented using async-await. Async-await works by transforming each async function into an object called a future. When a future blocks on I/O the future yields, and the scheduler, called an executor, can select a different future to execute. Compared to alternatives such as an RTOS, async can yield better performance and lower power consumption because the executor doesn't have to guess when a future is ready to execute. However, program size may be higher than other alternatives, which may be a problem for certain space-constrained devices with very low memory. On the devices Embassy supports, such as stm32 and nrf, memory is generally large enough to accommodate the modestly-increased program size. Compared to alternatives such as an RTOS, async can yield better performance and lower power consumption because the executor doesn't have to guess when a future is ready to execute. However, program size may be higher than other alternatives, which may be a problem for certain space-constrained devices with very low memory. On the devices Embassy supports, such as stm32 and nrf, memory is generally large enough to accommodate the modestly-increased program size.
== What is Embassy? == What is Embassy?
The Embassy project consists of several crates that you can use together or independently: The Embassy project consists of several crates that you can use together or independently:
* **Executor** - The link:https://docs.embassy.dev/embassy-executor/[embassy-executor] is an async/await executor that generally executes a fixed number of tasks, allocated at startup, though more can be added later. The HAL is an API that you can use to access peripherals, such as USART, UART, I2C, SPI, CAN, and USB. Embassy provides implementations of both async and blocking APIs where it makes sense. DMA (Direct Memory Access) is an example where async is a good fit, whereas GPIO states are a better fit for a blocking API. The executor may also provide a system timer that you can use for both async and blocking delays. For less than one microsecond, blocking delays should be used because the cost of context-switching is too high and the executor will be unable to provide accurate timing. === Executor
The link:https://docs.embassy.dev/embassy-executor/[embassy-executor] is an async/await executor that generally executes a fixed number of tasks, allocated at startup, though more can be added later. The executor may also provide a system timer that you can use for both async and blocking delays. For less than one microsecond, blocking delays should be used because the cost of context-switching is too high and the executor will be unable to provide accurate timing.
* **Hardware Abstraction Layers** - HALs implement safe, idiomatic Rust APIs to use the hardware capabilities, so raw register manipulation is not needed. The Embassy project maintains HALs for select hardware, but you can still use HALs from other projects with Embassy. === Hardware Abstraction Layers
** link:https://docs.embassy.dev/embassy-stm32/[embassy-stm32], for all STM32 microcontroller families. HALs implement safe Rust API which let you use peripherals such as USART, UART, I2C, SPI, CAN, and USB without having to directly manipulate registers.
** link:https://docs.embassy.dev/embassy-nrf/[embassy-nrf], for the Nordic Semiconductor nRF52, nRF53, nRF91 series.
* **Networking** - The link:https://docs.embassy.dev/embassy-net/[embassy-net] network stack implements extensive networking functionality, including Ethernet, IP, TCP, UDP, ICMP and DHCP. Async drastically simplifies managing timeouts and serving multiple connections concurrently. Embassy provides implementations of both async and blocking APIs where it makes sense. DMA (Direct Memory Access) is an example where async is a good fit, whereas GPIO states are a better fit for a blocking API.
* **Bluetooth** - The link:https://github.com/embassy-rs/nrf-softdevice[nrf-softdevice] crate provides Bluetooth Low Energy 4.x and 5.x support for nRF52 microcontrollers. The Embassy project maintains HALs for select hardware, but you can still use HALs from other projects with Embassy.
* **LoRa** - link:https://docs.embassy.dev/embassy-lora/[embassy-lora] supports LoRa networking on STM32WL wireless microcontrollers and Semtech SX127x transceivers. * link:https://docs.embassy.dev/embassy-stm32/[embassy-stm32], for all STM32 microcontroller families.
* link:https://docs.embassy.dev/embassy-nrf/[embassy-nrf], for the Nordic Semiconductor nRF52, nRF53, nRF91 series.
* link:https://docs.embassy.dev/embassy-rp/[embassy-rp], for the Raspberry Pi RP2040 microcontroller.
* link:https://github.com/esp-rs[esp-rs], for the Espressif Systems ESP32 series of chips.
* **USB** - link:https://docs.embassy.dev/embassy-usb/[embassy-usb] implements a device-side USB stack. Implementations for common classes such as USB serial (CDC ACM) and USB HID are available, and a rich builder API allows building your own. NOTE: A common question is if one can use the Embassy HALs standalone. Yes, it is possible! There are no dependency on the executor within the HALs. You can even use them without async,
as they implement both the link:https://github.com/rust-embedded/embedded-hal[Embedded HAL] blocking and async traits.
* **Bootloader and DFU** - link:https://github.com/embassy-rs/embassy/tree/master/embassy-boot[embassy-boot] is a lightweight bootloader supporting firmware application upgrades in a power-fail-safe way, with trial boots and rollbacks. === Networking
The link:https://docs.embassy.dev/embassy-net/[embassy-net] network stack implements extensive networking functionality, including Ethernet, IP, TCP, UDP, ICMP and DHCP. Async drastically simplifies managing timeouts and serving multiple connections concurrently. Several drivers for WiFi and Ethernet chips can be found.
=== Bluetooth
The link:https://github.com/embassy-rs/nrf-softdevice[nrf-softdevice] crate provides Bluetooth Low Energy 4.x and 5.x support for nRF52 microcontrollers.
=== LoRa
link:https://github.com/embassy-rs/lora-phy[lora-phy] and link:https://docs.embassy.dev/embassy-lora/[embassy-lora] supports LoRa networking on a wide range of LoRa radios, fully integrated with a Rust link:https://github.com/ivajloip/rust-lorawan[LoRaWAN] implementation.
=== USB
link:https://docs.embassy.dev/embassy-usb/[embassy-usb] implements a device-side USB stack. Implementations for common classes such as USB serial (CDC ACM) and USB HID are available, and a rich builder API allows building your own.
=== Bootloader and DFU
link:https://github.com/embassy-rs/embassy/tree/master/embassy-boot[embassy-boot] is a lightweight bootloader supporting firmware application upgrades in a power-fail-safe way, with trial boots and rollbacks.
== What is DMA?
For most I/O in embedded devices, the peripheral doesn't directly support the transmission of multiple bits at once, with CAN being a notable exception. Instead, the MCU must write each byte, one at a time, and then wait until the peripheral is ready to send the next. For high I/O rates, this can pose a problem if the MCU must devote an increasing portion of its time handling each byte. The solution to this problem is to use the Direct Memory Access controller.
The Direct Memory Access controller (DMA) is a controller that is present in MCUs that Embassy supports, including stm32 and nrf. The DMA allows the MCU to set up a transfer, either send or receive, and then wait for the transfer to complete. With DMA, once started, no MCU intervention is required until the transfer is complete, meaning that the MCU can perform other computation, or set up other I/O while the transfer is in progress. For high I/O rates, DMA can cut the time that the MCU spends handling I/O by over half. However, because DMA is more complex to set-up, it is less widely used in the embedded community. Embassy aims to change that by making DMA the first choice rather than the last. Using Embassy, there's no additional tuning required once I/O rates increase because your application is already set-up to handle them.
== Resources
For more reading material on async Rust and Embassy:
* link:https://tweedegolf.nl/en/blog/65/async-rust-vs-rtos-showdown[Comparsion of FreeRTOS and Embassy]
* link:https://dev.to/apollolabsbin/series/20707[Tutorials]
* link:https://blog.drogue.io/firmware-updates-part-1/[Firmware Updates with Embassy]

View File

@ -1,4 +1,4 @@
= Embassy layer by layer = From bare metal to async Rust
If you're new to Embassy, it can be overwhelming to grasp all the terminology and concepts. This guide aims to clarify the different layers in Embassy, which problem each layer solves for the application writer. If you're new to Embassy, it can be overwhelming to grasp all the terminology and concepts. This guide aims to clarify the different layers in Embassy, which problem each layer solves for the application writer.
@ -8,8 +8,7 @@ The application we'll write is a simple 'push button, blink led' application, wh
== PAC version == PAC version
The PAC is the lowest API for accessing peripherals and registers, if you don't count reading/writing directly to memory addresses. It provides distinct types The PAC is the lowest API for accessing peripherals and registers, if you don't count reading/writing directly to memory addresses. It provides distinct types to make accessing peripheral registers easier, but it does not prevent you from writing unsafe code.
to make accessing peripheral registers easier, but it does not prevent you from writing unsafe code.
Writing an application using the PAC directly is therefore not recommended, but if the functionality you want to use is not exposed in the upper layers, that's what you need to use. Writing an application using the PAC directly is therefore not recommended, but if the functionality you want to use is not exposed in the upper layers, that's what you need to use.

View File

@ -0,0 +1,178 @@
= Starting a new Embassy project
Once youve successfully xref:getting_started.adoc[run some example projects], the next step is to make a standalone Embassy project. The easiest way to do this is to adapt an example for a similar chip to the one youre targeting.
As an example, lets create a new embassy project from scratch for a STM32G474. The same instructions are applicable for any supported chip with some minor changes.
Run:
[source,bash]
----
cargo new stm32g474-example
cd stm32g474-example
----
to create an empty rust project:
[source]
----
stm32g474-example
├── Cargo.toml
└── src
└── main.rs
----
Looking in link:https://github.com/embassy-rs/embassy/tree/main/examples[the Embassy examples], we can see theres a `stm32g4` folder. Find `src/blinky.rs` and copy its contents into our `src/main.rs`.
== .cargo/config.toml
Currently, wed need to provide cargo with a target triple every time we run `cargo build` or `cargo run`. Lets spare ourselves that work by copying `.cargo/config.toml` from `examples/stm32g4` into our project.
[source]
----
stm32g474-example
├── .cargo
│   └── config.toml
├── Cargo.toml
└── src
└── main.rs
----
In addition to a target triple, `.cargo/config.toml` contains a `runner` key which allows us to conveniently run our project on hardware with `cargo run` via probe-rs. In order for this to work, we need to provide the correct chip ID. We can do this by checking `probe-rs chip list`:
[source,bash]
----
$ probe-rs chip list | grep -i stm32g474re
STM32G474RETx
----
and copying `STM32G474RETx` into `.cargo/config.toml` as so:
[source,toml]
----
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
# replace STM32G071C8Rx with your chip as listed in `probe-rs chip list`
runner = "probe-rs run --chip STM32G474RETx"
----
== Cargo.toml
Now that cargo knows what target to compile for (and probe-rs knows what chip to run it on), were ready to add some dependencies.
Looking in `examples/stm32g4/Cargo.toml`, we can see that the examples require a number of embassy crates. For blinky, well only need three of them: `embassy-stm32`, `embassy-executor` and `embassy-time`.
At the time of writing, the latest version of embassy isnt available on crates.io, so we need to install it straight from the git repository. The recommended way of doing so is as follows:
* Copy the required `embassy-*` lines from the example `Cargo.toml`
* Make any necessary changes to `features`, e.g. requiring the `stm32g474re` feature of `embassy-stm32`
* Remove the `path = ""` keys in the `embassy-*` entries
* Create a `[patch.crates-io]` section, with entries for each embassy crate we need. These should all contain identical values: a link to the git repository, and a reference to the commit were checking out. Assuming you want the latest commit, you can find it by running `git ls-remote https://github.com/embassy-rs/embassy.git HEAD`
NOTE: When using this method, its necessary that the `version` keys in `[dependencies]` match up with the versions defined in each crates `Cargo.toml` in the specificed `rev` under `[patch.crates.io]`. This means that when updating, you have to a pick a new revision, change everything in `[patch.crates.io]` to match it, and then correct any versions under `[dependencies]` which have changed. Hopefully this will no longer be necessary once embassy is released on crates.io!
At the time of writing, this method produces the following results:
[source,toml]
----
[dependencies]
embassy-stm32 = {version = "0.1.0", features = ["defmt", "time-driver-any", "stm32g474re", "memory-x", "unstable-pac", "exti"]}
embassy-executor = { version = "0.3.3", features = ["nightly", "arch-cortex-m", "executor-thread", "defmt", "integrated-timers"] }
embassy-time = { version = "0.2", features = ["defmt", "defmt-timestamp-uptime", "tick-hz-32_768"] }
[patch.crates-io]
embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "7703f47c1ecac029f603033b7977d9a2becef48c" }
embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "7703f47c1ecac029f603033b7977d9a2becef48c" }
embassy-stm32 = { git = "https://github.com/embassy-rs/embassy", rev = "7703f47c1ecac029f603033b7977d9a2becef48c" }
----
There are a few other dependencies we need to build the project, but fortunately theyre much simpler to install. Copy their lines from the example `Cargo.toml` to the the `[dependencies]` section in the new `Cargo.toml`:
[source,toml]
----
defmt = "0.3.5"
defmt-rtt = "0.4.0"
cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]}
cortex-m-rt = "0.7.3"
panic-probe = "0.3.1"
----
These are the bare minimum dependencies required to run `blinky.rs`, but its worth taking a look at the other dependencies specified in the example `Cargo.toml`, and noting what features are required for use with embassy for example `futures = { version = "0.3.17", default-features = false, features = ["async-await"] }`.
Finally, copy the `[profile.release]` section from the example `Cargo.toml` into ours.
[source,toml]
----
[profile.release]
debug = 2
----
== rust-toolchain.toml
Before we can build our project, we need to add an additional file to tell cargo to use the nightly toolchain. Copy the `rust-toolchain.toml` from the embassy repo to ours, and trim the list of targets down to only the target triple relevent for our project — in this case, `thumbv7em-none-eabi`:
[source]
----
stm32g474-example
├── .cargo
│   └── config.toml
├── Cargo.toml
├── rust-toolchain.toml
└── src
└── main.rs
----
[source,toml]
----
# Before upgrading check that everything is available on all tier1 targets here:
# https://rust-lang.github.io/rustup-components-history
[toolchain]
channel = "nightly-2023-11-01"
components = [ "rust-src", "rustfmt", "llvm-tools", "miri" ]
targets = ["thumbv7em-none-eabi"]
----
== build.rs
In order to produce a working binary for our target, cargo requires a custom build script. Copy `build.rs` from the example to our project:
[source]
----
stm32g474-example
├── build.rs
├── .cargo
│ └── config.toml
├── Cargo.toml
├── rust-toolchain.toml
└── src
└── main.rs
----
== Building and running
At this point, were finally ready to build and run our project! Connect your board via a debug probe and run:
[source,bash]
----
cargo run --release
----
should result in a blinking LED (if theres one attached to the pin in `src/main.rs` change it if not!) and the following output:
[source]
----
Compiling stm32g474-example v0.1.0 (/home/you/stm32g474-example)
Finished release [optimized + debuginfo] target(s) in 0.22s
Running `probe-rs run --chip STM32G474RETx target/thumbv7em-none-eabi/release/stm32g474-example`
Erasing sectors ✔ [00:00:00] [#########################################################] 18.00 KiB/18.00 KiB @ 54.09 KiB/s (eta 0s )
Programming pages ✔ [00:00:00] [#########################################################] 17.00 KiB/17.00 KiB @ 35.91 KiB/s (eta 0s ) Finished in 0.817s
0.000000 TRACE BDCR configured: 00008200
└─ embassy_stm32::rcc::bd::{impl#3}::init::{closure#4} @ /home/you/.cargo/git/checkouts/embassy-9312dcb0ed774b29/7703f47/embassy-stm32/src/fmt.rs:117
0.000000 DEBUG rcc: Clocks { sys: Hertz(16000000), pclk1: Hertz(16000000), pclk1_tim: Hertz(16000000), pclk2: Hertz(16000000), pclk2_tim: Hertz(16000000), hclk1: Hertz(16000000), hclk2: Hertz(16000000), pll1_p: None, adc: None, adc34: None, rtc: Some(Hertz(32000)) }
└─ embassy_stm32::rcc::set_freqs @ /home/you/.cargo/git/checkouts/embassy-9312dcb0ed774b29/7703f47/embassy-stm32/src/fmt.rs:130
0.000000 INFO Hello World!
└─ embassy_stm32g474::____embassy_main_task::{async_fn#0} @ src/main.rs:14
0.000091 INFO high
└─ embassy_stm32g474::____embassy_main_task::{async_fn#0} @ src/main.rs:19
0.300201 INFO low
└─ embassy_stm32g474::____embassy_main_task::{async_fn#0} @ src/main.rs:23
----

View File

@ -8,7 +8,7 @@ The nRF timer driver operates at 32768 Hz by default.
== Peripherals == Peripherals
The following peripherals have a HAL implementation at present: The following peripherals have a HAL implementation at present
* PWM * PWM
* SPIM * SPIM
@ -23,3 +23,7 @@ The following peripherals have a HAL implementation at present:
* UARTE * UARTE
* TWIM * TWIM
* SAADC * SAADC
== Bluetooth
For bluetooth, you can use the link:https://github.com/embassy-rs/nrf-softdevice[nrf-softdevice] crate.

View File

@ -0,0 +1,80 @@
= Project Structure
There are many ways to configure embassy and its components for your exact application. The link:https://github.com/embassy-rs/embassy/tree/main/examples[examples] directory for each chipset demonstrates how your project structure should look. Let's break it down:
The toplevel file structure of your project should look like this:
[source,plain]
----
{} = Maybe
my-project
|- .cargo
| |- config.toml
|- src
| |- main.rs
|- build.rs
|- Cargo.toml
|- {memory.x}
|- rust-toolchain.toml
----
=== .cargo/config.toml
This directory/file describes what platform you're on, and configures link:https://github.com/probe-rs/probe-rs[probe-rs] to deploy to your device.
Here is a minimal example:
[source,toml]
----
[target.thumbv6m-none-eabi] # <-change for your platform
runner = 'probe-rs run --chip STM32F031K6Tx' # <- change for your chip
[build]
target = "thumbv6m-none-eabi" # <-change for your platform
[env]
DEFMT_LOG = "trace" # <- can change to info, warn, or error
----
=== build.rs
This is the build script for your project. It links defmt (what is defmt?) and the `memory.x` file if needed. This file is pretty specific for each chipset, just copy and paste from the corresponding link:https://github.com/embassy-rs/embassy/tree/main/examples[example].
=== Cargo.toml
This is your manifest file, where you can configure all of the embassy components to use the features you need.
TODO: someone should exhaustively describe every feature for every component!
=== memory.x
This file outlines the flash/ram usage of your program. It is especially useful when using link:https://github.com/embassy-rs/nrf-softdevice[nrf-softdevice] on an nRF5x.
Here is an example for using S140 with an nRF52840:
[source,x]
----
MEMORY
{
/* NOTE 1 K = 1 KiBi = 1024 bytes */
/* These values correspond to the NRF52840 with Softdevices S140 7.0.1 */
FLASH : ORIGIN = 0x00027000, LENGTH = 868K
RAM : ORIGIN = 0x20020000, LENGTH = 128K
}
----
=== rust-toolchain.toml
This file configures the rust version and configuration to use.
A minimal example:
[source,toml]
----
[toolchain]
channel = "nightly-2023-08-19" # <- as of writing, this is the exact rust version embassy uses
components = [ "rust-src", "rustfmt" ] # <- optionally add "llvm-tools-preview" for some extra features like "cargo size"
targets = [
"thumbv6m-none-eabi" # <-change for your platform
]
----

View File

@ -6,11 +6,11 @@ The Embassy executor is an async/await executor designed for embedded usage alon
* No `alloc`, no heap needed. Task are statically allocated. * No `alloc`, no heap needed. Task are statically allocated.
* No "fixed capacity" data structures, executor works with 1 or 1000 tasks without needing config/tuning. * No "fixed capacity" data structures, executor works with 1 or 1000 tasks without needing config/tuning.
* Integrated timer queue: sleeping is easy, just do `Timer::after(Duration::from_secs(1)).await;`. * Integrated timer queue: sleeping is easy, just do `Timer::after_secs(1).await;`.
* No busy-loop polling: CPU sleeps when there's no work to do, using interrupts or `WFE/SEV`. * No busy-loop polling: CPU sleeps when there's no work to do, using interrupts or `WFE/SEV`.
* Efficient polling: a wake will only poll the woken task, not all of them. * Efficient polling: a wake will only poll the woken task, not all of them.
* Fair: a task can't monopolize CPU time even if it's constantly being woken. All other tasks get a chance to run before a given task gets polled for the second time. * Fair: a task can't monopolize CPU time even if it's constantly being woken. All other tasks get a chance to run before a given task gets polled for the second time.
* Creating multiple executor instances is supported, to run tasks with multiple priority levels. This allows higher-priority tasks to preempt lower-priority tasks. * Creating multiple executor instances is supported, to run tasks at different priority levels. This allows higher-priority tasks to preempt lower-priority tasks.
== Executor == Executor
@ -27,7 +27,7 @@ If you use the `#[embassy_executor::main]` macro in your application, it creates
Interrupts are a common way for peripherals to signal completion of some operation and fits well with the async execution model. The following diagram describes a typical application flow where (1) a task is polled and is attempting to make progress. The task then (2) instructs the peripheral to perform some operation, and awaits. After some time has passed, (3) an interrupt is raised, marking the completion of the operation. Interrupts are a common way for peripherals to signal completion of some operation and fits well with the async execution model. The following diagram describes a typical application flow where (1) a task is polled and is attempting to make progress. The task then (2) instructs the peripheral to perform some operation, and awaits. After some time has passed, (3) an interrupt is raised, marking the completion of the operation.
The peripheral HAL then (4) ensures that interrupt signals are routed to to the peripheral and updating the peripheral state with the results of the operation. The executor is then (5) notified that the task should be polled, which it will do. The peripheral HAL then (4) ensures that interrupt signals are routed to the peripheral and updating the peripheral state with the results of the operation. The executor is then (5) notified that the task should be polled, which it will do.
image::embassy_irq.png[Interrupt handling] image::embassy_irq.png[Interrupt handling]

View File

@ -25,32 +25,27 @@ features = ["defmt"]
[dependencies] [dependencies]
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }
digest = "0.10" digest = "0.10"
log = { version = "0.4", optional = true } log = { version = "0.4", optional = true }
ed25519-dalek = { version = "1.0.1", default_features = false, features = ["u32_backend"], optional = true } ed25519-dalek = { version = "2", default_features = false, features = ["digest"], optional = true }
embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal" } embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal" }
embassy-sync = { version = "0.2.0", path = "../../embassy-sync" } embassy-sync = { version = "0.5.0", path = "../../embassy-sync" }
embedded-storage = "0.3.0" embedded-storage = "0.3.1"
embedded-storage-async = { version = "0.4.0", optional = true } embedded-storage-async = { version = "0.4.1" }
salty = { git = "https://github.com/ycrypto/salty.git", rev = "a9f17911a5024698406b75c0fac56ab5ccf6a8c7", optional = true } salty = { version = "0.3", optional = true }
signature = { version = "1.6.4", default-features = false } signature = { version = "2.0", default-features = false }
[dev-dependencies] [dev-dependencies]
log = "0.4" log = "0.4"
env_logger = "0.9" env_logger = "0.9"
rand = "0.7" # ed25519-dalek v1.0.1 depends on this exact version rand = "0.8"
futures = { version = "0.3", features = ["executor"] } futures = { version = "0.3", features = ["executor"] }
sha1 = "0.10.5" sha1 = "0.10.5"
critical-section = { version = "1.1.1", features = ["std"] } critical-section = { version = "1.1.1", features = ["std"] }
ed25519-dalek = { version = "2", default_features = false, features = ["std", "rand_core", "digest"] }
[dev-dependencies.ed25519-dalek]
default_features = false
features = ["rand", "std", "u32_backend"]
[features] [features]
ed25519-dalek = ["dep:ed25519-dalek", "_verify"] ed25519-dalek = ["dep:ed25519-dalek", "_verify"]
ed25519-salty = ["dep:salty", "_verify"] ed25519-salty = ["dep:salty", "_verify"]
nightly = ["dep:embedded-storage-async", "embassy-embedded-hal/nightly"]
#Internal features #Internal features
_verify = [] _verify = []

View File

@ -8,6 +8,24 @@ The bootloader can be used either as a library or be flashed directly with the d
By design, the bootloader does not provide any network capabilities. Networking capabilities for fetching new firmware can be provided by the user application, using the bootloader as a library for updating the firmware, or by using the bootloader as a library and adding this capability yourself. By design, the bootloader does not provide any network capabilities. Networking capabilities for fetching new firmware can be provided by the user application, using the bootloader as a library for updating the firmware, or by using the bootloader as a library and adding this capability yourself.
## Overview
The bootloader divides the storage into 4 main partitions, configurable when creating the bootloader instance or via linker scripts:
* BOOTLOADER - Where the bootloader is placed. The bootloader itself consumes about 8kB of flash, but if you need to debug it and have space available, increasing this to 24kB will allow you to run the bootloader with probe-rs.
* ACTIVE - Where the main application is placed. The bootloader will attempt to load the application at the start of this partition. The minimum size required for this partition is the size of your application.
* DFU - Where the application-to-be-swapped is placed. This partition is written to by the application. This partition must be at least 1 page bigger than the ACTIVE partition.
* BOOTLOADER STATE - Where the bootloader stores the current state describing if the active and dfu partitions need to be swapped.
For any partition, the following preconditions are required:
* Partitions must be aligned on the page size.
* Partitions must be a multiple of the page size.
The linker scripts for the application and bootloader look similar, but the FLASH region must point to the BOOTLOADER partition for the bootloader, and the ACTIVE partition for the application.
For more details on the bootloader, see [the documentation](https://embassy.dev/book/dev/bootloader.html).
## Hardware support ## Hardware support
The bootloader supports different hardware in separate crates: The bootloader supports different hardware in separate crates:
@ -16,6 +34,7 @@ The bootloader supports different hardware in separate crates:
* `embassy-boot-rp` - for the RP2040 microcontrollers. * `embassy-boot-rp` - for the RP2040 microcontrollers.
* `embassy-boot-stm32` - for the STM32 microcontrollers. * `embassy-boot-stm32` - for the STM32 microcontrollers.
## Minimum supported Rust version (MSRV) ## Minimum supported Rust version (MSRV)
`embassy-boot` is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release. `embassy-boot` is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release.

View File

@ -5,7 +5,7 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex;
use embassy_sync::blocking_mutex::Mutex; use embassy_sync::blocking_mutex::Mutex;
use embedded_storage::nor_flash::{NorFlash, NorFlashError, NorFlashErrorKind}; use embedded_storage::nor_flash::{NorFlash, NorFlashError, NorFlashErrorKind};
use crate::{State, BOOT_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC}; use crate::{State, BOOT_MAGIC, DFU_DETACH_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC};
/// Errors returned by bootloader /// Errors returned by bootloader
#[derive(PartialEq, Eq, Debug)] #[derive(PartialEq, Eq, Debug)]
@ -135,51 +135,44 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash> BootLoader<ACTIVE, DFU, S
/// The provided aligned_buf argument must satisfy any alignment requirements /// The provided aligned_buf argument must satisfy any alignment requirements
/// given by the partition flashes. All flash operations will use this buffer. /// given by the partition flashes. All flash operations will use this buffer.
/// ///
/// SWAPPING /// ## SWAPPING
/// ///
/// Assume a flash size of 3 pages for the active partition, and 4 pages for the DFU partition. /// Assume a flash size of 3 pages for the active partition, and 4 pages for the DFU partition.
/// The swap index contains the copy progress, as to allow continuation of the copy process on /// The swap index contains the copy progress, as to allow continuation of the copy process on
/// power failure. The index counter is represented within 1 or more pages (depending on total /// power failure. The index counter is represented within 1 or more pages (depending on total
/// flash size), where a page X is considered swapped if index at location (X + WRITE_SIZE) /// flash size), where a page X is considered swapped if index at location (`X + WRITE_SIZE`)
/// contains a zero value. This ensures that index updates can be performed atomically and /// contains a zero value. This ensures that index updates can be performed atomically and
/// avoid a situation where the wrong index value is set (page write size is "atomic"). /// avoid a situation where the wrong index value is set (page write size is "atomic").
/// ///
/// +-----------+------------+--------+--------+--------+--------+ ///
/// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+------------+--------+--------+--------+--------+ /// |-----------|------------|--------|--------|--------|--------|
/// | Active | 0 | 1 | 2 | 3 | - | /// | Active | 0 | 1 | 2 | 3 | - |
/// | DFU | 0 | 3 | 2 | 1 | X | /// | DFU | 0 | 3 | 2 | 1 | X |
/// +-----------+------------+--------+--------+--------+--------+
/// ///
/// The algorithm starts by copying 'backwards', and after the first step, the layout is /// The algorithm starts by copying 'backwards', and after the first step, the layout is
/// as follows: /// as follows:
/// ///
/// +-----------+------------+--------+--------+--------+--------+
/// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+------------+--------+--------+--------+--------+ /// |-----------|------------|--------|--------|--------|--------|
/// | Active | 1 | 1 | 2 | 1 | - | /// | Active | 1 | 1 | 2 | 1 | - |
/// | DFU | 1 | 3 | 2 | 1 | 3 | /// | DFU | 1 | 3 | 2 | 1 | 3 |
/// +-----------+------------+--------+--------+--------+--------+
/// ///
/// The next iteration performs the same steps /// The next iteration performs the same steps
/// ///
/// +-----------+------------+--------+--------+--------+--------+
/// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+------------+--------+--------+--------+--------+ /// |-----------|------------|--------|--------|--------|--------|
/// | Active | 2 | 1 | 2 | 1 | - | /// | Active | 2 | 1 | 2 | 1 | - |
/// | DFU | 2 | 3 | 2 | 2 | 3 | /// | DFU | 2 | 3 | 2 | 2 | 3 |
/// +-----------+------------+--------+--------+--------+--------+
/// ///
/// And again until we're done /// And again until we're done
/// ///
/// +-----------+------------+--------+--------+--------+--------+
/// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Swap Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+------------+--------+--------+--------+--------+ /// |-----------|------------|--------|--------|--------|--------|
/// | Active | 3 | 3 | 2 | 1 | - | /// | Active | 3 | 3 | 2 | 1 | - |
/// | DFU | 3 | 3 | 1 | 2 | 3 | /// | DFU | 3 | 3 | 1 | 2 | 3 |
/// +-----------+------------+--------+--------+--------+--------+
/// ///
/// REVERTING /// ## REVERTING
/// ///
/// The reverting algorithm uses the swap index to discover that images were swapped, but that /// The reverting algorithm uses the swap index to discover that images were swapped, but that
/// the application failed to mark the boot successful. In this case, the revert algorithm will /// the application failed to mark the boot successful. In this case, the revert algorithm will
@ -190,28 +183,21 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash> BootLoader<ACTIVE, DFU, S
/// ///
/// The revert algorithm works forwards, by starting copying into the 'unused' DFU page at the start. /// The revert algorithm works forwards, by starting copying into the 'unused' DFU page at the start.
/// ///
/// +-----------+--------------+--------+--------+--------+--------+
/// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 |
//*/ /// |-----------|--------------|--------|--------|--------|--------|
/// +-----------+--------------+--------+--------+--------+--------+
/// | Active | 3 | 1 | 2 | 1 | - | /// | Active | 3 | 1 | 2 | 1 | - |
/// | DFU | 3 | 3 | 1 | 2 | 3 | /// | DFU | 3 | 3 | 1 | 2 | 3 |
/// +-----------+--------------+--------+--------+--------+--------+
/// ///
/// ///
/// +-----------+--------------+--------+--------+--------+--------+
/// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+--------------+--------+--------+--------+--------+ /// |-----------|--------------|--------|--------|--------|--------|
/// | Active | 3 | 1 | 2 | 1 | - | /// | Active | 3 | 1 | 2 | 1 | - |
/// | DFU | 3 | 3 | 2 | 2 | 3 | /// | DFU | 3 | 3 | 2 | 2 | 3 |
/// +-----------+--------------+--------+--------+--------+--------+
/// ///
/// +-----------+--------------+--------+--------+--------+--------+
/// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 | /// | Partition | Revert Index | Page 0 | Page 1 | Page 3 | Page 4 |
/// +-----------+--------------+--------+--------+--------+--------+ /// |-----------|--------------|--------|--------|--------|--------|
/// | Active | 3 | 1 | 2 | 3 | - | /// | Active | 3 | 1 | 2 | 3 | - |
/// | DFU | 3 | 3 | 2 | 1 | 3 | /// | DFU | 3 | 3 | 2 | 1 | 3 |
/// +-----------+--------------+--------+--------+--------+--------+
/// ///
pub fn prepare_boot(&mut self, aligned_buf: &mut [u8]) -> Result<State, BootError> { pub fn prepare_boot(&mut self, aligned_buf: &mut [u8]) -> Result<State, BootError> {
// Ensure we have enough progress pages to store copy progress // Ensure we have enough progress pages to store copy progress
@ -224,6 +210,7 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash> BootLoader<ACTIVE, DFU, S
assert_eq!(0, aligned_buf.len() % ACTIVE::WRITE_SIZE); assert_eq!(0, aligned_buf.len() % ACTIVE::WRITE_SIZE);
assert_eq!(0, aligned_buf.len() % DFU::WRITE_SIZE); assert_eq!(0, aligned_buf.len() % DFU::WRITE_SIZE);
// Ensure our partitions are able to handle boot operations
assert_partitions(&self.active, &self.dfu, &self.state, Self::PAGE_SIZE); assert_partitions(&self.active, &self.dfu, &self.state, Self::PAGE_SIZE);
// Copy contents from partition N to active // Copy contents from partition N to active
@ -384,6 +371,8 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash> BootLoader<ACTIVE, DFU, S
if !state_word.iter().any(|&b| b != SWAP_MAGIC) { if !state_word.iter().any(|&b| b != SWAP_MAGIC) {
Ok(State::Swap) Ok(State::Swap)
} else if !state_word.iter().any(|&b| b != DFU_DETACH_MAGIC) {
Ok(State::DfuDetach)
} else { } else {
Ok(State::Boot) Ok(State::Boot)
} }
@ -398,6 +387,7 @@ fn assert_partitions<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash>(
) { ) {
assert_eq!(active.capacity() as u32 % page_size, 0); assert_eq!(active.capacity() as u32 % page_size, 0);
assert_eq!(dfu.capacity() as u32 % page_size, 0); assert_eq!(dfu.capacity() as u32 % page_size, 0);
// DFU partition has to be bigger than ACTIVE partition to handle swap algorithm
assert!(dfu.capacity() as u32 - active.capacity() as u32 >= page_size); assert!(dfu.capacity() as u32 - active.capacity() as u32 >= page_size);
assert!(2 + 2 * (active.capacity() as u32 / page_size) <= state.capacity() as u32 / STATE::WRITE_SIZE as u32); assert!(2 + 2 * (active.capacity() as u32 / page_size) <= state.capacity() as u32 / STATE::WRITE_SIZE as u32);
} }

View File

@ -1,6 +1,6 @@
use digest::typenum::U64; use digest::typenum::U64;
use digest::{FixedOutput, HashMarker, OutputSizeUser, Update}; use digest::{FixedOutput, HashMarker, OutputSizeUser, Update};
use ed25519_dalek::Digest as _; use ed25519_dalek::Digest;
pub struct Sha512(ed25519_dalek::Sha512); pub struct Sha512(ed25519_dalek::Sha512);
@ -12,7 +12,7 @@ impl Default for Sha512 {
impl Update for Sha512 { impl Update for Sha512 {
fn update(&mut self, data: &[u8]) { fn update(&mut self, data: &[u8]) {
self.0.update(data) Digest::update(&mut self.0, data)
} }
} }

View File

@ -6,13 +6,13 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex;
use embedded_storage_async::nor_flash::NorFlash; use embedded_storage_async::nor_flash::NorFlash;
use super::FirmwareUpdaterConfig; use super::FirmwareUpdaterConfig;
use crate::{FirmwareUpdaterError, State, BOOT_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC}; use crate::{FirmwareUpdaterError, State, BOOT_MAGIC, DFU_DETACH_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC};
/// FirmwareUpdater is an application API for interacting with the BootLoader without the ability to /// FirmwareUpdater is an application API for interacting with the BootLoader without the ability to
/// 'mess up' the internal bootloader state /// 'mess up' the internal bootloader state
pub struct FirmwareUpdater<DFU: NorFlash, STATE: NorFlash> { pub struct FirmwareUpdater<'d, DFU: NorFlash, STATE: NorFlash> {
dfu: DFU, dfu: DFU,
state: STATE, state: FirmwareState<'d, STATE>,
} }
#[cfg(target_os = "none")] #[cfg(target_os = "none")]
@ -47,22 +47,12 @@ impl<'a, FLASH: NorFlash>
} }
} }
impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> { impl<'d, DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<'d, DFU, STATE> {
/// Create a firmware updater instance with partition ranges for the update and state partitions. /// Create a firmware updater instance with partition ranges for the update and state partitions.
pub fn new(config: FirmwareUpdaterConfig<DFU, STATE>) -> Self { pub fn new(config: FirmwareUpdaterConfig<DFU, STATE>, aligned: &'d mut [u8]) -> Self {
Self { Self {
dfu: config.dfu, dfu: config.dfu,
state: config.state, state: FirmwareState::new(config.state, aligned),
}
}
// Make sure we are running a booted firmware to avoid reverting to a bad state.
async fn verify_booted(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
if self.get_state(aligned).await? == State::Boot {
Ok(())
} else {
Err(FirmwareUpdaterError::BadState)
} }
} }
@ -71,14 +61,8 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
/// This is useful to check if the bootloader has just done a swap, in order /// This is useful to check if the bootloader has just done a swap, in order
/// to do verifications and self-tests of the new image before calling /// to do verifications and self-tests of the new image before calling
/// `mark_booted`. /// `mark_booted`.
pub async fn get_state(&mut self, aligned: &mut [u8]) -> Result<State, FirmwareUpdaterError> { pub async fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> {
self.state.read(0, aligned).await?; self.state.get_state().await
if !aligned.iter().any(|&b| b != SWAP_MAGIC) {
Ok(State::Swap)
} else {
Ok(State::Boot)
}
} }
/// Verify the DFU given a public key. If there is an error then DO NOT /// Verify the DFU given a public key. If there is an error then DO NOT
@ -92,43 +76,36 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
/// ///
/// If no signature feature is set then this method will always return a /// If no signature feature is set then this method will always return a
/// signature error. /// signature error.
///
/// # Safety
///
/// The `_aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
#[cfg(feature = "_verify")] #[cfg(feature = "_verify")]
pub async fn verify_and_mark_updated( pub async fn verify_and_mark_updated(
&mut self, &mut self,
_public_key: &[u8], _public_key: &[u8; 32],
_signature: &[u8], _signature: &[u8; 64],
_update_len: u32, _update_len: u32,
_aligned: &mut [u8],
) -> Result<(), FirmwareUpdaterError> { ) -> Result<(), FirmwareUpdaterError> {
assert_eq!(_aligned.len(), STATE::WRITE_SIZE);
assert!(_update_len <= self.dfu.capacity() as u32); assert!(_update_len <= self.dfu.capacity() as u32);
self.verify_booted(_aligned).await?; self.state.verify_booted().await?;
#[cfg(feature = "ed25519-dalek")] #[cfg(feature = "ed25519-dalek")]
{ {
use ed25519_dalek::{PublicKey, Signature, SignatureError, Verifier}; use ed25519_dalek::{Signature, SignatureError, Verifier, VerifyingKey};
use crate::digest_adapters::ed25519_dalek::Sha512; use crate::digest_adapters::ed25519_dalek::Sha512;
let into_signature_error = |e: SignatureError| FirmwareUpdaterError::Signature(e.into()); let into_signature_error = |e: SignatureError| FirmwareUpdaterError::Signature(e.into());
let public_key = PublicKey::from_bytes(_public_key).map_err(into_signature_error)?; let public_key = VerifyingKey::from_bytes(_public_key).map_err(into_signature_error)?;
let signature = Signature::from_bytes(_signature).map_err(into_signature_error)?; let signature = Signature::from_bytes(_signature);
let mut chunk_buf = [0; 2];
let mut message = [0; 64]; let mut message = [0; 64];
self.hash::<Sha512>(_update_len, _aligned, &mut message).await?; self.hash::<Sha512>(_update_len, &mut chunk_buf, &mut message).await?;
public_key.verify(&message, &signature).map_err(into_signature_error)? public_key.verify(&message, &signature).map_err(into_signature_error)?
} }
#[cfg(feature = "ed25519-salty")] #[cfg(feature = "ed25519-salty")]
{ {
use salty::constants::{PUBLICKEY_SERIALIZED_LENGTH, SIGNATURE_SERIALIZED_LENGTH};
use salty::{PublicKey, Signature}; use salty::{PublicKey, Signature};
use crate::digest_adapters::salty::Sha512; use crate::digest_adapters::salty::Sha512;
@ -137,13 +114,12 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
FirmwareUpdaterError::Signature(signature::Error::default()) FirmwareUpdaterError::Signature(signature::Error::default())
} }
let public_key: [u8; PUBLICKEY_SERIALIZED_LENGTH] = _public_key.try_into().map_err(into_signature_error)?; let public_key = PublicKey::try_from(_public_key).map_err(into_signature_error)?;
let public_key = PublicKey::try_from(&public_key).map_err(into_signature_error)?; let signature = Signature::try_from(_signature).map_err(into_signature_error)?;
let signature: [u8; SIGNATURE_SERIALIZED_LENGTH] = _signature.try_into().map_err(into_signature_error)?;
let signature = Signature::try_from(&signature).map_err(into_signature_error)?;
let mut message = [0; 64]; let mut message = [0; 64];
self.hash::<Sha512>(_update_len, _aligned, &mut message).await?; let mut chunk_buf = [0; 2];
self.hash::<Sha512>(_update_len, &mut chunk_buf, &mut message).await?;
let r = public_key.verify(&message, &signature); let r = public_key.verify(&message, &signature);
trace!( trace!(
@ -156,7 +132,7 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
r.map_err(into_signature_error)? r.map_err(into_signature_error)?
} }
self.set_magic(_aligned, SWAP_MAGIC).await self.state.mark_updated().await
} }
/// Verify the update in DFU with any digest. /// Verify the update in DFU with any digest.
@ -177,49 +153,20 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
} }
/// Mark to trigger firmware swap on next boot. /// Mark to trigger firmware swap on next boot.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
#[cfg(not(feature = "_verify"))] #[cfg(not(feature = "_verify"))]
pub async fn mark_updated(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> { pub async fn mark_updated(&mut self) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE); self.state.mark_updated().await
self.set_magic(aligned, SWAP_MAGIC).await }
/// Mark to trigger USB DFU on next boot.
pub async fn mark_dfu(&mut self) -> Result<(), FirmwareUpdaterError> {
self.state.verify_booted().await?;
self.state.mark_dfu().await
} }
/// Mark firmware boot successful and stop rollback on reset. /// Mark firmware boot successful and stop rollback on reset.
/// pub async fn mark_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
/// # Safety self.state.mark_booted().await
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
pub async fn mark_booted(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.set_magic(aligned, BOOT_MAGIC).await
}
async fn set_magic(&mut self, aligned: &mut [u8], magic: u8) -> Result<(), FirmwareUpdaterError> {
self.state.read(0, aligned).await?;
if aligned.iter().any(|&b| b != magic) {
// Read progress validity
self.state.read(STATE::WRITE_SIZE as u32, aligned).await?;
if aligned.iter().any(|&b| b != STATE_ERASE_VALUE) {
// The current progress validity marker is invalid
} else {
// Invalidate progress
aligned.fill(!STATE_ERASE_VALUE);
self.state.write(STATE::WRITE_SIZE as u32, aligned).await?;
}
// Clear magic and progress
self.state.erase(0, self.state.capacity() as u32).await?;
// Set magic
aligned.fill(magic);
self.state.write(0, aligned).await?;
}
Ok(())
} }
/// Write data to a flash page. /// Write data to a flash page.
@ -229,16 +176,10 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
/// # Safety /// # Safety
/// ///
/// Failing to meet alignment and size requirements may result in a panic. /// Failing to meet alignment and size requirements may result in a panic.
pub async fn write_firmware( pub async fn write_firmware(&mut self, offset: usize, data: &[u8]) -> Result<(), FirmwareUpdaterError> {
&mut self,
aligned: &mut [u8],
offset: usize,
data: &[u8],
) -> Result<(), FirmwareUpdaterError> {
assert!(data.len() >= DFU::ERASE_SIZE); assert!(data.len() >= DFU::ERASE_SIZE);
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.verify_booted(aligned).await?; self.state.verify_booted().await?;
self.dfu.erase(offset as u32, (offset + data.len()) as u32).await?; self.dfu.erase(offset as u32, (offset + data.len()) as u32).await?;
@ -252,20 +193,109 @@ impl<DFU: NorFlash, STATE: NorFlash> FirmwareUpdater<DFU, STATE> {
/// ///
/// Using this instead of `write_firmware` allows for an optimized API in /// Using this instead of `write_firmware` allows for an optimized API in
/// exchange for added complexity. /// exchange for added complexity.
/// pub async fn prepare_update(&mut self) -> Result<&mut DFU, FirmwareUpdaterError> {
/// # Safety self.state.verify_booted().await?;
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
pub async fn prepare_update(&mut self, aligned: &mut [u8]) -> Result<&mut DFU, FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.verify_booted(aligned).await?;
self.dfu.erase(0, self.dfu.capacity() as u32).await?; self.dfu.erase(0, self.dfu.capacity() as u32).await?;
Ok(&mut self.dfu) Ok(&mut self.dfu)
} }
} }
/// Manages the state partition of the firmware update.
///
/// Can be used standalone for more fine grained control, or as part of the updater.
pub struct FirmwareState<'d, STATE> {
state: STATE,
aligned: &'d mut [u8],
}
impl<'d, STATE: NorFlash> FirmwareState<'d, STATE> {
/// Create a firmware state instance from a FirmwareUpdaterConfig with a buffer for magic content and state partition.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
pub fn from_config<DFU: NorFlash>(config: FirmwareUpdaterConfig<DFU, STATE>, aligned: &'d mut [u8]) -> Self {
Self::new(config.state, aligned)
}
/// Create a firmware state instance with a buffer for magic content and state partition.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
pub fn new(state: STATE, aligned: &'d mut [u8]) -> Self {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
Self { state, aligned }
}
// Make sure we are running a booted firmware to avoid reverting to a bad state.
async fn verify_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
if self.get_state().await? == State::Boot {
Ok(())
} else {
Err(FirmwareUpdaterError::BadState)
}
}
/// Obtain the current state.
///
/// This is useful to check if the bootloader has just done a swap, in order
/// to do verifications and self-tests of the new image before calling
/// `mark_booted`.
pub async fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> {
self.state.read(0, &mut self.aligned).await?;
if !self.aligned.iter().any(|&b| b != SWAP_MAGIC) {
Ok(State::Swap)
} else {
Ok(State::Boot)
}
}
/// Mark to trigger firmware swap on next boot.
pub async fn mark_updated(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(SWAP_MAGIC).await
}
/// Mark to trigger USB DFU on next boot.
pub async fn mark_dfu(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(DFU_DETACH_MAGIC).await
}
/// Mark firmware boot successful and stop rollback on reset.
pub async fn mark_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(BOOT_MAGIC).await
}
async fn set_magic(&mut self, magic: u8) -> Result<(), FirmwareUpdaterError> {
self.state.read(0, &mut self.aligned).await?;
if self.aligned.iter().any(|&b| b != magic) {
// Read progress validity
self.state.read(STATE::WRITE_SIZE as u32, &mut self.aligned).await?;
if self.aligned.iter().any(|&b| b != STATE_ERASE_VALUE) {
// The current progress validity marker is invalid
} else {
// Invalidate progress
self.aligned.fill(!STATE_ERASE_VALUE);
self.state.write(STATE::WRITE_SIZE as u32, &self.aligned).await?;
}
// Clear magic and progress
self.state.erase(0, self.state.capacity() as u32).await?;
// Set magic
self.aligned.fill(magic);
self.state.write(0, &self.aligned).await?;
}
Ok(())
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use embassy_embedded_hal::flash::partition::Partition; use embassy_embedded_hal::flash::partition::Partition;
@ -288,8 +318,8 @@ mod tests {
let mut to_write = [0; 4096]; let mut to_write = [0; 4096];
to_write[..7].copy_from_slice(update.as_slice()); to_write[..7].copy_from_slice(update.as_slice());
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { dfu, state }); let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { dfu, state }, &mut aligned);
block_on(updater.write_firmware(&mut aligned, 0, to_write.as_slice())).unwrap(); block_on(updater.write_firmware(0, to_write.as_slice())).unwrap();
let mut chunk_buf = [0; 2]; let mut chunk_buf = [0; 2];
let mut hash = [0; 20]; let mut hash = [0; 20];
block_on(updater.hash::<Sha1>(update.len() as u32, &mut chunk_buf, &mut hash)).unwrap(); block_on(updater.hash::<Sha1>(update.len() as u32, &mut chunk_buf, &mut hash)).unwrap();

View File

@ -6,13 +6,13 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex;
use embedded_storage::nor_flash::NorFlash; use embedded_storage::nor_flash::NorFlash;
use super::FirmwareUpdaterConfig; use super::FirmwareUpdaterConfig;
use crate::{FirmwareUpdaterError, State, BOOT_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC}; use crate::{FirmwareUpdaterError, State, BOOT_MAGIC, DFU_DETACH_MAGIC, STATE_ERASE_VALUE, SWAP_MAGIC};
/// Blocking FirmwareUpdater is an application API for interacting with the BootLoader without the ability to /// Blocking FirmwareUpdater is an application API for interacting with the BootLoader without the ability to
/// 'mess up' the internal bootloader state /// 'mess up' the internal bootloader state
pub struct BlockingFirmwareUpdater<DFU: NorFlash, STATE: NorFlash> { pub struct BlockingFirmwareUpdater<'d, DFU: NorFlash, STATE: NorFlash> {
dfu: DFU, dfu: DFU,
state: STATE, state: BlockingFirmwareState<'d, STATE>,
} }
#[cfg(target_os = "none")] #[cfg(target_os = "none")]
@ -49,22 +49,17 @@ impl<'a, FLASH: NorFlash>
} }
} }
impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> { impl<'d, DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<'d, DFU, STATE> {
/// Create a firmware updater instance with partition ranges for the update and state partitions. /// Create a firmware updater instance with partition ranges for the update and state partitions.
pub fn new(config: FirmwareUpdaterConfig<DFU, STATE>) -> Self { ///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
pub fn new(config: FirmwareUpdaterConfig<DFU, STATE>, aligned: &'d mut [u8]) -> Self {
Self { Self {
dfu: config.dfu, dfu: config.dfu,
state: config.state, state: BlockingFirmwareState::new(config.state, aligned),
}
}
// Make sure we are running a booted firmware to avoid reverting to a bad state.
fn verify_booted(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
if self.get_state(aligned)? == State::Boot {
Ok(())
} else {
Err(FirmwareUpdaterError::BadState)
} }
} }
@ -73,14 +68,8 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
/// This is useful to check if the bootloader has just done a swap, in order /// This is useful to check if the bootloader has just done a swap, in order
/// to do verifications and self-tests of the new image before calling /// to do verifications and self-tests of the new image before calling
/// `mark_booted`. /// `mark_booted`.
pub fn get_state(&mut self, aligned: &mut [u8]) -> Result<State, FirmwareUpdaterError> { pub fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> {
self.state.read(0, aligned)?; self.state.get_state()
if !aligned.iter().any(|&b| b != SWAP_MAGIC) {
Ok(State::Swap)
} else {
Ok(State::Boot)
}
} }
/// Verify the DFU given a public key. If there is an error then DO NOT /// Verify the DFU given a public key. If there is an error then DO NOT
@ -94,43 +83,36 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
/// ///
/// If no signature feature is set then this method will always return a /// If no signature feature is set then this method will always return a
/// signature error. /// signature error.
///
/// # Safety
///
/// The `_aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
#[cfg(feature = "_verify")] #[cfg(feature = "_verify")]
pub fn verify_and_mark_updated( pub fn verify_and_mark_updated(
&mut self, &mut self,
_public_key: &[u8], _public_key: &[u8; 32],
_signature: &[u8], _signature: &[u8; 64],
_update_len: u32, _update_len: u32,
_aligned: &mut [u8],
) -> Result<(), FirmwareUpdaterError> { ) -> Result<(), FirmwareUpdaterError> {
assert_eq!(_aligned.len(), STATE::WRITE_SIZE);
assert!(_update_len <= self.dfu.capacity() as u32); assert!(_update_len <= self.dfu.capacity() as u32);
self.verify_booted(_aligned)?; self.state.verify_booted()?;
#[cfg(feature = "ed25519-dalek")] #[cfg(feature = "ed25519-dalek")]
{ {
use ed25519_dalek::{PublicKey, Signature, SignatureError, Verifier}; use ed25519_dalek::{Signature, SignatureError, Verifier, VerifyingKey};
use crate::digest_adapters::ed25519_dalek::Sha512; use crate::digest_adapters::ed25519_dalek::Sha512;
let into_signature_error = |e: SignatureError| FirmwareUpdaterError::Signature(e.into()); let into_signature_error = |e: SignatureError| FirmwareUpdaterError::Signature(e.into());
let public_key = PublicKey::from_bytes(_public_key).map_err(into_signature_error)?; let public_key = VerifyingKey::from_bytes(_public_key).map_err(into_signature_error)?;
let signature = Signature::from_bytes(_signature).map_err(into_signature_error)?; let signature = Signature::from_bytes(_signature);
let mut message = [0; 64]; let mut message = [0; 64];
self.hash::<Sha512>(_update_len, _aligned, &mut message)?; let mut chunk_buf = [0; 2];
self.hash::<Sha512>(_update_len, &mut chunk_buf, &mut message)?;
public_key.verify(&message, &signature).map_err(into_signature_error)? public_key.verify(&message, &signature).map_err(into_signature_error)?
} }
#[cfg(feature = "ed25519-salty")] #[cfg(feature = "ed25519-salty")]
{ {
use salty::constants::{PUBLICKEY_SERIALIZED_LENGTH, SIGNATURE_SERIALIZED_LENGTH};
use salty::{PublicKey, Signature}; use salty::{PublicKey, Signature};
use crate::digest_adapters::salty::Sha512; use crate::digest_adapters::salty::Sha512;
@ -139,13 +121,12 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
FirmwareUpdaterError::Signature(signature::Error::default()) FirmwareUpdaterError::Signature(signature::Error::default())
} }
let public_key: [u8; PUBLICKEY_SERIALIZED_LENGTH] = _public_key.try_into().map_err(into_signature_error)?; let public_key = PublicKey::try_from(_public_key).map_err(into_signature_error)?;
let public_key = PublicKey::try_from(&public_key).map_err(into_signature_error)?; let signature = Signature::try_from(_signature).map_err(into_signature_error)?;
let signature: [u8; SIGNATURE_SERIALIZED_LENGTH] = _signature.try_into().map_err(into_signature_error)?;
let signature = Signature::try_from(&signature).map_err(into_signature_error)?;
let mut message = [0; 64]; let mut message = [0; 64];
self.hash::<Sha512>(_update_len, _aligned, &mut message)?; let mut chunk_buf = [0; 2];
self.hash::<Sha512>(_update_len, &mut chunk_buf, &mut message)?;
let r = public_key.verify(&message, &signature); let r = public_key.verify(&message, &signature);
trace!( trace!(
@ -158,7 +139,7 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
r.map_err(into_signature_error)? r.map_err(into_signature_error)?
} }
self.set_magic(_aligned, SWAP_MAGIC) self.state.mark_updated()
} }
/// Verify the update in DFU with any digest. /// Verify the update in DFU with any digest.
@ -179,49 +160,20 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
} }
/// Mark to trigger firmware swap on next boot. /// Mark to trigger firmware swap on next boot.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
#[cfg(not(feature = "_verify"))] #[cfg(not(feature = "_verify"))]
pub fn mark_updated(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> { pub fn mark_updated(&mut self) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE); self.state.mark_updated()
self.set_magic(aligned, SWAP_MAGIC) }
/// Mark to trigger USB DFU device on next boot.
pub fn mark_dfu(&mut self) -> Result<(), FirmwareUpdaterError> {
self.state.verify_booted()?;
self.state.mark_dfu()
} }
/// Mark firmware boot successful and stop rollback on reset. /// Mark firmware boot successful and stop rollback on reset.
/// pub fn mark_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
/// # Safety self.state.mark_booted()
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
pub fn mark_booted(&mut self, aligned: &mut [u8]) -> Result<(), FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.set_magic(aligned, BOOT_MAGIC)
}
fn set_magic(&mut self, aligned: &mut [u8], magic: u8) -> Result<(), FirmwareUpdaterError> {
self.state.read(0, aligned)?;
if aligned.iter().any(|&b| b != magic) {
// Read progress validity
self.state.read(STATE::WRITE_SIZE as u32, aligned)?;
if aligned.iter().any(|&b| b != STATE_ERASE_VALUE) {
// The current progress validity marker is invalid
} else {
// Invalidate progress
aligned.fill(!STATE_ERASE_VALUE);
self.state.write(STATE::WRITE_SIZE as u32, aligned)?;
}
// Clear magic and progress
self.state.erase(0, self.state.capacity() as u32)?;
// Set magic
aligned.fill(magic);
self.state.write(0, aligned)?;
}
Ok(())
} }
/// Write data to a flash page. /// Write data to a flash page.
@ -231,17 +183,13 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
/// # Safety /// # Safety
/// ///
/// Failing to meet alignment and size requirements may result in a panic. /// Failing to meet alignment and size requirements may result in a panic.
pub fn write_firmware( pub fn write_firmware(&mut self, offset: usize, data: &[u8]) -> Result<(), FirmwareUpdaterError> {
&mut self, //assert!(data.len() >= DFU::ERASE_SIZE);
aligned: &mut [u8], self.state.verify_booted()?;
offset: usize,
data: &[u8],
) -> Result<(), FirmwareUpdaterError> {
assert!(data.len() >= DFU::ERASE_SIZE);
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.verify_booted(aligned)?;
self.dfu.erase(offset as u32, (offset + data.len()) as u32)?; if offset == 0 {
self.dfu.erase(0, self.dfu.capacity() as u32)?;
}
self.dfu.write(offset as u32, data)?; self.dfu.write(offset as u32, data)?;
@ -253,19 +201,111 @@ impl<DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<DFU, STATE> {
/// ///
/// Using this instead of `write_firmware` allows for an optimized API in /// Using this instead of `write_firmware` allows for an optimized API in
/// exchange for added complexity. /// exchange for added complexity.
/// pub fn prepare_update(&mut self) -> Result<&mut DFU, FirmwareUpdaterError> {
/// # Safety self.state.verify_booted()?;
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being written to.
pub fn prepare_update(&mut self, aligned: &mut [u8]) -> Result<&mut DFU, FirmwareUpdaterError> {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
self.verify_booted(aligned)?;
self.dfu.erase(0, self.dfu.capacity() as u32)?; self.dfu.erase(0, self.dfu.capacity() as u32)?;
Ok(&mut self.dfu) Ok(&mut self.dfu)
} }
} }
/// Manages the state partition of the firmware update.
///
/// Can be used standalone for more fine grained control, or as part of the updater.
pub struct BlockingFirmwareState<'d, STATE> {
state: STATE,
aligned: &'d mut [u8],
}
impl<'d, STATE: NorFlash> BlockingFirmwareState<'d, STATE> {
/// Creates a firmware state instance from a FirmwareUpdaterConfig, with a buffer for magic content and state partition.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
pub fn from_config<DFU: NorFlash>(config: FirmwareUpdaterConfig<DFU, STATE>, aligned: &'d mut [u8]) -> Self {
Self::new(config.state, aligned)
}
/// Create a firmware state instance with a buffer for magic content and state partition.
///
/// # Safety
///
/// The `aligned` buffer must have a size of STATE::WRITE_SIZE, and follow the alignment rules for the flash being read from
/// and written to.
pub fn new(state: STATE, aligned: &'d mut [u8]) -> Self {
assert_eq!(aligned.len(), STATE::WRITE_SIZE);
Self { state, aligned }
}
// Make sure we are running a booted firmware to avoid reverting to a bad state.
fn verify_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
if self.get_state()? == State::Boot || self.get_state()? == State::DfuDetach {
Ok(())
} else {
Err(FirmwareUpdaterError::BadState)
}
}
/// Obtain the current state.
///
/// This is useful to check if the bootloader has just done a swap, in order
/// to do verifications and self-tests of the new image before calling
/// `mark_booted`.
pub fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> {
self.state.read(0, &mut self.aligned)?;
if !self.aligned.iter().any(|&b| b != SWAP_MAGIC) {
Ok(State::Swap)
} else if !self.aligned.iter().any(|&b| b != DFU_DETACH_MAGIC) {
Ok(State::DfuDetach)
} else {
Ok(State::Boot)
}
}
/// Mark to trigger firmware swap on next boot.
pub fn mark_updated(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(SWAP_MAGIC)
}
/// Mark to trigger USB DFU on next boot.
pub fn mark_dfu(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(DFU_DETACH_MAGIC)
}
/// Mark firmware boot successful and stop rollback on reset.
pub fn mark_booted(&mut self) -> Result<(), FirmwareUpdaterError> {
self.set_magic(BOOT_MAGIC)
}
fn set_magic(&mut self, magic: u8) -> Result<(), FirmwareUpdaterError> {
self.state.read(0, &mut self.aligned)?;
if self.aligned.iter().any(|&b| b != magic) {
// Read progress validity
self.state.read(STATE::WRITE_SIZE as u32, &mut self.aligned)?;
if self.aligned.iter().any(|&b| b != STATE_ERASE_VALUE) {
// The current progress validity marker is invalid
} else {
// Invalidate progress
self.aligned.fill(!STATE_ERASE_VALUE);
self.state.write(STATE::WRITE_SIZE as u32, &self.aligned)?;
}
// Clear magic and progress
self.state.erase(0, self.state.capacity() as u32)?;
// Set magic
self.aligned.fill(magic);
self.state.write(0, &self.aligned)?;
}
Ok(())
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use core::cell::RefCell; use core::cell::RefCell;
@ -283,14 +323,14 @@ mod tests {
let flash = Mutex::<NoopRawMutex, _>::new(RefCell::new(MemFlash::<131072, 4096, 8>::default())); let flash = Mutex::<NoopRawMutex, _>::new(RefCell::new(MemFlash::<131072, 4096, 8>::default()));
let state = BlockingPartition::new(&flash, 0, 4096); let state = BlockingPartition::new(&flash, 0, 4096);
let dfu = BlockingPartition::new(&flash, 65536, 65536); let dfu = BlockingPartition::new(&flash, 65536, 65536);
let mut aligned = [0; 8];
let update = [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66]; let update = [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66];
let mut to_write = [0; 4096]; let mut to_write = [0; 4096];
to_write[..7].copy_from_slice(update.as_slice()); to_write[..7].copy_from_slice(update.as_slice());
let mut updater = BlockingFirmwareUpdater::new(FirmwareUpdaterConfig { dfu, state }); let mut updater = BlockingFirmwareUpdater::new(FirmwareUpdaterConfig { dfu, state }, &mut aligned);
let mut aligned = [0; 8]; updater.write_firmware(0, to_write.as_slice()).unwrap();
updater.write_firmware(&mut aligned, 0, to_write.as_slice()).unwrap();
let mut chunk_buf = [0; 2]; let mut chunk_buf = [0; 2];
let mut hash = [0; 20]; let mut hash = [0; 20];
updater updater

View File

@ -1,10 +1,8 @@
#[cfg(feature = "nightly")]
mod asynch; mod asynch;
mod blocking; mod blocking;
#[cfg(feature = "nightly")] pub use asynch::{FirmwareState, FirmwareUpdater};
pub use asynch::FirmwareUpdater; pub use blocking::{BlockingFirmwareState, BlockingFirmwareUpdater};
pub use blocking::BlockingFirmwareUpdater;
use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind}; use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind};
/// Firmware updater flash configuration holding the two flashes used by the updater /// Firmware updater flash configuration holding the two flashes used by the updater

View File

@ -1,6 +1,8 @@
#![macro_use] #![macro_use]
#![allow(unused_macros)] #![allow(unused_macros)]
use core::fmt::{Debug, Display, LowerHex};
#[cfg(all(feature = "defmt", feature = "log"))] #[cfg(all(feature = "defmt", feature = "log"))]
compile_error!("You may not enable both `defmt` and `log` features."); compile_error!("You may not enable both `defmt` and `log` features.");
@ -81,14 +83,17 @@ macro_rules! todo {
}; };
} }
#[cfg(not(feature = "defmt"))]
macro_rules! unreachable { macro_rules! unreachable {
($($x:tt)*) => { ($($x:tt)*) => {
{ ::core::unreachable!($($x)*)
#[cfg(not(feature = "defmt"))] };
::core::unreachable!($($x)*); }
#[cfg(feature = "defmt")]
::defmt::unreachable!($($x)*); #[cfg(feature = "defmt")]
} macro_rules! unreachable {
($($x:tt)*) => {
::defmt::unreachable!($($x)*)
}; };
} }
@ -223,3 +228,31 @@ impl<T, E> Try for Result<T, E> {
self self
} }
} }
#[allow(unused)]
pub(crate) struct Bytes<'a>(pub &'a [u8]);
impl<'a> Debug for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> Display for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> LowerHex for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
#[cfg(feature = "defmt")]
impl<'a> defmt::Format for Bytes<'a> {
fn format(&self, fmt: defmt::Formatter) {
defmt::write!(fmt, "{:02x}", self.0)
}
}

View File

@ -1,5 +1,5 @@
#![cfg_attr(feature = "nightly", feature(async_fn_in_trait))]
#![no_std] #![no_std]
#![allow(async_fn_in_trait)]
#![warn(missing_docs)] #![warn(missing_docs)]
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
mod fmt; mod fmt;
@ -16,12 +16,14 @@ mod test_flash;
// TODO: Use the value provided by NorFlash when available // TODO: Use the value provided by NorFlash when available
pub(crate) const STATE_ERASE_VALUE: u8 = 0xFF; pub(crate) const STATE_ERASE_VALUE: u8 = 0xFF;
pub use boot_loader::{BootError, BootLoader, BootLoaderConfig}; pub use boot_loader::{BootError, BootLoader, BootLoaderConfig};
#[cfg(feature = "nightly")] pub use firmware_updater::{
pub use firmware_updater::FirmwareUpdater; BlockingFirmwareState, BlockingFirmwareUpdater, FirmwareState, FirmwareUpdater, FirmwareUpdaterConfig,
pub use firmware_updater::{BlockingFirmwareUpdater, FirmwareUpdaterConfig, FirmwareUpdaterError}; FirmwareUpdaterError,
};
pub(crate) const BOOT_MAGIC: u8 = 0xD0; pub(crate) const BOOT_MAGIC: u8 = 0xD0;
pub(crate) const SWAP_MAGIC: u8 = 0xF0; pub(crate) const SWAP_MAGIC: u8 = 0xF0;
pub(crate) const DFU_DETACH_MAGIC: u8 = 0xE0;
/// The state of the bootloader after running prepare. /// The state of the bootloader after running prepare.
#[derive(PartialEq, Eq, Debug)] #[derive(PartialEq, Eq, Debug)]
@ -31,6 +33,8 @@ pub enum State {
Boot, Boot,
/// Bootloader has swapped the active partition with the dfu partition and will attempt boot. /// Bootloader has swapped the active partition with the dfu partition and will attempt boot.
Swap, Swap,
/// Application has received a request to reboot into DFU mode to apply an update.
DfuDetach,
} }
/// Buffer aligned to 32 byte boundary, largest known alignment requirement for embassy-boot. /// Buffer aligned to 32 byte boundary, largest known alignment requirement for embassy-boot.
@ -54,7 +58,6 @@ mod tests {
#![allow(unused_imports)] #![allow(unused_imports)]
use embedded_storage::nor_flash::{NorFlash, ReadNorFlash}; use embedded_storage::nor_flash::{NorFlash, ReadNorFlash};
#[cfg(feature = "nightly")]
use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash; use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
use futures::executor::block_on; use futures::executor::block_on;
@ -62,9 +65,7 @@ mod tests {
use crate::boot_loader::BootLoaderConfig; use crate::boot_loader::BootLoaderConfig;
use crate::firmware_updater::FirmwareUpdaterConfig; use crate::firmware_updater::FirmwareUpdaterConfig;
use crate::mem_flash::MemFlash; use crate::mem_flash::MemFlash;
#[cfg(feature = "nightly")] use crate::test_flash::{AsyncTestFlash, BlockingTestFlash};
use crate::test_flash::AsyncTestFlash;
use crate::test_flash::BlockingTestFlash;
/* /*
#[test] #[test]
@ -102,7 +103,7 @@ mod tests {
} }
#[test] #[test]
#[cfg(all(feature = "nightly", not(feature = "_verify")))] #[cfg(not(feature = "_verify"))]
fn test_swap_state() { fn test_swap_state() {
const FIRMWARE_SIZE: usize = 57344; const FIRMWARE_SIZE: usize = 57344;
let flash = AsyncTestFlash::new(BootLoaderConfig { let flash = AsyncTestFlash::new(BootLoaderConfig {
@ -118,15 +119,18 @@ mod tests {
block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap();
block_on(flash.active().write(0, &ORIGINAL)).unwrap(); block_on(flash.active().write(0, &ORIGINAL)).unwrap();
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { let mut updater = FirmwareUpdater::new(
dfu: flash.dfu(), FirmwareUpdaterConfig {
state: flash.state(), dfu: flash.dfu(),
}); state: flash.state(),
block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); },
block_on(updater.mark_updated(&mut aligned)).unwrap(); &mut aligned,
);
block_on(updater.write_firmware(0, &UPDATE)).unwrap();
block_on(updater.mark_updated()).unwrap();
// Writing after marking updated is not allowed until marked as booted. // Writing after marking updated is not allowed until marked as booted.
let res: Result<(), FirmwareUpdaterError> = block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)); let res: Result<(), FirmwareUpdaterError> = block_on(updater.write_firmware(0, &UPDATE));
assert!(matches!(res, Err::<(), _>(FirmwareUpdaterError::BadState))); assert!(matches!(res, Err::<(), _>(FirmwareUpdaterError::BadState)));
let flash = flash.into_blocking(); let flash = flash.into_blocking();
@ -158,11 +162,14 @@ mod tests {
// Mark as booted // Mark as booted
let flash = flash.into_async(); let flash = flash.into_async();
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { let mut updater = FirmwareUpdater::new(
dfu: flash.dfu(), FirmwareUpdaterConfig {
state: flash.state(), dfu: flash.dfu(),
}); state: flash.state(),
block_on(updater.mark_booted(&mut aligned)).unwrap(); },
&mut aligned,
);
block_on(updater.mark_booted()).unwrap();
let flash = flash.into_blocking(); let flash = flash.into_blocking();
let mut bootloader = BootLoader::new(BootLoaderConfig { let mut bootloader = BootLoader::new(BootLoaderConfig {
@ -174,7 +181,7 @@ mod tests {
} }
#[test] #[test]
#[cfg(all(feature = "nightly", not(feature = "_verify")))] #[cfg(not(feature = "_verify"))]
fn test_swap_state_active_page_biggest() { fn test_swap_state_active_page_biggest() {
const FIRMWARE_SIZE: usize = 12288; const FIRMWARE_SIZE: usize = 12288;
let flash = AsyncTestFlash::new(BootLoaderConfig { let flash = AsyncTestFlash::new(BootLoaderConfig {
@ -190,12 +197,15 @@ mod tests {
block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap();
block_on(flash.active().write(0, &ORIGINAL)).unwrap(); block_on(flash.active().write(0, &ORIGINAL)).unwrap();
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { let mut updater = FirmwareUpdater::new(
dfu: flash.dfu(), FirmwareUpdaterConfig {
state: flash.state(), dfu: flash.dfu(),
}); state: flash.state(),
block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); },
block_on(updater.mark_updated(&mut aligned)).unwrap(); &mut aligned,
);
block_on(updater.write_firmware(0, &UPDATE)).unwrap();
block_on(updater.mark_updated()).unwrap();
let flash = flash.into_blocking(); let flash = flash.into_blocking();
let mut bootloader = BootLoader::new(BootLoaderConfig { let mut bootloader = BootLoader::new(BootLoaderConfig {
@ -216,7 +226,7 @@ mod tests {
} }
#[test] #[test]
#[cfg(all(feature = "nightly", not(feature = "_verify")))] #[cfg(not(feature = "_verify"))]
fn test_swap_state_dfu_page_biggest() { fn test_swap_state_dfu_page_biggest() {
const FIRMWARE_SIZE: usize = 12288; const FIRMWARE_SIZE: usize = 12288;
let flash = AsyncTestFlash::new(BootLoaderConfig { let flash = AsyncTestFlash::new(BootLoaderConfig {
@ -232,12 +242,15 @@ mod tests {
block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap();
block_on(flash.active().write(0, &ORIGINAL)).unwrap(); block_on(flash.active().write(0, &ORIGINAL)).unwrap();
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { let mut updater = FirmwareUpdater::new(
dfu: flash.dfu(), FirmwareUpdaterConfig {
state: flash.state(), dfu: flash.dfu(),
}); state: flash.state(),
block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); },
block_on(updater.mark_updated(&mut aligned)).unwrap(); &mut aligned,
);
block_on(updater.write_firmware(0, &UPDATE)).unwrap();
block_on(updater.mark_updated()).unwrap();
let flash = flash.into_blocking(); let flash = flash.into_blocking();
let mut bootloader = BootLoader::new(BootLoaderConfig { let mut bootloader = BootLoader::new(BootLoaderConfig {
@ -257,26 +270,24 @@ mod tests {
} }
#[test] #[test]
#[cfg(all(feature = "nightly", feature = "_verify"))] #[cfg(feature = "_verify")]
fn test_verify() { fn test_verify() {
// The following key setup is based on: // The following key setup is based on:
// https://docs.rs/ed25519-dalek/latest/ed25519_dalek/#example // https://docs.rs/ed25519-dalek/latest/ed25519_dalek/#example
use ed25519_dalek::Keypair; use ed25519_dalek::{Digest, Sha512, Signature, Signer, SigningKey, VerifyingKey};
use rand::rngs::OsRng; use rand::rngs::OsRng;
let mut csprng = OsRng {}; let mut csprng = OsRng {};
let keypair: Keypair = Keypair::generate(&mut csprng); let keypair = SigningKey::generate(&mut csprng);
use ed25519_dalek::{Digest, Sha512, Signature, Signer};
let firmware: &[u8] = b"This are bytes that would otherwise be firmware bytes for DFU."; let firmware: &[u8] = b"This are bytes that would otherwise be firmware bytes for DFU.";
let mut digest = Sha512::new(); let mut digest = Sha512::new();
digest.update(&firmware); digest.update(&firmware);
let message = digest.finalize(); let message = digest.finalize();
let signature: Signature = keypair.sign(&message); let signature: Signature = keypair.sign(&message);
use ed25519_dalek::PublicKey; let public_key = keypair.verifying_key();
let public_key: PublicKey = keypair.public;
// Setup flash // Setup flash
let flash = BlockingTestFlash::new(BootLoaderConfig { let flash = BlockingTestFlash::new(BootLoaderConfig {
@ -293,18 +304,19 @@ mod tests {
// On with the test // On with the test
let flash = flash.into_async(); let flash = flash.into_async();
let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig {
dfu: flash.dfu(),
state: flash.state(),
});
let mut aligned = [0; 4]; let mut aligned = [0; 4];
let mut updater = FirmwareUpdater::new(
FirmwareUpdaterConfig {
dfu: flash.dfu(),
state: flash.state(),
},
&mut aligned,
);
assert!(block_on(updater.verify_and_mark_updated( assert!(block_on(updater.verify_and_mark_updated(
&public_key.to_bytes(), &public_key.to_bytes(),
&signature.to_bytes(), &signature.to_bytes(),
firmware_len as u32, firmware_len as u32,
&mut aligned,
)) ))
.is_ok()); .is_ok());
} }

View File

@ -3,7 +3,6 @@
use core::ops::{Bound, Range, RangeBounds}; use core::ops::{Bound, Range, RangeBounds};
use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash};
#[cfg(feature = "nightly")]
use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash};
pub struct MemFlash<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> { pub struct MemFlash<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> {
@ -141,7 +140,6 @@ impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> NorFla
} }
} }
#[cfg(feature = "nightly")]
impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncReadNorFlash impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncReadNorFlash
for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE> for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
{ {
@ -156,7 +154,6 @@ impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncR
} }
} }
#[cfg(feature = "nightly")]
impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncNorFlash impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncNorFlash
for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE> for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
{ {

View File

@ -51,7 +51,6 @@ where
} }
} }
#[cfg(feature = "nightly")]
impl<ACTIVE, DFU, STATE> BlockingTestFlash<ACTIVE, DFU, STATE> impl<ACTIVE, DFU, STATE> BlockingTestFlash<ACTIVE, DFU, STATE>
where where
ACTIVE: NorFlash + embedded_storage_async::nor_flash::NorFlash, ACTIVE: NorFlash + embedded_storage_async::nor_flash::NorFlash,

View File

@ -1,7 +1,5 @@
#[cfg(feature = "nightly")]
mod asynch; mod asynch;
mod blocking; mod blocking;
#[cfg(feature = "nightly")]
pub(crate) use asynch::AsyncTestFlash; pub(crate) use asynch::AsyncTestFlash;
pub(crate) use blocking::BlockingTestFlash; pub(crate) use blocking::BlockingTestFlash;

View File

@ -4,6 +4,12 @@ name = "embassy-boot-nrf"
version = "0.1.0" version = "0.1.0"
description = "Bootloader lib for nRF chips" description = "Bootloader lib for nRF chips"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/embassy-rs/embassy"
categories = [
"embedded",
"no-std",
"asynchronous",
]
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/"
@ -16,16 +22,16 @@ target = "thumbv7em-none-eabi"
[dependencies] [dependencies]
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }
embassy-sync = { path = "../../embassy-sync" } embassy-sync = { version = "0.5.0", path = "../../embassy-sync" }
embassy-nrf = { path = "../../embassy-nrf" } embassy-nrf = { path = "../../embassy-nrf" }
embassy-boot = { path = "../boot", default-features = false } embassy-boot = { path = "../boot", default-features = false }
cortex-m = { version = "0.7.6" } cortex-m = { version = "0.7.6" }
cortex-m-rt = { version = "0.7" } cortex-m-rt = { version = "0.7" }
embedded-storage = "0.3.0" embedded-storage = "0.3.1"
embedded-storage-async = { version = "0.4.0", optional = true } embedded-storage-async = { version = "0.4.1" }
cfg-if = "1.0.0" cfg-if = "1.0.0"
nrf-softdevice-mbr = { version = "0.1.0", git = "https://github.com/embassy-rs/nrf-softdevice.git", branch = "master", optional = true } nrf-softdevice-mbr = { version = "0.2.0", optional = true }
[features] [features]
defmt = [ defmt = [
@ -36,8 +42,3 @@ defmt = [
softdevice = [ softdevice = [
"nrf-softdevice-mbr", "nrf-softdevice-mbr",
] ]
nightly = [
"dep:embedded-storage-async",
"embassy-boot/nightly",
"embassy-nrf/nightly"
]

View File

@ -6,7 +6,7 @@ An adaptation of `embassy-boot` for nRF.
## Features ## Features
* Load applications with our without the softdevice. * Load applications with or without the softdevice.
* Configure bootloader partitions based on linker script. * Configure bootloader partitions based on linker script.
* Using watchdog timer to detect application failure. * Using watchdog timer to detect application failure.

View File

@ -1,6 +1,8 @@
#![macro_use] #![macro_use]
#![allow(unused_macros)] #![allow(unused_macros)]
use core::fmt::{Debug, Display, LowerHex};
#[cfg(all(feature = "defmt", feature = "log"))] #[cfg(all(feature = "defmt", feature = "log"))]
compile_error!("You may not enable both `defmt` and `log` features."); compile_error!("You may not enable both `defmt` and `log` features.");
@ -81,14 +83,17 @@ macro_rules! todo {
}; };
} }
#[cfg(not(feature = "defmt"))]
macro_rules! unreachable { macro_rules! unreachable {
($($x:tt)*) => { ($($x:tt)*) => {
{ ::core::unreachable!($($x)*)
#[cfg(not(feature = "defmt"))] };
::core::unreachable!($($x)*); }
#[cfg(feature = "defmt")]
::defmt::unreachable!($($x)*); #[cfg(feature = "defmt")]
} macro_rules! unreachable {
($($x:tt)*) => {
::defmt::unreachable!($($x)*)
}; };
} }
@ -223,3 +228,31 @@ impl<T, E> Try for Result<T, E> {
self self
} }
} }
#[allow(unused)]
pub(crate) struct Bytes<'a>(pub &'a [u8]);
impl<'a> Debug for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> Display for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> LowerHex for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
#[cfg(feature = "defmt")]
impl<'a> defmt::Format for Bytes<'a> {
fn format(&self, fmt: defmt::Formatter) {
defmt::write!(fmt, "{:02x}", self.0)
}
}

View File

@ -3,37 +3,27 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
mod fmt; mod fmt;
#[cfg(feature = "nightly")] pub use embassy_boot::{
pub use embassy_boot::FirmwareUpdater; AlignedBuffer, BlockingFirmwareState, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareState, FirmwareUpdater,
pub use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareUpdaterConfig}; FirmwareUpdaterConfig,
use embassy_nrf::nvmc::{Nvmc, PAGE_SIZE}; };
use embassy_nrf::nvmc::PAGE_SIZE;
use embassy_nrf::peripherals::WDT; use embassy_nrf::peripherals::WDT;
use embassy_nrf::wdt; use embassy_nrf::wdt;
use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
/// A bootloader for nRF devices. /// A bootloader for nRF devices.
pub struct BootLoader<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize = PAGE_SIZE> { pub struct BootLoader<const BUFFER_SIZE: usize = PAGE_SIZE>;
boot: embassy_boot::BootLoader<ACTIVE, DFU, STATE>,
aligned_buf: AlignedBuffer<BUFFER_SIZE>,
}
impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize> impl<const BUFFER_SIZE: usize> BootLoader<BUFFER_SIZE> {
BootLoader<ACTIVE, DFU, STATE, BUFFER_SIZE> /// Inspect the bootloader state and perform actions required before booting, such as swapping firmware.
{ pub fn prepare<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash>(
/// Create a new bootloader instance using the supplied partitions for active, dfu and state. config: BootLoaderConfig<ACTIVE, DFU, STATE>,
pub fn new(config: BootLoaderConfig<ACTIVE, DFU, STATE>) -> Self { ) -> Self {
Self { let mut aligned_buf = AlignedBuffer([0; BUFFER_SIZE]);
boot: embassy_boot::BootLoader::new(config), let mut boot = embassy_boot::BootLoader::new(config);
aligned_buf: AlignedBuffer([0; BUFFER_SIZE]), boot.prepare_boot(&mut aligned_buf.0).expect("Boot prepare error");
} Self
}
/// Inspect the bootloader state and perform actions required before booting, such as swapping
/// firmware.
pub fn prepare(&mut self) {
self.boot
.prepare_boot(&mut self.aligned_buf.0)
.expect("Boot prepare error");
} }
/// Boots the application without softdevice mechanisms. /// Boots the application without softdevice mechanisms.
@ -43,8 +33,6 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
/// This modifies the stack pointer and reset vector and will run code placed in the active partition. /// This modifies the stack pointer and reset vector and will run code placed in the active partition.
#[cfg(not(feature = "softdevice"))] #[cfg(not(feature = "softdevice"))]
pub unsafe fn load(self, start: u32) -> ! { pub unsafe fn load(self, start: u32) -> ! {
core::mem::drop(self.boot);
let mut p = cortex_m::Peripherals::steal(); let mut p = cortex_m::Peripherals::steal();
p.SCB.invalidate_icache(); p.SCB.invalidate_icache();
p.SCB.vtor.write(start); p.SCB.vtor.write(start);
@ -57,7 +45,7 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
/// ///
/// This modifies the stack pointer and reset vector and will run code placed in the active partition. /// This modifies the stack pointer and reset vector and will run code placed in the active partition.
#[cfg(feature = "softdevice")] #[cfg(feature = "softdevice")]
pub unsafe fn load(&mut self, _app: u32) -> ! { pub unsafe fn load(self, _app: u32) -> ! {
use nrf_softdevice_mbr as mbr; use nrf_softdevice_mbr as mbr;
const NRF_SUCCESS: u32 = 0; const NRF_SUCCESS: u32 = 0;
@ -104,15 +92,15 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
} }
} }
/// A flash implementation that wraps NVMC and will pet a watchdog when touching flash. /// A flash implementation that wraps any flash and will pet a watchdog when touching flash.
pub struct WatchdogFlash<'d> { pub struct WatchdogFlash<FLASH> {
flash: Nvmc<'d>, flash: FLASH,
wdt: wdt::WatchdogHandle, wdt: wdt::WatchdogHandle,
} }
impl<'d> WatchdogFlash<'d> { impl<FLASH> WatchdogFlash<FLASH> {
/// Start a new watchdog with a given flash and WDT peripheral and a timeout /// Start a new watchdog with a given flash and WDT peripheral and a timeout
pub fn start(flash: Nvmc<'d>, wdt: WDT, config: wdt::Config) -> Self { pub fn start(flash: FLASH, wdt: WDT, config: wdt::Config) -> Self {
let (_wdt, [wdt]) = match wdt::Watchdog::try_new(wdt, config) { let (_wdt, [wdt]) = match wdt::Watchdog::try_new(wdt, config) {
Ok(x) => x, Ok(x) => x,
Err(_) => { Err(_) => {
@ -127,13 +115,13 @@ impl<'d> WatchdogFlash<'d> {
} }
} }
impl<'d> ErrorType for WatchdogFlash<'d> { impl<FLASH: ErrorType> ErrorType for WatchdogFlash<FLASH> {
type Error = <Nvmc<'d> as ErrorType>::Error; type Error = FLASH::Error;
} }
impl<'d> NorFlash for WatchdogFlash<'d> { impl<FLASH: NorFlash> NorFlash for WatchdogFlash<FLASH> {
const WRITE_SIZE: usize = <Nvmc<'d> as NorFlash>::WRITE_SIZE; const WRITE_SIZE: usize = FLASH::WRITE_SIZE;
const ERASE_SIZE: usize = <Nvmc<'d> as NorFlash>::ERASE_SIZE; const ERASE_SIZE: usize = FLASH::ERASE_SIZE;
fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> { fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
self.wdt.pet(); self.wdt.pet();
@ -145,8 +133,8 @@ impl<'d> NorFlash for WatchdogFlash<'d> {
} }
} }
impl<'d> ReadNorFlash for WatchdogFlash<'d> { impl<FLASH: ReadNorFlash> ReadNorFlash for WatchdogFlash<FLASH> {
const READ_SIZE: usize = <Nvmc<'d> as ReadNorFlash>::READ_SIZE; const READ_SIZE: usize = FLASH::READ_SIZE;
fn read(&mut self, offset: u32, data: &mut [u8]) -> Result<(), Self::Error> { fn read(&mut self, offset: u32, data: &mut [u8]) -> Result<(), Self::Error> {
self.wdt.pet(); self.wdt.pet();
self.flash.read(offset, data) self.flash.read(offset, data)

View File

@ -4,6 +4,12 @@ name = "embassy-boot-rp"
version = "0.1.0" version = "0.1.0"
description = "Bootloader lib for RP2040 chips" description = "Bootloader lib for RP2040 chips"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/embassy-rs/embassy"
categories = [
"embedded",
"no-std",
"asynchronous",
]
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-rp-v$VERSION/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-rp-v$VERSION/src/"
@ -17,15 +23,15 @@ defmt = { version = "0.3", optional = true }
defmt-rtt = { version = "0.4", optional = true } defmt-rtt = { version = "0.4", optional = true }
log = { version = "0.4", optional = true } log = { version = "0.4", optional = true }
embassy-sync = { path = "../../embassy-sync" } embassy-sync = { version = "0.5.0", path = "../../embassy-sync" }
embassy-rp = { path = "../../embassy-rp", default-features = false } embassy-rp = { path = "../../embassy-rp", default-features = false }
embassy-boot = { path = "../boot", default-features = false } embassy-boot = { path = "../boot", default-features = false }
embassy-time = { path = "../../embassy-time" } embassy-time = { path = "../../embassy-time" }
cortex-m = { version = "0.7.6" } cortex-m = { version = "0.7.6" }
cortex-m-rt = { version = "0.7" } cortex-m-rt = { version = "0.7" }
embedded-storage = "0.3.0" embedded-storage = "0.3.1"
embedded-storage-async = { version = "0.4.0", optional = true } embedded-storage-async = { version = "0.4.1" }
cfg-if = "1.0.0" cfg-if = "1.0.0"
[features] [features]
@ -40,12 +46,6 @@ log = [
"embassy-rp/log", "embassy-rp/log",
] ]
debug = ["defmt-rtt"] debug = ["defmt-rtt"]
nightly = [
"dep:embedded-storage-async",
"embassy-boot/nightly",
"embassy-rp/nightly",
"embassy-time/nightly"
]
[profile.dev] [profile.dev]
debug = 2 debug = 2

View File

@ -1,6 +1,8 @@
#![macro_use] #![macro_use]
#![allow(unused_macros)] #![allow(unused_macros)]
use core::fmt::{Debug, Display, LowerHex};
#[cfg(all(feature = "defmt", feature = "log"))] #[cfg(all(feature = "defmt", feature = "log"))]
compile_error!("You may not enable both `defmt` and `log` features."); compile_error!("You may not enable both `defmt` and `log` features.");
@ -81,14 +83,17 @@ macro_rules! todo {
}; };
} }
#[cfg(not(feature = "defmt"))]
macro_rules! unreachable { macro_rules! unreachable {
($($x:tt)*) => { ($($x:tt)*) => {
{ ::core::unreachable!($($x)*)
#[cfg(not(feature = "defmt"))] };
::core::unreachable!($($x)*); }
#[cfg(feature = "defmt")]
::defmt::unreachable!($($x)*); #[cfg(feature = "defmt")]
} macro_rules! unreachable {
($($x:tt)*) => {
::defmt::unreachable!($($x)*)
}; };
} }
@ -223,3 +228,31 @@ impl<T, E> Try for Result<T, E> {
self self
} }
} }
#[allow(unused)]
pub(crate) struct Bytes<'a>(pub &'a [u8]);
impl<'a> Debug for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> Display for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> LowerHex for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
#[cfg(feature = "defmt")]
impl<'a> defmt::Format for Bytes<'a> {
fn format(&self, fmt: defmt::Formatter) {
defmt::write!(fmt, "{:02x}", self.0)
}
}

View File

@ -3,38 +3,28 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
mod fmt; mod fmt;
#[cfg(feature = "nightly")] pub use embassy_boot::{
pub use embassy_boot::FirmwareUpdater; AlignedBuffer, BlockingFirmwareState, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareState, FirmwareUpdater,
pub use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareUpdaterConfig, State}; FirmwareUpdaterConfig, State,
use embassy_rp::flash::{Flash, ERASE_SIZE}; };
use embassy_rp::flash::{Blocking, Flash, ERASE_SIZE};
use embassy_rp::peripherals::{FLASH, WATCHDOG}; use embassy_rp::peripherals::{FLASH, WATCHDOG};
use embassy_rp::watchdog::Watchdog; use embassy_rp::watchdog::Watchdog;
use embassy_time::Duration; use embassy_time::Duration;
use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
/// A bootloader for RP2040 devices. /// A bootloader for RP2040 devices.
pub struct BootLoader<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize = ERASE_SIZE> { pub struct BootLoader<const BUFFER_SIZE: usize = ERASE_SIZE>;
boot: embassy_boot::BootLoader<ACTIVE, DFU, STATE>,
aligned_buf: AlignedBuffer<BUFFER_SIZE>,
}
impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize> impl<const BUFFER_SIZE: usize> BootLoader<BUFFER_SIZE> {
BootLoader<ACTIVE, DFU, STATE, BUFFER_SIZE> /// Inspect the bootloader state and perform actions required before booting, such as swapping firmware
{ pub fn prepare<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash>(
/// Create a new bootloader instance using the supplied partitions for active, dfu and state. config: BootLoaderConfig<ACTIVE, DFU, STATE>,
pub fn new(config: BootLoaderConfig<ACTIVE, DFU, STATE>) -> Self { ) -> Self {
Self { let mut aligned_buf = AlignedBuffer([0; BUFFER_SIZE]);
boot: embassy_boot::BootLoader::new(config), let mut boot = embassy_boot::BootLoader::new(config);
aligned_buf: AlignedBuffer([0; BUFFER_SIZE]), boot.prepare_boot(aligned_buf.as_mut()).expect("Boot prepare error");
} Self
}
/// Inspect the bootloader state and perform actions required before booting, such as swapping
/// firmware.
pub fn prepare(&mut self) {
self.boot
.prepare_boot(self.aligned_buf.as_mut())
.expect("Boot prepare error");
} }
/// Boots the application. /// Boots the application.
@ -43,8 +33,6 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
/// ///
/// This modifies the stack pointer and reset vector and will run code placed in the active partition. /// This modifies the stack pointer and reset vector and will run code placed in the active partition.
pub unsafe fn load(self, start: u32) -> ! { pub unsafe fn load(self, start: u32) -> ! {
core::mem::drop(self.boot);
trace!("Loading app at 0x{:x}", start); trace!("Loading app at 0x{:x}", start);
#[allow(unused_mut)] #[allow(unused_mut)]
let mut p = cortex_m::Peripherals::steal(); let mut p = cortex_m::Peripherals::steal();
@ -58,14 +46,14 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
/// A flash implementation that will feed a watchdog when touching flash. /// A flash implementation that will feed a watchdog when touching flash.
pub struct WatchdogFlash<'d, const SIZE: usize> { pub struct WatchdogFlash<'d, const SIZE: usize> {
flash: Flash<'d, FLASH, SIZE>, flash: Flash<'d, FLASH, Blocking, SIZE>,
watchdog: Watchdog, watchdog: Watchdog,
} }
impl<'d, const SIZE: usize> WatchdogFlash<'d, SIZE> { impl<'d, const SIZE: usize> WatchdogFlash<'d, SIZE> {
/// Start a new watchdog with a given flash and watchdog peripheral and a timeout /// Start a new watchdog with a given flash and watchdog peripheral and a timeout
pub fn start(flash: FLASH, watchdog: WATCHDOG, timeout: Duration) -> Self { pub fn start(flash: FLASH, watchdog: WATCHDOG, timeout: Duration) -> Self {
let flash: Flash<'_, FLASH, SIZE> = Flash::new(flash); let flash = Flash::<_, Blocking, SIZE>::new_blocking(flash);
let mut watchdog = Watchdog::new(watchdog); let mut watchdog = Watchdog::new(watchdog);
watchdog.start(timeout); watchdog.start(timeout);
Self { flash, watchdog } Self { flash, watchdog }
@ -73,28 +61,28 @@ impl<'d, const SIZE: usize> WatchdogFlash<'d, SIZE> {
} }
impl<'d, const SIZE: usize> ErrorType for WatchdogFlash<'d, SIZE> { impl<'d, const SIZE: usize> ErrorType for WatchdogFlash<'d, SIZE> {
type Error = <Flash<'d, FLASH, SIZE> as ErrorType>::Error; type Error = <Flash<'d, FLASH, Blocking, SIZE> as ErrorType>::Error;
} }
impl<'d, const SIZE: usize> NorFlash for WatchdogFlash<'d, SIZE> { impl<'d, const SIZE: usize> NorFlash for WatchdogFlash<'d, SIZE> {
const WRITE_SIZE: usize = <Flash<'d, FLASH, SIZE> as NorFlash>::WRITE_SIZE; const WRITE_SIZE: usize = <Flash<'d, FLASH, Blocking, SIZE> as NorFlash>::WRITE_SIZE;
const ERASE_SIZE: usize = <Flash<'d, FLASH, SIZE> as NorFlash>::ERASE_SIZE; const ERASE_SIZE: usize = <Flash<'d, FLASH, Blocking, SIZE> as NorFlash>::ERASE_SIZE;
fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> { fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
self.watchdog.feed(); self.watchdog.feed();
self.flash.erase(from, to) self.flash.blocking_erase(from, to)
} }
fn write(&mut self, offset: u32, data: &[u8]) -> Result<(), Self::Error> { fn write(&mut self, offset: u32, data: &[u8]) -> Result<(), Self::Error> {
self.watchdog.feed(); self.watchdog.feed();
self.flash.write(offset, data) self.flash.blocking_write(offset, data)
} }
} }
impl<'d, const SIZE: usize> ReadNorFlash for WatchdogFlash<'d, SIZE> { impl<'d, const SIZE: usize> ReadNorFlash for WatchdogFlash<'d, SIZE> {
const READ_SIZE: usize = <Flash<'d, FLASH, SIZE> as ReadNorFlash>::READ_SIZE; const READ_SIZE: usize = <Flash<'d, FLASH, Blocking, SIZE> as ReadNorFlash>::READ_SIZE;
fn read(&mut self, offset: u32, data: &mut [u8]) -> Result<(), Self::Error> { fn read(&mut self, offset: u32, data: &mut [u8]) -> Result<(), Self::Error> {
self.watchdog.feed(); self.watchdog.feed();
self.flash.read(offset, data) self.flash.blocking_read(offset, data)
} }
fn capacity(&self) -> usize { fn capacity(&self) -> usize {
self.flash.capacity() self.flash.capacity()

View File

@ -4,6 +4,12 @@ name = "embassy-boot-stm32"
version = "0.1.0" version = "0.1.0"
description = "Bootloader lib for STM32 chips" description = "Bootloader lib for STM32 chips"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/embassy-rs/embassy"
categories = [
"embedded",
"no-std",
"asynchronous",
]
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/"
@ -18,32 +24,19 @@ defmt = { version = "0.3", optional = true }
defmt-rtt = { version = "0.4", optional = true } defmt-rtt = { version = "0.4", optional = true }
log = { version = "0.4", optional = true } log = { version = "0.4", optional = true }
embassy-sync = { path = "../../embassy-sync" } embassy-sync = { version = "0.5.0", path = "../../embassy-sync" }
embassy-stm32 = { path = "../../embassy-stm32", default-features = false } embassy-stm32 = { path = "../../embassy-stm32", default-features = false }
embassy-boot = { path = "../boot", default-features = false } embassy-boot = { path = "../boot", default-features = false }
cortex-m = { version = "0.7.6" } cortex-m = { version = "0.7.6" }
cortex-m-rt = { version = "0.7" } cortex-m-rt = { version = "0.7" }
embedded-storage = "0.3.0" embedded-storage = "0.3.1"
embedded-storage-async = { version = "0.4.0", optional = true } embedded-storage-async = { version = "0.4.1" }
cfg-if = "1.0.0" cfg-if = "1.0.0"
[features] [features]
defmt = [ defmt = ["dep:defmt", "embassy-boot/defmt", "embassy-stm32/defmt"]
"dep:defmt", log = ["dep:log", "embassy-boot/log", "embassy-stm32/log"]
"embassy-boot/defmt",
"embassy-stm32/defmt",
]
log = [
"dep:log",
"embassy-boot/log",
"embassy-stm32/log",
]
debug = ["defmt-rtt"] debug = ["defmt-rtt"]
nightly = [
"dep:embedded-storage-async",
"embassy-boot/nightly",
"embassy-stm32/nightly"
]
[profile.dev] [profile.dev]
debug = 2 debug = 2

View File

@ -1,6 +1,8 @@
#![macro_use] #![macro_use]
#![allow(unused_macros)] #![allow(unused_macros)]
use core::fmt::{Debug, Display, LowerHex};
#[cfg(all(feature = "defmt", feature = "log"))] #[cfg(all(feature = "defmt", feature = "log"))]
compile_error!("You may not enable both `defmt` and `log` features."); compile_error!("You may not enable both `defmt` and `log` features.");
@ -81,14 +83,17 @@ macro_rules! todo {
}; };
} }
#[cfg(not(feature = "defmt"))]
macro_rules! unreachable { macro_rules! unreachable {
($($x:tt)*) => { ($($x:tt)*) => {
{ ::core::unreachable!($($x)*)
#[cfg(not(feature = "defmt"))] };
::core::unreachable!($($x)*); }
#[cfg(feature = "defmt")]
::defmt::unreachable!($($x)*); #[cfg(feature = "defmt")]
} macro_rules! unreachable {
($($x:tt)*) => {
::defmt::unreachable!($($x)*)
}; };
} }
@ -223,3 +228,31 @@ impl<T, E> Try for Result<T, E> {
self self
} }
} }
#[allow(unused)]
pub(crate) struct Bytes<'a>(pub &'a [u8]);
impl<'a> Debug for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> Display for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
impl<'a> LowerHex for Bytes<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:#02x?}", self.0)
}
}
#[cfg(feature = "defmt")]
impl<'a> defmt::Format for Bytes<'a> {
fn format(&self, fmt: defmt::Formatter) {
defmt::write!(fmt, "{:02x}", self.0)
}
}

View File

@ -3,34 +3,27 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
mod fmt; mod fmt;
#[cfg(feature = "nightly")] pub use embassy_boot::{
pub use embassy_boot::FirmwareUpdater; AlignedBuffer, BlockingFirmwareState, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareState, FirmwareUpdater,
pub use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater, BootLoaderConfig, FirmwareUpdaterConfig, State}; FirmwareUpdaterConfig, State,
};
use embedded_storage::nor_flash::NorFlash; use embedded_storage::nor_flash::NorFlash;
/// A bootloader for STM32 devices. /// A bootloader for STM32 devices.
pub struct BootLoader<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize> { pub struct BootLoader {
boot: embassy_boot::BootLoader<ACTIVE, DFU, STATE>, /// The reported state of the bootloader after preparing for boot
aligned_buf: AlignedBuffer<BUFFER_SIZE>, pub state: State,
} }
impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize> impl BootLoader {
BootLoader<ACTIVE, DFU, STATE, BUFFER_SIZE> /// Inspect the bootloader state and perform actions required before booting, such as swapping firmware
{ pub fn prepare<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>(
/// Create a new bootloader instance using the supplied partitions for active, dfu and state. config: BootLoaderConfig<ACTIVE, DFU, STATE>,
pub fn new(config: BootLoaderConfig<ACTIVE, DFU, STATE>) -> Self { ) -> Self {
Self { let mut aligned_buf = AlignedBuffer([0; BUFFER_SIZE]);
boot: embassy_boot::BootLoader::new(config), let mut boot = embassy_boot::BootLoader::new(config);
aligned_buf: AlignedBuffer([0; BUFFER_SIZE]), let state = boot.prepare_boot(aligned_buf.as_mut()).expect("Boot prepare error");
} Self { state }
}
/// Inspect the bootloader state and perform actions required before booting, such as swapping
/// firmware.
pub fn prepare(&mut self) {
self.boot
.prepare_boot(self.aligned_buf.as_mut())
.expect("Boot prepare error");
} }
/// Boots the application. /// Boots the application.
@ -39,8 +32,6 @@ impl<ACTIVE: NorFlash, DFU: NorFlash, STATE: NorFlash, const BUFFER_SIZE: usize>
/// ///
/// This modifies the stack pointer and reset vector and will run code placed in the active partition. /// This modifies the stack pointer and reset vector and will run code placed in the active partition.
pub unsafe fn load(self, start: u32) -> ! { pub unsafe fn load(self, start: u32) -> ! {
core::mem::drop(self.boot);
trace!("Loading app at 0x{:x}", start); trace!("Loading app at 0x{:x}", start);
#[allow(unused_mut)] #[allow(unused_mut)]
let mut p = cortex_m::Peripherals::steal(); let mut p = cortex_m::Peripherals::steal();

View File

@ -8,24 +8,25 @@ license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/" src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/"
features = ["nightly", "std"] features = ["std"]
target = "x86_64-unknown-linux-gnu" target = "x86_64-unknown-linux-gnu"
[features] [features]
std = [] std = []
# Enable nightly-only features time = ["dep:embassy-time"]
nightly = ["embassy-futures", "embedded-hal-async", "embedded-storage-async"] default = ["time"]
[dependencies] [dependencies]
embassy-futures = { version = "0.1.0", path = "../embassy-futures", optional = true } embassy-futures = { version = "0.1.0", path = "../embassy-futures" }
embassy-sync = { version = "0.2.0", path = "../embassy-sync" } embassy-sync = { version = "0.5.0", path = "../embassy-sync" }
embassy-time = { version = "0.2", 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-rc.3" }
embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true } embedded-hal-async = { version = "=1.0.0-rc.3" }
embedded-storage = "0.3.0" embedded-storage = "0.3.1"
embedded-storage-async = { version = "0.4.0", optional = true } embedded-storage-async = { version = "0.4.1" }
nb = "1.0.0" nb = "1.0.0"
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }

View File

@ -0,0 +1,18 @@
use std::env;
use std::ffi::OsString;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
let output = Command::new(rustc)
.arg("--version")
.output()
.expect("failed to run `rustc --version`");
if String::from_utf8_lossy(&output.stdout).contains("nightly") {
println!("cargo:rustc-cfg=nightly");
}
}

View File

@ -1,4 +1,4 @@
use embedded_hal_02::{blocking, serial}; use embedded_hal_02::blocking;
/// Wrapper that implements async traits using blocking implementations. /// Wrapper that implements async traits using blocking implementations.
/// ///
@ -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,52 +97,12 @@ 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(())
} }
} }
// Uart implementatinos
impl<T, E> embedded_hal_1::serial::ErrorType for BlockingAsync<T>
where
T: serial::Read<u8, Error = E>,
E: embedded_hal_1::serial::Error + 'static,
{
type Error = E;
}
/// NOR flash wrapper /// NOR flash wrapper
use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash};

View File

@ -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(())
}
} }
/// ///

View File

@ -1,5 +1,4 @@
use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, ReadNorFlash};
#[cfg(feature = "nightly")]
use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash};
/// Convenience helper for concatenating two consecutive flashes into one. /// Convenience helper for concatenating two consecutive flashes into one.
@ -117,7 +116,6 @@ where
} }
} }
#[cfg(feature = "nightly")]
impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second> impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second>
where where
First: AsyncReadNorFlash<Error = E>, First: AsyncReadNorFlash<Error = E>,
@ -146,7 +144,6 @@ where
} }
} }
#[cfg(feature = "nightly")]
impl<First, Second, E> AsyncNorFlash for ConcatFlash<First, Second> impl<First, Second, E> AsyncNorFlash for ConcatFlash<First, Second>
where where
First: AsyncNorFlash<Error = E>, First: AsyncNorFlash<Error = E>,

View File

@ -1,7 +1,6 @@
use alloc::vec::Vec; use alloc::vec::Vec;
use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
#[cfg(feature = "nightly")]
use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash};
extern crate alloc; extern crate alloc;
@ -93,7 +92,6 @@ impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> NorFla
} }
} }
#[cfg(feature = "nightly")]
impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncReadNorFlash impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncReadNorFlash
for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE> for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
{ {
@ -109,7 +107,6 @@ impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncR
} }
} }
#[cfg(feature = "nightly")]
impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncNorFlash impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncNorFlash
for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE> for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
{ {

View File

@ -2,16 +2,14 @@
use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind}; use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind};
#[cfg(feature = "nightly")]
mod asynch; mod asynch;
mod blocking; mod blocking;
#[cfg(feature = "nightly")]
pub use asynch::Partition; pub use asynch::Partition;
pub use blocking::BlockingPartition; pub use blocking::BlockingPartition;
/// Partition error /// Partition error
#[derive(Debug)] #[derive(Debug, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Error<T> { pub enum Error<T> {
/// The requested flash area is outside the partition /// The requested flash area is outside the partition

View File

@ -1,14 +1,13 @@
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "nightly", feature(async_fn_in_trait, impl_trait_projections, try_blocks))] #![cfg_attr(nightly, feature(async_fn_in_trait, impl_trait_projections))]
#![cfg_attr(nightly, allow(stable_features, unknown_lints))]
#![allow(async_fn_in_trait)]
#![warn(missing_docs)] #![warn(missing_docs)]
//! Utilities to use `embedded-hal` traits with Embassy. //! Utilities to use `embedded-hal` traits with Embassy.
#[cfg(feature = "nightly")]
pub mod adapter; pub mod adapter;
pub mod flash; pub mod flash;
pub mod shared_bus; pub mod shared_bus;
/// Set the configuration of a peripheral driver. /// Set the configuration of a peripheral driver.
@ -26,6 +25,18 @@ pub trait SetConfig {
/// The configuration type used by this driver. /// The configuration type used by this driver.
type Config; type Config;
/// The error type that can occur if `set_config` fails.
type ConfigError;
/// Set the configuration of the driver. /// Set the configuration of the driver.
fn set_config(&mut self, config: &Self::Config); fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError>;
}
/// Get the configuration of a peripheral driver.
pub trait GetConfig {
/// The configuration type used by this driver.
type Config;
/// Get the configuration of the driver.
fn get_config(&self) -> Self::Config;
} }

View File

@ -2,16 +2,15 @@
//! //!
//! # Example (nrf52) //! # Example (nrf52)
//! //!
//! ```rust //! ```rust,ignore
//! use embassy_embedded_hal::shared_bus::i2c::I2cDevice; //! use embassy_embedded_hal::shared_bus::asynch::i2c::I2cDevice;
//! use embassy_sync::mutex::Mutex; //! use embassy_sync::mutex::Mutex;
//! use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; //! use embassy_sync::blocking_mutex::raw::NoopRawMutex;
//! //!
//! static I2C_BUS: StaticCell<Mutex::<ThreadModeRawMutex, Twim<TWISPI0>>> = StaticCell::new(); //! static I2C_BUS: StaticCell<Mutex<NoopRawMutex, Twim<TWISPI0>>> = StaticCell::new();
//! let config = twim::Config::default(); //! let config = twim::Config::default();
//! let irq = interrupt::take!(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0); //! let i2c = Twim::new(p.TWISPI0, Irqs, p.P0_03, p.P0_04, config);
//! let i2c = Twim::new(p.TWISPI0, irq, p.P0_03, p.P0_04, config); //! let i2c_bus = Mutex::new(i2c);
//! let i2c_bus = Mutex::<ThreadModeRawMutex, _>::new(i2c);
//! let i2c_bus = I2C_BUS.init(i2c_bus); //! let i2c_bus = I2C_BUS.init(i2c_bus);
//! //!
//! // Device 1, using embedded-hal-async compatible driver for QMC5883L compass //! // Device 1, using embedded-hal-async compatible driver for QMC5883L compass
@ -125,14 +124,14 @@ where
{ {
async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> { async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.read(address, buffer).await.map_err(I2cDeviceError::I2c)?; bus.read(address, buffer).await.map_err(I2cDeviceError::I2c)?;
Ok(()) Ok(())
} }
async fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), I2cDeviceError<BUS::Error>> { async fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.write(address, bytes).await.map_err(I2cDeviceError::I2c)?; bus.write(address, bytes).await.map_err(I2cDeviceError::I2c)?;
Ok(()) Ok(())
} }
@ -144,7 +143,7 @@ where
rd_buffer: &mut [u8], rd_buffer: &mut [u8],
) -> Result<(), I2cDeviceError<BUS::Error>> { ) -> Result<(), I2cDeviceError<BUS::Error>> {
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.write_read(address, wr_buffer, rd_buffer) bus.write_read(address, wr_buffer, rd_buffer)
.await .await
.map_err(I2cDeviceError::I2c)?; .map_err(I2cDeviceError::I2c)?;
@ -153,7 +152,7 @@ where
async fn transaction(&mut self, address: u8, operations: &mut [i2c::Operation<'_>]) -> Result<(), Self::Error> { async fn transaction(&mut self, address: u8, operations: &mut [i2c::Operation<'_>]) -> Result<(), Self::Error> {
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.transaction(address, operations) bus.transaction(address, operations)
.await .await
.map_err(I2cDeviceError::I2c)?; .map_err(I2cDeviceError::I2c)?;

View File

@ -2,17 +2,16 @@
//! //!
//! # Example (nrf52) //! # Example (nrf52)
//! //!
//! ```rust //! ```rust,ignore
//! use embassy_embedded_hal::shared_bus::spi::SpiDevice; //! use embassy_embedded_hal::shared_bus::spi::SpiDevice;
//! use embassy_sync::mutex::Mutex; //! use embassy_sync::mutex::Mutex;
//! use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; //! use embassy_sync::blocking_mutex::raw::NoopRawMutex;
//! //!
//! static SPI_BUS: StaticCell<Mutex<ThreadModeRawMutex, spim::Spim<SPI3>>> = StaticCell::new(); //! static SPI_BUS: StaticCell<Mutex<NoopRawMutex, spim::Spim<SPI3>>> = StaticCell::new();
//! let mut config = spim::Config::default(); //! let mut config = spim::Config::default();
//! config.frequency = spim::Frequency::M32; //! config.frequency = spim::Frequency::M32;
//! let irq = interrupt::take!(SPIM3); //! let spi = spim::Spim::new_txonly(p.SPI3, Irqs, p.P0_15, p.P0_18, config);
//! let spi = spim::Spim::new_txonly(p.SPI3, irq, p.P0_15, p.P0_18, config); //! let spi_bus = Mutex::new(spi);
//! let spi_bus = Mutex::<ThreadModeRawMutex, _>::new(spi);
//! let spi_bus = SPI_BUS.init(spi_bus); //! let spi_bus = SPI_BUS.init(spi_bus);
//! //!
//! // Device 1, using embedded-hal-async compatible driver for ST7735 LCD display //! // Device 1, using embedded-hal-async compatible driver for ST7735 LCD display
@ -56,62 +55,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,
@ -119,18 +62,36 @@ where
CS: OutputPin, CS: OutputPin,
{ {
async fn transaction(&mut self, operations: &mut [spi::Operation<'_, u8>]) -> Result<(), Self::Error> { async fn transaction(&mut self, operations: &mut [spi::Operation<'_, u8>]) -> Result<(), Self::Error> {
if cfg!(not(feature = "time")) && operations.iter().any(|op| matches!(op, Operation::DelayNs(_))) {
return Err(SpiDeviceError::DelayNotSupported);
}
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
self.cs.set_low().map_err(SpiDeviceError::Cs)?; self.cs.set_low().map_err(SpiDeviceError::Cs)?;
let op_res: Result<(), BUS::Error> = try { let op_res = 'ops: {
for op in operations { for op in operations {
match op { let res = match op {
Operation::Read(buf) => bus.read(buf).await?, Operation::Read(buf) => bus.read(buf).await,
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::DelayNs(_) => unreachable!(),
#[cfg(feature = "time")]
Operation::DelayNs(ns) => match bus.flush().await {
Err(e) => Err(e),
Ok(()) => {
embassy_time::Timer::after_nanos(*ns as _).await;
Ok(())
}
},
};
if let Err(e) = res {
break 'ops Err(e);
} }
} }
Ok(())
}; };
// On failure, it's important to still flush and deassert CS. // On failure, it's important to still flush and deassert CS.
@ -172,64 +133,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,
@ -237,19 +140,37 @@ where
CS: OutputPin, CS: OutputPin,
{ {
async fn transaction(&mut self, operations: &mut [spi::Operation<'_, u8>]) -> Result<(), Self::Error> { async fn transaction(&mut self, operations: &mut [spi::Operation<'_, u8>]) -> Result<(), Self::Error> {
if cfg!(not(feature = "time")) && operations.iter().any(|op| matches!(op, Operation::DelayNs(_))) {
return Err(SpiDeviceError::DelayNotSupported);
}
let mut bus = self.bus.lock().await; let mut bus = self.bus.lock().await;
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| SpiDeviceError::Config)?;
self.cs.set_low().map_err(SpiDeviceError::Cs)?; self.cs.set_low().map_err(SpiDeviceError::Cs)?;
let op_res: Result<(), BUS::Error> = try { let op_res = 'ops: {
for op in operations { for op in operations {
match op { let res = match op {
Operation::Read(buf) => bus.read(buf).await?, Operation::Read(buf) => bus.read(buf).await,
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::DelayNs(_) => unreachable!(),
#[cfg(feature = "time")]
Operation::DelayNs(ns) => match bus.flush().await {
Err(e) => Err(e),
Ok(()) => {
embassy_time::Timer::after_nanos(*ns as _).await;
Ok(())
}
},
};
if let Err(e) = res {
break 'ops Err(e);
} }
} }
Ok(())
}; };
// On failure, it's important to still flush and deassert CS. // On failure, it's important to still flush and deassert CS.

View File

@ -148,7 +148,7 @@ where
fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error> { fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error> {
self.bus.lock(|bus| { self.bus.lock(|bus| {
let mut bus = bus.borrow_mut(); let mut bus = bus.borrow_mut();
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.read(address, buffer).map_err(I2cDeviceError::I2c) bus.read(address, buffer).map_err(I2cDeviceError::I2c)
}) })
} }
@ -156,7 +156,7 @@ where
fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), Self::Error> { fn write(&mut self, address: u8, bytes: &[u8]) -> Result<(), Self::Error> {
self.bus.lock(|bus| { self.bus.lock(|bus| {
let mut bus = bus.borrow_mut(); let mut bus = bus.borrow_mut();
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.write(address, bytes).map_err(I2cDeviceError::I2c) bus.write(address, bytes).map_err(I2cDeviceError::I2c)
}) })
} }
@ -164,7 +164,7 @@ where
fn write_read(&mut self, address: u8, wr_buffer: &[u8], rd_buffer: &mut [u8]) -> Result<(), Self::Error> { fn write_read(&mut self, address: u8, wr_buffer: &[u8], rd_buffer: &mut [u8]) -> Result<(), Self::Error> {
self.bus.lock(|bus| { self.bus.lock(|bus| {
let mut bus = bus.borrow_mut(); let mut bus = bus.borrow_mut();
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| I2cDeviceError::Config)?;
bus.write_read(address, wr_buffer, rd_buffer) bus.write_read(address, wr_buffer, rd_buffer)
.map_err(I2cDeviceError::I2c) .map_err(I2cDeviceError::I2c)
}) })

View File

@ -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,
@ -107,6 +55,10 @@ where
CS: OutputPin, CS: OutputPin,
{ {
fn transaction(&mut self, operations: &mut [Operation<'_, u8>]) -> Result<(), Self::Error> { fn transaction(&mut self, operations: &mut [Operation<'_, u8>]) -> Result<(), Self::Error> {
if cfg!(not(feature = "time")) && operations.iter().any(|op| matches!(op, Operation::DelayNs(_))) {
return Err(SpiDeviceError::DelayNotSupported);
}
self.bus.lock(|bus| { self.bus.lock(|bus| {
let mut bus = bus.borrow_mut(); let mut bus = bus.borrow_mut();
self.cs.set_low().map_err(SpiDeviceError::Cs)?; self.cs.set_low().map_err(SpiDeviceError::Cs)?;
@ -116,6 +68,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::DelayNs(_) => unreachable!(),
#[cfg(feature = "time")]
Operation::DelayNs(ns) => {
embassy_time::block_for(embassy_time::Duration::from_nanos(*ns 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 +158,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,
@ -258,9 +165,13 @@ where
CS: OutputPin, CS: OutputPin,
{ {
fn transaction(&mut self, operations: &mut [Operation<'_, u8>]) -> Result<(), Self::Error> { fn transaction(&mut self, operations: &mut [Operation<'_, u8>]) -> Result<(), Self::Error> {
if cfg!(not(feature = "time")) && operations.iter().any(|op| matches!(op, Operation::DelayNs(_))) {
return Err(SpiDeviceError::DelayNotSupported);
}
self.bus.lock(|bus| { self.bus.lock(|bus| {
let mut bus = bus.borrow_mut(); let mut bus = bus.borrow_mut();
bus.set_config(&self.config); bus.set_config(&self.config).map_err(|_| SpiDeviceError::Config)?;
self.cs.set_low().map_err(SpiDeviceError::Cs)?; self.cs.set_low().map_err(SpiDeviceError::Cs)?;
let op_res = operations.iter_mut().try_for_each(|op| match op { let op_res = operations.iter_mut().try_for_each(|op| match op {
@ -268,6 +179,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::DelayNs(_) => unreachable!(),
#[cfg(feature = "time")]
Operation::DelayNs(ns) => {
embassy_time::block_for(embassy_time::Duration::from_nanos(*ns as _));
Ok(())
}
}); });
// On failure, it's important to still flush and deassert CS. // On failure, it's important to still flush and deassert CS.

View File

@ -3,9 +3,7 @@ use core::fmt::Debug;
use embedded_hal_1::{i2c, spi}; use embedded_hal_1::{i2c, spi};
#[cfg(feature = "nightly")]
pub mod asynch; pub mod asynch;
pub mod blocking; pub mod blocking;
/// Error returned by I2C device implementations in this crate. /// Error returned by I2C device implementations in this crate.
@ -14,6 +12,8 @@ pub mod blocking;
pub enum I2cDeviceError<BUS> { pub enum I2cDeviceError<BUS> {
/// An operation on the inner I2C bus failed. /// An operation on the inner I2C bus failed.
I2c(BUS), I2c(BUS),
/// Configuration of the inner I2C bus failed.
Config,
} }
impl<BUS> i2c::Error for I2cDeviceError<BUS> impl<BUS> i2c::Error for I2cDeviceError<BUS>
@ -23,6 +23,7 @@ where
fn kind(&self) -> i2c::ErrorKind { fn kind(&self) -> i2c::ErrorKind {
match self { match self {
Self::I2c(e) => e.kind(), Self::I2c(e) => e.kind(),
Self::Config => i2c::ErrorKind::Other,
} }
} }
} }
@ -30,11 +31,16 @@ 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),
/// Delay operations are not supported when the `time` Cargo feature is not enabled.
DelayNotSupported,
/// The SPI bus could not be configured.
Config,
} }
impl<BUS, CS> spi::Error for SpiDeviceError<BUS, CS> impl<BUS, CS> spi::Error for SpiDeviceError<BUS, CS>
@ -46,6 +52,8 @@ 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::DelayNotSupported => spi::ErrorKind::Other,
Self::Config => spi::ErrorKind::Other,
} }
} }
} }

View File

@ -1,6 +1,6 @@
[package] [package]
name = "embassy-macros" name = "embassy-executor-macros"
version = "0.2.0" version = "0.4.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
description = "macros for creating the entry point and tasks for embassy-executor" description = "macros for creating the entry point and tasks for embassy-executor"
@ -21,5 +21,4 @@ proc-macro2 = "1.0.29"
proc-macro = true proc-macro = true
[features] [features]
# Enabling this cause interrupt::take! to require embassy-executor nightly = []
rtos-trace-interrupt = []

View File

@ -0,0 +1,15 @@
# embassy-executor-macros
An [Embassy](https://embassy.dev) project.
NOTE: Do not use this crate directly. The macros are re-exported by `embassy-executor`.
## License
This work is licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
<http://www.apache.org/licenses/LICENSE-2.0>)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
at your option.

View File

@ -53,8 +53,7 @@ pub fn wasm() -> TokenStream {
quote! { quote! {
#[wasm_bindgen::prelude::wasm_bindgen(start)] #[wasm_bindgen::prelude::wasm_bindgen(start)]
pub fn main() -> Result<(), wasm_bindgen::JsValue> { pub fn main() -> Result<(), wasm_bindgen::JsValue> {
static EXECUTOR: ::embassy_executor::_export::StaticCell<::embassy_executor::Executor> = ::embassy_executor::_export::StaticCell::new(); let executor = ::std::boxed::Box::leak(::std::boxed::Box::new(::embassy_executor::Executor::new()));
let executor = EXECUTOR.init(::embassy_executor::Executor::new());
executor.start(|spawner| { executor.start(|spawner| {
spawner.spawn(__embassy_main(spawner)).unwrap(); spawner.spawn(__embassy_main(spawner)).unwrap();

View File

@ -79,6 +79,7 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
task_inner.vis = syn::Visibility::Inherited; task_inner.vis = syn::Visibility::Inherited;
task_inner.sig.ident = task_inner_ident.clone(); task_inner.sig.ident = task_inner_ident.clone();
#[cfg(feature = "nightly")]
let mut task_outer: ItemFn = parse_quote! { let mut task_outer: ItemFn = parse_quote! {
#visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> { #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> {
type Fut = impl ::core::future::Future + 'static; type Fut = impl ::core::future::Future + 'static;
@ -87,6 +88,14 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
unsafe { POOL._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) } unsafe { POOL._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) }
} }
}; };
#[cfg(not(feature = "nightly"))]
let mut task_outer: ItemFn = parse_quote! {
#visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> {
const POOL_SIZE: usize = #pool_size;
static POOL: ::embassy_executor::_export::TaskPoolRef = ::embassy_executor::_export::TaskPoolRef::new();
unsafe { POOL.get::<_, POOL_SIZE>()._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) }
}
};
task_outer.attrs.append(&mut task_inner.attrs.clone()); task_outer.attrs.append(&mut task_inner.attrs.clone());

View File

@ -5,6 +5,41 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
## 0.4.0 - 2023-12-05
- Removed `arch-xtensa`. Use the executor provided by the HAL crate (`esp-hal`, `esp32s3-hal`, etc...) instead.
- Added an arena allocator for tasks, allowing using the `main` and `task` macros on Rust 1.75 stable. (it is only used if the `nightly` feature is not enabled. When `nightly` is enabled, `type_alias_impl_trait` is used to statically allocate tasks, as before).
## 0.3.3 - 2023-11-15
- Add `main` macro reexport for Xtensa arch.
- Remove use of `atomic-polyfill`. The executor now has multiple implementations of its internal data structures for cases where the target supports atomics or doesn't.
## 0.3.2 - 2023-11-06
- Use `atomic-polyfill` for `riscv32`
- Removed unused dependencies (static_cell, futures-util)
## 0.3.1 - 2023-11-01
- Fix spurious "Found waker not created by the Embassy executor" error in recent nightlies.
## 0.3.0 - 2023-08-25
- Replaced Pender. Implementations now must define an extern function called `__pender`.
- Made `raw::AvailableTask` public
- Made `SpawnToken::new_failed` public
- You can now use arbitrary expressions to specify `#[task(pool_size = X)]`
## 0.2.1 - 2023-08-10
- Avoid calling `pend()` when waking expired timers
- Properly reset finished task state with `integrated-timers` enabled
- Introduce `InterruptExecutor::spawner()`
- Fix incorrect critical section in Xtensa executor
## 0.2.0 - 2023-04-27 ## 0.2.0 - 2023-04-27
- Replace unnecessary atomics in runqueue - Replace unnecessary atomics in runqueue

View File

@ -1,6 +1,6 @@
[package] [package]
name = "embassy-executor" name = "embassy-executor"
version = "0.2.0" version = "0.4.0"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
description = "async/await executor designed for embedded usage" description = "async/await executor designed for embedded usage"
@ -14,7 +14,7 @@ categories = [
[package.metadata.embassy_docs] [package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/" src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/" src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/"
features = ["nightly", "defmt", "pender-callback"] features = ["defmt"]
flavors = [ flavors = [
{ name = "std", target = "x86_64-unknown-linux-gnu", features = ["arch-std", "executor-thread"] }, { name = "std", target = "x86_64-unknown-linux-gnu", features = ["arch-std", "executor-thread"] },
{ name = "wasm", target = "wasm32-unknown-unknown", features = ["arch-wasm", "executor-thread"] }, { name = "wasm", target = "wasm32-unknown-unknown", features = ["arch-wasm", "executor-thread"] },
@ -25,47 +25,20 @@ flavors = [
[package.metadata.docs.rs] [package.metadata.docs.rs]
default-target = "thumbv7em-none-eabi" default-target = "thumbv7em-none-eabi"
targets = ["thumbv7em-none-eabi"] targets = ["thumbv7em-none-eabi"]
features = ["nightly", "defmt", "pender-callback", "arch-cortex-m", "executor-thread", "executor-interrupt"] features = ["defmt", "arch-cortex-m", "executor-thread", "executor-interrupt"]
[features]
# Architecture
_arch = [] # some arch was picked
arch-std = ["_arch", "critical-section/std"]
arch-cortex-m = ["_arch", "dep:cortex-m"]
arch-xtensa = ["_arch"]
arch-riscv32 = ["_arch"]
arch-wasm = ["_arch", "dep:wasm-bindgen", "dep:js-sys"]
# Enable creating a `Pender` from an arbitrary function pointer callback.
pender-callback = []
# Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs)
executor-thread = []
# Enable the interrupt-mode executor (available in Cortex-M only)
executor-interrupt = []
# Enable nightly-only features
nightly = []
turbowakers = []
integrated-timers = ["dep:embassy-time"]
# Trace interrupt invocations with rtos-trace.
rtos-trace-interrupt = ["rtos-trace", "embassy-macros/rtos-trace-interrupt"]
[dependencies] [dependencies]
defmt = { version = "0.3", optional = true } defmt = { version = "0.3", optional = true }
log = { version = "0.4.14", optional = true } log = { version = "0.4.14", optional = true }
rtos-trace = { version = "0.1.2", optional = true } rtos-trace = { version = "0.1.2", optional = true }
futures-util = { version = "0.3.17", default-features = false } embassy-executor-macros = { version = "0.4.0", path = "../embassy-executor-macros" }
embassy-macros = { version = "0.2.0", path = "../embassy-macros" } embassy-time = { version = "0.2", path = "../embassy-time", optional = true}
embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true}
atomic-polyfill = "1.0.1"
critical-section = "1.1" critical-section = "1.1"
static_cell = "1.1"
# needed for riscv
# remove when https://github.com/rust-lang/rust/pull/114499 is merged
portable-atomic = { version = "1.5", optional = true }
# arch-cortex-m dependencies # arch-cortex-m dependencies
cortex-m = { version = "0.7.6", optional = true } cortex-m = { version = "0.7.6", optional = true }
@ -73,3 +46,73 @@ cortex-m = { version = "0.7.6", optional = true }
# arch-wasm dependencies # arch-wasm dependencies
wasm-bindgen = { version = "0.2.82", optional = true } wasm-bindgen = { version = "0.2.82", optional = true }
js-sys = { version = "0.3", optional = true } js-sys = { version = "0.3", optional = true }
[dev-dependencies]
critical-section = { version = "1.1", features = ["std"] }
[features]
# Architecture
_arch = [] # some arch was picked
arch-std = ["_arch", "critical-section/std"]
arch-cortex-m = ["_arch", "dep:cortex-m"]
arch-riscv32 = ["_arch", "dep:portable-atomic"]
arch-wasm = ["_arch", "dep:wasm-bindgen", "dep:js-sys"]
# Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs)
executor-thread = []
# Enable the interrupt-mode executor (available in Cortex-M only)
executor-interrupt = []
# Enable nightly-only features
nightly = ["embassy-executor-macros/nightly"]
turbowakers = []
integrated-timers = ["dep:embassy-time"]
# BEGIN AUTOGENERATED CONFIG FEATURES
# Generated by gen_config.py. DO NOT EDIT.
task-arena-size-64 = []
task-arena-size-128 = []
task-arena-size-192 = []
task-arena-size-256 = []
task-arena-size-320 = []
task-arena-size-384 = []
task-arena-size-512 = []
task-arena-size-640 = []
task-arena-size-768 = []
task-arena-size-1024 = []
task-arena-size-1280 = []
task-arena-size-1536 = []
task-arena-size-2048 = []
task-arena-size-2560 = []
task-arena-size-3072 = []
task-arena-size-4096 = [] # Default
task-arena-size-5120 = []
task-arena-size-6144 = []
task-arena-size-8192 = []
task-arena-size-10240 = []
task-arena-size-12288 = []
task-arena-size-16384 = []
task-arena-size-20480 = []
task-arena-size-24576 = []
task-arena-size-32768 = []
task-arena-size-40960 = []
task-arena-size-49152 = []
task-arena-size-65536 = []
task-arena-size-81920 = []
task-arena-size-98304 = []
task-arena-size-131072 = []
task-arena-size-163840 = []
task-arena-size-196608 = []
task-arena-size-262144 = []
task-arena-size-327680 = []
task-arena-size-393216 = []
task-arena-size-524288 = []
task-arena-size-655360 = []
task-arena-size-786432 = []
task-arena-size-1048576 = []
# END AUTOGENERATED CONFIG FEATURES

View File

@ -2,10 +2,36 @@
An async/await executor designed for embedded usage. An async/await executor designed for embedded usage.
- No `alloc`, no heap needed. Task futures are statically allocated. - No `alloc`, no heap needed.
- With nightly Rust, task futures can be fully statically allocated.
- No "fixed capacity" data structures, executor works with 1 or 1000 tasks without needing config/tuning. - No "fixed capacity" data structures, executor works with 1 or 1000 tasks without needing config/tuning.
- Integrated timer queue: sleeping is easy, just do `Timer::after(Duration::from_secs(1)).await;`. - Integrated timer queue: sleeping is easy, just do `Timer::after_secs(1).await;`.
- No busy-loop polling: CPU sleeps when there's no work to do, using interrupts or `WFE/SEV`. - No busy-loop polling: CPU sleeps when there's no work to do, using interrupts or `WFE/SEV`.
- Efficient polling: a wake will only poll the woken task, not all of them. - Efficient polling: a wake will only poll the woken task, not all of them.
- Fair: a task can't monopolize CPU time even if it's constantly being woken. All other tasks get a chance to run before a given task gets polled for the second time. - Fair: a task can't monopolize CPU time even if it's constantly being woken. All other tasks get a chance to run before a given task gets polled for the second time.
- Creating multiple executor instances is supported, to run tasks with multiple priority levels. This allows higher-priority tasks to preempt lower-priority tasks. - Creating multiple executor instances is supported, to run tasks with multiple priority levels. This allows higher-priority tasks to preempt lower-priority tasks.
## Task arena
When the `nightly` Cargo feature is not enabled, `embassy-executor` allocates tasks out of an arena (a very simple bump allocator).
If the task arena gets full, the program will panic at runtime. To guarantee this doesn't happen, you must set the size to the sum of sizes of all tasks.
Tasks are allocated from the arena when spawned for the first time. If the task exists, the allocation is not released to the arena, but can be reused to spawn the task again. For multiple-instance tasks (like `#[embassy_executor::task(pool_size = 4)]`), the first spawn will allocate memory for all instances. This is done for performance and to increase predictability (for example, spawning at least 1 instance of every task at boot guarantees an immediate panic if the arena is too small, while allocating instances on-demand could delay the panic to only when the program is under load).
The arena size can be configured in two ways:
- Via Cargo features: enable a Cargo feature like `task-arena-size-8192`. Only a selection of values
is available, check `Cargo.toml` for the list.
- Via environment variables at build time: set the variable named `EMBASSY_EXECUTOR_TASK_ARENA_SIZE`. For example
`EMBASSY_EXECUTOR_TASK_ARENA_SIZE=4321 cargo build`. You can also set them in the `[env]` section of `.cargo/config.toml`.
Any value can be set, unlike with Cargo features.
Environment variables take precedence over Cargo features. If two Cargo features are enabled for the same setting
with different values, compilation fails.
## Statically allocating tasks
When using nightly Rust, enable the `nightly` Cargo feature. This will make `embassy-executor` use the `type_alias_impl_trait` feature to allocate all tasks in `static`s. Each task gets its own `static`, with the exact size to hold the task (or multiple instances of it, if using `pool_size`) calculated automatically at compile time. If tasks don't fit in RAM, this is detected at compile time by the linker. Runtime panics due to running out of memory are not possible.
The configured arena size is ignored, no arena is used at all.

View File

@ -1,6 +1,97 @@
use std::env; use std::collections::HashMap;
use std::fmt::Write;
use std::path::PathBuf;
use std::{env, fs};
static CONFIGS: &[(&str, usize)] = &[
// BEGIN AUTOGENERATED CONFIG FEATURES
// Generated by gen_config.py. DO NOT EDIT.
("TASK_ARENA_SIZE", 4096),
// END AUTOGENERATED CONFIG FEATURES
];
struct ConfigState {
value: usize,
seen_feature: bool,
seen_env: bool,
}
fn main() { fn main() {
let crate_name = env::var("CARGO_PKG_NAME")
.unwrap()
.to_ascii_uppercase()
.replace('-', "_");
// only rebuild if build.rs changed. Otherwise Cargo will rebuild if any
// other file changed.
println!("cargo:rerun-if-changed=build.rs");
// Rebuild if config envvar changed.
for (name, _) in CONFIGS {
println!("cargo:rerun-if-env-changed={crate_name}_{name}");
}
let mut configs = HashMap::new();
for (name, default) in CONFIGS {
configs.insert(
*name,
ConfigState {
value: *default,
seen_env: false,
seen_feature: false,
},
);
}
let prefix = format!("{crate_name}_");
for (var, value) in env::vars() {
if let Some(name) = var.strip_prefix(&prefix) {
let Some(cfg) = configs.get_mut(name) else {
panic!("Unknown env var {name}")
};
let Ok(value) = value.parse::<usize>() else {
panic!("Invalid value for env var {name}: {value}")
};
cfg.value = value;
cfg.seen_env = true;
}
if let Some(feature) = var.strip_prefix("CARGO_FEATURE_") {
if let Some(i) = feature.rfind('_') {
let name = &feature[..i];
let value = &feature[i + 1..];
if let Some(cfg) = configs.get_mut(name) {
let Ok(value) = value.parse::<usize>() else {
panic!("Invalid value for feature {name}: {value}")
};
// envvars take priority.
if !cfg.seen_env {
if cfg.seen_feature {
panic!("multiple values set for feature {}: {} and {}", name, cfg.value, value);
}
cfg.value = value;
cfg.seen_feature = true;
}
}
}
}
}
let mut data = String::new();
for (name, cfg) in &configs {
writeln!(&mut data, "pub const {}: usize = {};", name, cfg.value).unwrap();
}
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let out_file = out_dir.join("config.rs").to_string_lossy().to_string();
fs::write(out_file, data).unwrap();
// cortex-m targets
let target = env::var("TARGET").unwrap(); let target = env::var("TARGET").unwrap();
if target.starts_with("thumbv6m-") { if target.starts_with("thumbv6m-") {

View File

@ -0,0 +1,82 @@
import os
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
features = []
def feature(name, default, min=None, max=None, pow2=None, vals=None, factors=[]):
if vals is None:
assert min is not None
assert max is not None
vals = set()
val = min
while val <= max:
vals.add(val)
for f in factors:
if val * f <= max:
vals.add(val * f)
if (pow2 == True or (isinstance(pow2, int) and val >= pow2)) and val > 0:
val *= 2
else:
val += 1
vals.add(default)
vals = sorted(list(vals))
features.append(
{
"name": name,
"default": default,
"vals": vals,
}
)
feature(
"task_arena_size", default=4096, min=64, max=1024 * 1024, pow2=True, factors=[3, 5]
)
# ========= Update Cargo.toml
things = ""
for f in features:
name = f["name"].replace("_", "-")
for val in f["vals"]:
things += f"{name}-{val} = []"
if val == f["default"]:
things += " # Default"
things += "\n"
things += "\n"
SEPARATOR_START = "# BEGIN AUTOGENERATED CONFIG FEATURES\n"
SEPARATOR_END = "# END AUTOGENERATED CONFIG FEATURES\n"
HELP = "# Generated by gen_config.py. DO NOT EDIT.\n"
with open("Cargo.toml", "r") as f:
data = f.read()
before, data = data.split(SEPARATOR_START, maxsplit=1)
_, after = data.split(SEPARATOR_END, maxsplit=1)
data = before + SEPARATOR_START + HELP + things + SEPARATOR_END + after
with open("Cargo.toml", "w") as f:
f.write(data)
# ========= Update build.rs
things = ""
for f in features:
name = f["name"].upper()
things += f' ("{name}", {f["default"]}),\n'
SEPARATOR_START = "// BEGIN AUTOGENERATED CONFIG FEATURES\n"
SEPARATOR_END = "// END AUTOGENERATED CONFIG FEATURES\n"
HELP = " // Generated by gen_config.py. DO NOT EDIT.\n"
with open("build.rs", "r") as f:
data = f.read()
before, data = data.split(SEPARATOR_START, maxsplit=1)
_, after = data.split(SEPARATOR_END, maxsplit=1)
data = before + SEPARATOR_START + HELP + things + " " + SEPARATOR_END + after
with open("build.rs", "w") as f:
f.write(data)

View File

@ -1,25 +1,60 @@
#[export_name = "__pender"]
#[cfg(any(feature = "executor-thread", feature = "executor-interrupt"))]
fn __pender(context: *mut ()) {
unsafe {
// Safety: `context` is either `usize::MAX` created by `Executor::run`, or a valid interrupt
// request number given to `InterruptExecutor::start`.
let context = context as usize;
#[cfg(feature = "executor-thread")]
// Try to make Rust optimize the branching away if we only use thread mode.
if !cfg!(feature = "executor-interrupt") || context == THREAD_PENDER {
core::arch::asm!("sev");
return;
}
#[cfg(feature = "executor-interrupt")]
{
use cortex_m::interrupt::InterruptNumber;
use cortex_m::peripheral::NVIC;
#[derive(Clone, Copy)]
struct Irq(u16);
unsafe impl InterruptNumber for Irq {
fn number(self) -> u16 {
self.0
}
}
let irq = Irq(context as u16);
// STIR is faster, but is only available in v7 and higher.
#[cfg(not(armv6m))]
{
let mut nvic: NVIC = core::mem::transmute(());
nvic.request(irq);
}
#[cfg(armv6m)]
NVIC::pend(irq);
}
}
}
#[cfg(feature = "executor-thread")] #[cfg(feature = "executor-thread")]
pub use thread::*; pub use thread::*;
#[cfg(feature = "executor-thread")] #[cfg(feature = "executor-thread")]
mod thread { mod thread {
pub(super) const THREAD_PENDER: usize = usize::MAX;
use core::arch::asm; use core::arch::asm;
use core::marker::PhantomData; use core::marker::PhantomData;
#[cfg(feature = "nightly")] pub use embassy_executor_macros::main_cortex_m as main;
pub use embassy_macros::main_cortex_m as main;
use crate::raw::{Pender, PenderInner};
use crate::{raw, Spawner}; use crate::{raw, Spawner};
#[derive(Copy, Clone)]
pub(crate) struct ThreadPender;
impl ThreadPender {
pub(crate) fn pend(self) {
unsafe { core::arch::asm!("sev") }
}
}
/// Thread mode executor, using WFE/SEV. /// Thread mode executor, using WFE/SEV.
/// ///
/// This is the simplest and most common kind of executor. It runs on /// This is the simplest and most common kind of executor. It runs on
@ -39,7 +74,7 @@ mod thread {
/// Create a new Executor. /// Create a new Executor.
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
inner: raw::Executor::new(Pender(PenderInner::Thread(ThreadPender))), inner: raw::Executor::new(THREAD_PENDER as *mut ()),
not_send: PhantomData, not_send: PhantomData,
} }
} }
@ -79,37 +114,14 @@ mod thread {
pub use interrupt::*; pub use interrupt::*;
#[cfg(feature = "executor-interrupt")] #[cfg(feature = "executor-interrupt")]
mod interrupt { mod interrupt {
use core::cell::UnsafeCell; use core::cell::{Cell, UnsafeCell};
use core::mem::MaybeUninit; use core::mem::MaybeUninit;
use atomic_polyfill::{AtomicBool, Ordering};
use cortex_m::interrupt::InterruptNumber; use cortex_m::interrupt::InterruptNumber;
use cortex_m::peripheral::NVIC; use cortex_m::peripheral::NVIC;
use critical_section::Mutex;
use crate::raw::{self, Pender, PenderInner}; use crate::raw;
#[derive(Clone, Copy)]
pub(crate) struct InterruptPender(u16);
impl InterruptPender {
pub(crate) fn pend(self) {
// STIR is faster, but is only available in v7 and higher.
#[cfg(not(armv6m))]
{
let mut nvic: cortex_m::peripheral::NVIC = unsafe { core::mem::transmute(()) };
nvic.request(self);
}
#[cfg(armv6m)]
cortex_m::peripheral::NVIC::pend(self);
}
}
unsafe impl cortex_m::interrupt::InterruptNumber for InterruptPender {
fn number(self) -> u16 {
self.0
}
}
/// Interrupt mode executor. /// Interrupt mode executor.
/// ///
@ -133,7 +145,7 @@ mod interrupt {
/// It is somewhat more complex to use, it's recommended to use the thread-mode /// It is somewhat more complex to use, it's recommended to use the thread-mode
/// [`Executor`] instead, if it works for your use case. /// [`Executor`] instead, if it works for your use case.
pub struct InterruptExecutor { pub struct InterruptExecutor {
started: AtomicBool, started: Mutex<Cell<bool>>,
executor: UnsafeCell<MaybeUninit<raw::Executor>>, executor: UnsafeCell<MaybeUninit<raw::Executor>>,
} }
@ -145,7 +157,7 @@ mod interrupt {
#[inline] #[inline]
pub const fn new() -> Self { pub const fn new() -> Self {
Self { Self {
started: AtomicBool::new(false), started: Mutex::new(Cell::new(false)),
executor: UnsafeCell::new(MaybeUninit::uninit()), executor: UnsafeCell::new(MaybeUninit::uninit()),
} }
} }
@ -154,7 +166,8 @@ mod interrupt {
/// ///
/// # Safety /// # Safety
/// ///
/// You MUST call this from the interrupt handler, and from nowhere else. /// - You MUST call this from the interrupt handler, and from nowhere else.
/// - You must not call this before calling `start()`.
pub unsafe fn on_interrupt(&'static self) { pub unsafe fn on_interrupt(&'static self) {
let executor = unsafe { (&*self.executor.get()).assume_init_ref() }; let executor = unsafe { (&*self.executor.get()).assume_init_ref() };
executor.poll(); executor.poll();
@ -183,20 +196,14 @@ mod interrupt {
/// do it after. /// do it after.
/// ///
pub fn start(&'static self, irq: impl InterruptNumber) -> crate::SendSpawner { pub fn start(&'static self, irq: impl InterruptNumber) -> crate::SendSpawner {
if self if critical_section::with(|cs| self.started.borrow(cs).replace(true)) {
.started
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
.is_err()
{
panic!("InterruptExecutor::start() called multiple times on the same executor."); panic!("InterruptExecutor::start() called multiple times on the same executor.");
} }
unsafe { unsafe {
(&mut *self.executor.get()) (&mut *self.executor.get())
.as_mut_ptr() .as_mut_ptr()
.write(raw::Executor::new(Pender(PenderInner::Interrupt(InterruptPender( .write(raw::Executor::new(irq.number() as *mut ()))
irq.number(),
)))))
} }
let executor = unsafe { (&*self.executor.get()).assume_init_ref() }; let executor = unsafe { (&*self.executor.get()).assume_init_ref() };
@ -211,10 +218,10 @@ mod interrupt {
/// This returns a [`SendSpawner`] you can use to spawn tasks on this /// This returns a [`SendSpawner`] you can use to spawn tasks on this
/// executor. /// executor.
/// ///
/// This MUST only be called on an executor that has already been spawned. /// This MUST only be called on an executor that has already been started.
/// The function will panic otherwise. /// The function will panic otherwise.
pub fn spawner(&'static self) -> crate::SendSpawner { pub fn spawner(&'static self) -> crate::SendSpawner {
if !self.started.load(Ordering::Acquire) { if !critical_section::with(|cs| self.started.borrow(cs).get()) {
panic!("InterruptExecutor::spawner() called on uninitialized executor."); panic!("InterruptExecutor::spawner() called on uninitialized executor.");
} }
let executor = unsafe { (&*self.executor.get()).assume_init_ref() }; let executor = unsafe { (&*self.executor.get()).assume_init_ref() };

Some files were not shown because too many files have changed in this diff Show More