diff --git a/Cargo.lock b/Cargo.lock index 59624d5..0cf6b77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,13 +19,34 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" dependencies = [ "term", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "bare-metal" version = "0.2.5" @@ -37,18 +58,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitfield" @@ -56,12 +77,6 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" -[[package]] -name = "bitfield" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" - [[package]] name = "bitflags" version = "1.3.2" @@ -74,6 +89,21 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + [[package]] name = "byteorder" version = "1.5.0" @@ -103,7 +133,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" dependencies = [ "bare-metal", - "bitfield 0.13.2", + "bitfield", "embedded-hal 0.2.7", "volatile-register", ] @@ -125,7 +155,16 @@ checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", ] [[package]] @@ -149,21 +188,57 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "debug-helper" version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" -[[package]] -name = "defmt" -version = "0.3.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" -dependencies = [ - "defmt 1.0.1", -] - [[package]] name = "defmt" version = "1.0.1" @@ -184,7 +259,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.110", + "syn", ] [[package]] @@ -193,7 +268,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" dependencies = [ - "thiserror 2.0.17", + "thiserror", ] [[package]] @@ -203,34 +278,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" dependencies = [ "critical-section", - "defmt 1.0.1", + "defmt", ] [[package]] -name = "diff" -version = "0.1.13" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "cfg-if", - "dirs-sys-next", + "block-buffer", + "crypto-common", ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "libc", - "redox_users", - "winapi", + "litrs", ] [[package]] @@ -240,12 +307,204 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "embedded-dma" +name = "embassy-embedded-hal" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "554e3e840696f54b4c9afcf28a0f24da431c927f4151040020416e7393d6d0d8" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-executor" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06070468370195e0e86f241c8e5004356d696590a678d47d6676795b2e439c6b" +dependencies = [ + "cortex-m", + "critical-section", + "defmt", + "document-features", + "embassy-executor-macros", + "embassy-executor-timer-queue", +] + +[[package]] +name = "embassy-executor-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfdddc3a04226828316bf31393b6903ee162238576b1584ee2669af215d55472" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "embassy-executor-timer-queue" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc328bf943af66b80b98755db9106bf7e7471b0cf47dc8559cd9a6be504cc9c" + +[[package]] +name = "embassy-futures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" +dependencies = [ + "defmt", +] + +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "cortex-m", + "critical-section", + "defmt", + "num-traits", +] + +[[package]] +name = "embassy-net-driver" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "994f7e5b5cb23521c22304927195f236813053eb9c065dd2226a32ba64695446" +checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" + +[[package]] +name = "embassy-net-driver-channel" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b2739fbcf6cd206ae08779c7d709087b16577d255f2ea4a45bc4bbbf305b3f" dependencies = [ - "stable_deref_trait", + "embassy-futures", + "embassy-net-driver", + "embassy-sync", +] + +[[package]] +name = "embassy-rp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a284935af0a869de3fa14af74b5f932389dd66d7048012f1083b06f38d05399" +dependencies = [ + "atomic-polyfill", + "cfg-if", + "cortex-m", + "cortex-m-rt", + "critical-section", + "defmt", + "document-features", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-internal", + "embassy-sync", + "embassy-time", + "embassy-time-driver", + "embassy-time-queue-utils", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "embedded-io-async", + "embedded-storage", + "embedded-storage-async", + "fixed", + "nb 1.1.0", + "pio", + "rand_core 0.6.4", + "rand_core 0.9.3", + "rp-pac", + "rp2040-boot2", + "sha2-const-stable", + "smart-leds", +] + +[[package]] +name = "embassy-sync" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73974a3edbd0bd286759b3d483540f0ebef705919a5f56f4fc7709066f71689b" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-core", + "futures-sink", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-time" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa65b9284d974dad7a23bb72835c4ec85c0b540d86af7fc4098c88cff51d65" +dependencies = [ + "cfg-if", + "critical-section", + "document-features", + "embassy-time-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "futures-core", +] + +[[package]] +name = "embassy-time-driver" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a244c7dc22c8d0289379c8d8830cae06bb93d8f990194d0de5efb3b5ae7ba6" +dependencies = [ + "document-features", +] + +[[package]] +name = "embassy-time-queue-utils" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e2ee86063bd028a420a5fb5898c18c87a8898026da1d4c852af2c443d0a454" +dependencies = [ + "embassy-executor-timer-queue", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-usb" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4462e48b19a4f401a11901bdd981aab80c6a826608016a0bdc73cbbab31954" +dependencies = [ + "defmt", + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync", + "embassy-usb-driver", + "embedded-io-async", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" +dependencies = [ + "defmt", + "embedded-io-async", ] [[package]] @@ -289,6 +548,30 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[package]] +name = "embedded-storage" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + +[[package]] +name = "embedded-storage-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" +dependencies = [ + "embedded-storage", +] + [[package]] name = "ena" version = "0.14.3" @@ -304,75 +587,61 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "fixed" +version = "1.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707070ccf8c4173548210893a0186e29c266901b71ed20cd9e2ca0193dfe95c3" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] -name = "frunk" -version = "0.4.4" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28aef0f9aa070bce60767c12ba9cb41efeaf1a2bc6427f87b7d83f11239a16d7" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "frunk_core", - "frunk_derives", + "typenum", + "version_check", ] [[package]] -name = "frunk_core" -version = "0.4.4" +name = "half" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476eeaa382e3462b84da5d6ba3da97b5786823c2d0d3a0d04ef088d073da225c" - -[[package]] -name = "frunk_derives" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b4095fc99e1d858e5b8c7125d2638372ec85aa0fe6c807105cf10b0265ca6c" -dependencies = [ - "frunk_proc_macro_helpers", - "quote", - "syn 2.0.110", -] - -[[package]] -name = "frunk_proc_macro_helpers" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1952b802269f2db12ab7c0bd328d0ae8feaabf19f352a7b0af7bb0c5693abfce" -dependencies = [ - "frunk_core", - "proc-macro2", - "quote", - "syn 2.0.110", -] - -[[package]] -name = "fugit" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e639847d312d9a82d2e75b0edcc1e934efcc64e6cb7aa94f0b1fbec0bc231d6" -dependencies = [ - "gcd", -] - -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", - "libc", - "wasi", + "crunchy", + "zerocopy", ] [[package]] @@ -411,10 +680,10 @@ dependencies = [ ] [[package]] -name = "hermit-abi" -version = "0.5.2" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" @@ -426,55 +695,54 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - [[package]] name = "itertools" -version = "0.10.5" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] -name = "lalrpop" -version = "0.19.12" +name = "keccak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4ebbd48ce411c1d10fb35185f5a51a7bfa3d8b24b4e330d30c9e3a34129501" dependencies = [ "ascii-canvas", "bit-set", - "diff", "ena", - "is-terminal", "itertools", "lalrpop-util", "petgraph", + "pico-args", "regex", - "regex-syntax 0.6.29", + "regex-syntax", + "sha3", "string_cache", "term", - "tiny-keccak", "unicode-xid", + "walkdir", ] [[package]] name = "lalrpop-util" -version = "0.19.12" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +checksum = "b5baa5e9ff84f1aefd264e6869907646538a52147a755d494517a8007fb48733" dependencies = [ - "regex", + "regex-automata", + "rustversion", ] [[package]] @@ -484,14 +752,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] -name = "libredox" -version = "0.1.10" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" -dependencies = [ - "bitflags 2.10.0", - "libc", -] +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" @@ -536,12 +800,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] -name = "num_enum" -version = "0.5.11" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "num_enum_derive 0.5.11", + "autocfg", ] [[package]] @@ -550,21 +814,10 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ - "num_enum_derive 0.7.5", + "num_enum_derive", "rustversion", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.7.5" @@ -573,7 +826,7 @@ checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn", ] [[package]] @@ -583,7 +836,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a" dependencies = [ "cortex-m", - "defmt 1.0.1", + "defmt", ] [[package]] @@ -617,9 +870,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "petgraph" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", "indexmap", @@ -634,63 +887,78 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "picorom-rs" version = "0.1.0" dependencies = [ - "cortex-m", "cortex-m-rt", - "defmt 1.0.1", + "critical-section", + "defmt", "defmt-rtt", + "embassy-executor", + "embassy-futures", + "embassy-rp", + "embassy-usb", "embedded-hal 1.0.0", "heapless 0.9.2", - "num_enum 0.7.5", + "num_enum", "panic-probe", - "pio", - "pio-proc", - "rp-pico", - "usb-device", - "usbd-serial", + "portable-atomic", + "static_cell", ] [[package]] name = "pio" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e09694b50f89f302ed531c1f2a7569f0be5867aee4ab4f8f729bbeec0078e3" +checksum = "d0ba4153cee9585abc451271aa437d9e8defdea8b468d48ba6b8f098cbe03d7f" +dependencies = [ + "pio-core", + "pio-proc", +] + +[[package]] +name = "pio-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d90fddc3d67f21bbf93683bc461b05d6a29c708caf3ffb79947d7ff7095406" dependencies = [ "arrayvec", - "num_enum 0.5.11", + "num_enum", "paste", ] [[package]] name = "pio-parser" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77532c2b8279aef98dfc7207ef15298a5a3d6b6cc76ccc8b65913d69f3a8dd6b" +checksum = "825266c1eaddf54f636d06eefa4bf3c99d774c14ec46a4a6c6e5128a0f10d205" dependencies = [ "lalrpop", "lalrpop-util", - "pio", - "regex-syntax 0.6.29", + "pio-core", ] [[package]] name = "pio-proc" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b04dc870fb3a4fd8b3e4ca8c61b53bc8ac4eb78b66805d2b3c2e5c4829e0d7a" +checksum = "ed4a76571f5fe51af43cc80ac870fe0c79cc0cdd686b9002a6c4c84bfdd0176b" dependencies = [ "codespan-reporting", "lalrpop-util", - "pio", + "pio-core", "pio-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "regex-syntax 0.6.29", - "syn 1.0.109", + "syn", ] [[package]] @@ -698,6 +966,9 @@ name = "portable-atomic" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +dependencies = [ + "critical-section", +] [[package]] name = "precomputed-hash" @@ -705,30 +976,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -748,7 +995,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.110", + "syn", ] [[package]] @@ -775,6 +1022,12 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + [[package]] name = "redox_syscall" version = "0.5.18" @@ -784,17 +1037,6 @@ dependencies = [ "bitflags 2.10.0", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror 1.0.69", -] - [[package]] name = "regex" version = "1.12.2" @@ -804,7 +1046,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.8", + "regex-syntax", ] [[package]] @@ -815,15 +1057,9 @@ checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.8", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.8" @@ -831,16 +1067,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] -name = "rp-pico" -version = "0.9.0" +name = "rgb" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9342d3ac7011ac688300979e9b52a81f0add1d05feb02868cf94bfee0705b28" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" + +[[package]] +name = "rp-pac" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8af65855c40b2c35079514c5489abffc0429347fef25d8467ff98ad84b4322d3" dependencies = [ + "cortex-m", "cortex-m-rt", - "fugit", - "rp2040-boot2", - "rp2040-hal", - "usb-device", ] [[package]] @@ -852,59 +1091,6 @@ dependencies = [ "crc-any", ] -[[package]] -name = "rp2040-hal" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11e711940087f2cdff8aeae9f4b902e2014c06a00b39a1092686b81ec973d6f" -dependencies = [ - "bitfield 0.14.0", - "cortex-m", - "critical-section", - "embedded-dma", - "embedded-hal 0.2.7", - "embedded-hal 1.0.0", - "embedded-hal-async", - "embedded-hal-nb", - "embedded-io", - "frunk", - "fugit", - "itertools", - "nb 1.1.0", - "paste", - "pio", - "rand_core", - "rp2040-hal-macros", - "rp2040-pac", - "usb-device", - "vcell", - "void", -] - -[[package]] -name = "rp2040-hal-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86479063e497efe1ae81995ef9071f54fd1c7427e04d6c5b84cde545ff672a5e" -dependencies = [ - "cortex-m-rt", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rp2040-pac" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cbcd3f7a0ca7bbe61dc4eb7e202842bee4e27b769a7bf3a4a72fa399d6e404" -dependencies = [ - "cortex-m", - "cortex-m-rt", - "critical-section", - "vcell", -] - [[package]] name = "rustc_version" version = "0.2.3" @@ -920,6 +1106,15 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -941,6 +1136,22 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -953,12 +1164,39 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smart-leds" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df34e571fa9993fa6f99131a374d58ca3d694b75f9baac93458fe0d6057bf0" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f4441a131924d58da6b83a7ad765c460e64630cce504376c3a87a2558c487f" +dependencies = [ + "rgb", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_cell" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23" +dependencies = [ + "portable-atomic", +] + [[package]] name = "string_cache" version = "0.8.9" @@ -972,15 +1210,10 @@ dependencies = [ ] [[package]] -name = "syn" -version = "1.0.109" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -995,13 +1228,11 @@ dependencies = [ [[package]] name = "term" -version = "0.7.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +checksum = "2111ef44dae28680ae9752bb89409e7310ca33a8c621ebe7b106cf5c928b3ac0" dependencies = [ - "dirs-next", - "rustversion", - "winapi", + "windows-sys", ] [[package]] @@ -1013,33 +1244,13 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", + "thiserror-impl", ] [[package]] @@ -1050,17 +1261,14 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn", ] [[package]] -name = "tiny-keccak" -version = "2.0.2" +name = "typenum" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" @@ -1080,29 +1288,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "usb-device" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" -dependencies = [ - "defmt 0.3.100", - "heapless 0.8.0", - "portable-atomic", -] - -[[package]] -name = "usbd-serial" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065e4eaf93db81d5adac82d9cef8f8da314cb640fa7f89534b972383f1cf80fc" -dependencies = [ - "embedded-hal 0.2.7", - "embedded-io", - "nb 1.1.0", - "usb-device", -] - [[package]] name = "vcell" version = "0.1.3" @@ -1131,27 +1316,15 @@ dependencies = [ ] [[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "same-file", + "winapi-util", ] -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.11" @@ -1161,12 +1334,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-link" version = "0.2.1" @@ -1181,3 +1348,23 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] + +[[package]] +name = "zerocopy" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index a7c3817..28c0958 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,15 +9,30 @@ test = false bench = false [dependencies] -cortex-m = { version = "0.7", features = ["inline-asm"] } cortex-m-rt = "0.7" +embassy-rp = { version = "0.8", features = [ + "time-driver", + "defmt", + "rp2040", + "unstable-pac", + "critical-section-impl", + "intrinsics", +] } +embassy-executor = { version = "0.9", features = [ + "defmt", + "executor-thread", + "executor-interrupt", + "arch-cortex-m", +] } +embassy-usb = { version = "0.5", default-features = false, features = [ + "defmt", +] } +embassy-futures = { version = "0.1", features = ["defmt"] } panic-probe = { version = "1.0", features = ["print-defmt", "defmt-error"] } -rp-pico = "0.9" embedded-hal = "1.0" -pio = "0.2" -pio-proc = "0.2" -usb-device = { version = "0.3", features = ["defmt"] } -usbd-serial = "0.2" +static_cell = "2.1" +portable-atomic = { version = "1.11", features = ["critical-section"] } +critical-section = "1.2" defmt = "1.0" defmt-rtt = "1.1" diff --git a/Embed.toml b/Embed.toml new file mode 100644 index 0000000..be32c0e --- /dev/null +++ b/Embed.toml @@ -0,0 +1,36 @@ +[default.probe] +protocol = "Swd" +speed = 20000 +# If you only have one probe cargo embed will pick automatically +# Otherwise: add your probe's VID/PID/serial to filter + +## rust-dap +# usb_vid = "6666" +# usb_pid = "4444" +# serial = "test" + + +[default.flashing] +enabled = true + +[default.reset] +enabled = true +halt_afterwards = false + +[default.general] +chip = "RP2040" +log_level = "WARN" +# RP2040 does not support connect_under_reset +connect_under_reset = false + +[default.rtt] +enabled = true +up_mode = "NoBlockSkip" +up_channels = [{ channel = 0, name = "name", format = "Defmt" }] +timeout = 3000 +log_enabled = false +log_path = "./logs" + +[default.gdb] +enabled = true +gdb_connection_string = "127.0.0.1:1337" diff --git a/memory.x b/memory.x index 5063f52..6e80188 100644 --- a/memory.x +++ b/memory.x @@ -13,12 +13,10 @@ SECTIONS { { KEEP(*(.boot2)); } > BOOT2 -} INSERT BEFORE .text; -SECTIONS { - /* ### Boot loader */ + /* Initial ROM data */ .romdata ORIGIN(ROM) : { - KEEP(*(.romdata)); + KEEP(*(.romdata*)); } > ROM -} INSERT AFTER .bss; +} INSERT BEFORE .text; diff --git a/src/main.rs b/src/main.rs index a2d760f..ac4dcbb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,143 +11,70 @@ mod serial; use core::{ - cell::Cell, + mem::MaybeUninit, sync::atomic::{AtomicU8, Ordering}, + task::Poll, }; -use cortex_m::{delay::Delay, interrupt::Mutex, singleton}; use defmt_rtt as _; -use embedded_hal::digital::OutputPin; -use panic_probe as _; -use pio_proc::pio_asm; -use rp_pico::{ - Pins, XOSC_CRYSTAL_FREQ, entry, - hal::{ - Sio, Watchdog, - clocks::init_clocks_and_plls, - gpio::{FunctionPio0, PullNone}, - pio::{PIO0SM0, PIO0SM3, PIOBuilder, PioIRQ, Rx, Tx}, - prelude::*, - usb::UsbBus, - }, - pac::{self, CorePeripherals, Peripherals, interrupt}, +use embassy_executor::{InterruptExecutor, Spawner, task}; +use embassy_futures::{poll_once, yield_now}; +use embassy_rp::{ + bind_interrupts, + clocks::ClockConfig, + gpio::{Drive, Level, Output, SlewRate}, + interrupt::{self, InterruptExt, Priority}, + peripherals::{PIO0, USB}, + pio::{self, Direction, Pio, ShiftConfig, ShiftDirection, StateMachine, program::pio_asm}, + usb::{self, Driver}, }; -use usb_device::{class_prelude::*, prelude::*}; -use usbd_serial::SerialPort; +use embassy_usb::{ + UsbDevice, + class::cdc_acm::{self, CdcAcmClass}, +}; +use panic_probe as _; +use static_cell::{ConstStaticCell, StaticCell}; use crate::serial::{Link, PacketBuilder}; -const ADDRESS_BASE: u8 = 0; const ADDRESS_PINS: u8 = 15; -const DATA_BASE: u8 = 15; const DATA_PINS: u8 = 8; -const CE: u8 = 26; -#[allow(unused)] -const OE: u8 = 27; const ROM_SIZE: usize = 1024 * 32; -static GLOBAL_ADDRESS_RX: Mutex>>> = Mutex::new(Cell::new(None)); -static GLOBAL_DATA_TX: Mutex>>> = Mutex::new(Cell::new(None)); static ROM_DATA: [AtomicU8; ROM_SIZE] = [const { AtomicU8::new(0) }; ROM_SIZE]; -static GLOBAL_USB_DEVICE: Mutex>>> = Mutex::new(Cell::new(None)); -static GLOBAL_USB_SERIAL: Mutex>>> = Mutex::new(Cell::new(None)); +#[unsafe(link_section = ".romdata")] +#[used] +static INIT_ROM_DATA: MaybeUninit<[u8; ROM_SIZE]> = MaybeUninit::uninit(); -#[entry] -fn main() -> ! { - let mut pac = Peripherals::take().unwrap(); - let mut core = CorePeripherals::take().unwrap(); +bind_interrupts!(struct Irqs { + PIO0_IRQ_0 => pio::InterruptHandler; + USBCTRL_IRQ => usb::InterruptHandler; +}); - let mut watchdog = Watchdog::new(pac.WATCHDOG); +static EXECUTOR_HIGH: InterruptExecutor = InterruptExecutor::new(); - let clocks = init_clocks_and_plls( - XOSC_CRYSTAL_FREQ, - pac.XOSC, - pac.CLOCKS, - pac.PLL_SYS, - pac.PLL_USB, - &mut pac.RESETS, - &mut watchdog, - ) - .ok() - .unwrap(); +#[embassy_rp::interrupt] +unsafe fn SWI_IRQ_0() { + unsafe { EXECUTOR_HIGH.on_interrupt() } +} - let mut delay = Delay::new(core.SYST, clocks.system_clock.freq().to_Hz()); +#[embassy_executor::main] +async fn main(spawner: Spawner) -> ! { + let config = + embassy_rp::config::Config::new(defmt::unwrap!(ClockConfig::system_freq(133_000_000))); + let p = embassy_rp::init(config); - let sio = Sio::new(pac.SIO); + let led = unsafe { p.PIN_25.clone_unchecked() }; - let pins = Pins::new( - pac.IO_BANK0, - pac.PADS_BANK0, - sio.gpio_bank0, - &mut pac.RESETS, - ); - - let mut led_pin = pins.led.into_push_pull_output(); - - // set address pins as schmitt-trigger inputs - pins.gpio0 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio1 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio2 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio3 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio4 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio5 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio6 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio7 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio8 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio9 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio10 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio11 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio12 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio13 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio14 - .reconfigure::() - .set_schmitt_enabled(true); - // set data pins as inputs as we don't know if the output should be enabled yet - pins.gpio15.reconfigure::(); - pins.gpio16.reconfigure::(); - pins.gpio17.reconfigure::(); - pins.gpio18.reconfigure::(); - pins.gpio19.reconfigure::(); - pins.gpio20.reconfigure::(); - pins.gpio21.reconfigure::(); - pins.gpio22.reconfigure::(); - // set CE and OE as schmitt-triger inputs - pins.gpio26 - .reconfigure::() - .set_schmitt_enabled(true); - pins.gpio27 - .reconfigure::() - .set_schmitt_enabled(true); + // initialize rom data + for (init, byte) in unsafe { INIT_ROM_DATA.assume_init_ref() } + .iter() + .zip(ROM_DATA.iter()) + { + byte.store(*init, Ordering::SeqCst); + } // Pull from fifo and write to all data pins let data = pio_asm!(".wrap_target", "out pins, 8", ".wrap"); @@ -176,175 +103,238 @@ fn main() -> ! { ".wrap" ); - let (mut pio, sm0, sm1, sm2, sm3) = pac.PIO0.split(&mut pac.RESETS); + let Pio { + mut common, + mut sm0, + mut sm1, + mut sm2, + mut sm3, + .. + } = Pio::new(p.PIO0, Irqs); + let output_enable = common.load_program(&output_enable.program); - let data = pio.install(&data.program).unwrap(); - let output_enable = pio.install(&output_enable.program).unwrap(); - let address = pio.install(&report_data.program).unwrap(); - - let (data_sm, _, data_tx) = PIOBuilder::from_installed_program(data) - .out_pins(DATA_BASE, DATA_PINS) - .pull_threshold(DATA_PINS) - .autopull(true) - .build(sm0); - let _data_sm = data_sm.start(); - cortex_m::interrupt::free(|cs| GLOBAL_DATA_TX.borrow(cs).set(Some(data_tx))); - - let (output_enable_low_sm, _, _) = - PIOBuilder::from_installed_program(unsafe { output_enable.share() }) - .side_set_pin_base(DATA_BASE) - .in_pin_base(CE) - .build(sm1); - let _output_enable_low_sm = output_enable_low_sm.start(); - let (output_enable_high_sm, _, _) = PIOBuilder::from_installed_program(output_enable) - .side_set_pin_base(DATA_BASE + 4) - .in_pin_base(CE) - .build(sm2); - let _output_enable_high_sm = output_enable_high_sm.start(); - - let (address_sm, address_rx, _) = PIOBuilder::from_installed_program(address) - .in_pin_base(ADDRESS_BASE) - .push_threshold(ADDRESS_PINS) - .autopush(true) - .build(sm3); - let _address_sm = address_sm.start(); - address_rx.enable_rx_not_empty_interrupt(PioIRQ::Irq0); - cortex_m::interrupt::free(|cs| GLOBAL_ADDRESS_RX.borrow(cs).set(Some(address_rx))); - - let usbctrl_regs = pac.USBCTRL_REGS; - let usbctrl_dpram = pac.USBCTRL_DPRAM; - let resets = &mut pac.RESETS; - let usb_bus = singleton!(: UsbBusAllocator = UsbBusAllocator::new(UsbBus::new( - usbctrl_regs, - usbctrl_dpram, - clocks.usb_clock, - true, - resets, - ))) - .unwrap(); - let serial = SerialPort::new(usb_bus); - cortex_m::interrupt::free(|cs| GLOBAL_USB_SERIAL.borrow(cs).set(Some(serial))); - - let usb_dev = UsbDeviceBuilder::new(usb_bus, UsbVidPid(0x2e8a, 0x000a)) - .strings(&[StringDescriptors::default() - .manufacturer("Max Känner") - .product("PicoROM.rs") - .serial_number("1")]) - .unwrap() - .device_class(2) - .build(); - cortex_m::interrupt::free(|cs| GLOBAL_USB_DEVICE.borrow(cs).set(Some(usb_dev))); - - unsafe { - // Highest priority for pio - core.NVIC.set_priority(pac::interrupt::PIO0_IRQ_0, 0x00); - // lowest priority for usb - core.NVIC.set_priority(pac::interrupt::USBCTRL_IRQ, 0xFF); - pac::NVIC::unmask(pac::interrupt::PIO0_IRQ_0); - pac::NVIC::unmask(pac::interrupt::USBCTRL_IRQ); + let mut address_pins = [ + common.make_pio_pin(p.PIN_0), + common.make_pio_pin(p.PIN_1), + common.make_pio_pin(p.PIN_2), + common.make_pio_pin(p.PIN_3), + common.make_pio_pin(p.PIN_4), + common.make_pio_pin(p.PIN_5), + common.make_pio_pin(p.PIN_6), + common.make_pio_pin(p.PIN_7), + common.make_pio_pin(p.PIN_8), + common.make_pio_pin(p.PIN_9), + common.make_pio_pin(p.PIN_10), + common.make_pio_pin(p.PIN_11), + common.make_pio_pin(p.PIN_12), + common.make_pio_pin(p.PIN_13), + common.make_pio_pin(p.PIN_14), + ]; + for pin in &mut address_pins { + pin.set_schmitt(true); } + let mut data_pins = [ + common.make_pio_pin(p.PIN_15), + common.make_pio_pin(p.PIN_16), + common.make_pio_pin(p.PIN_17), + common.make_pio_pin(p.PIN_18), + common.make_pio_pin(p.PIN_19), + common.make_pio_pin(p.PIN_20), + common.make_pio_pin(p.PIN_21), + common.make_pio_pin(p.PIN_22), + ]; + for pin in &mut data_pins { + pin.set_slew_rate(SlewRate::Fast); + pin.set_drive_strength(Drive::_12mA); + pin.set_schmitt(true); + } + let data_pins = [ + &data_pins[0], + &data_pins[1], + &data_pins[2], + &data_pins[3], + &data_pins[4], + &data_pins[5], + &data_pins[6], + &data_pins[7], + ]; + let mut ce_pin = common.make_pio_pin(p.PIN_26); + ce_pin.set_schmitt(true); + let mut oe_pin = common.make_pio_pin(p.PIN_27); + oe_pin.set_schmitt(true); + let led_pin = common.make_pio_pin(p.PIN_25); + let address_pins = [ + &address_pins[0], + &address_pins[1], + &address_pins[2], + &address_pins[3], + &address_pins[4], + &address_pins[5], + &address_pins[6], + &address_pins[7], + &address_pins[8], + &address_pins[9], + &address_pins[10], + &address_pins[11], + &address_pins[12], + &address_pins[13], + &address_pins[14], + data_pins[0], + data_pins[1], + data_pins[2], + data_pins[3], + data_pins[4], + data_pins[5], + data_pins[6], + data_pins[7], + &common.make_pio_pin(p.PIN_23), + &common.make_pio_pin(p.PIN_24), + &led_pin, + &ce_pin, + &oe_pin, + ]; + + // configure data pio + let mut cfg = pio::Config::default(); + cfg.use_program(&common.load_program(&data.program), &[]); + cfg.set_out_pins(&data_pins[..]); + cfg.shift_out = ShiftConfig { + threshold: DATA_PINS, + direction: ShiftDirection::default(), + auto_fill: true, + }; + sm0.set_config(&cfg); + sm0.set_enable(true); + + // configure output enable pio + let mut cfg = pio::Config::default(); + cfg.use_program(&output_enable, &data_pins[..4]); + cfg.set_in_pins(&[&ce_pin, &oe_pin]); + sm1.set_config(&cfg); + sm1.set_enable(true); + cfg.use_program(&output_enable, &data_pins[4..]); + sm2.set_config(&cfg); + sm2.set_enable(true); + + // configure address pio + let mut cfg = pio::Config::default(); + cfg.use_program(&common.load_program(&report_data.program), &[]); + cfg.set_in_pins(&address_pins[..]); + cfg.shift_in = ShiftConfig { + threshold: ADDRESS_PINS, + direction: ShiftDirection::default(), + auto_fill: true, + }; + sm3.set_pin_dirs(Direction::In, &address_pins[..]); + sm3.set_pin_dirs(Direction::Out, &[&led_pin]); + sm3.set_config(&cfg); + sm3.set_enable(true); + + let driver = Driver::new(p.USB, Irqs); + + let config = { + let mut config = embassy_usb::Config::new(0x2e8a, 0x000a); + config.manufacturer = Some("Max Känner"); + config.product = Some("PicoROM.rs"); + config.serial_number = Some("2"); + config.max_power = 100; + config.max_packet_size_0 = 64; + config + }; + + let mut builder = { + static CONFIG_DESCRIPTOR: ConstStaticCell<[u8; 256]> = ConstStaticCell::new([0; 256]); + static BOS_DESCRIPTOR: ConstStaticCell<[u8; 256]> = ConstStaticCell::new([0; 256]); + static CONTROL_BUF: ConstStaticCell<[u8; 64]> = ConstStaticCell::new([0; 64]); + embassy_usb::Builder::new( + driver, + config, + CONFIG_DESCRIPTOR.take(), + BOS_DESCRIPTOR.take(), + &mut [], + CONTROL_BUF.take(), + ) + }; + + let mut class = { + static STATE: StaticCell = StaticCell::new(); + CdcAcmClass::new(&mut builder, STATE.init(cdc_acm::State::new()), 64) + }; + + let usb = builder.build(); + + interrupt::SWI_IRQ_0.set_priority(Priority::P1); + interrupt::PIO0_IRQ_0.set_priority(Priority::P0); + interrupt::USBCTRL_IRQ.set_priority(Priority::P3); + + let int_spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_0); + int_spawner.must_spawn(pio_task(sm0, sm3)); + + spawner.must_spawn(usb_task(usb)); + + let mut led = Output::new(led, Level::Low); loop { - led_pin.set_high().unwrap(); - delay.delay_ms(500); - led_pin.set_low().unwrap(); - delay.delay_ms(500); - } -} - -#[interrupt] -fn PIO0_IRQ_0() { - static mut ADDRESS: Option> = None; - static mut DATA: Option> = None; - - if ADDRESS.is_none() { - *ADDRESS = cortex_m::interrupt::free(|cs| GLOBAL_ADDRESS_RX.borrow(cs).take()); - } - if DATA.is_none() { - *DATA = cortex_m::interrupt::free(|cs| GLOBAL_DATA_TX.borrow(cs).take()); - } - - if let Some(address) = ADDRESS { - while let Some(rx) = address.read() { - let address = (rx & 0x7fff) as u16; - if let Some(tx) = DATA { - let data = ROM_DATA[usize::from(address)].load(Ordering::Relaxed); - defmt::trace!("replying with {:#04x} @ {:#06x}", data, address); - tx.write(u32::from(data)); + 'outer: { + led.set_low(); + class.wait_connection().await; + while !class.rts() { + yield_now().await; } - } - } -} - -#[interrupt] -fn USBCTRL_IRQ() { - static mut USB_DEVICE: Option> = None; - static mut USB_SERIAL: Option> = None; - static mut DO_PREAMBLE: bool = true; - static mut PACKET_BUILDER: PacketBuilder = PacketBuilder::new(); - static mut LINK: Link = Link::new(); - const PREAMBLE: &[u8] = b"PicoROM Hello"; - - if USB_DEVICE.is_none() { - *USB_DEVICE = cortex_m::interrupt::free(|cs| GLOBAL_USB_DEVICE.borrow(cs).take()); - } - - if USB_SERIAL.is_none() { - *USB_SERIAL = cortex_m::interrupt::free(|cs| GLOBAL_USB_SERIAL.borrow(cs).take()); - } - - let Some(usb_dev) = USB_DEVICE else { return }; - let Some(serial) = USB_SERIAL else { return }; - - if !serial.rts() { - *DO_PREAMBLE = true; - } - if *DO_PREAMBLE && serial.rts() { - match serial.write(PREAMBLE) { - Ok(count) if count == PREAMBLE.len() => { - *DO_PREAMBLE = false; - defmt::info!("Send Preamble") + defmt::info!("USB Connected"); + led.set_high(); + if let Err(e) = class.write_packet(b"PicoROM Hello").await { + defmt::error!("Error sending preamble: {}", e); + break 'outer; } - Ok(count) => { - defmt::warn!( - "Unable to write the whole preamble. Only wrote {} Bytes", - count - ); - } - Err(UsbError::WouldBlock) => (), - Err(e) => { - defmt::error!("Unable to write preamble: {}", e) - } - } - } - - if usb_dev.poll(&mut [serial]) { - let mut buf = [0u8; 64]; - match serial.read(&mut buf) { - Ok(0) => {} - Ok(count) => { - for byte in buf.into_iter().take(count) { - if let Some(packet) = PACKET_BUILDER.push(byte) { + let mut buf = [0; 64]; + let mut packet_builder = PacketBuilder::new(); + let mut link = Link::new(); + while class.rts() { + let n = match poll_once(class.read_packet(&mut buf)) { + Poll::Ready(Ok(n)) => n, + Poll::Ready(Err(e)) => { + defmt::error!("Error reading packet data: {}", e); + break 'outer; + } + Poll::Pending => { + yield_now().await; + continue; + } + }; + for byte in buf.into_iter().take(n) { + if let Some(packet) = packet_builder.push(byte) { defmt::debug!("Got packet: {}", packet); - if let Some(response) = LINK.handle_packet(&packet) { + if let Some(response) = link.handle_packet(&packet) { defmt::info!("Sending Response: {}", response); - if let Err(e) = response.send(serial) - && e != UsbError::WouldBlock - { + if let Err(e) = response.send(&mut class).await { defmt::error!("Unable to send response: {}", e); + break 'outer; } } } } } - Err(UsbError::WouldBlock) => (), - Err(e) => { - defmt::error!("USB Error: {}", e); - } } - } - - if usb_dev.state() == UsbDeviceState::Default { - *DO_PREAMBLE = true; + defmt::info!("USB Disconnected"); + } +} + +#[task] +async fn usb_task(mut usb: UsbDevice<'static, Driver<'static, USB>>) -> ! { + usb.run().await +} + +#[task] +async fn pio_task( + mut data_sm: StateMachine<'static, PIO0, 0>, + mut address_sm: StateMachine<'static, PIO0, 3>, +) -> ! { + loop { + let address = address_sm.rx().wait_pull().await; + let address = (address & 0x7fff) as u16; + let data = ROM_DATA[usize::from(address)].load(Ordering::SeqCst); + defmt::trace!("replying with {:#04x} @ {:#06x}", data, address); + data_sm.tx().try_push(u32::from(data)); } } diff --git a/src/serial.rs b/src/serial.rs index 13ea13d..e46307b 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -1,10 +1,10 @@ -use core::{borrow::BorrowMut, sync::atomic::Ordering}; +use core::sync::atomic::Ordering; use defmt::Format; +use embassy_rp::usb::{self, Driver}; +use embassy_usb::{class::cdc_acm::CdcAcmClass, driver::EndpointError}; use heapless::{String, Vec}; use num_enum::{IntoPrimitive, TryFromPrimitive}; -use usb_device::{UsbError, bus::UsbBus}; -use usbd_serial::SerialPort; use crate::ROM_DATA; @@ -60,16 +60,15 @@ impl Format for Packet { } impl Packet { - pub fn send( + pub async fn send( &self, - serial: &mut SerialPort, impl BorrowMut<[u8]>>, - ) -> Result<(), UsbError> { - serial.write(&[ - self.kind.into(), - u8::try_from(self.payload.len()).unwrap_or(MAX_PAYLOAD), - ])?; - serial.write(&self.payload)?; - Ok(()) + serial: &mut CdcAcmClass<'static, Driver<'static, impl usb::Instance>>, + ) -> Result<(), EndpointError> { + let mut packet = Vec::<_, 32>::new(); + let _ = packet.push(self.kind.into()); + let _ = packet.push(u8::try_from(self.payload.len()).unwrap_or(MAX_PAYLOAD)); + let _ = packet.extend_from_slice(self.payload.as_slice()); + serial.write_packet(&packet).await } pub fn error(reason: &[u8; N]) -> Self { @@ -160,6 +159,7 @@ impl Link { } } + #[unsafe(link_section = ".data")] pub fn handle_packet(&mut self, packet: &Packet) -> Option { if self.name.is_empty() { let _ = self.name.push_str("rom"); @@ -184,7 +184,7 @@ impl Link { // return Some(Packet::error(b"Write out of range")); continue; }; - target.store(*byte, Ordering::Relaxed); + target.store(*byte, Ordering::SeqCst); self.pointer += 1; } None @@ -274,6 +274,7 @@ impl Link { } } } + Kind::CommitFlash => None, _ => Some(Packet::error(b"Unrecognized packet")), } }