forked from NaxdyOrg/NaxGCC-FW
add button mapping, implement SPI, use patched embassy
This commit is contained in:
parent
76355b72ce
commit
cbaa4f4ca9
8 changed files with 289 additions and 178 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
/target
|
/target
|
||||||
/result
|
/result
|
||||||
/.direnv
|
/.direnv
|
||||||
|
/lib
|
123
Cargo.lock
generated
123
Cargo.lock
generated
|
@ -53,7 +53,7 @@ version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3"
|
checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustc_version 0.2.3",
|
"rustc_version",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -310,12 +310,10 @@ checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-embedded-hal"
|
name = "embassy-embedded-hal"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "eca4a9380d03e61063067b8239f67d2fa9f108ede7c46b4273804f6b79e59a1d"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"defmt",
|
"defmt",
|
||||||
"embassy-futures",
|
"embassy-futures",
|
||||||
"embassy-sync 0.5.0",
|
"embassy-sync",
|
||||||
"embassy-time",
|
"embassy-time",
|
||||||
"embedded-hal 0.2.7",
|
"embedded-hal 0.2.7",
|
||||||
"embedded-hal 1.0.0",
|
"embedded-hal 1.0.0",
|
||||||
|
@ -328,8 +326,6 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-executor"
|
name = "embassy-executor"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ec648daedd2143466eff4b3e8002024f9f6c1de4ab7666bb679688752624c925"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
"critical-section",
|
"critical-section",
|
||||||
|
@ -342,9 +338,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-executor-macros"
|
name = "embassy-executor-macros"
|
||||||
version = "0.4.1"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ad454accf80050e9cf7a51e994132ba0e56286b31f9317b68703897c328c59b5"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"darling",
|
"darling",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
@ -355,14 +349,13 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-futures"
|
name = "embassy-futures"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
dependencies = [
|
||||||
checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067"
|
"defmt",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-hal-internal"
|
name = "embassy-hal-internal"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a0ec47cf8bab914018d4bd2b4f0aaeb46e4f52ab1e7985df88aeef2c6eda5aed"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
"critical-section",
|
"critical-section",
|
||||||
|
@ -373,25 +366,19 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-net-driver"
|
name = "embassy-net-driver"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-net-driver-channel"
|
name = "embassy-net-driver-channel"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "584ab4da7e5612efaa7d55ee76161d9549adf788eab48d49362eddbf322f9933"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"embassy-futures",
|
"embassy-futures",
|
||||||
"embassy-net-driver",
|
"embassy-net-driver",
|
||||||
"embassy-sync 0.3.0",
|
"embassy-sync",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-rp"
|
name = "embassy-rp"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "438f170cbd97d4a870e8d57e1738ee815255028ad31dd409d891e2bf797dc531"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atomic-polyfill",
|
"atomic-polyfill",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
@ -403,7 +390,7 @@ dependencies = [
|
||||||
"embassy-embedded-hal",
|
"embassy-embedded-hal",
|
||||||
"embassy-futures",
|
"embassy-futures",
|
||||||
"embassy-hal-internal",
|
"embassy-hal-internal",
|
||||||
"embassy-sync 0.5.0",
|
"embassy-sync",
|
||||||
"embassy-time",
|
"embassy-time",
|
||||||
"embassy-time-driver",
|
"embassy-time-driver",
|
||||||
"embassy-usb-driver",
|
"embassy-usb-driver",
|
||||||
|
@ -425,37 +412,21 @@ dependencies = [
|
||||||
"rp2040-boot2",
|
"rp2040-boot2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "embassy-sync"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f0525b466ca3ace30b57f2db868a35215dfaecd038d8668cb2db03feb7c069a0"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"critical-section",
|
|
||||||
"futures-util",
|
|
||||||
"heapless 0.7.17",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-sync"
|
name = "embassy-sync"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"critical-section",
|
"critical-section",
|
||||||
"defmt",
|
"defmt",
|
||||||
"embedded-io-async",
|
"embedded-io-async",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"heapless 0.8.0",
|
"heapless",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-time"
|
name = "embassy-time"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a9c844070d9f80dc66ee739299183312baee2e1cdeb6e90b4ea2af44f4676da5"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"critical-section",
|
"critical-section",
|
||||||
|
@ -467,14 +438,12 @@ dependencies = [
|
||||||
"embedded-hal 1.0.0",
|
"embedded-hal 1.0.0",
|
||||||
"embedded-hal-async",
|
"embedded-hal-async",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"heapless 0.8.0",
|
"heapless",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-time-driver"
|
name = "embassy-time-driver"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6e0c214077aaa9206958b16411c157961fb7990d4ea628120a78d1a5a28aed24"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"document-features",
|
"document-features",
|
||||||
]
|
]
|
||||||
|
@ -482,21 +451,17 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-time-queue-driver"
|
name = "embassy-time-queue-driver"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-usb"
|
name = "embassy-usb"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1587e58ed8f7e0215246e6bb8d7ef4837db682e209e5ef7410a81c500dc949e5"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"defmt",
|
"defmt",
|
||||||
"embassy-futures",
|
"embassy-futures",
|
||||||
"embassy-net-driver-channel",
|
"embassy-net-driver-channel",
|
||||||
"embassy-sync 0.5.0",
|
"embassy-sync",
|
||||||
"embassy-usb-driver",
|
"embassy-usb-driver",
|
||||||
"heapless 0.8.0",
|
"heapless",
|
||||||
"ssmarshal",
|
"ssmarshal",
|
||||||
"usbd-hid",
|
"usbd-hid",
|
||||||
]
|
]
|
||||||
|
@ -504,8 +469,6 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embassy-usb-driver"
|
name = "embassy-usb-driver"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"defmt",
|
"defmt",
|
||||||
]
|
]
|
||||||
|
@ -761,15 +724,6 @@ dependencies = [
|
||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hash32"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
|
|
||||||
dependencies = [
|
|
||||||
"byteorder",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hash32"
|
name = "hash32"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
|
@ -785,26 +739,13 @@ version = "0.14.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "heapless"
|
|
||||||
version = "0.7.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
|
|
||||||
dependencies = [
|
|
||||||
"atomic-polyfill",
|
|
||||||
"hash32 0.2.1",
|
|
||||||
"rustc_version 0.4.0",
|
|
||||||
"spin",
|
|
||||||
"stable_deref_trait",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "heapless"
|
name = "heapless"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
|
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hash32 0.3.1",
|
"hash32",
|
||||||
"stable_deref_trait",
|
"stable_deref_trait",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -938,7 +879,7 @@ dependencies = [
|
||||||
"embassy-executor",
|
"embassy-executor",
|
||||||
"embassy-futures",
|
"embassy-futures",
|
||||||
"embassy-rp",
|
"embassy-rp",
|
||||||
"embassy-sync 0.5.0",
|
"embassy-sync",
|
||||||
"embassy-time",
|
"embassy-time",
|
||||||
"embassy-usb",
|
"embassy-usb",
|
||||||
"fixed",
|
"fixed",
|
||||||
|
@ -947,6 +888,7 @@ dependencies = [
|
||||||
"packed_struct",
|
"packed_struct",
|
||||||
"panic-probe",
|
"panic-probe",
|
||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
|
"rand",
|
||||||
"static_cell",
|
"static_cell",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1200,6 +1142,15 @@ version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.4"
|
version = "0.6.4"
|
||||||
|
@ -1286,16 +1237,7 @@ version = "0.2.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"semver 0.9.0",
|
"semver",
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc_version"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
|
||||||
dependencies = [
|
|
||||||
"semver 1.0.22",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1319,12 +1261,6 @@ dependencies = [
|
||||||
"semver-parser",
|
"semver-parser",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "semver"
|
|
||||||
version = "1.0.22"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "semver-parser"
|
name = "semver-parser"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
|
@ -1363,15 +1299,6 @@ version = "1.13.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
|
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "spin"
|
|
||||||
version = "0.9.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
|
||||||
dependencies = [
|
|
||||||
"lock_api",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ssmarshal"
|
name = "ssmarshal"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
|
32
Cargo.toml
32
Cargo.toml
|
@ -9,9 +9,13 @@ edition = "2021"
|
||||||
embassy-time = { version = "0.3.0", features = [
|
embassy-time = { version = "0.3.0", features = [
|
||||||
"defmt",
|
"defmt",
|
||||||
"defmt-timestamp-uptime",
|
"defmt-timestamp-uptime",
|
||||||
] }
|
], path = "lib/embassy-rs/embassy-time" }
|
||||||
embassy-embedded-hal = { version = "0.1.0", features = ["defmt"] }
|
embassy-embedded-hal = { version = "0.1.0", features = [
|
||||||
embassy-sync = { version = "0.5.0", features = ["defmt"] }
|
"defmt",
|
||||||
|
], path = "lib/embassy-rs/embassy-embedded-hal" }
|
||||||
|
embassy-sync = { version = "0.5.0", features = [
|
||||||
|
"defmt",
|
||||||
|
], path = "lib/embassy-rs/embassy-sync" }
|
||||||
embassy-executor = { version = "0.5.0", features = [
|
embassy-executor = { version = "0.5.0", features = [
|
||||||
"task-arena-size-32768",
|
"task-arena-size-32768",
|
||||||
"arch-cortex-m",
|
"arch-cortex-m",
|
||||||
|
@ -19,15 +23,19 @@ embassy-executor = { version = "0.5.0", features = [
|
||||||
"executor-interrupt",
|
"executor-interrupt",
|
||||||
"defmt",
|
"defmt",
|
||||||
"integrated-timers",
|
"integrated-timers",
|
||||||
] }
|
], path = "lib/embassy-rs/embassy-executor" }
|
||||||
embassy-rp = { version = "0.1.0", features = [
|
embassy-rp = { version = "0.1.0", features = [
|
||||||
"defmt",
|
"defmt",
|
||||||
"unstable-pac",
|
"unstable-pac",
|
||||||
"time-driver",
|
"time-driver",
|
||||||
"critical-section-impl",
|
"critical-section-impl",
|
||||||
] }
|
], path = "lib/embassy-rs/embassy-rp" }
|
||||||
embassy-usb = { version = "0.1.0", features = ["defmt"] }
|
embassy-usb = { version = "0.1.0", features = [
|
||||||
embassy-futures = { version = "0.1.0" }
|
"defmt",
|
||||||
|
], path = "lib/embassy-rs/embassy-usb" }
|
||||||
|
embassy-futures = { version = "0.1.0", features = [
|
||||||
|
"defmt",
|
||||||
|
], path = "lib/embassy-rs/embassy-futures" }
|
||||||
defmt = "0.3"
|
defmt = "0.3"
|
||||||
defmt-rtt = "0.4"
|
defmt-rtt = "0.4"
|
||||||
fixed = "1.23.1"
|
fixed = "1.23.1"
|
||||||
|
@ -41,6 +49,7 @@ cortex-m-rt = "0.7.0"
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
packed_struct = { version = "0.10.1", default_features = false }
|
packed_struct = { version = "0.10.1", default_features = false }
|
||||||
format_no_std = "1.0.2"
|
format_no_std = "1.0.2"
|
||||||
|
rand = { version = "0.8.5", default-features = false }
|
||||||
|
|
||||||
# cargo build/run
|
# cargo build/run
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
|
@ -93,3 +102,12 @@ debug-assertions = false
|
||||||
incremental = false
|
incremental = false
|
||||||
lto = 'fat'
|
lto = 'fat'
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
|
# [patch.crates-io]
|
||||||
|
# embassy-rp = { path = "lib/embassy-rs/embassy-rp" }
|
||||||
|
# embassy-time = { path = "lib/embassy-rs/embassy-time" }
|
||||||
|
# embassy-embedded-hal = { path = "lib/embassy-rs/embassy-embedded-hal" }
|
||||||
|
# embassy-usb = { path = "lib/embassy-rs/embassy-usb" }
|
||||||
|
# embassy-sync = { path = "lib/embassy-rs/embassy-sync" }
|
||||||
|
# embassy-executor = { path = "lib/embassy-rs/embassy-executor" }
|
||||||
|
# embassy-futures = { path = "lib/embassy-rs/embassy-futures" }
|
||||||
|
|
36
flake.lock
36
flake.lock
|
@ -1,15 +1,32 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"embassy-rs-patched": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710754402,
|
||||||
|
"narHash": "sha256-HyTw5VQXlSqz9UOq0Dc6G/NWNzQOPXf3PNWffMkfLC4=",
|
||||||
|
"owner": "Naxdy",
|
||||||
|
"repo": "embassy",
|
||||||
|
"rev": "2ee4657727b9679998d941de00b43e1754f570bf",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Naxdy",
|
||||||
|
"ref": "naxgcc-fw",
|
||||||
|
"repo": "embassy",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-utils": {
|
"flake-utils": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1709126324,
|
"lastModified": 1710146030,
|
||||||
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -58,11 +75,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1709309926,
|
"lastModified": 1710283656,
|
||||||
"narHash": "sha256-VZFBtXGVD9LWTecGi6eXrE0hJ/mVB3zGUlHImUs2Qak=",
|
"narHash": "sha256-nI+AOy4uK6jLGBi9nsbHjL1EdSIzoo8oa+9oeVhbyFc=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "79baff8812a0d68e24a836df0a364c678089e2c7",
|
"rev": "51063ed4f2343a59fdeebb279bb81d87d453942b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -90,6 +107,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"embassy-rs-patched": "embassy-rs-patched",
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"naersk": "naersk",
|
"naersk": "naersk",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
|
@ -102,11 +120,11 @@
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1709431943,
|
"lastModified": 1710382258,
|
||||||
"narHash": "sha256-CqTcEJGITB3rfSuAcWC1QZnbVnIipXmIDbZHfxsAy80=",
|
"narHash": "sha256-2FW1q+o34VBweYQiEkRaSEkNMq3ecrn83VzETeGiVbY=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "362184acf4a991f27fc222864e94a2e81b3c3c9f",
|
"rev": "8ce81e71ab04a7e906fae62da086d6ee5d6cfc21",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
29
flake.nix
29
flake.nix
|
@ -8,6 +8,11 @@
|
||||||
|
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
|
||||||
|
embassy-rs-patched = {
|
||||||
|
url = "github:Naxdy/embassy?ref=naxgcc-fw";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
naersk = {
|
naersk = {
|
||||||
url = "github:nmattia/naersk";
|
url = "github:nmattia/naersk";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
@ -20,6 +25,7 @@
|
||||||
, rust-overlay
|
, rust-overlay
|
||||||
, flake-utils
|
, flake-utils
|
||||||
, naersk
|
, naersk
|
||||||
|
, embassy-rs-patched
|
||||||
}: (flake-utils.lib.eachDefaultSystem (system:
|
}: (flake-utils.lib.eachDefaultSystem (system:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
|
@ -30,7 +36,7 @@
|
||||||
config.allowUnsupportedSystem = true;
|
config.allowUnsupportedSystem = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
rustToolchain = pkgs.rust-bin.nightly.latest.default.override {
|
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
|
||||||
extensions = [
|
extensions = [
|
||||||
"rust-src"
|
"rust-src"
|
||||||
];
|
];
|
||||||
|
@ -46,14 +52,11 @@
|
||||||
|
|
||||||
CARGO_BUILD_TARGET = "thumbv6m-none-eabi";
|
CARGO_BUILD_TARGET = "thumbv6m-none-eabi";
|
||||||
|
|
||||||
# RUSTFLAGS = [
|
prepCmd = ''
|
||||||
# "-Clinker=flip-link"
|
mkdir -p lib
|
||||||
# "-Clink-arg=--nmagic"
|
rm lib/embassy-rs || true
|
||||||
# "-Clink-arg=-Tlink.x"
|
ln -s "${embassy-rs-patched}" lib/embassy-rs
|
||||||
# "-Clink-arg=-Tdefmt.x"
|
'';
|
||||||
# "-Cinline-threshold=5"
|
|
||||||
# "-Cno-vectorize-loops"
|
|
||||||
# ];
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages.default = self.packages.${system}.naxgcc-fw-uf2;
|
packages.default = self.packages.${system}.naxgcc-fw-uf2;
|
||||||
|
@ -67,9 +70,7 @@
|
||||||
pname = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.name;
|
pname = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.name;
|
||||||
version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
|
version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
|
||||||
|
|
||||||
nativeBuildInputs = [
|
prePatch = prepCmd;
|
||||||
pkgs.flip-link
|
|
||||||
];
|
|
||||||
|
|
||||||
src = self;
|
src = self;
|
||||||
|
|
||||||
|
@ -83,13 +84,15 @@
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
nativeBuildInputs = builtins.attrValues {
|
nativeBuildInputs = builtins.attrValues {
|
||||||
inherit rustToolchain;
|
inherit rustToolchain;
|
||||||
inherit (pkgs) gcc-arm-embedded flip-link elf2uf2-rs picotool probe-rs cargo-expand;
|
inherit (pkgs) gcc-arm-embedded elf2uf2-rs picotool probe-rs cargo-expand;
|
||||||
};
|
};
|
||||||
|
|
||||||
CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER = "probe-rs run --chip RP2040 --protocol swd";
|
CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER = "probe-rs run --chip RP2040 --protocol swd";
|
||||||
DEFMT_LOG = "debug";
|
DEFMT_LOG = "debug";
|
||||||
|
|
||||||
inherit CARGO_BUILD_TARGET;
|
inherit CARGO_BUILD_TARGET;
|
||||||
|
|
||||||
|
shellHook = prepCmd;
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use embassy_futures::{
|
||||||
use embassy_rp::{peripherals::USB, usb::Driver};
|
use embassy_rp::{peripherals::USB, usb::Driver};
|
||||||
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||||
use embassy_sync::signal::Signal;
|
use embassy_sync::signal::Signal;
|
||||||
use embassy_time::Duration;
|
use embassy_time::{Duration, Instant};
|
||||||
use embassy_usb::{
|
use embassy_usb::{
|
||||||
class::hid::{HidReaderWriter, ReportId, RequestHandler, State},
|
class::hid::{HidReaderWriter, ReportId, RequestHandler, State},
|
||||||
control::OutResponse,
|
control::OutResponse,
|
||||||
|
@ -17,7 +17,7 @@ use embassy_usb::{
|
||||||
use packed_struct::{derive::PackedStruct, PackedStruct};
|
use packed_struct::{derive::PackedStruct, PackedStruct};
|
||||||
use portable_atomic::Ordering;
|
use portable_atomic::Ordering;
|
||||||
|
|
||||||
use crate::input::GCC_STATE;
|
use crate::input::GCC_SIGNAL;
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
pub const GCC_REPORT_DESCRIPTOR: &[u8] = &[
|
pub const GCC_REPORT_DESCRIPTOR: &[u8] = &[
|
||||||
|
@ -235,19 +235,43 @@ impl Handler for MyDeviceHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[embassy_executor::task]
|
#[embassy_executor::task]
|
||||||
pub async fn usb_transfer_loop(driver: Driver<'static, USB>) {
|
pub async fn usb_transfer_loop(driver: Driver<'static, USB>, raw_serial: [u8; 8]) {
|
||||||
debug!("Start of config");
|
let mut serial_buffer = [0u8; 64];
|
||||||
|
|
||||||
|
let serial = {
|
||||||
|
let s = format_no_std::show(
|
||||||
|
&mut serial_buffer,
|
||||||
|
format_args!(
|
||||||
|
"{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}",
|
||||||
|
raw_serial[0],
|
||||||
|
raw_serial[1],
|
||||||
|
raw_serial[2],
|
||||||
|
raw_serial[3],
|
||||||
|
raw_serial[4],
|
||||||
|
raw_serial[5],
|
||||||
|
raw_serial[6],
|
||||||
|
raw_serial[7]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
info!("Detected flash with unique serial number {}", s);
|
||||||
|
|
||||||
|
s
|
||||||
|
};
|
||||||
|
|
||||||
|
trace!("Start of config");
|
||||||
let mut usb_config = embassy_usb::Config::new(0x057e, 0x0337);
|
let mut usb_config = embassy_usb::Config::new(0x057e, 0x0337);
|
||||||
usb_config.manufacturer = Some("Naxdy");
|
usb_config.manufacturer = Some("Naxdy");
|
||||||
usb_config.product = Some("NaxGCC");
|
usb_config.product = Some("NaxGCC");
|
||||||
usb_config.serial_number = Some("Fleeb");
|
usb_config.serial_number = Some(serial);
|
||||||
usb_config.max_power = 100;
|
usb_config.max_power = 100;
|
||||||
usb_config.max_packet_size_0 = 64;
|
usb_config.max_packet_size_0 = 64;
|
||||||
usb_config.device_class = 0;
|
usb_config.device_class = 0;
|
||||||
usb_config.device_protocol = 0;
|
usb_config.device_protocol = 0;
|
||||||
usb_config.self_powered = false;
|
usb_config.self_powered = true;
|
||||||
usb_config.device_sub_class = 0;
|
usb_config.device_sub_class = 0;
|
||||||
usb_config.supports_remote_wakeup = false;
|
usb_config.supports_remote_wakeup = true;
|
||||||
|
|
||||||
let mut device_descriptor = [0; 256];
|
let mut device_descriptor = [0; 256];
|
||||||
let mut config_descriptor = [0; 256];
|
let mut config_descriptor = [0; 256];
|
||||||
|
@ -275,8 +299,9 @@ pub async fn usb_transfer_loop(driver: Driver<'static, USB>) {
|
||||||
let hid_config = embassy_usb::class::hid::Config {
|
let hid_config = embassy_usb::class::hid::Config {
|
||||||
report_descriptor: GCC_REPORT_DESCRIPTOR,
|
report_descriptor: GCC_REPORT_DESCRIPTOR,
|
||||||
request_handler: Some(&request_handler),
|
request_handler: Some(&request_handler),
|
||||||
poll_ms: 1,
|
poll_ms: 8,
|
||||||
max_packet_size: 64,
|
max_packet_size_in: 37,
|
||||||
|
max_packet_size_out: 5,
|
||||||
};
|
};
|
||||||
let hid = HidReaderWriter::<_, 5, 37>::new(&mut builder, &mut state, hid_config);
|
let hid = HidReaderWriter::<_, 5, 37>::new(&mut builder, &mut state, hid_config);
|
||||||
|
|
||||||
|
@ -294,15 +319,19 @@ pub async fn usb_transfer_loop(driver: Driver<'static, USB>) {
|
||||||
let (mut reader, mut writer) = hid.split();
|
let (mut reader, mut writer) = hid.split();
|
||||||
debug!("In here");
|
debug!("In here");
|
||||||
|
|
||||||
let mut timer = embassy_time::Ticker::every(Duration::from_millis(1));
|
let mut lasttime = Instant::now();
|
||||||
|
|
||||||
let in_fut = async {
|
let in_fut = async {
|
||||||
loop {
|
loop {
|
||||||
let state = unsafe { GCC_STATE.clone() };
|
let state = GCC_SIGNAL.wait().await;
|
||||||
let report = get_gcinput_hid_report(&state);
|
let report = get_gcinput_hid_report(&state);
|
||||||
match writer.write(&report).await {
|
match writer.write(&report).await {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
trace!("Report Written: {:08b}", report);
|
trace!("Report Written: {:08b}", report);
|
||||||
|
let currtime = Instant::now();
|
||||||
|
let polltime = currtime.duration_since(lasttime);
|
||||||
|
trace!("Report written in {}us", polltime.as_micros());
|
||||||
|
lasttime = currtime;
|
||||||
}
|
}
|
||||||
Err(e) => warn!("Failed to send report: {:?}", e),
|
Err(e) => warn!("Failed to send report: {:?}", e),
|
||||||
}
|
}
|
||||||
|
@ -311,10 +340,10 @@ pub async fn usb_transfer_loop(driver: Driver<'static, USB>) {
|
||||||
|
|
||||||
let out_fut = async {
|
let out_fut = async {
|
||||||
loop {
|
loop {
|
||||||
debug!("Readery loop");
|
trace!("Readery loop");
|
||||||
let mut buf = [0u8; 5];
|
let mut buf = [0u8; 5];
|
||||||
match reader.read(&mut buf).await {
|
match reader.read(&mut buf).await {
|
||||||
Ok(e) => {
|
Ok(_e) => {
|
||||||
debug!("READ SOMETHIN: {:08b}", buf)
|
debug!("READ SOMETHIN: {:08b}", buf)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|
124
src/input.rs
124
src/input.rs
|
@ -1,39 +1,101 @@
|
||||||
use defmt::{debug, info};
|
use defmt::{debug, info};
|
||||||
use embassy_rp::{gpio::Input, peripherals::PIN_15, Peripherals};
|
use embassy_rp::{
|
||||||
|
clocks::RoscRng,
|
||||||
use crate::gcc_hid::{Buttons1, Buttons2, GcReport};
|
flash::{Async, Flash, ERASE_SIZE},
|
||||||
|
gpio::{Input, Output, Pin},
|
||||||
pub static mut GCC_STATE: GcReport = GcReport {
|
peripherals::{
|
||||||
buttons_1: Buttons1 {
|
DMA_CH0, FLASH, PIN_10, PIN_11, PIN_15, PIN_16, PIN_17, PIN_18, PIN_19, PIN_20, PIN_21,
|
||||||
button_a: false,
|
PIN_22, PIN_23, PIN_24, PIN_25, PIN_29, PIN_5, PIN_8, PIN_9, SPI0,
|
||||||
button_b: false,
|
|
||||||
button_x: false,
|
|
||||||
button_y: false,
|
|
||||||
dpad_left: false,
|
|
||||||
dpad_right: false,
|
|
||||||
dpad_down: false,
|
|
||||||
dpad_up: false,
|
|
||||||
},
|
},
|
||||||
buttons_2: Buttons2 {
|
spi::Spi,
|
||||||
button_start: false,
|
|
||||||
button_z: false,
|
|
||||||
button_r: false,
|
|
||||||
button_l: false,
|
|
||||||
blank1: 0,
|
|
||||||
},
|
|
||||||
stick_x: 0,
|
|
||||||
stick_y: 0,
|
|
||||||
cstick_x: 0,
|
|
||||||
cstick_y: 0,
|
|
||||||
trigger_l: 0,
|
|
||||||
trigger_r: 0,
|
|
||||||
};
|
};
|
||||||
|
use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal};
|
||||||
|
use rand::RngCore;
|
||||||
|
|
||||||
|
use crate::{gcc_hid::GcReport, ADDR_OFFSET, FLASH_SIZE};
|
||||||
|
|
||||||
|
pub static GCC_SIGNAL: Signal<CriticalSectionRawMutex, GcReport> = Signal::new();
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq)]
|
||||||
|
enum Stick {
|
||||||
|
ControlStick,
|
||||||
|
CStick,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq)]
|
||||||
|
enum StickAxis {
|
||||||
|
XAxis,
|
||||||
|
YAxis,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_ext_adc<'a, Acs: Pin, Ccs: Pin>(
|
||||||
|
which_stick: Stick,
|
||||||
|
which_axis: StickAxis,
|
||||||
|
spi: &mut Spi<'a, SPI0, embassy_rp::spi::Blocking>,
|
||||||
|
spi_acs: &mut Output<'a, Acs>,
|
||||||
|
spi_ccs: &mut Output<'a, Ccs>,
|
||||||
|
) -> u16 {
|
||||||
|
let mut buf = [0b11010000; 3];
|
||||||
|
|
||||||
|
if which_axis == StickAxis::YAxis {
|
||||||
|
buf = [0b11110000; 3];
|
||||||
|
}
|
||||||
|
|
||||||
|
if which_stick == Stick::CStick {
|
||||||
|
spi_acs.set_low();
|
||||||
|
} else {
|
||||||
|
spi_ccs.set_low();
|
||||||
|
}
|
||||||
|
|
||||||
|
spi.blocking_transfer_in_place(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let temp_value =
|
||||||
|
(((buf[0] & 0b00000111) as u16) << 9) | (buf[1] as u16) << 1 | (buf[2] as u16) >> 7;
|
||||||
|
|
||||||
|
if which_stick == Stick::ControlStick {
|
||||||
|
spi_acs.set_high();
|
||||||
|
} else {
|
||||||
|
spi_ccs.set_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp_value;
|
||||||
|
}
|
||||||
|
|
||||||
#[embassy_executor::task]
|
#[embassy_executor::task]
|
||||||
pub async fn input_loop(btn_z: Input<'static, PIN_15>) -> ! {
|
pub async fn input_loop(
|
||||||
|
mut flash: Flash<'static, FLASH, Async, FLASH_SIZE>,
|
||||||
|
btn_z: Input<'static, PIN_20>,
|
||||||
|
btn_a: Input<'static, PIN_17>,
|
||||||
|
btn_b: Input<'static, PIN_16>,
|
||||||
|
btn_dright: Input<'static, PIN_11>,
|
||||||
|
btn_dup: Input<'static, PIN_9>,
|
||||||
|
btn_ddown: Input<'static, PIN_10>,
|
||||||
|
btn_dleft: Input<'static, PIN_8>,
|
||||||
|
btn_l: Input<'static, PIN_22>,
|
||||||
|
btn_r: Input<'static, PIN_21>,
|
||||||
|
btn_x: Input<'static, PIN_18>,
|
||||||
|
btn_y: Input<'static, PIN_19>,
|
||||||
|
btn_start: Input<'static, PIN_5>,
|
||||||
|
btn_rumble: Input<'static, PIN_25>,
|
||||||
|
btn_brake: Input<'static, PIN_29>,
|
||||||
|
mut spi: Spi<'static, SPI0, embassy_rp::spi::Blocking>,
|
||||||
|
mut spi_acs: Output<'static, PIN_24>,
|
||||||
|
mut spi_ccs: Output<'static, PIN_23>,
|
||||||
|
) -> ! {
|
||||||
|
let mut gcc_state = GcReport::default();
|
||||||
|
|
||||||
|
let mut rng = RoscRng;
|
||||||
|
|
||||||
|
let mut uid = [0u8; 1];
|
||||||
|
flash.blocking_read(ADDR_OFFSET, &mut uid).unwrap();
|
||||||
|
|
||||||
|
debug!("Read from flash: {:02X}", uid);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
unsafe {
|
gcc_state.buttons_1.button_a = btn_z.is_low();
|
||||||
GCC_STATE.buttons_2.button_z = btn_z.is_low();
|
gcc_state.stick_x = rng.next_u32() as u8;
|
||||||
}
|
gcc_state.stick_y = rng.next_u32() as u8;
|
||||||
|
|
||||||
|
GCC_SIGNAL.signal(gcc_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
65
src/main.rs
65
src/main.rs
|
@ -7,16 +7,17 @@
|
||||||
mod gcc_hid;
|
mod gcc_hid;
|
||||||
mod input;
|
mod input;
|
||||||
|
|
||||||
use defmt::info;
|
use defmt::{debug, info};
|
||||||
use embassy_executor::{Executor, Spawner};
|
use embassy_executor::Executor;
|
||||||
use embassy_rp::{
|
use embassy_rp::{
|
||||||
bind_interrupts,
|
bind_interrupts,
|
||||||
|
flash::{Async, Flash, ERASE_SIZE},
|
||||||
gpio::{self, Input},
|
gpio::{self, Input},
|
||||||
multicore::{spawn_core1, Stack},
|
multicore::{spawn_core1, Stack},
|
||||||
peripherals::USB,
|
peripherals::USB,
|
||||||
|
spi::{self, Spi},
|
||||||
usb::{Driver, InterruptHandler},
|
usb::{Driver, InterruptHandler},
|
||||||
};
|
};
|
||||||
use embassy_time::Timer;
|
|
||||||
use gcc_hid::usb_transfer_loop;
|
use gcc_hid::usb_transfer_loop;
|
||||||
use gpio::{Level, Output};
|
use gpio::{Level, Output};
|
||||||
use input::input_loop;
|
use input::input_loop;
|
||||||
|
@ -27,27 +28,79 @@ static mut CORE1_STACK: Stack<4096> = Stack::new();
|
||||||
static EXECUTOR0: StaticCell<Executor> = StaticCell::new();
|
static EXECUTOR0: StaticCell<Executor> = StaticCell::new();
|
||||||
static EXECUTOR1: StaticCell<Executor> = StaticCell::new();
|
static EXECUTOR1: StaticCell<Executor> = StaticCell::new();
|
||||||
|
|
||||||
|
const FLASH_SIZE: usize = 2 * 1024 * 1024;
|
||||||
|
const ADDR_OFFSET: u32 = 0x100000;
|
||||||
|
|
||||||
bind_interrupts!(struct Irqs {
|
bind_interrupts!(struct Irqs {
|
||||||
USBCTRL_IRQ => InterruptHandler<USB>;
|
USBCTRL_IRQ => InterruptHandler<USB>;
|
||||||
});
|
});
|
||||||
|
|
||||||
#[cortex_m_rt::entry]
|
#[cortex_m_rt::entry]
|
||||||
fn main() -> ! {
|
fn main() -> ! {
|
||||||
|
info!("Initializing");
|
||||||
|
|
||||||
let p = embassy_rp::init(Default::default());
|
let p = embassy_rp::init(Default::default());
|
||||||
|
|
||||||
let driver = Driver::new(p.USB, Irqs);
|
let driver = Driver::new(p.USB, Irqs);
|
||||||
|
|
||||||
info!("Initializing");
|
let mut flash = Flash::<_, Async, FLASH_SIZE>::new(p.FLASH, p.DMA_CH0);
|
||||||
|
|
||||||
|
let mut uid = [0u8; 8];
|
||||||
|
flash.blocking_unique_id(&mut uid).unwrap();
|
||||||
|
|
||||||
|
flash
|
||||||
|
.blocking_erase(ADDR_OFFSET, ADDR_OFFSET + ERASE_SIZE as u32)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
flash.blocking_write(ADDR_OFFSET, &[0xAB]).unwrap();
|
||||||
|
|
||||||
|
debug!("Read unique id: {:02X}", uid);
|
||||||
|
|
||||||
spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || {
|
spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || {
|
||||||
let executor1 = EXECUTOR1.init(Executor::new());
|
let executor1 = EXECUTOR1.init(Executor::new());
|
||||||
executor1.run(|spawner| spawner.spawn(usb_transfer_loop(driver)).unwrap());
|
executor1.run(|spawner| spawner.spawn(usb_transfer_loop(driver, uid)).unwrap());
|
||||||
});
|
});
|
||||||
|
|
||||||
let executor0 = EXECUTOR0.init(Executor::new());
|
let executor0 = EXECUTOR0.init(Executor::new());
|
||||||
|
info!("Initialized.");
|
||||||
|
|
||||||
|
let mosi = p.PIN_7;
|
||||||
|
let miso = p.PIN_4;
|
||||||
|
let spi_clk = p.PIN_6;
|
||||||
|
|
||||||
|
let p_acs = p.PIN_24;
|
||||||
|
let p_ccs = p.PIN_23;
|
||||||
|
|
||||||
|
let mut spi_cfg = spi::Config::default();
|
||||||
|
spi_cfg.frequency = 3000 * 1000;
|
||||||
|
|
||||||
|
let spi = Spi::new_blocking(p.SPI0, spi_clk, mosi, miso, spi_cfg);
|
||||||
|
|
||||||
|
let spi_acs = Output::new(p_acs, Level::High); // active low
|
||||||
|
let spi_ccs = Output::new(p_ccs, Level::High); // active low
|
||||||
|
|
||||||
executor0.run(|spawner| {
|
executor0.run(|spawner| {
|
||||||
spawner
|
spawner
|
||||||
.spawn(input_loop(Input::new(p.PIN_15, gpio::Pull::Up)))
|
.spawn(input_loop(
|
||||||
|
flash,
|
||||||
|
Input::new(p.PIN_20, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_17, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_16, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_11, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_9, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_10, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_8, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_22, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_21, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_18, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_19, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_5, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_25, gpio::Pull::Up),
|
||||||
|
Input::new(p.PIN_29, gpio::Pull::Up),
|
||||||
|
spi,
|
||||||
|
spi_acs,
|
||||||
|
spi_ccs,
|
||||||
|
))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue