lr-shuttle 0.2.3__tar.gz → 0.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/PKG-INFO +19 -1
  2. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/README.md +18 -0
  3. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/pyproject.toml +1 -1
  4. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/PKG-INFO +19 -1
  5. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/cli.py +453 -37
  6. lr_shuttle-0.2.8/src/shuttle/firmware/esp32c5/devboard.ino.bin +0 -0
  7. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/prodtest.py +1 -3
  8. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/serial_client.py +52 -2
  9. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/timo.py +64 -5
  10. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_cli.py +804 -14
  11. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_flash.py +1 -1
  12. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_serial_client.py +113 -4
  13. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_timo.py +47 -0
  14. lr_shuttle-0.2.3/src/shuttle/firmware/esp32c5/devboard.ino.bin +0 -0
  15. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/setup.cfg +0 -0
  16. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/SOURCES.txt +0 -0
  17. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/dependency_links.txt +0 -0
  18. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/entry_points.txt +0 -0
  19. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/requires.txt +0 -0
  20. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/lr_shuttle.egg-info/top_level.txt +0 -0
  21. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/constants.py +0 -0
  22. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/__init__.py +0 -0
  23. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/esp32c5/__init__.py +0 -0
  24. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/esp32c5/boot_app0.bin +0 -0
  25. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/esp32c5/devboard.ino.bootloader.bin +0 -0
  26. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/esp32c5/devboard.ino.partitions.bin +0 -0
  27. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/firmware/esp32c5/manifest.json +0 -0
  28. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/src/shuttle/flash.py +0 -0
  29. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_cli_client.py +0 -0
  30. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_cli_edge.py +0 -0
  31. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_cli_seq.py +0 -0
  32. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_cli_utils.py +0 -0
  33. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_prodtest_edge.py +0 -0
  34. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_prodtest_helpers.py +0 -0
  35. {lr_shuttle-0.2.3 → lr_shuttle-0.2.8}/tests/test_timo_write.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lr-shuttle
3
- Version: 0.2.3
3
+ Version: 0.2.8
4
4
  Summary: CLI and Python client for host-side of json based serial communication with embedded device bridge.
5
5
  Author-email: Jonas Estberger <jonas.estberger@lumenradio.com>
6
6
  License: MIT
