commit 611420a4dcf6c7da686a5976815e35d531e69de6 Author: baldeau Date: Fri Jan 3 16:15:22 2025 +0100 initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..72c0dce Binary files /dev/null and b/.DS_Store differ diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..d1ac1e2 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,8 @@ +[build] +target = "thumbv7em-none-eabihf" + +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +rustflags = [ + "-C", "link-arg=-Tlink.x", + "-C", "link-arg=--nmagic", +] \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ad07676 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,652 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytemuck" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byterepr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7eb1a05c2ec66850db33d8dd2119626aef815662a074656a74bbe47a562fdf4" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cortex-m" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" +dependencies = [ + "bare-metal", + "bitfield", + "critical-section", + "embedded-hal", + "volatile-register", +] + +[[package]] +name = "cortex-m-rt" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6" +dependencies = [ + "cortex-m-rt-macros", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.94", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "embedded-dma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "994f7e5b5cb23521c22304927195f236813053eb9c065dd2226a32ba64695446" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-storage" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + +[[package]] +name = "fixed" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c6e0b89bf864acd20590dbdbad56f69aeb898abfc9443008fd7bd48b2cc85a" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + +[[package]] +name = "flatbuffers" +version = "23.5.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640" +dependencies = [ + "bitflags", + "rustc_version 0.4.1", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "microflow" +version = "0.1.3" +dependencies = [ + "libm", + "microflow-macros", + "nalgebra 0.33.2", + "simba 0.9.0", +] + +[[package]] +name = "microflow-macros" +version = "0.1.1" +dependencies = [ + "byterepr", + "flatbuffers", + "nalgebra 0.32.6", + "proc-macro-error", + "proc-macro2", + "quote", + "simba 0.8.1", + "structmeta", + "syn 2.0.94", +] + +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba 0.8.1", + "typenum", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba 0.9.0", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.94", +] + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "nrf-hal-common" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea48ed7f0843fe6ec5aac0c42701e9194adfa1ee82ce6d028d64e5f68542be4" +dependencies = [ + "cast", + "cfg-if", + "cortex-m", + "embedded-dma", + "embedded-hal", + "embedded-storage", + "fixed", + "nb 1.1.0", + "nrf-usbd", + "nrf52840-pac", + "rand_core", + "void", +] + +[[package]] +name = "nrf-usbd" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b2907c0b3ec4d264981c1fc5a2321d51c463d5a63d386e573f00e84d5495e6" +dependencies = [ + "cortex-m", + "critical-section", + "usb-device", + "vcell", +] + +[[package]] +name = "nrf52840-hal" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709f85690f7f8d04612a18838785ee9176e1292ce3e53f0c68692b4cf5b4948e" +dependencies = [ + "embedded-hal", + "nrf-hal-common", + "nrf52840-pac", +] + +[[package]] +name = "nrf52840-pac" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30713f36f1be02e5bc9abefa30eae4a1f943d810f199d4923d3ad062d1be1b3d" +dependencies = [ + "cortex-m", + "cortex-m-rt", + "vcell", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.24", +] + +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.94", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.94", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tflite_demo" +version = "0.1.0" +dependencies = [ + "cortex-m", + "cortex-m-rt", + "heapless", + "libm", + "microflow", + "nalgebra 0.33.2", + "nrf52840-hal", + "usb-device", + "usbd-serial", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "usb-device" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508" + +[[package]] +name = "usbd-serial" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db75519b86287f12dcf0d171c7cf4ecc839149fe9f3b720ac4cfce52959e1dfe" +dependencies = [ + "embedded-hal", + "nb 0.1.3", + "usb-device", +] + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "volatile-register" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc" +dependencies = [ + "vcell", +] + +[[package]] +name = "wide" +version = "0.7.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" +dependencies = [ + "bytemuck", + "safe_arch", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0f49a8e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +members = [ + "tflite_demo" +] + +[workspace.dependencies] +cortex-m = { version = "0.7.7", features = ["critical-section-single-core", "inline-asm"] } +cortex-m-rt = "0.7.2" +nrf52840-hal = "0.16.0" +usb-device = "0.2.7" +usbd-serial = "0.1.0" +microflow = { path = "../microflow-rs" } +# microflow = "0.1.3" +nalgebra = { version = "0.33.2", default-features = false, features = ["macros"] } +libm = "0.2" +panic-halt = "1.0.0" +heapless = "0.8.0" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f2056c --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# xiao_pet_tracker_rust \ No newline at end of file diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..d4dbebf --- /dev/null +++ b/build.rs @@ -0,0 +1,6 @@ +fn main() { + // Rebuild if memory.x file was rebuild. + // Linker seems to pick it up automatically. + // (via the include in link.x which is added with a linker argument!) + println!("cargo:rerun-if-changed=memory.x"); +} \ No newline at end of file diff --git a/build_and_flash.sh b/build_and_flash.sh new file mode 100755 index 0000000..ec4b233 --- /dev/null +++ b/build_and_flash.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +COM_PORT=/dev/cu.usbmodem1101 + +while getopts 'abc:h' opt; do + case "$opt" in + ?|h) + echo "Usage: $(basename $0) crate_name" + exit 1 + ;; + esac +done +shift "$(($OPTIND -1))" +CRATE=$1 + +cargo build -p $CRATE --release +arm-none-eabi-objcopy -O ihex target/thumbv7em-none-eabihf/release/$CRATE target/$CRATE.hex +adafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0x0123 --application target/$CRATE.hex target/$CRATE.zip +adafruit-nrfutil --verbose dfu serial -pkg target/$CRATE.zip -p $COM_PORT -b 115200 --singlebank \ No newline at end of file diff --git a/flashing_time.py b/flashing_time.py new file mode 100755 index 0000000..7784ed7 --- /dev/null +++ b/flashing_time.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +from subprocess import run + +# requires pySerial: +# python -m pip install pyserial +import serial + +# grab the port for the seeed nrf52 (only connect one at a time) +data = run("ls /dev/ | grep 'cu.usbmodem'", capture_output=True, shell=True, text=True) + +ser = serial.Serial("/dev/" + data.stdout.strip(), 1200) +# send 16 null characters as reset signal to enter the bootloader +ser.write(b"\x00" * 16) +ser.close() diff --git a/memory.x b/memory.x new file mode 100644 index 0000000..7a7d5e0 --- /dev/null +++ b/memory.x @@ -0,0 +1,18 @@ +MEMORY +{ + /* Need to leave space for the SoftDevice + These values are confirmed working for S140 7.3.0 + + They were extracted from the Arduino IDE plugin linked indirectly at https://wiki.seeedstudio.com/XIAO_BLE/ + */ + FLASH (rx) : ORIGIN = 0x27000, LENGTH = 0xED000 - 0x27000 + + /* SRAM required by Softdevice depend on + * - Attribute Table Size (Number of Services and Characteristics) + * - Vendor UUID count + * - Max ATT MTU + * - Concurrent connection peripheral + central + secure links + * - Event Len, HVN queue, Write CMD queue + */ + RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000 +} \ No newline at end of file diff --git a/tflite_demo/Cargo.toml b/tflite_demo/Cargo.toml new file mode 100644 index 0000000..6090098 --- /dev/null +++ b/tflite_demo/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "tflite_demo" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +cortex-m.workspace = true +cortex-m-rt.workspace = true +nrf52840-hal.workspace = true +usb-device.workspace = true +usbd-serial.workspace = true +microflow.workspace = true +libm.workspace = true +nalgebra.workspace = true +heapless.workspace = true \ No newline at end of file diff --git a/tflite_demo/models/sine.tflite b/tflite_demo/models/sine.tflite new file mode 100644 index 0000000..5dee2c7 Binary files /dev/null and b/tflite_demo/models/sine.tflite differ diff --git a/tflite_demo/src/allocator.rs b/tflite_demo/src/allocator.rs new file mode 100644 index 0000000..82959d0 --- /dev/null +++ b/tflite_demo/src/allocator.rs @@ -0,0 +1,24 @@ +use alloc::alloc::*; + +/// The global allocator type. +#[derive(Default)] +pub struct Allocator; + +unsafe impl GlobalAlloc for Allocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + malloc(layout.size() as u32) as *mut u8 + } + unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) { + free(ptr as *mut c_void); + } +} + +/// If there is an out of memory error, just panic. +#[alloc_error_handler] +fn my_allocator_error(_layout: Layout) -> ! { + panic!("out of memory"); +} + +/// The static global allocator. +#[global_allocator] +static GLOBAL_ALLOCATOR: Allocator = Allocator; \ No newline at end of file diff --git a/tflite_demo/src/main.rs b/tflite_demo/src/main.rs new file mode 100644 index 0000000..e453313 --- /dev/null +++ b/tflite_demo/src/main.rs @@ -0,0 +1,130 @@ +#![no_main] +#![no_std] + +use hal::prelude::*; +use nrf52840_hal as hal; +use usb_device::class_prelude::UsbBusAllocator; +use core::fmt::Write; +use hal::Rtc; +use libm::sinf; +use microflow::model; +use nalgebra::matrix; + +use heapless::String; + +#[panic_handler] // panicking behavior +fn panic(_: &core::panic::PanicInfo) -> ! { + reset_into_dfu(); +} + +#[model("tflite_demo/models/sine.tflite")] +struct Sine; + +/// Resets the device into Device Firmware Update mode (DFU). +fn reset_into_dfu() -> ! { + // Via https://devzone.nordicsemi.com/f/nordic-q-a/50839/start-dfu-mode-or-open_bootloader-from-application-by-function-call + unsafe { (*hal::pac::POWER::PTR).gpregret.write(|w| w.bits(0xB1)) }; + hal::pac::SCB::sys_reset(); +} + +#[derive(Clone, Copy)] +enum LightState { + Red = 0, + Green = 1, + Blue = 2, +} + +#[cortex_m_rt::entry] +fn main() -> ! { + let peripherals = hal::pac::Peripherals::take().unwrap(); + let port0 = hal::gpio::p0::Parts::new(peripherals.P0); + let mut led_red = port0.p0_26.into_push_pull_output(hal::gpio::Level::Low); + let mut led_green = port0.p0_30.into_push_pull_output(hal::gpio::Level::Low); + let mut led_blue = port0.p0_06.into_push_pull_output(hal::gpio::Level::Low); + + let clocks = hal::clocks::Clocks::new(peripherals.CLOCK); + let clocks = clocks.enable_ext_hfosc(); + let usb_peripheral = hal::usbd::UsbPeripheral::new(peripherals.USBD, &clocks); + let usb_bus = UsbBusAllocator::new(hal::usbd::Usbd::new(usb_peripheral)); + let mut serial_port = usbd_serial::SerialPort::new(&usb_bus); + + let rtc = Rtc::new(peripherals.RTC0, 0).unwrap(); + rtc.enable_counter(); + + let mut usb_device = usb_device::device::UsbDeviceBuilder::new( + &usb_bus, + usb_device::device::UsbVidPid(0x16c0, 0x27dd), + ) + .manufacturer("Wumpftech") + .product("Wumpftech nRF52840") + .serial_number("wumpf1") + .device_class(usbd_serial::USB_CLASS_CDC) + .max_packet_size_0(64) // makes control transfers 8x faster says https://github.com/nrf-rs/nrf-hal/blob/master/examples/usb/src/bin/serial.rs + .build(); + + let x = 0.5; + let start = rtc.get_counter(); + let y_predicted = Sine::predict(matrix![x])[0]; + let end = rtc.get_counter(); + let y_exact = sinf(x); + + // TIMER0 is reserved by Softdevice + // https://devzone.nordicsemi.com/f/nordic-q-a/1160/soft-device-and-timers---how-do-they-work-together + let mut timer = hal::Timer::new(peripherals.TIMER1).into_periodic(); + timer.start(hal::Timer::::TICKS_PER_SECOND); + + let mut light = LightState::Red; + + loop { + light = match light { + LightState::Red => LightState::Green, + LightState::Green => LightState::Blue, + LightState::Blue => LightState::Red, + }; + match light { + LightState::Red => { + led_red.set_state(PinState::Low).unwrap(); + led_green.set_state(PinState::High).unwrap(); + led_blue.set_state(PinState::High).unwrap(); + } + LightState::Green => { + led_red.set_state(PinState::High).unwrap(); + led_green.set_state(PinState::Low).unwrap(); + led_blue.set_state(PinState::High).unwrap(); + } + LightState::Blue => { + // led_red.set_state(PinState::High).unwrap(); + // led_green.set_state(PinState::High).unwrap(); + // led_blue.set_state(PinState::Low).unwrap(); + //reset_into_dfu(); + } + } + + let text = y_predicted.to_bits(); + let mut data = String::<32>::new(); + + let text2 = y_exact.to_bits(); + let mut data2 = String::<32>::new(); + + let _ = serial_port.write("Hello World\n".as_bytes()); + + let _ = serial_port.write("Predicted Y: ".as_bytes()); + let _ = write!(data, "data:{text}"); + let _ = serial_port.write(data.as_bytes()); + let _ = serial_port.write("\n".as_bytes()); + + + let _ = serial_port.write("Exact Y: ".as_bytes()); + let _ = write!(data2, "data:{text2}"); + let _ = serial_port.write(data2.as_bytes()); + let _ = serial_port.write("\n".as_bytes()); + + + while timer.wait().is_err() { + // TODO: sleep. + // Spec says poll needs to be called at least every 10ms. + usb_device.poll(&mut [&mut serial_port]); + continue; + } + } +} \ No newline at end of file