Compare commits
3 Commits
main
...
psram-allo
| Author | SHA1 | Date | |
|---|---|---|---|
| 31a3772bcb | |||
| 212077578c | |||
| 13d267f61e |
263
Cargo.lock
generated
263
Cargo.lock
generated
@@ -78,7 +78,7 @@ version = "4.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891"
|
||||
dependencies = [
|
||||
"term 1.2.0",
|
||||
"term 1.0.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -232,9 +232,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.23.2"
|
||||
version = "1.23.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677"
|
||||
checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
@@ -272,9 +272,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.3"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
|
||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
@@ -339,7 +339,7 @@ checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -436,7 +436,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim 0.11.1",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -447,7 +447,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -485,7 +485,7 @@ dependencies = [
|
||||
"proc-macro-error2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -494,7 +494,7 @@ version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e"
|
||||
dependencies = [
|
||||
"thiserror 2.0.16",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -634,7 +634,7 @@ dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -706,7 +706,7 @@ dependencies = [
|
||||
"embassy-hal-internal 0.2.0",
|
||||
"embassy-sync 0.6.2",
|
||||
"embassy-time 0.4.0",
|
||||
"embassy-usb-driver 0.1.1",
|
||||
"embassy-usb-driver 0.1.0",
|
||||
"embedded-hal 0.2.7",
|
||||
"embedded-hal 1.0.0",
|
||||
"embedded-hal-async",
|
||||
@@ -866,12 +866,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "embassy-usb-driver"
|
||||
version = "0.1.1"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76"
|
||||
dependencies = [
|
||||
"embedded-io-async",
|
||||
]
|
||||
checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970"
|
||||
|
||||
[[package]]
|
||||
name = "embassy-usb-driver"
|
||||
@@ -999,7 +996,7 @@ checksum = "4f6e621fe4c7e05b695274b722dc0a60bacd1c8696b58191baa0154713d52400"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1040,9 +1037,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "embedded-text"
|
||||
version = "0.7.2"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "005680edc0d075af5e02d5788ca291737bd9aba7fc404ae031cc9dfa715e5f7d"
|
||||
checksum = "6cf5c72c52db2f7dbe4a9c1ed81cd21301e8d66311b194fa41c04fb4f71843ba"
|
||||
dependencies = [
|
||||
"az",
|
||||
"embedded-graphics",
|
||||
@@ -1077,7 +1074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.61.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1191,7 +1188,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1247,26 +1244,26 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.3.3"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
|
||||
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi",
|
||||
"wasi 0.14.7+wasi-0.2.4",
|
||||
"wasip2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "goblin"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6a80adfd63bd7ffd94fefc3d22167880c440a724303080e5aa686fa36abaa96"
|
||||
checksum = "7be320f077239a0361c20d608b4768c62a1b77aa4946dd76395aa4cd502cba7d"
|
||||
dependencies = [
|
||||
"plain",
|
||||
"scroll",
|
||||
@@ -1308,9 +1305,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.0"
|
||||
version = "0.15.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
|
||||
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
|
||||
|
||||
[[package]]
|
||||
name = "heapless"
|
||||
@@ -1350,6 +1347,15 @@ version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
|
||||
|
||||
[[package]]
|
||||
name = "home"
|
||||
version = "0.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
|
||||
dependencies = [
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ident_case"
|
||||
version = "1.0.1"
|
||||
@@ -1368,12 +1374,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.11.4"
|
||||
version = "2.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.16.0",
|
||||
"hashbrown 0.15.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1384,7 +1390,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
|
||||
dependencies = [
|
||||
"hermit-abi 0.5.2",
|
||||
"libc",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1413,9 +1419,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.80"
|
||||
version = "0.3.77"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e"
|
||||
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
@@ -1441,6 +1447,7 @@ dependencies = [
|
||||
"bumpalo",
|
||||
"cortex-m",
|
||||
"cortex-m-rt",
|
||||
"critical-section",
|
||||
"cyw43",
|
||||
"cyw43-pio",
|
||||
"defmt 0.3.100",
|
||||
@@ -1524,10 +1531,10 @@ dependencies = [
|
||||
"petgraph 0.7.1",
|
||||
"pico-args",
|
||||
"regex",
|
||||
"regex-syntax 0.8.6",
|
||||
"regex-syntax 0.8.5",
|
||||
"sha3",
|
||||
"string_cache",
|
||||
"term 1.2.0",
|
||||
"term 1.0.2",
|
||||
"unicode-xid",
|
||||
"walkdir",
|
||||
]
|
||||
@@ -1559,15 +1566,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.175"
|
||||
version = "0.2.174"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
|
||||
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.1.10"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
|
||||
checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638"
|
||||
dependencies = [
|
||||
"bitflags 2.9.4",
|
||||
"libc",
|
||||
@@ -1581,9 +1588,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
|
||||
|
||||
[[package]]
|
||||
name = "litrs"
|
||||
version = "0.4.2"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
|
||||
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
@@ -1597,9 +1604,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.28"
|
||||
version = "0.4.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
|
||||
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
@@ -1681,7 +1688,7 @@ checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1748,7 +1755,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
|
||||
dependencies = [
|
||||
"fixedbitset 0.4.2",
|
||||
"indexmap 2.11.4",
|
||||
"indexmap 2.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1758,7 +1765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772"
|
||||
dependencies = [
|
||||
"fixedbitset 0.5.7",
|
||||
"indexmap 2.11.4",
|
||||
"indexmap 2.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1873,7 +1880,7 @@ dependencies = [
|
||||
"proc-macro-error2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1940,14 +1947,14 @@ dependencies = [
|
||||
"proc-macro-error-attr2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.101"
|
||||
version = "1.0.95"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
|
||||
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -1996,9 +2003,9 @@ checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.17"
|
||||
version = "0.5.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
|
||||
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
|
||||
dependencies = [
|
||||
"bitflags 2.9.4",
|
||||
]
|
||||
@@ -2016,25 +2023,25 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.11.2"
|
||||
version = "1.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
|
||||
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
"regex-syntax 0.8.6",
|
||||
"regex-syntax 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.10"
|
||||
version = "0.4.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
|
||||
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax 0.8.6",
|
||||
"regex-syntax 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2045,15 +2052,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.6"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
|
||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||
|
||||
[[package]]
|
||||
name = "rgb"
|
||||
version = "0.8.52"
|
||||
version = "0.8.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
|
||||
checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
]
|
||||
@@ -2096,14 +2103,14 @@ dependencies = [
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.61.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -2149,9 +2156,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.225"
|
||||
version = "1.0.228"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d"
|
||||
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
"serde_derive",
|
||||
@@ -2159,22 +2166,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_core"
|
||||
version = "1.0.225"
|
||||
version = "1.0.228"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383"
|
||||
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.225"
|
||||
version = "1.0.228"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516"
|
||||
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2341,7 +2348,7 @@ dependencies = [
|
||||
"heck 0.5.0",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2357,9 +2364,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.106"
|
||||
version = "2.0.104"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
|
||||
checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -2388,10 +2395,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.3.3",
|
||||
"getrandom 0.3.4",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.61.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2407,11 +2414,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "term"
|
||||
version = "1.2.0"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2111ef44dae28680ae9752bb89409e7310ca33a8c621ebe7b106cf5c928b3ac0"
|
||||
checksum = "8a984c8d058c627faaf5e8e2ed493fa3c51771889196de1016cf9c1c6e90d750"
|
||||
dependencies = [
|
||||
"windows-sys 0.61.0",
|
||||
"home",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2440,11 +2448,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "2.0.16"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
|
||||
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
|
||||
dependencies = [
|
||||
"thiserror-impl 2.0.16",
|
||||
"thiserror-impl 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2455,18 +2463,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "2.0.16"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
|
||||
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2525,7 +2533,7 @@ dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
@@ -2537,9 +2545,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.19"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
|
||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
@@ -2602,9 +2610,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.18.1"
|
||||
version = "1.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
|
||||
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
@@ -2653,15 +2661,6 @@ version = "0.11.1+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.14.7+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c"
|
||||
dependencies = [
|
||||
"wasip2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.1+wasi-0.2.4"
|
||||
@@ -2673,36 +2672,35 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.103"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819"
|
||||
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"rustversion",
|
||||
"wasm-bindgen-macro",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.103"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c"
|
||||
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.103"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0"
|
||||
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -2710,22 +2708,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.103"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32"
|
||||
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.103"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf"
|
||||
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -2748,11 +2746,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.11"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||
dependencies = [
|
||||
"windows-sys 0.61.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2761,12 +2759,6 @@ version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-link"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.59.0"
|
||||
@@ -2776,15 +2768,6 @@ dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.61.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
@@ -2866,20 +2849,20 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.27"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
|
||||
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.27"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
|
||||
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.106",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
@@ -58,6 +58,7 @@ cyw43 = { version = "0.3.0", features = [
|
||||
], optional = true }
|
||||
cyw43-pio = { version = "0.3.0", optional = true }
|
||||
|
||||
critical-section = "1.2.0"
|
||||
embedded-hal-bus = { version = "0.3.0", features = ["async"] }
|
||||
embedded-hal = "0.2.7"
|
||||
embedded-hal_2 = { package = "embedded-hal", version = "1.0.0" }
|
||||
|
||||
@@ -11,6 +11,7 @@ mod display;
|
||||
mod elf;
|
||||
mod framebuffer;
|
||||
mod peripherals;
|
||||
mod psram;
|
||||
mod scsi;
|
||||
mod storage;
|
||||
mod ui;
|
||||
@@ -24,6 +25,7 @@ use crate::{
|
||||
conf_peripherals,
|
||||
keyboard::{KeyState, read_keyboard_fifo},
|
||||
},
|
||||
psram::init_psram,
|
||||
scsi::MSC_SHUTDOWN,
|
||||
storage::{SDCARD, SdCard},
|
||||
ui::{SELECTIONS, clear_selection, ui_handler},
|
||||
@@ -47,9 +49,11 @@ use embassy_rp::{
|
||||
i2c::{self, I2c},
|
||||
multicore::{Stack, spawn_core1},
|
||||
peripherals::{
|
||||
DMA_CH0, DMA_CH1, I2C1, PIN_6, PIN_7, PIN_10, PIN_11, PIN_12, PIN_13, PIN_14, PIN_15,
|
||||
PIN_16, PIN_17, PIN_18, PIN_19, PIN_22, SPI0, SPI1, USB,
|
||||
DMA_CH0, DMA_CH1, DMA_CH3, DMA_CH4, I2C1, PIN_2, PIN_3, PIN_6, PIN_7, PIN_10, PIN_11,
|
||||
PIN_12, PIN_13, PIN_14, PIN_15, PIN_16, PIN_17, PIN_18, PIN_19, PIN_20, PIN_21, PIN_22,
|
||||
PIO0, SPI0, SPI1, USB,
|
||||
},
|
||||
pio,
|
||||
spi::{self, Spi},
|
||||
usb as embassy_rp_usb,
|
||||
};
|
||||
@@ -65,6 +69,7 @@ use talc::*;
|
||||
embassy_rp::bind_interrupts!(struct Irqs {
|
||||
I2C1_IRQ => i2c::InterruptHandler<I2C1>;
|
||||
USBCTRL_IRQ => embassy_rp_usb::InterruptHandler<USB>;
|
||||
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
|
||||
});
|
||||
|
||||
static mut CORE1_STACK: Stack<16384> = Stack::new();
|
||||
@@ -113,13 +118,24 @@ async fn main(_spawner: Spawner) {
|
||||
cs: p.PIN_17,
|
||||
det: p.PIN_22,
|
||||
};
|
||||
let psram = Psram {
|
||||
pio: p.PIO0,
|
||||
sclk: p.PIN_21,
|
||||
mosi: p.PIN_2,
|
||||
miso: p.PIN_3,
|
||||
cs: p.PIN_20,
|
||||
dma1: p.DMA_CH3,
|
||||
dma2: p.DMA_CH4,
|
||||
};
|
||||
let mcu = Mcu {
|
||||
i2c: p.I2C1,
|
||||
clk: p.PIN_7,
|
||||
data: p.PIN_6,
|
||||
};
|
||||
let executor0 = EXECUTOR0.init(Executor::new());
|
||||
executor0.run(|spawner| unwrap!(spawner.spawn(kernel_task(spawner, display, sd, mcu, p.USB))));
|
||||
executor0.run(|spawner| {
|
||||
unwrap!(spawner.spawn(kernel_task(spawner, display, sd, psram, mcu, p.USB)))
|
||||
});
|
||||
}
|
||||
|
||||
// One-slot channel to pass EntryFn from core1
|
||||
@@ -177,6 +193,15 @@ struct Sd {
|
||||
cs: Peri<'static, PIN_17>,
|
||||
det: Peri<'static, PIN_22>,
|
||||
}
|
||||
struct Psram {
|
||||
pio: Peri<'static, PIO0>,
|
||||
sclk: Peri<'static, PIN_21>,
|
||||
mosi: Peri<'static, PIN_2>,
|
||||
miso: Peri<'static, PIN_3>,
|
||||
cs: Peri<'static, PIN_20>,
|
||||
dma1: Peri<'static, DMA_CH3>,
|
||||
dma2: Peri<'static, DMA_CH4>,
|
||||
}
|
||||
struct Mcu {
|
||||
i2c: Peri<'static, I2C1>,
|
||||
clk: Peri<'static, PIN_7>,
|
||||
@@ -207,6 +232,19 @@ async fn setup_display(display: Display, spawner: Spawner) {
|
||||
spawner.spawn(display_handler(display)).unwrap();
|
||||
}
|
||||
|
||||
async fn setup_psram(psram: Psram) {
|
||||
let psram = init_psram(
|
||||
psram.pio, psram.sclk, psram.mosi, psram.miso, psram.cs, psram.dma1, psram.dma2,
|
||||
)
|
||||
.await;
|
||||
|
||||
defmt::info!("psram size: {}", psram.size);
|
||||
|
||||
if psram.size == 0 {
|
||||
defmt::info!("\u{1b}[1mExternal PSRAM was NOT found!\u{1b}[0m");
|
||||
}
|
||||
}
|
||||
|
||||
async fn setup_sd(sd: Sd) {
|
||||
let mut config = spi::Config::default();
|
||||
config.frequency = 400_000;
|
||||
@@ -227,12 +265,14 @@ async fn kernel_task(
|
||||
spawner: Spawner,
|
||||
display: Display,
|
||||
sd: Sd,
|
||||
psram: Psram,
|
||||
mcu: Mcu,
|
||||
usb: Peri<'static, USB>,
|
||||
) {
|
||||
setup_mcu(mcu).await;
|
||||
Timer::after_millis(250).await;
|
||||
setup_display(display, spawner).await;
|
||||
setup_psram(psram).await;
|
||||
setup_sd(sd).await;
|
||||
|
||||
let _usb = embassy_rp_usb::Driver::new(usb, Irqs);
|
||||
|
||||
385
kernel/src/psram.rs
Normal file
385
kernel/src/psram.rs
Normal file
@@ -0,0 +1,385 @@
|
||||
// This whole file was taken from
|
||||
// <https://github.com/wezterm/picocalc-wezterm/blob/8dcf8aae0598afdeaf0ed2ba50c39dea6e30c011/src/psram.rs>
|
||||
//
|
||||
use crate::Irqs;
|
||||
use embassy_futures::yield_now;
|
||||
use embassy_rp::Peri;
|
||||
use embassy_rp::gpio::{Drive, SlewRate};
|
||||
use embassy_rp::peripherals::{DMA_CH3, DMA_CH4, PIN_2, PIN_3, PIN_20, PIN_21, PIO0};
|
||||
use embassy_rp::pio::program::pio_asm;
|
||||
use embassy_rp::pio::{Config, Direction, Pio, ShiftDirection};
|
||||
use embassy_rp::pio_programs::clock_divider::calculate_pio_clock_divider;
|
||||
use embassy_time::{Duration, Instant, Timer};
|
||||
|
||||
// The physical connections in the picocalc schematic are:
|
||||
// LABEL PICO ESP-PSRAM64H
|
||||
// RAM_CS - PIN_20 CE (pulled up to 3v3 via 10kOhm)
|
||||
// RAM_SCK - PIN_21 SCLK
|
||||
// RAM_TX - PIN_2 SI/SIO0
|
||||
// RAM_RX - PIN_3 SO/SIO1
|
||||
// RAM_IO2 - PIN_4 SIO2 (QPI Mode)
|
||||
// RAM_IO3 - PIN_5 SIO3 (QPI Mode)
|
||||
|
||||
#[allow(unused)]
|
||||
const PSRAM_CMD_READ_ID: u8 = 0x9F;
|
||||
const PSRAM_CMD_RSTEN: u8 = 0x66;
|
||||
const PSRAM_CMD_RST: u8 = 0x99;
|
||||
const PSRAM_CMD_WRITE: u8 = 0x02;
|
||||
const PSRAM_CMD_FAST_READ: u8 = 0x0B;
|
||||
#[allow(unused)]
|
||||
const PSRAM_CMD_NOOP: u8 = 0xFF;
|
||||
#[allow(unused)]
|
||||
const PSRAM_KNOWN_GOOD_DIE_PASS: u8 = 0x5d;
|
||||
|
||||
const SPEED: u32 = 133_000_000;
|
||||
|
||||
pub struct PsRam {
|
||||
sm: embassy_rp::pio::StateMachine<'static, PIO0, 0>,
|
||||
tx_ch: Peri<'static, DMA_CH3>,
|
||||
rx_ch: Peri<'static, DMA_CH4>,
|
||||
pub size: u32,
|
||||
}
|
||||
|
||||
impl PsRam {
|
||||
pub async fn send_command(&mut self, cmd: &[u8], out: &mut [u8]) {
|
||||
if out.is_empty() {
|
||||
self.sm
|
||||
.tx()
|
||||
.dma_push(self.tx_ch.reborrow(), cmd, false)
|
||||
.await;
|
||||
} else {
|
||||
let (rx, tx) = self.sm.rx_tx();
|
||||
tx.dma_push(self.tx_ch.reborrow(), cmd, false).await;
|
||||
rx.dma_pull(self.rx_ch.reborrow(), out, false).await;
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn write(&mut self, mut addr: u32, mut data: &[u8]) {
|
||||
// I haven't seen this work reliably over 24 bytes
|
||||
const MAX_CHUNK: usize = 24;
|
||||
while data.len() > 0 {
|
||||
let to_write = data.len().min(MAX_CHUNK);
|
||||
//defmt::info!("writing {to_write} @ {addr}");
|
||||
|
||||
#[rustfmt::skip]
|
||||
let mut to_send = [
|
||||
32 + (to_write as u8 * 8), // write address + data
|
||||
0, // read 0 bits
|
||||
PSRAM_CMD_WRITE,
|
||||
((addr >> 16) & 0xff) as u8,
|
||||
((addr >> 8) & 0xff) as u8,
|
||||
(addr & 0xff) as u8,
|
||||
// This sequence must be MAX_CHUNK in length
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
];
|
||||
|
||||
for (src, dst) in data.iter().zip(to_send.iter_mut().skip(6)) {
|
||||
*dst = *src;
|
||||
}
|
||||
|
||||
self.send_command(&to_send[0..6 + to_write], &mut []).await;
|
||||
addr += to_write as u32;
|
||||
data = &data[to_write..];
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn read_id(&mut self) -> [u8; 3] {
|
||||
let mut id = [0u8; 3];
|
||||
#[rustfmt::skip]
|
||||
self.send_command(
|
||||
&[
|
||||
32, // write 32 bits
|
||||
3 * 8, // read 8 bytes = 64 bits
|
||||
PSRAM_CMD_READ_ID,
|
||||
// don't care: 24-bit "address"
|
||||
0, 0, 0,
|
||||
],
|
||||
&mut id,
|
||||
)
|
||||
.await;
|
||||
id
|
||||
}
|
||||
|
||||
pub async fn read(&mut self, mut addr: u32, mut out: &mut [u8]) {
|
||||
// Cannot get reliable reads above 4 bytes at a time.
|
||||
// out[4] will always have a bit error
|
||||
const MAX_CHUNK: usize = 4;
|
||||
while out.len() > 0 {
|
||||
let to_read = out.len().min(MAX_CHUNK);
|
||||
//defmt::info!("reading {to_read} @ {addr}");
|
||||
self.send_command(
|
||||
&[
|
||||
40, // write 40 bits
|
||||
to_read as u8 * 8, // read n bytes
|
||||
PSRAM_CMD_FAST_READ,
|
||||
((addr >> 16) & 0xff) as u8,
|
||||
((addr >> 8) & 0xff) as u8,
|
||||
(addr & 0xff) as u8,
|
||||
0, // 8 cycle delay by sending 8 bits of don't care data
|
||||
],
|
||||
&mut out[0..to_read],
|
||||
)
|
||||
.await;
|
||||
addr += to_read as u32;
|
||||
out = &mut out[to_read..];
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub async fn write8(&mut self, addr: u32, data: u8) {
|
||||
//defmt::info!("write8 addr {addr} <- {data:x}");
|
||||
self.send_command(
|
||||
&[
|
||||
40, // write 40 bits
|
||||
0, // read 0 bits
|
||||
PSRAM_CMD_WRITE,
|
||||
((addr >> 16) & 0xff) as u8,
|
||||
((addr >> 8) & 0xff) as u8,
|
||||
(addr & 0xff) as u8,
|
||||
data,
|
||||
],
|
||||
&mut [],
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub async fn read8(&mut self, addr: u32) -> u8 {
|
||||
let mut buf = [0u8];
|
||||
self.send_command(
|
||||
&[
|
||||
40, // write 40 bits
|
||||
8, // read 8 bits
|
||||
PSRAM_CMD_FAST_READ,
|
||||
((addr >> 16) & 0xff) as u8,
|
||||
((addr >> 8) & 0xff) as u8,
|
||||
(addr & 0xff) as u8,
|
||||
0, // 8 cycle delay
|
||||
],
|
||||
&mut buf,
|
||||
)
|
||||
.await;
|
||||
buf[0]
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn init_psram(
|
||||
pio: Peri<'static, PIO0>,
|
||||
sclk: Peri<'static, PIN_21>,
|
||||
mosi: Peri<'static, PIN_2>,
|
||||
miso: Peri<'static, PIN_3>,
|
||||
cs: Peri<'static, PIN_20>,
|
||||
dma1: Peri<'static, DMA_CH3>,
|
||||
dma2: Peri<'static, DMA_CH4>,
|
||||
) -> PsRam {
|
||||
let mut pio = Pio::new(pio, Irqs);
|
||||
|
||||
let divider = calculate_pio_clock_divider(SPEED);
|
||||
|
||||
// This pio program was taken from
|
||||
// <https://github.com/polpo/rp2040-psram/blob/7786c93ec8d02dbb4f94a2e99645b25fb4abc2db/psram_spi.pio>
|
||||
// which is Copyright © 2023 Ian Scott, reproduced here under the MIT license
|
||||
|
||||
let p = pio_asm!(
|
||||
r#"
|
||||
.side_set 2 ; sideset bit 1 is SCK, bit 0 is CS
|
||||
begin:
|
||||
out x, 8 side 0b01 ; x = number of bits to output. CS deasserted
|
||||
out y, 8 side 0b01 ; y = number of bits to input
|
||||
jmp x--, writeloop side 0b01 ; Pre-decement x by 1 so loop has correct number of iterations
|
||||
writeloop:
|
||||
out pins, 1 side 0b00 ; Write value on pin, lower clock. CS asserted
|
||||
jmp x--, writeloop side 0b10 ; Raise clock: this is when PSRAM reads the value. Loop if we have more to write
|
||||
jmp !y, done side 0b00 ; If this is a write-only operation, jump back to beginning
|
||||
nop side 0b10 ; Fudge factor of extra clock cycle; the PSRAM needs 1 extra for output to start appearing
|
||||
jmp readloop_mid side 0b00 ; Jump to middle of readloop to decrement y and get right clock phase
|
||||
readloop:
|
||||
in pins, 1 side 0b00 ; Read value on pin, lower clock. Datasheet says to read on falling edge > 83MHz
|
||||
readloop_mid:
|
||||
jmp y--, readloop side 0b10 ; Raise clock. Loop if we have more to read
|
||||
done:
|
||||
nop side 0b11 ; CS deasserted
|
||||
"#
|
||||
);
|
||||
let prog = pio.common.load_program(&p.program);
|
||||
|
||||
let mut cfg = Config::default();
|
||||
|
||||
let mut cs = pio.common.make_pio_pin(cs);
|
||||
let mut sclk = pio.common.make_pio_pin(sclk);
|
||||
let mut mosi = pio.common.make_pio_pin(mosi);
|
||||
let mut miso = pio.common.make_pio_pin(miso);
|
||||
|
||||
sclk.set_slew_rate(SlewRate::Fast);
|
||||
mosi.set_slew_rate(SlewRate::Fast);
|
||||
|
||||
cs.set_drive_strength(Drive::_4mA);
|
||||
sclk.set_drive_strength(Drive::_4mA);
|
||||
mosi.set_drive_strength(Drive::_4mA);
|
||||
miso.set_drive_strength(Drive::_4mA);
|
||||
|
||||
cfg.use_program(&prog, &[&cs, &sclk]);
|
||||
cfg.set_out_pins(&[&mosi]);
|
||||
cfg.set_in_pins(&[&miso]);
|
||||
|
||||
cfg.shift_out.direction = ShiftDirection::Left;
|
||||
cfg.shift_out.auto_fill = true;
|
||||
cfg.shift_out.threshold = 8;
|
||||
|
||||
cfg.shift_in = cfg.shift_out;
|
||||
cfg.clock_divider = divider;
|
||||
|
||||
let mut sm = pio.sm0;
|
||||
sm.restart();
|
||||
sm.set_pin_dirs(Direction::Out, &[&cs, &sclk]);
|
||||
sm.set_pin_dirs(Direction::Out, &[&mosi]);
|
||||
sm.set_pin_dirs(Direction::In, &[&miso]);
|
||||
miso.set_input_sync_bypass(true);
|
||||
|
||||
sm.set_config(&cfg);
|
||||
sm.set_enable(true);
|
||||
|
||||
let mut psram = PsRam {
|
||||
sm,
|
||||
tx_ch: dma1,
|
||||
rx_ch: dma2,
|
||||
size: 0,
|
||||
};
|
||||
|
||||
// Issue a reset command
|
||||
psram.send_command(&[8, 0, PSRAM_CMD_RSTEN], &mut []).await;
|
||||
Timer::after(Duration::from_micros(50)).await;
|
||||
psram.send_command(&[8, 0, PSRAM_CMD_RST], &mut []).await;
|
||||
Timer::after(Duration::from_micros(100)).await;
|
||||
|
||||
defmt::info!("Verifying 1 byte write and read...");
|
||||
for i in 0..10u8 {
|
||||
psram.write8(i as u32, i).await;
|
||||
}
|
||||
for i in 0..10u32 {
|
||||
let n = psram.read8(i as u32).await;
|
||||
if n as u32 != i {}
|
||||
}
|
||||
defmt::info!("testing read again @ 0");
|
||||
let mut got = [0u8; 8];
|
||||
psram.read(0, &mut got).await;
|
||||
const EXPECT: &[u8] = &[0, 1, 2, 3, 4, 5, 6, 7];
|
||||
if got != EXPECT {
|
||||
defmt::warn!("Got Read error");
|
||||
}
|
||||
|
||||
const DEADBEEF: &[u8] = &[0xd, 0xe, 0xa, 0xd, 0xb, 0xe, 0xe, 0xf];
|
||||
defmt::info!("testing write of deadbeef at 0");
|
||||
psram.write(0, DEADBEEF).await;
|
||||
|
||||
defmt::info!("testing read of deadbeef from 0");
|
||||
psram.read(0, &mut got).await;
|
||||
if got != DEADBEEF {
|
||||
for addr in 0..DEADBEEF.len() {
|
||||
let bad = got[addr];
|
||||
if bad != DEADBEEF[addr] {
|
||||
let x = psram.read8(addr as u32).await;
|
||||
defmt::info!("read addr: {}, got: {:X}", addr, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const TEST_STRING: &[u8] = b"hello there, this is a test, how is it?";
|
||||
psram.write(16, TEST_STRING).await;
|
||||
|
||||
let mut buffer = [0u8; 42];
|
||||
psram.read(16, &mut buffer).await;
|
||||
|
||||
let got = &buffer[0..TEST_STRING.len()];
|
||||
|
||||
if got != TEST_STRING {}
|
||||
|
||||
defmt::info!("PSRAM test complete");
|
||||
|
||||
let id = psram.read_id().await;
|
||||
defmt::info!("psram id: {}", id);
|
||||
// id: [d, 5d, 53, 15, 49, e3, 7c, 7b]
|
||||
// id[0] -- manufacturer id
|
||||
// id[1] -- "known good die" status
|
||||
if id[1] == PSRAM_KNOWN_GOOD_DIE_PASS {
|
||||
// See <https://github.com/espressif/esp-idf/blob/1c468f68259065ef51afd114605d9122f13d9d72/components/esp_psram/esp32/esp_psram_impl_quad.c#L67-L86>
|
||||
// for information on deciding the size of ESP PSRAM chips,
|
||||
// such as the one used in the picocalc
|
||||
let size = match (id[2] >> 5) & 0x7 {
|
||||
0 => 16,
|
||||
1 => 32,
|
||||
2 => 64,
|
||||
_ => 0,
|
||||
};
|
||||
psram.size = size * 1024 * 1024 / 8;
|
||||
}
|
||||
|
||||
psram
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub async fn test_psram(psram: &mut PsRam) -> bool {
|
||||
const REPORT_CHUNK: u32 = 256 * 1024;
|
||||
const BLOCK_SIZE: usize = 8;
|
||||
let limit = psram.size; //.min(4 * 1024 * 1024);
|
||||
|
||||
let start = Instant::now();
|
||||
|
||||
fn expect(addr: u32) -> [u8; BLOCK_SIZE] {
|
||||
[
|
||||
!((addr >> 24 & 0xff) as u8),
|
||||
!((addr >> 16 & 0xff) as u8),
|
||||
!((addr >> 8 & 0xff) as u8),
|
||||
!((addr & 0xff) as u8),
|
||||
((addr >> 24 & 0xff) as u8),
|
||||
((addr >> 16 & 0xff) as u8),
|
||||
((addr >> 8 & 0xff) as u8),
|
||||
((addr & 0xff) as u8),
|
||||
]
|
||||
}
|
||||
|
||||
for i in 0..limit / BLOCK_SIZE as u32 {
|
||||
let addr = i * BLOCK_SIZE as u32;
|
||||
let data = expect(addr);
|
||||
psram.write(addr, &data).await;
|
||||
if addr > 0 && addr % REPORT_CHUNK == 0 {
|
||||
if start.elapsed() > Duration::from_secs(5) {}
|
||||
}
|
||||
// Yield so that the watchdog doesn't kick in
|
||||
yield_now().await;
|
||||
}
|
||||
let writes_took = start.elapsed();
|
||||
|
||||
defmt::info!("Starting reads...");
|
||||
Timer::after(Duration::from_millis(200)).await;
|
||||
|
||||
let start = Instant::now();
|
||||
let mut bad_count = 0;
|
||||
let mut data = [0u8; BLOCK_SIZE];
|
||||
for i in 0..limit / BLOCK_SIZE as u32 {
|
||||
let addr = i * BLOCK_SIZE as u32;
|
||||
let expect = expect(addr);
|
||||
psram.read(addr, &mut data).await;
|
||||
if addr == 0 {
|
||||
Timer::after(Duration::from_millis(200)).await;
|
||||
}
|
||||
if data != expect {
|
||||
bad_count += 1;
|
||||
if bad_count < 50 {}
|
||||
}
|
||||
if addr > 0 && addr % REPORT_CHUNK == 0 {
|
||||
if start.elapsed() > Duration::from_secs(5) {}
|
||||
}
|
||||
|
||||
// Yield so that the watchdog doesn't kick in
|
||||
yield_now().await;
|
||||
}
|
||||
let reads_took = start.elapsed();
|
||||
|
||||
bad_count == 0
|
||||
}
|
||||
Reference in New Issue
Block a user