@@ -119,6 +119,7 @@ Commands implementing the SPI protocol as described at [docs.lumenradio.io/timot
119
119
  | `shuttle timo read-reg --addr 0x05 --length 2` | Performs the two-phase TiMo register read sequence and decodes the resulting payload/IRQ flags. |
120
120
  | `shuttle timo write-reg --addr 0x05 --data cafebabe` | Performs the two-phase TiMo register write sequence to write bytes to a register. |
121
121
  | `shuttle timo read-dmx --length 12` | Reads the latest received DMX values from the TiMo device using a two-phase SPI sequence. |
122
+ | `shuttle timo update-fw TIMO.cci --port /dev/ttyUSB0` | Streams a TiMo `.cci` firmware image via FW_BLOCK commands (requires SPI ≤ 2 MHz and ≥ 255-byte transfers). |
122
123
 
123
124
  All commands respect the global options declared on the root CLI (`--log`, `--seq-meta`, `--port`, etc.). Rich tables are used to render human-friendly summaries of responses and decoded payloads.
124
125
 
@@ -174,6 +175,23 @@ This will print a summary table with the length, data bytes (hex), and IRQ flags
174
175
  - `--port` is your serial device
175
176
 
176
177
 
178
+ ### TiMo Firmware Update
179
+
180
+ Use `shuttle timo update-fw` to push official `.cci` images (for example `timotwo-fx-b50f26ad.cci`; the companion `.hex` is provided for reference only) through the Shuttle bridge without touching an external programmer:
181
+
182
+ ```bash
183
+ shuttle timo update-fw timotwo-fx-b50f26ad.cci --port /dev/ttyUSB0
184
+ ```
185
+
186
+ - The command first checks `spi_caps.max_transfer_bytes` and the current SPI clock. Firmware updates require at least 255 bytes per `spi.xfer` call and a clock ≤ 2 MHz. Run `shuttle spi-cfg --hz 2000000` (or lower) if the persisted setting is faster.
187
+ - Shuttle enables SPI, sets TiMo into UPDATE_MODE by writing `0x40` to CONFIG, waits for the IRQ reboot window (0.6 s), and verifies bit 7 of STATUS before streaming data.
188
+ - `.cci` files contain a 4-byte header followed by 272-byte chunks. Because the TiMo FW loader accepts at most 255 contiguous bytes, each chunk is split into one `FW_BLOCK_CMD_1` transfer (0x8E + 254 bytes) and one `FW_BLOCK_CMD_2` transfer (0x8F + 18 bytes).
189
+ - The first chunk after the header carries metadata. After every 16 data chunks the device writes flash internally, so the CLI pauses for `--flush-wait-ms` (defaults to 500 ms) before continuing. When the whole image has been sent it waits `--final-wait-ms` (defaults to 1000 ms) to let TiMo finalize the update.
190
+ - Once STATUS clears UPDATE_MODE the command reads the VERSION register, prints FW/HW revisions, and confirms completion. If any step fails (IRQ bit 7, transport error, malformed `.cci`) the CLI aborts with a helpful message.
191
+
192
+ Tip: combine `--flush-wait-ms 0` and `--final-wait-ms 0` with a lab DUT when replaying the same firmware repeatedly, but keep the defaults when programming production hardware to honour the vendor timing guidelines.
193
+
194
+
177
195
  ### Using the Library from Python
178
196
 
179
197
  Use the transport helpers for HIL tests with explicit request→response pairing:
@@ -93,6 +93,7 @@ Commands implementing the SPI protocol as described at [docs.lumenradio.io/timot
93
93
  | `shuttle timo read-reg --addr 0x05 --length 2` | Performs the two-phase TiMo register read sequence and decodes the resulting payload/IRQ flags. |
94
94
  | `shuttle timo write-reg --addr 0x05 --data cafebabe` | Performs the two-phase TiMo register write sequence to write bytes to a register. |
95
95
  | `shuttle timo read-dmx --length 12` | Reads the latest received DMX values from the TiMo device using a two-phase SPI sequence. |
96
+ | `shuttle timo update-fw TIMO.cci --port /dev/ttyUSB0` | Streams a TiMo `.cci` firmware image via FW_BLOCK commands (requires SPI ≤ 2 MHz and ≥ 255-byte transfers). |
96
97
 
97
98
  All commands respect the global options declared on the root CLI (`--log`, `--seq-meta`, `--port`, etc.). Rich tables are used to render human-friendly summaries of responses and decoded payloads.
98
99
 
@@ -148,6 +149,23 @@ This will print a summary table with the length, data bytes (hex), and IRQ flags
148
149
  - `--port` is your serial device
149
150
 
150
151
 
152
+ ### TiMo Firmware Update
153
+
154
+ Use `shuttle timo update-fw` to push official `.cci` images (for example `timotwo-fx-b50f26ad.cci`; the companion `.hex` is provided for reference only) through the Shuttle bridge without touching an external programmer:
155
+
156
+ ```bash
157
+ shuttle timo update-fw timotwo-fx-b50f26ad.cci --port /dev/ttyUSB0
158
+ ```
159
+
160
+ - The command first checks `spi_caps.max_transfer_bytes` and the current SPI clock. Firmware updates require at least 255 bytes per `spi.xfer` call and a clock ≤ 2 MHz. Run `shuttle spi-cfg --hz 2000000` (or lower) if the persisted setting is faster.
161
+ - Shuttle enables SPI, sets TiMo into UPDATE_MODE by writing `0x40` to CONFIG, waits for the IRQ reboot window (0.6 s), and verifies bit 7 of STATUS before streaming data.
162
+ - `.cci` files contain a 4-byte header followed by 272-byte chunks. Because the TiMo FW loader accepts at most 255 contiguous bytes, each chunk is split into one `FW_BLOCK_CMD_1` transfer (0x8E + 254 bytes) and one `FW_BLOCK_CMD_2` transfer (0x8F + 18 bytes).
163
+ - The first chunk after the header carries metadata. After every 16 data chunks the device writes flash internally, so the CLI pauses for `--flush-wait-ms` (defaults to 500 ms) before continuing. When the whole image has been sent it waits `--final-wait-ms` (defaults to 1000 ms) to let TiMo finalize the update.
164
+ - Once STATUS clears UPDATE_MODE the command reads the VERSION register, prints FW/HW revisions, and confirms completion. If any step fails (IRQ bit 7, transport error, malformed `.cci`) the CLI aborts with a helpful message.
165
+
166
+ Tip: combine `--flush-wait-ms 0` and `--final-wait-ms 0` with a lab DUT when replaying the same firmware repeatedly, but keep the defaults when programming production hardware to honour the vendor timing guidelines.
167
+
168
+
151
169
  ### Using the Library from Python
152
170
 
153
171
  Use the transport helpers for HIL tests with explicit request→response pairing:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "lr-shuttle"
7
- version = "0.2.3"
7
+ version = "0.2.8"
8
8
  description = "CLI and Python client for host-side of json based serial communication with embedded device bridge."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lr-shuttle
3
- Version: 0.2.3
3
+ Version: 0.2.8
4
4
  Summary: CLI and Python client for host-side of json based serial communication with embedded device bridge.
5
5
  Author-email: Jonas Estberger <jonas.estberger@lumenradio.com>
6
6
  License: MIT
@@ -119,6 +119,7 @@ Commands implementing the SPI protocol as described at [docs.lumenradio.io/timot
119
119
  | `shuttle timo read-reg --addr 0x05 --length 2` | Performs the two-phase TiMo register read sequence and decodes the resulting payload/IRQ flags. |
120
120
  | `shuttle timo write-reg --addr 0x05 --data cafebabe` | Performs the two-phase TiMo register write sequence to write bytes to a register. |
121
121
  | `shuttle timo read-dmx --length 12` | Reads the latest received DMX values from the TiMo device using a two-phase SPI sequence. |
122
+ | `shuttle timo update-fw TIMO.cci --port /dev/ttyUSB0` | Streams a TiMo `.cci` firmware image via FW_BLOCK commands (requires SPI ≤ 2 MHz and ≥ 255-byte transfers). |
122
123
 
123
124
  All commands respect the global options declared on the root CLI (`--log`, `--seq-meta`, `--port`, etc.). Rich tables are used to render human-friendly summaries of responses and decoded payloads.
124
125
 
@@ -174,6 +175,23 @@ This will print a summary table with the length, data bytes (hex), and IRQ flags
174
175
  - `--port` is your serial device
175
176
 
176
177
 
178
+ ### TiMo Firmware Update
179
+
180
+ Use `shuttle timo update-fw` to push official `.cci` images (for example `timotwo-fx-b50f26ad.cci`; the companion `.hex` is provided for reference only) through the Shuttle bridge without touching an external programmer:
181
+
182
+ ```bash
183
+ shuttle timo update-fw timotwo-fx-b50f26ad.cci --port /dev/ttyUSB0
184
+ ```
185
+
186
+ - The command first checks `spi_caps.max_transfer_bytes` and the current SPI clock. Firmware updates require at least 255 bytes per `spi.xfer` call and a clock ≤ 2 MHz. Run `shuttle spi-cfg --hz 2000000` (or lower) if the persisted setting is faster.
187
+ - Shuttle enables SPI, sets TiMo into UPDATE_MODE by writing `0x40` to CONFIG, waits for the IRQ reboot window (0.6 s), and verifies bit 7 of STATUS before streaming data.
188
+ - `.cci` files contain a 4-byte header followed by 272-byte chunks. Because the TiMo FW loader accepts at most 255 contiguous bytes, each chunk is split into one `FW_BLOCK_CMD_1` transfer (0x8E + 254 bytes) and one `FW_BLOCK_CMD_2` transfer (0x8F + 18 bytes).
189
+ - The first chunk after the header carries metadata. After every 16 data chunks the device writes flash internally, so the CLI pauses for `--flush-wait-ms` (defaults to 500 ms) before continuing. When the whole image has been sent it waits `--final-wait-ms` (defaults to 1000 ms) to let TiMo finalize the update.
190
+ - Once STATUS clears UPDATE_MODE the command reads the VERSION register, prints FW/HW revisions, and confirms completion. If any step fails (IRQ bit 7, transport error, malformed `.cci`) the CLI aborts with a helpful message.
191
+
192
+ Tip: combine `--flush-wait-ms 0` and `--final-wait-ms 0` with a lab DUT when replaying the same firmware repeatedly, but keep the defaults when programming production hardware to honour the vendor timing guidelines.
193
+
194
+
177
195
  ### Using the Library from Python
178
196
 
179
197
  Use the transport helpers for HIL tests with explicit request→response pairing: