├── .cargo └── config.toml ├── .envrc ├── .gitignore ├── .gitmodules ├── Cargo.lock ├── Cargo.toml ├── Embed.toml ├── LICENSE ├── README.md ├── SETUP.md ├── flake.lock ├── flake.nix ├── openocd.cfg ├── rust-toolchain.toml └── stm32f730v8t6.yaml /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.thumbv7em-none-eabihf] 2 | # uncomment this to make `cargo run` execute programs on QEMU 3 | # runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" 4 | 5 | [target.'cfg(all(target_arch = "arm", target_os = "none"))'] 6 | # uncomment ONE of these three option to make `cargo run` start a GDB session 7 | # which option to pick depends on your system 8 | # runner = "arm-none-eabi-gdb -q -x openocd.gdb" 9 | # runner = "gdb-multiarch -q -x openocd.gdb" 10 | # runner = "gdb -q -x openocd.gdb" 11 | runner = "probe-run --chip=stm32f730V8Tx" 12 | 13 | rustflags = [ 14 | # This is needed if your flash or ram addresses are not aligned to 0x10000 in memory.x 15 | # See https://github.com/rust-embedded/cortex-m-quickstart/pull/95 16 | "-C", "link-arg=--nmagic", 17 | 18 | # LLD (shipped with the Rust toolchain) is used as the default linker 19 | "-C", "link-arg=-Tlink.x", 20 | 21 | # if you run into problems with LLD switch to the GNU linker by commenting out 22 | # this line 23 | # "-C", "linker=arm-none-eabi-ld", 24 | 25 | # if you need to link to pre-compiled C librarie provided by a C toolchain 26 | # use GCC as the linker by commenting out both lines above and then 27 | # uncommenting the three lines below 28 | # "-C", "linker=arm-none-eabi-gcc", 29 | # "-C", "link-arg=-Wl,-Tlink.x", 30 | # "-C", "link-arg=-nostartfiles", 31 | ] 32 | 33 | [build] 34 | target = "thumbv7em-none-eabihf" 35 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then 2 | source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8=" 3 | fi 4 | use flake 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .DS_Store 3 | .direnv 4 | .vscode 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "board-support"] 2 | path = board-support 3 | url = ../board-support.git 4 | [submodule "bootloader"] 5 | path = bootloader 6 | url = ../bootloader.git 7 | [submodule "os"] 8 | path = os 9 | url = ../os.git 10 | [submodule "citrus-cas"] 11 | path = citrus-cas 12 | url = ../citrus-cas.git 13 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aligned" 7 | version = "0.3.5" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "3a785a543aea40f5e4e2e93bb2655d31bc21bb391fff65697150973e383f16bb" 10 | dependencies = [ 11 | "as-slice 0.1.5", 12 | ] 13 | 14 | [[package]] 15 | name = "as-slice" 16 | version = "0.1.5" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" 19 | dependencies = [ 20 | "generic-array 0.12.4", 21 | "generic-array 0.13.3", 22 | "generic-array 0.14.7", 23 | "stable_deref_trait", 24 | ] 25 | 26 | [[package]] 27 | name = "as-slice" 28 | version = "0.2.1" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" 31 | dependencies = [ 32 | "stable_deref_trait", 33 | ] 34 | 35 | [[package]] 36 | name = "atomic-polyfill" 37 | version = "0.1.11" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" 40 | dependencies = [ 41 | "critical-section", 42 | ] 43 | 44 | [[package]] 45 | name = "autocfg" 46 | version = "1.1.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 49 | 50 | [[package]] 51 | name = "az" 52 | version = "1.2.1" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" 55 | 56 | [[package]] 57 | name = "bare-metal" 58 | version = "0.2.5" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" 61 | dependencies = [ 62 | "rustc_version 0.2.3", 63 | ] 64 | 65 | [[package]] 66 | name = "bare-metal" 67 | version = "1.0.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" 70 | 71 | [[package]] 72 | name = "bitfield" 73 | version = "0.13.2" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" 76 | 77 | [[package]] 78 | name = "bitflags" 79 | version = "1.3.2" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 82 | 83 | [[package]] 84 | name = "bxcan" 85 | version = "0.6.2" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "4b13b4b2ea9ab2ba924063ebb86ad895cb79f4a79bf90f27949eb20c335b30f9" 88 | dependencies = [ 89 | "bitflags", 90 | "nb 1.1.0", 91 | "vcell", 92 | ] 93 | 94 | [[package]] 95 | name = "byteorder" 96 | version = "1.4.3" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 99 | 100 | [[package]] 101 | name = "cast" 102 | version = "0.3.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 105 | 106 | [[package]] 107 | name = "cortex-m" 108 | version = "0.6.7" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "9075300b07c6a56263b9b582c214d0ff037b00d45ec9fde1cc711490c56f1bb9" 111 | dependencies = [ 112 | "aligned", 113 | "bare-metal 0.2.5", 114 | "bitfield", 115 | "cortex-m 0.7.7", 116 | "volatile-register", 117 | ] 118 | 119 | [[package]] 120 | name = "cortex-m" 121 | version = "0.7.7" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" 124 | dependencies = [ 125 | "bare-metal 0.2.5", 126 | "bitfield", 127 | "embedded-hal", 128 | "volatile-register", 129 | ] 130 | 131 | [[package]] 132 | name = "cortex-m-rt" 133 | version = "0.7.3" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "ee84e813d593101b1723e13ec38b6ab6abbdbaaa4546553f5395ed274079ddb1" 136 | dependencies = [ 137 | "cortex-m-rt-macros", 138 | ] 139 | 140 | [[package]] 141 | name = "cortex-m-rt-macros" 142 | version = "0.7.0" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" 145 | dependencies = [ 146 | "proc-macro2", 147 | "quote", 148 | "syn", 149 | ] 150 | 151 | [[package]] 152 | name = "cortex-m-semihosting" 153 | version = "0.5.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "c23234600452033cc77e4b761e740e02d2c4168e11dbf36ab14a0f58973592b0" 156 | dependencies = [ 157 | "cortex-m 0.7.7", 158 | ] 159 | 160 | [[package]] 161 | name = "critical-section" 162 | version = "1.1.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52" 165 | 166 | [[package]] 167 | name = "display-interface" 168 | version = "0.4.1" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "7517c040926d7b02b111884aa089177db80878533127f7c1b480d852c5fb4112" 171 | 172 | [[package]] 173 | name = "embedded-graphics" 174 | version = "0.7.1" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "750082c65094fbcc4baf9ba31583ce9a8bb7f52cadfb96f6164b1bc7f922f32b" 177 | dependencies = [ 178 | "az", 179 | "byteorder", 180 | "embedded-graphics-core", 181 | "float-cmp", 182 | "micromath 1.1.1", 183 | ] 184 | 185 | [[package]] 186 | name = "embedded-graphics-core" 187 | version = "0.3.3" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "b8b1239db5f3eeb7e33e35bd10bd014e7b2537b17e071f726a09351431337cfa" 190 | dependencies = [ 191 | "az", 192 | "byteorder", 193 | ] 194 | 195 | [[package]] 196 | name = "embedded-hal" 197 | version = "0.2.7" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" 200 | dependencies = [ 201 | "nb 0.1.3", 202 | "void", 203 | ] 204 | 205 | [[package]] 206 | name = "embedded-text" 207 | version = "0.5.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "ce4010b774f36bf6bf1497500dc8299c99c3775c83719dd1734b8b66b13f205c" 210 | dependencies = [ 211 | "az", 212 | "embedded-graphics", 213 | "object-chain", 214 | ] 215 | 216 | [[package]] 217 | name = "float-cmp" 218 | version = "0.8.0" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" 221 | dependencies = [ 222 | "num-traits", 223 | ] 224 | 225 | [[package]] 226 | name = "fugit" 227 | version = "0.3.6" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "7ab17bb279def6720d058cb6c052249938e7f99260ab534879281a95367a87e5" 230 | dependencies = [ 231 | "gcd", 232 | ] 233 | 234 | [[package]] 235 | name = "fugit-timer" 236 | version = "0.1.3" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "d9607bfc4c388f9d629704f56ede4a007546cad417b3bcd6fc7c87dc7edce04a" 239 | dependencies = [ 240 | "fugit", 241 | "nb 1.1.0", 242 | ] 243 | 244 | [[package]] 245 | name = "gcd" 246 | version = "2.3.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" 249 | 250 | [[package]] 251 | name = "generic-array" 252 | version = "0.12.4" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 255 | dependencies = [ 256 | "typenum", 257 | ] 258 | 259 | [[package]] 260 | name = "generic-array" 261 | version = "0.13.3" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" 264 | dependencies = [ 265 | "typenum", 266 | ] 267 | 268 | [[package]] 269 | name = "generic-array" 270 | version = "0.14.7" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 273 | dependencies = [ 274 | "typenum", 275 | "version_check", 276 | ] 277 | 278 | [[package]] 279 | name = "hash32" 280 | version = "0.2.1" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 283 | dependencies = [ 284 | "byteorder", 285 | ] 286 | 287 | [[package]] 288 | name = "heapless" 289 | version = "0.7.16" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" 292 | dependencies = [ 293 | "atomic-polyfill", 294 | "hash32", 295 | "rustc_version 0.4.0", 296 | "spin", 297 | "stable_deref_trait", 298 | ] 299 | 300 | [[package]] 301 | name = "lock_api" 302 | version = "0.4.9" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 305 | dependencies = [ 306 | "autocfg", 307 | "scopeguard", 308 | ] 309 | 310 | [[package]] 311 | name = "micromath" 312 | version = "1.1.1" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94" 315 | 316 | [[package]] 317 | name = "micromath" 318 | version = "2.0.0" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "39617bc909d64b068dcffd0e3e31679195b5576d0c83fadc52690268cc2b2b55" 321 | 322 | [[package]] 323 | name = "mipidsi" 324 | version = "0.2.1" 325 | source = "git+https://github.com/almindor/mipidsi?rev=0d66e68#0d66e6899f0a758aa85785399755c4fe883a5ffb" 326 | dependencies = [ 327 | "display-interface", 328 | "embedded-graphics-core", 329 | "embedded-hal", 330 | "heapless", 331 | "nb 1.1.0", 332 | ] 333 | 334 | [[package]] 335 | name = "nb" 336 | version = "0.1.3" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" 339 | dependencies = [ 340 | "nb 1.1.0", 341 | ] 342 | 343 | [[package]] 344 | name = "nb" 345 | version = "1.1.0" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" 348 | 349 | [[package]] 350 | name = "num-derive" 351 | version = "0.3.3" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 354 | dependencies = [ 355 | "proc-macro2", 356 | "quote", 357 | "syn", 358 | ] 359 | 360 | [[package]] 361 | name = "num-traits" 362 | version = "0.2.15" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 365 | dependencies = [ 366 | "autocfg", 367 | ] 368 | 369 | [[package]] 370 | name = "nw-board-support" 371 | version = "0.0.1" 372 | dependencies = [ 373 | "cortex-m 0.7.7", 374 | "embedded-graphics", 375 | "embedded-hal", 376 | "embedded-text", 377 | "fugit", 378 | "heapless", 379 | "mipidsi", 380 | "num-derive", 381 | "num-traits", 382 | "stm32-usbd", 383 | "stm32f7xx-hal", 384 | "usb-device", 385 | ] 386 | 387 | [[package]] 388 | name = "nw-bootloader" 389 | version = "0.0.1" 390 | dependencies = [ 391 | "cortex-m 0.7.7", 392 | "cortex-m-rt", 393 | "cortex-m-semihosting", 394 | "embedded-hal", 395 | "heapless", 396 | "nw-board-support", 397 | "rtt-target", 398 | "usb-device", 399 | "usbd-dfu", 400 | ] 401 | 402 | [[package]] 403 | name = "object-chain" 404 | version = "0.1.3" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "41af26158b0f5530f7b79955006c2727cd23d0d8e7c3109dc316db0a919784dd" 407 | 408 | [[package]] 409 | name = "proc-macro2" 410 | version = "1.0.56" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" 413 | dependencies = [ 414 | "unicode-ident", 415 | ] 416 | 417 | [[package]] 418 | name = "quote" 419 | version = "1.0.27" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" 422 | dependencies = [ 423 | "proc-macro2", 424 | ] 425 | 426 | [[package]] 427 | name = "rand_core" 428 | version = "0.6.4" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 431 | 432 | [[package]] 433 | name = "rtt-target" 434 | version = "0.3.1" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "065d6058bb1204f51a562a67209e1817cf714759d5cf845aa45c75fa7b0b9d9b" 437 | dependencies = [ 438 | "cortex-m 0.7.7", 439 | "ufmt-write", 440 | ] 441 | 442 | [[package]] 443 | name = "rustc_version" 444 | version = "0.2.3" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 447 | dependencies = [ 448 | "semver 0.9.0", 449 | ] 450 | 451 | [[package]] 452 | name = "rustc_version" 453 | version = "0.4.0" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 456 | dependencies = [ 457 | "semver 1.0.17", 458 | ] 459 | 460 | [[package]] 461 | name = "rustworks" 462 | version = "0.0.1" 463 | dependencies = [ 464 | "cortex-m 0.7.7", 465 | "cortex-m-rt", 466 | "cortex-m-semihosting", 467 | "embedded-hal", 468 | "nw-board-support", 469 | "rtt-target", 470 | ] 471 | 472 | [[package]] 473 | name = "scopeguard" 474 | version = "1.1.0" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 477 | 478 | [[package]] 479 | name = "semver" 480 | version = "0.9.0" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 483 | dependencies = [ 484 | "semver-parser", 485 | ] 486 | 487 | [[package]] 488 | name = "semver" 489 | version = "1.0.17" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" 492 | 493 | [[package]] 494 | name = "semver-parser" 495 | version = "0.7.0" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 498 | 499 | [[package]] 500 | name = "spin" 501 | version = "0.9.8" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 504 | dependencies = [ 505 | "lock_api", 506 | ] 507 | 508 | [[package]] 509 | name = "stable_deref_trait" 510 | version = "1.2.0" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 513 | 514 | [[package]] 515 | name = "stm32-fmc" 516 | version = "0.2.4" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "cf16ee9bd5de754482883cf3eac9a49eb862baf1420f55ce408e001705e9ae74" 519 | dependencies = [ 520 | "embedded-hal", 521 | ] 522 | 523 | [[package]] 524 | name = "stm32-usbd" 525 | version = "0.6.0" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "c6c94998f166d66b210a164648a0b7866428d8f1e0740bf8a4c5edd89d4750c1" 528 | dependencies = [ 529 | "cortex-m 0.7.7", 530 | "usb-device", 531 | "vcell", 532 | ] 533 | 534 | [[package]] 535 | name = "stm32f7" 536 | version = "0.14.0" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "b7c0afd45eee4e6d73c2146862ae899912a18ece42e392d095c4a449db99e543" 539 | dependencies = [ 540 | "bare-metal 1.0.0", 541 | "cortex-m 0.7.7", 542 | "cortex-m-rt", 543 | "vcell", 544 | ] 545 | 546 | [[package]] 547 | name = "stm32f7xx-hal" 548 | version = "0.7.0" 549 | source = "git+https://github.com/stm32-rs/stm32f7xx-hal?rev=62a1c8a#62a1c8af6296ab60187e78058133c8f21c38888d" 550 | dependencies = [ 551 | "as-slice 0.2.1", 552 | "bare-metal 1.0.0", 553 | "bitflags", 554 | "bxcan", 555 | "cast", 556 | "cortex-m 0.7.7", 557 | "cortex-m-rt", 558 | "display-interface", 559 | "embedded-hal", 560 | "fugit", 561 | "fugit-timer", 562 | "micromath 2.0.0", 563 | "nb 1.1.0", 564 | "rand_core", 565 | "stm32-fmc", 566 | "stm32f7", 567 | "synopsys-usb-otg", 568 | "time", 569 | "void", 570 | ] 571 | 572 | [[package]] 573 | name = "syn" 574 | version = "1.0.109" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 577 | dependencies = [ 578 | "proc-macro2", 579 | "quote", 580 | "unicode-ident", 581 | ] 582 | 583 | [[package]] 584 | name = "synopsys-usb-otg" 585 | version = "0.2.4" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "d1216cb0fe29f65bfffe03c364640202eed1291d85d2f62bbadbe670106786e5" 588 | dependencies = [ 589 | "cortex-m 0.6.7", 590 | "usb-device", 591 | "vcell", 592 | ] 593 | 594 | [[package]] 595 | name = "time" 596 | version = "0.3.21" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" 599 | dependencies = [ 600 | "time-core", 601 | ] 602 | 603 | [[package]] 604 | name = "time-core" 605 | version = "0.1.1" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" 608 | 609 | [[package]] 610 | name = "typenum" 611 | version = "1.16.0" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 614 | 615 | [[package]] 616 | name = "ufmt-write" 617 | version = "0.1.0" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" 620 | 621 | [[package]] 622 | name = "unicode-ident" 623 | version = "1.0.8" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 626 | 627 | [[package]] 628 | name = "usb-device" 629 | version = "0.2.9" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508" 632 | 633 | [[package]] 634 | name = "usbd-dfu" 635 | version = "0.2.0" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "4ec4d1eebd92f4805553a45947d87b0cf9ba53960040a2fa5ed2abcad2ae62e5" 638 | dependencies = [ 639 | "usb-device", 640 | ] 641 | 642 | [[package]] 643 | name = "vcell" 644 | version = "0.1.3" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" 647 | 648 | [[package]] 649 | name = "version_check" 650 | version = "0.9.4" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 653 | 654 | [[package]] 655 | name = "void" 656 | version = "1.0.2" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 659 | 660 | [[package]] 661 | name = "volatile-register" 662 | version = "0.2.1" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" 665 | dependencies = [ 666 | "vcell", 667 | ] 668 | 669 | [[patch.unused]] 670 | name = "citrus-cas" 671 | version = "0.0.1" 672 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = ["board-support", "bootloader", "os"] 3 | 4 | [profile.dev.package."*"] 5 | opt-level = "s" 6 | 7 | [profile.dev] 8 | opt-level = "z" 9 | debug = 1 10 | debug-assertions = false 11 | overflow-checks = false 12 | lto = true 13 | panic = 'abort' 14 | incremental = false 15 | codegen-units = 1 16 | rpath = false 17 | 18 | [profile.release.package."*"] 19 | opt-level = "s" 20 | 21 | [profile.release] 22 | codegen-units = 1 23 | debug = true 24 | panic = "abort" 25 | opt-level = "z" 26 | lto = true 27 | 28 | [patch.'https://github.com/nw-rs/board-support.git'] 29 | nw-board-support = { path = "./board-support" } 30 | 31 | [patch.'https://github.com/nw-rs/citrus-cas.git'] 32 | citrus-cas = { path = "./citrus-cas" } 33 | 34 | [patch.'https://github.com/nw-rs/bootloader.git'] 35 | nw-bootloader = { path = "./bootloader" } 36 | 37 | -------------------------------------------------------------------------------- /Embed.toml: -------------------------------------------------------------------------------- 1 | [default.probe] 2 | protocol = "Swd" 3 | speed = 2000 4 | 5 | [default.flashing] 6 | enabled = true 7 | 8 | [default.reset] 9 | enabled = true 10 | halt_afterwards = true 11 | 12 | [default.general] 13 | chip = "stm32f730V8Tx" 14 | chip_descriptions = ["stm32f730v8t6.yaml"] 15 | 16 | [default.rtt] 17 | enabled = false 18 | timeout = 2 19 | show_timestamps = true 20 | 21 | [default.gdb] 22 | enabled = true 23 | gdb_connection_string = "localhost:1338" 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 nw-rs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # RustWorks 4 | 5 | *Creating a truly free operating system for calculators.* 6 |
7 | 8 |
9 | 10 | [![GitHub issues](https://img.shields.io/github/issues/nw-rs/rustworks?style=flat-square)](https://github.com/nw-rs/rustworks/issues) 11 | ![GitHub pull requests](https://img.shields.io/github/issues-pr/nw-rs/rustworks?style=flat-square) 12 | [![GitHub forks](https://img.shields.io/github/forks/nw-rs/rustworks?style=flat-square)](https://github.com/nw-rs/rustworks/network) 13 | [![GitHub stars](https://img.shields.io/github/stars/nw-rs/rustworks?style=flat-square)](https://github.com/nw-rs/rustworks/stargazers) 14 | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/nw-rs/rustworks?style=flat-square) 15 | ![GitHub contributors](https://img.shields.io/github/contributors/nw-rs/rustworks?style=flat-square) 16 | ![Maintenance](https://img.shields.io/maintenance/yes/2022?style=flat-square) 17 | [![GitHub license](https://img.shields.io/github/license/nw-rs/rustworks?style=flat-square)](https://github.com/nw-rs/rustworks/blob/master/LICENSE) 18 | 19 |
20 | 21 | An operating system and bootloader for the NumWorks calculator (model n0110). 22 | 23 | ## Setup 24 | 25 | First follow the instructions in [`SETUP.md`](./SETUP.md) then clone the 26 | repository **recursively**: 27 | 28 | ```zsh 29 | git clone --recursive https://github.com/nw-rs/rustworks.git 30 | ``` 31 | 32 | Currently the bootloader and external flash drivers are not finished so 33 | everything must be flashed individually, please read the README of the 34 | submodule if you are interested in more information on flashing or 35 | using it. 36 | 37 | ## 🚧 Roadmap 🚧 38 | 39 | - [ ] Drivers for the External flash chip (read, write, XiP) **(highest priority)** 40 | - [ ] Finish CAS (rCAS) 41 | - [ ] REPL on the calculator to demonstrate the CAS 42 | - [ ] Multiple programs/apps with UI to choose one on boot 43 | - [ ] Support for 3rd party apps and binaries 44 | 45 | ## ❤️ Contributing ❤️ 46 | 47 | Contributions are extremely valued, specially now, since the lead developer (@willemml) has little time to work on this project. 48 | 49 | If you would like to contribute, please, fork the repo and open a Pull Request (PR). 50 | 51 | **Thank you!** 52 | 53 | ## ⚙️ Components ⚙️ 54 | 55 | RustWorks is composed of several components which are listed here: 56 | - [rcas](https://github.com/nw-rs/rcas) - Computer algebra system 57 | - [board-support](https://github.com/nw-rs/board-support) - Drivers for the calculator's hardware. Currently only supports NumWorks n0110 58 | - [bootloader](https://github.com/nw-rs/bootloader) - Prepares the processor for booting, initializes external flash and boots from it. Also used for installing and updating the OS code 59 | - [flash_algo](https://github.com/nw-rs/flash-algo) - Allows reading and writing to the calculator's flash storage using a debugger 60 | - [os](https://github.com/nw-rs/os) - Operating system code, user-interface and built in apps 61 | 62 | ## ⚖️ Licensing ⚖️ 63 | 64 | The code in this project is licensed under the MIT license. 65 | -------------------------------------------------------------------------------- /SETUP.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | 3 | This guide explains how to setup an embedded Rust development environment 4 | for the Numworks n0110 calculator. 5 | 6 | ## Install Rust 7 | 8 | To develop software in Rust you need the Rust toolchain which can be installed 9 | using rustup using the instructions at 10 | [rust-lang.org/tools/install](https://www.rust-lang.org/tools/install). 11 | 12 | ## Install the ARM toolchain 13 | 14 | To build for STM32 we need the GNU Arm Embedded Toolchain, you can either 15 | install it using a package manager or download the binaries directly from the 16 | [developer.arm.com](https://developer.arm.com/downloads/-/gnu-rm) and then add 17 | it to your path. 18 | 19 | Use the following instructions to use your operating system's package manager 20 | or if your OS isn't listed use the built in search function to find it. 21 | 22 | ### Debian based 23 | 24 | ```zsh 25 | sudo apt-get install gcc-arm-none-eabi 26 | ``` 27 | 28 | ### macOS 29 | 30 | Install [Homebrew](https://brew.sh/) then run the following: 31 | 32 | ```zsh 33 | brew tap osx-cross/arm 34 | brew install arm-gcc-bin 35 | ``` 36 | 37 | ## Install dfu-util 38 | 39 | If you don't have an STLink probe you will need to flash the calculator using 40 | DFU (you'll still need this to test your changes even if you have an STLink). 41 | You can get this by following the instructions on 42 | [the dfu-util homepage](http://dfu-util.sourceforge.net/). 43 | 44 | ## Install cargo tools 45 | 46 | RustWorks and some related projects use 47 | [`cargo-make`](https://sagiegurari.github.io/cargo-make/) to make flashing 48 | easier and 49 | [`cargo-binutils`](https://github.com/rust-embedded/cargo-binutils) to convert 50 | the output of `cargo build` into raw binaries. Install them using the following 51 | commands: 52 | 53 | ```zsh 54 | cargo install cargo-binutils 55 | cargo install cargo-make 56 | ``` 57 | 58 | We also need to add the `thumbv7em-none-eabi` target to Rust and install the 59 | Rust LLVM tools preview: 60 | 61 | ```zsh 62 | rustup target add thumbv7em-none-eabihf 63 | rustup component add llvm-tools-preview 64 | ``` 65 | 66 | If you have an STLink probe you can also install `probe-run`, `cargo-embed` and 67 | `cargo-flash` to make flashing and debugging easier: 68 | 69 | ```zsh 70 | cargo install probe-run 71 | cargo install cargo-embed 72 | cargo install cargo-flash 73 | ``` 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "fenix": { 4 | "inputs": { 5 | "nixpkgs": [ 6 | "nixpkgs" 7 | ], 8 | "rust-analyzer-src": "rust-analyzer-src" 9 | }, 10 | "locked": { 11 | "lastModified": 1683613339, 12 | "narHash": "sha256-QSQtAOeIy1XabNXCkpk4E1Gz14Oqolkvp6wtaIZ3dkQ=", 13 | "owner": "nix-community", 14 | "repo": "fenix", 15 | "rev": "55a548eaef105815905977b8470ee35c67e67b7b", 16 | "type": "github" 17 | }, 18 | "original": { 19 | "owner": "nix-community", 20 | "repo": "fenix", 21 | "type": "github" 22 | } 23 | }, 24 | "flake-utils": { 25 | "inputs": { 26 | "systems": "systems" 27 | }, 28 | "locked": { 29 | "lastModified": 1681202837, 30 | "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", 31 | "owner": "numtide", 32 | "repo": "flake-utils", 33 | "rev": "cfacdce06f30d2b68473a46042957675eebb3401", 34 | "type": "github" 35 | }, 36 | "original": { 37 | "owner": "numtide", 38 | "repo": "flake-utils", 39 | "type": "github" 40 | } 41 | }, 42 | "nixpkgs": { 43 | "locked": { 44 | "lastModified": 1683408522, 45 | "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", 46 | "owner": "NixOS", 47 | "repo": "nixpkgs", 48 | "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", 49 | "type": "github" 50 | }, 51 | "original": { 52 | "owner": "NixOS", 53 | "ref": "nixos-unstable", 54 | "repo": "nixpkgs", 55 | "type": "github" 56 | } 57 | }, 58 | "root": { 59 | "inputs": { 60 | "fenix": "fenix", 61 | "flake-utils": "flake-utils", 62 | "nixpkgs": "nixpkgs" 63 | } 64 | }, 65 | "rust-analyzer-src": { 66 | "flake": false, 67 | "locked": { 68 | "lastModified": 1683571499, 69 | "narHash": "sha256-SUs1qlsGJB09yjAKLQIJVxUPHGUdcayzE9IOkV4XRFM=", 70 | "owner": "rust-lang", 71 | "repo": "rust-analyzer", 72 | "rev": "c26a43d6bd660eba94500645a47f931e153015d8", 73 | "type": "github" 74 | }, 75 | "original": { 76 | "owner": "rust-lang", 77 | "ref": "nightly", 78 | "repo": "rust-analyzer", 79 | "type": "github" 80 | } 81 | }, 82 | "systems": { 83 | "locked": { 84 | "lastModified": 1681028828, 85 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 86 | "owner": "nix-systems", 87 | "repo": "default", 88 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 89 | "type": "github" 90 | }, 91 | "original": { 92 | "owner": "nix-systems", 93 | "repo": "default", 94 | "type": "github" 95 | } 96 | } 97 | }, 98 | "root": "root", 99 | "version": 7 100 | } 101 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "A simple flake"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 6 | fenix.url = "github:nix-community/fenix"; 7 | fenix.inputs.nixpkgs.follows = "nixpkgs"; 8 | flake-utils.url = "github:numtide/flake-utils"; 9 | }; 10 | 11 | outputs = { 12 | self, 13 | nixpkgs, 14 | fenix, 15 | flake-utils, 16 | }: 17 | flake-utils.lib.eachDefaultSystem ( 18 | system: let 19 | pkgs = import nixpkgs { 20 | inherit system; 21 | overlays = [fenix.overlays.default]; 22 | }; 23 | in { 24 | devShells.default = pkgs.mkShell { 25 | packages = let 26 | arm-gcc = 27 | if system == "aarch64-darwin" 28 | then (pkgs // {system = "x86_64-darwin";}).gcc-arm-embedded 29 | else pkgs.gcc-arm-embedded; 30 | rust-toolchain = fenix.packages.${system}.combine (with fenix.packages.${system}; [ 31 | latest.toolchain 32 | targets.thumbv7em-none-eabihf.latest.rust-std 33 | ]); 34 | in 35 | with pkgs; [ 36 | arm-gcc 37 | cargo-binutils 38 | cargo-embed 39 | cargo-flash 40 | cargo-make 41 | dfu-util 42 | probe-run 43 | rust-toolchain 44 | stlink-gui 45 | ]; 46 | }; 47 | } 48 | ); 49 | } 50 | -------------------------------------------------------------------------------- /openocd.cfg: -------------------------------------------------------------------------------- 1 | source [find interface/stlink.cfg] 2 | 3 | transport select hla_swd 4 | 5 | source [find target/stm32f7x.cfg] 6 | 7 | reset_config none separate 8 | 9 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly" 3 | targets = ["thumbv7em-none-eabihf"] 4 | profile = "complete" 5 | -------------------------------------------------------------------------------- /stm32f730v8t6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: STM32F7 Series 3 | variants: 4 | - name: STM32F730V8Tx 5 | cores: 6 | - name: main 7 | type: armv7em 8 | core_access_options: 9 | Arm: 10 | ap: 0x0 11 | psel: 0x0 12 | memory_map: 13 | - Ram: 14 | range: 15 | start: 0x20000000 16 | end: 0x20040000 17 | is_boot_memory: false 18 | cores: 19 | - main 20 | - Nvm: 21 | range: 22 | start: 0x8000000 23 | end: 0x8010000 24 | is_boot_memory: true 25 | cores: 26 | - main 27 | - Nvm: 28 | range: 29 | start: 0x90000000 30 | end: 0x90800000 31 | is_boot_memory: false 32 | cores: 33 | - main 34 | flash_algorithms: 35 | - stm32f7x_64_axi 36 | - stm32f730_qspi_adesto 37 | flash_algorithms: 38 | - name: stm32f7x_64_axi 39 | description: STM32F7xx 64k AXI Flash 40 | cores: 41 | - main 42 | default: true 43 | instructions: v/NPj3BHwPOEMAgoAtMEIQHr0ABwR1RIUkkBYFNJAWAAIQAfAWBQSAgwAWhB8PABAWBNSBAwAGiABgjUTEhF8lVRAWAGIUFgQPb/cYFgACBwR0VIDDABaEHwAEEBYAAgcEcQtUBMDDQgaEDwBAAgYCBoQPSAMCBgPUkiH0r2qiAA4AhgE2jbA/vUIGgg8AQAIGAAIBC9ELX/97X/MkkIMQpoQvDwAgpgAiIMHSJgImh4IwPqwAACQyJgIGhA9IAwIGArSkr2qiAA4BBgC2jbA/vUIGgg8AIAIGAIaBDw8AAE0AhoQPDwAAhgASAQvfC1HUzJHCHwAwEINCNoQ/DwAyNgACMlHStgQPIBLBhPSvaqJiLgK2hD6gwDK2DA8xMOE2hO8ABuzvgAML/zT48A4D5gI2jbA/vUK2gj8AEDK2AjaBPw8A8F0CBoQPDwACBgASDwvQAdCR8SHQAp2tEAIPC9AAAjAWdFBDwCQKuJ780AMABAAAAAAA== 44 | pc_init: 0x17 45 | pc_uninit: 0x53 46 | pc_program_page: 0xef 47 | pc_erase_sector: 0x97 48 | pc_erase_all: 0x63 49 | data_section_offset: 0x174 50 | flash_properties: 51 | address_range: 52 | start: 0x8000000 53 | end: 0x8010000 54 | page_size: 0x400 55 | erased_byte_value: 0xff 56 | program_page_timeout: 0x3e8 57 | erase_sector_timeout: 0x1770 58 | sectors: 59 | - size: 0x4000 60 | address: 0x0 61 | - name: stm32f730_qspi_adesto 62 | description: STM32F730V8T6 Adesto 8MB Flash AT25SF641 63 | cores: 64 | - main 65 | default: false 66 | instructions: 8LWBsEpPf0Q4eAEoCL8A8JH4Q/YYAE/2JELE8gIAz/b/cgFqCSVC8iAECiZB8AIBAWIBaEHwAgEBYAFoIfACAQFggWlB8B4BgWFA8gBAxPICAAFqIfAPIUHwIGFB9BBhAWJA9gBBxPICAYtYZfMHE4tQmSNKamPzF0JKYkHyAALE8gICE2pl8wsjE2IDaEPyMAWrQyNDA2DQ+AA0AiRk85NDwPgANAtoZvMbYwtgE2hk8wUTE2CDaCtDg2DQ+Ag0Q/RAI8D4CDSIaEDwcGCIYJBoASE5cEDyASFA8DAAkGBB8gAAwPIWAcryAABBYAEhwPIAMQFgqyAAIQDwmfhE8kAlwPIPBQDw1/gBPfvRUCAAIQDwjfgxIAEhASQA8Ij4OCAAIQDwhPg8cAAgAbDwvbICAAAQtQZMfEQgeAEoHL8BIBC9/yAA8Iz4ACAgcBC9gAEAAIC1CEh4RAB4ASgcvwEggL0GIADwfPjHIADwefgA8If4ACCAvWABAACwtQRGDkh4RAB4ASgS0QYgAPBp+EHyCAVM8tgwyvIABcDyAgBsYehgKGiABgTVAPCF+PnnASCwvQDwZfgAILC9NgEAAPC1gbAGRhlIeEQAeAEoKNEGIBRGDUYA8ET4LbNB8ggHaB7K8gAHJUS4YEzyAjDA8gIwfmH4YDhoQAcC1ADwXPj552AcIXioQjl2BEbz0QHgAPBS+DhogAb61ADwMvgAIADgASABsPC9/t4Av/AAAAAQtUHyCAQAIsryAASiYCGxAiFhYU/0gkEB4E/0gHHAsghD4GAgaIAGWL8QvQDwLPj45xC1QfIIBAMhyvIABGHzHyDgYCBogAZYvxC9APAc+Pjn8LWBsEHyCARA8gU2yvIABAAlwPIAdqVg5mCnaSBogAYC1QDwCPj55/gHAtAA8AP48ecBsPC9AL9wRwDU1NQ= 67 | pc_init: 0x01 68 | pc_uninit: 309 69 | pc_program_page: 449 70 | pc_erase_sector: 381 71 | pc_erase_all: 341 72 | data_section_offset: 4740 73 | flash_properties: 74 | address_range: 75 | start: 0x90000000 76 | end: 0x90800000 77 | page_size: 256 78 | erased_byte_value: 255 79 | program_page_timeout: 3000 80 | erase_sector_timeout: 3000 81 | sectors: 82 | - size: 65536 83 | address: 0 84 | core: M7 85 | --------------------------------------------------------------------------------