firestarter 3.2.2__tar.gz → 3.2.3__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 (211) hide show
  1. {firestarter-3.2.2/firestarter.egg-info → firestarter-3.2.3}/PKG-INFO +1 -1
  2. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/_version.py +3 -3
  3. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/data/chip_database.json +29 -29
  4. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/data/pinouts.json +26 -3
  5. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/database.py +16 -4
  6. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/ic_layout.py +12 -3
  7. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/jumper_table.py +21 -0
  8. {firestarter-3.2.2 → firestarter-3.2.3/firestarter.egg-info}/PKG-INFO +1 -1
  9. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/scm_file_list.json +1 -0
  10. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/scm_version.json +2 -2
  11. {firestarter-3.2.2 → firestarter-3.2.3}/tests/golden/wire_dict.json +87 -58
  12. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_build_db_pinout_fork.py +40 -0
  13. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_eprom_database.py +58 -1
  14. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_ic_layout.py +36 -0
  15. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_jumper_table.py +3 -1
  16. {firestarter-3.2.2 → firestarter-3.2.3}/LICENSE +0 -0
  17. {firestarter-3.2.2 → firestarter-3.2.3}/MANIFEST.in +0 -0
  18. {firestarter-3.2.2 → firestarter-3.2.3}/README.md +0 -0
  19. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/__init__.py +0 -0
  20. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/address_parser.py +0 -0
  21. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/avr_tool.py +0 -0
  22. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/channel.py +0 -0
  23. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/chip_resolver.py +0 -0
  24. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/chip_test.py +0 -0
  25. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/cli_handlers.py +0 -0
  26. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/codec.py +0 -0
  27. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/compare.py +0 -0
  28. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/config.py +0 -0
  29. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/constants.py +0 -0
  30. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/diagnostic_report.py +0 -0
  31. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/dip24_2816_erase_gate.py +0 -0
  32. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/eprom_info.py +0 -0
  33. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/eprom_operations.py +0 -0
  34. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/erase_support.py +0 -0
  35. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/exceptions.py +0 -0
  36. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/firmware.py +0 -0
  37. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/flash4_erase_gate.py +0 -0
  38. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/frame_parser.py +0 -0
  39. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/fw_release_gate.py +0 -0
  40. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/hardware.py +0 -0
  41. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/jp5_gate.py +0 -0
  42. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/lock_status.py +0 -0
  43. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/log_capture.py +0 -0
  44. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/logging_utils.py +0 -0
  45. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/main.py +0 -0
  46. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/messages.py +0 -0
  47. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/page_size_gate.py +0 -0
  48. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/protection_readability.py +0 -0
  49. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/py32_dfu.py +0 -0
  50. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/sdp_capability.py +0 -0
  51. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/sdp_honesty.py +0 -0
  52. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/serial_comm.py +0 -0
  53. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/submit.py +0 -0
  54. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/timestamps.py +0 -0
  55. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/transport_counters.py +0 -0
  56. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/utils.py +0 -0
  57. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/vpp_display.py +0 -0
  58. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter/write_blank_guard.py +0 -0
  59. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/SOURCES.txt +0 -0
  60. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/dependency_links.txt +0 -0
  61. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/entry_points.txt +0 -0
  62. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/requires.txt +0 -0
  63. {firestarter-3.2.2 → firestarter-3.2.3}/firestarter.egg-info/top_level.txt +0 -0
  64. {firestarter-3.2.2 → firestarter-3.2.3}/pyproject.toml +0 -0
  65. {firestarter-3.2.2 → firestarter-3.2.3}/setup.cfg +0 -0
  66. {firestarter-3.2.2 → firestarter-3.2.3}/tests/__init__.py +0 -0
  67. {firestarter-3.2.2 → firestarter-3.2.3}/tests/__snapshots__/test_characterization.ambr +0 -0
  68. {firestarter-3.2.2 → firestarter-3.2.3}/tests/conftest.py +0 -0
  69. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fake_chip.py +0 -0
  70. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/part_number_delta.json +0 -0
  71. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/report_shapes.py +0 -0
  72. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/at28c256-full-all-ok-sdp.json +0 -0
  73. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/attr01-status-axis-transport-fault.json +0 -0
  74. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/gh20-at28c256-fail.json +0 -0
  75. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/gh23-w27e257-fail.json +0 -0
  76. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/gh28-m27c512-fail.json +0 -0
  77. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/gh47-sst27sf512-pass.json +0 -0
  78. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-all-ok.json +0 -0
  79. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-blank-check-bad.json +0 -0
  80. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-canonical-name.json +0 -0
  81. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-comma-joined-name.json +0 -0
  82. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-runs-1.json +0 -0
  83. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/prune03-synthesized-fingerprint-match.json +0 -0
  84. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-full-all-ok.json +0 -0
  85. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step-readback-gated.json +0 -0
  86. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step.json +0 -0
  87. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-empty-results.json +0 -0
  88. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-no-ok.json +0 -0
  89. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/uv-slot-write-pass.json +0 -0
  90. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/reports/w27e257-full-all-ok.json +0 -0
  91. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/shape_ids.json +0 -0
  92. {firestarter-3.2.2 → firestarter-3.2.3}/tests/fixtures/synthetic_nonzero_chip_id.py +0 -0
  93. {firestarter-3.2.2 → firestarter-3.2.3}/tests/golden/build_db_part_specific_constants.json +0 -0
  94. {firestarter-3.2.2 → firestarter-3.2.3}/tests/golden/chip_database_field_inventory.json +0 -0
  95. {firestarter-3.2.2 → firestarter-3.2.3}/tests/plan_corpus.py +0 -0
  96. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_address_parser.py +0 -0
  97. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_b15_page_size_corroboration.py +0 -0
  98. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_blast_radius_invariance.py +0 -0
  99. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_boot_block_hint.py +0 -0
  100. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_budget_failure_render.py +0 -0
  101. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_bug_characterization.py +0 -0
  102. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_build_db_constant_census.py +0 -0
  103. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_build_db_inclusion.py +0 -0
  104. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_build_db_interpret_timing.py +0 -0
  105. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_canonical_part_number.py +0 -0
  106. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_characterization.py +0 -0
  107. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_database_field_inventory.py +0 -0
  108. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_name_resolution.py +0 -0
  109. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_resolver.py +0 -0
  110. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test.py +0 -0
  111. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test_blank_check_order.py +0 -0
  112. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test_cycle.py +0 -0
  113. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test_sdp_leg.py +0 -0
  114. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test_timing.py +0 -0
  115. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_chip_test_uv_slot_write.py +0 -0
  116. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_cli_handlers.py +0 -0
  117. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_click_group_gate_hook.py +0 -0
  118. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_cobs.py +0 -0
  119. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_codec.py +0 -0
  120. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_codec_format_message.py +0 -0
  121. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_compare.py +0 -0
  122. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_config.py +0 -0
  123. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_config_band_refusal.py +0 -0
  124. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_connect_cost_harness.py +0 -0
  125. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_consistency_check.py +0 -0
  126. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_coverage_floor_v18.py +0 -0
  127. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_database_conversion.py +0 -0
  128. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_datasheet_overrides.py +0 -0
  129. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_decoder.py +0 -0
  130. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_derive_plan_no_drop_sweep.py +0 -0
  131. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_derive_plan_structural_sentinel.py +0 -0
  132. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_dev_group_channel_gating.py +0 -0
  133. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_dev_test_cmd.py +0 -0
  134. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_dev_tools_channel_gate.py +0 -0
  135. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_devtest_firmware_error_propagation.py +0 -0
  136. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_dfu_opcode_anchors.py +0 -0
  137. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_diagnostic_report.py +0 -0
  138. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_dip24_2816_erase_gate.py +0 -0
  139. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_endpoint_constants.py +0 -0
  140. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_eprom_info.py +0 -0
  141. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_eprom_operations.py +0 -0
  142. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_erase_blank_step_nonregression.py +0 -0
  143. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_erase_flag_invariants.py +0 -0
  144. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_error_code_seam.py +0 -0
  145. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_even_block.py +0 -0
  146. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_extra_chips_supplement.py +0 -0
  147. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_firmware_install.py +0 -0
  148. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_flash4_erase_gate.py +0 -0
  149. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_list_failure_vs_empty.py +0 -0
  150. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_port_targeting_and_blind_install.py +0 -0
  151. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_release_gate.py +0 -0
  152. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_update_dead_endpoint.py +0 -0
  153. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_update_path_gate.py +0 -0
  154. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fw_version_guard.py +0 -0
  155. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_fwguard.py +0 -0
  156. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_hardware.py +0 -0
  157. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_hw_revision_gate.py +0 -0
  158. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_info_vpp_and_erase.py +0 -0
  159. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_jp5_gate.py +0 -0
  160. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_lock_status_class_partition.py +0 -0
  161. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_lock_status_cli.py +0 -0
  162. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_lock_status_wire.py +0 -0
  163. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_log_capture.py +0 -0
  164. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_logging_utils.py +0 -0
  165. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_matrix_artifact.py +0 -0
  166. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_page_size_alignment_refusal.py +0 -0
  167. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_page_size_invariants.py +0 -0
  168. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_page_size_write_refusal.py +0 -0
  169. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_parse_devtest_issue.py +0 -0
  170. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_probe_spurious_setup_ack.py +0 -0
  171. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_programming_vcc_census.py +0 -0
  172. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protect_flags_doc_measurements.py +0 -0
  173. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protection_resolution.py +0 -0
  174. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protection_status_catalog.py +0 -0
  175. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protection_table_citations.py +0 -0
  176. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protocol_not_implemented.py +0 -0
  177. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_protocol_not_implemented_production_path.py +0 -0
  178. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_provenance.py +0 -0
  179. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_pulse_us_override.py +0 -0
  180. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_py32_channel_gating.py +0 -0
  181. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_py32_dfu.py +0 -0
  182. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_py32_flash_map_host.py +0 -0
  183. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_py32_pyusb_absent.py +0 -0
  184. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_pyusb_api_surface.py +0 -0
  185. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_sdp_capability.py +0 -0
  186. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_sdp_db_invariant.py +0 -0
  187. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_sdp_honesty.py +0 -0
  188. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_serial_characterization.py +0 -0
  189. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_serial_comm.py +0 -0
  190. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_session_lease.py +0 -0
  191. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_setup_refusals.py +0 -0
  192. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_submit.py +0 -0
  193. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_timestamps.py +0 -0
  194. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_transport_counters.py +0 -0
  195. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_utils.py +0 -0
  196. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_uv_mask.py +0 -0
  197. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_validate_family_cmd.py +0 -0
  198. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_validate_oracle.py +0 -0
  199. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_validated_parts_regression_surface.py +0 -0
  200. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_vcc_margin_rail.py +0 -0
  201. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_vpp_decode_table.py +0 -0
  202. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_vpp_rail_classification.py +0 -0
  203. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_wire_dict_equivalence.py +0 -0
  204. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_blank_guard.py +0 -0
  205. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_blank_guard_pinning.py +0 -0
  206. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_guard_port_pinning.py +0 -0
  207. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_progress.py +0 -0
  208. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_response_budget.py +0 -0
  209. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_skip_erase_0x0d.py +0 -0
  210. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_skip_sdp_unlock.py +0 -0
  211. {firestarter-3.2.2 → firestarter-3.2.3}/tests/test_write_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: firestarter
3
- Version: 3.2.2
3
+ Version: 3.2.3
4
4
  Summary: EPROM programmer software for the Relatively Universal ROM Programmer
5
5
  Author-email: Henrik Olsson <henols@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/henols/firestarter_app
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '3.2.2'
22
- __version_tuple__ = version_tuple = (3, 2, 2)
21
+ __version__ = version = '3.2.3'
22
+ __version_tuple__ = version_tuple = (3, 2, 3)
23
23
 
24
- __commit_id__ = commit_id = 'ga7d562c'
24
+ __commit_id__ = commit_id = 'g660e8c4'
@@ -190,7 +190,7 @@
190
190
  "vpp_mv": 13000
191
191
  },
192
192
  "part_number": "AM27128A",
193
- "pinout": "DIP28_2764",
193
+ "pinout": "DIP28_27128",
194
194
  "programming": {
195
195
  "algorithm": 7,
196
196
  "chip_id_check": true,
@@ -366,7 +366,7 @@
366
366
  "vpp_mv": 13000
367
367
  },
368
368
  "part_number": "AM27C128",
369
- "pinout": "DIP28_2764",
369
+ "pinout": "DIP28_27128",
370
370
  "programming": {
371
371
  "algorithm": 7,
372
372
  "chip_id_check": true,
@@ -1478,7 +1478,7 @@
1478
1478
  "vpp_mv": 13000
1479
1479
  },
1480
1480
  "part_number": "SMJ27C128",
1481
- "pinout": "DIP28_2764",
1481
+ "pinout": "DIP28_27128",
1482
1482
  "programming": {
1483
1483
  "algorithm": 7,
1484
1484
  "chip_id_check": true,
@@ -1612,7 +1612,7 @@
1612
1612
  "vpp_mv": 13000
1613
1613
  },
1614
1614
  "part_number": "AT27C011",
1615
- "pinout": "DIP28_2764",
1615
+ "pinout": "DIP28_27011",
1616
1616
  "programming": {
1617
1617
  "algorithm": 7,
1618
1618
  "chip_id_check": true,
@@ -1700,7 +1700,7 @@
1700
1700
  "vpp_mv": 13000
1701
1701
  },
1702
1702
  "part_number": "AT27C128",
1703
- "pinout": "DIP28_2764",
1703
+ "pinout": "DIP28_27128",
1704
1704
  "programming": {
1705
1705
  "algorithm": 7,
1706
1706
  "chip_id_check": true,
@@ -3331,7 +3331,7 @@
3331
3331
  "vpp_mv": 13000
3332
3332
  },
3333
3333
  "part_number": "CAT27128A",
3334
- "pinout": "DIP28_2764",
3334
+ "pinout": "DIP28_27128",
3335
3335
  "programming": {
3336
3336
  "algorithm": 7,
3337
3337
  "chip_id_check": false,
@@ -4222,7 +4222,7 @@
4222
4222
  "vpp_mv": 13000
4223
4223
  },
4224
4224
  "part_number": "CY27C128",
4225
- "pinout": "DIP28_2764",
4225
+ "pinout": "DIP28_27128",
4226
4226
  "programming": {
4227
4227
  "algorithm": 7,
4228
4228
  "chip_id_check": false,
@@ -5403,7 +5403,7 @@
5403
5403
  "vpp_mv": 13000
5404
5404
  },
5405
5405
  "part_number": "NM27C128,NMC27C128B,NMC27C128C",
5406
- "pinout": "DIP28_2764",
5406
+ "pinout": "DIP28_27128",
5407
5407
  "programming": {
5408
5408
  "algorithm": 7,
5409
5409
  "chip_id_check": true,
@@ -5603,7 +5603,7 @@
5603
5603
  "vpp_mv": 21000
5604
5604
  },
5605
5605
  "part_number": "MBM27128",
5606
- "pinout": "DIP28_2764",
5606
+ "pinout": "DIP28_27128",
5607
5607
  "programming": {
5608
5608
  "algorithm": 7,
5609
5609
  "chip_id_check": false,
@@ -5735,7 +5735,7 @@
5735
5735
  "vpp_mv": 18000
5736
5736
  },
5737
5737
  "part_number": "MBM27C128P",
5738
- "pinout": "DIP28_2764",
5738
+ "pinout": "DIP28_27128",
5739
5739
  "programming": {
5740
5740
  "algorithm": 7,
5741
5741
  "chip_id_check": false,
@@ -6001,7 +6001,7 @@
6001
6001
  "vpp_mv": 13000
6002
6002
  },
6003
6003
  "part_number": "GR27128",
6004
- "pinout": "DIP28_2764",
6004
+ "pinout": "DIP28_27128",
6005
6005
  "programming": {
6006
6006
  "algorithm": 7,
6007
6007
  "chip_id_check": false,
@@ -6069,7 +6069,7 @@
6069
6069
  "vpp_mv": 13000
6070
6070
  },
6071
6071
  "part_number": "HN27128AG,HN27128AP",
6072
- "pinout": "DIP28_2764",
6072
+ "pinout": "DIP28_27128",
6073
6073
  "programming": {
6074
6074
  "algorithm": 7,
6075
6075
  "chip_id_check": true,
@@ -7031,7 +7031,7 @@
7031
7031
  "vpp_mv": 13000
7032
7032
  },
7033
7033
  "part_number": "D27011",
7034
- "pinout": "DIP28_2764",
7034
+ "pinout": "DIP28_27011",
7035
7035
  "programming": {
7036
7036
  "algorithm": 7,
7037
7037
  "chip_id_check": true,
@@ -7053,7 +7053,7 @@
7053
7053
  "vpp_mv": 13000
7054
7054
  },
7055
7055
  "part_number": "D27C011",
7056
- "pinout": "DIP28_2764",
7056
+ "pinout": "DIP28_27011",
7057
7057
  "programming": {
7058
7058
  "algorithm": 7,
7059
7059
  "chip_id_check": true,
@@ -7141,7 +7141,7 @@
7141
7141
  "vpp_mv": 18000
7142
7142
  },
7143
7143
  "part_number": "27128,D27128",
7144
- "pinout": "DIP28_2764",
7144
+ "pinout": "DIP28_27128",
7145
7145
  "programming": {
7146
7146
  "algorithm": 7,
7147
7147
  "chip_id_check": true,
@@ -7163,7 +7163,7 @@
7163
7163
  "vpp_mv": 12000
7164
7164
  },
7165
7165
  "part_number": "27128A,D27128A,D27128B",
7166
- "pinout": "DIP28_2764",
7166
+ "pinout": "DIP28_27128",
7167
7167
  "programming": {
7168
7168
  "algorithm": 7,
7169
7169
  "chip_id_check": true,
@@ -7339,7 +7339,7 @@
7339
7339
  "vpp_mv": 12000
7340
7340
  },
7341
7341
  "part_number": "27C128",
7342
- "pinout": "DIP28_2764",
7342
+ "pinout": "DIP28_27128",
7343
7343
  "programming": {
7344
7344
  "algorithm": 7,
7345
7345
  "chip_id_check": true,
@@ -8870,7 +8870,7 @@
8870
8870
  "vpp_mv": 13000
8871
8871
  },
8872
8872
  "part_number": "27C128",
8873
- "pinout": "DIP28_2764",
8873
+ "pinout": "DIP28_27128",
8874
8874
  "programming": {
8875
8875
  "algorithm": 7,
8876
8876
  "chip_id_check": true,
@@ -9406,7 +9406,7 @@
9406
9406
  "vpp_mv": 18000
9407
9407
  },
9408
9408
  "part_number": "M5M27C128",
9409
- "pinout": "DIP28_2764",
9409
+ "pinout": "DIP28_27128",
9410
9410
  "programming": {
9411
9411
  "algorithm": 7,
9412
9412
  "chip_id_check": false,
@@ -9806,7 +9806,7 @@
9806
9806
  "vpp_mv": 12000
9807
9807
  },
9808
9808
  "part_number": "UPD27128",
9809
- "pinout": "DIP28_2764",
9809
+ "pinout": "DIP28_27128",
9810
9810
  "programming": {
9811
9811
  "algorithm": 7,
9812
9812
  "chip_id_check": false,
@@ -9916,7 +9916,7 @@
9916
9916
  "vpp_mv": 12000
9917
9917
  },
9918
9918
  "part_number": "UPD27C128",
9919
- "pinout": "DIP28_2764",
9919
+ "pinout": "DIP28_27128",
9920
9920
  "programming": {
9921
9921
  "algorithm": 7,
9922
9922
  "chip_id_check": false,
@@ -10229,7 +10229,7 @@
10229
10229
  "vpp_mv": 13000
10230
10230
  },
10231
10231
  "part_number": "NM27C128,NMC27C128B,NMC27C128C",
10232
- "pinout": "DIP28_2764",
10232
+ "pinout": "DIP28_27128",
10233
10233
  "programming": {
10234
10234
  "algorithm": 7,
10235
10235
  "chip_id_check": true,
@@ -11277,7 +11277,7 @@
11277
11277
  "vpp_mv": 12000
11278
11278
  },
11279
11279
  "part_number": "M27128A",
11280
- "pinout": "DIP28_2764",
11280
+ "pinout": "DIP28_27128",
11281
11281
  "programming": {
11282
11282
  "algorithm": 7,
11283
11283
  "chip_id_check": true,
@@ -11916,7 +11916,7 @@
11916
11916
  "vpp_mv": 12000
11917
11917
  },
11918
11918
  "part_number": "ST27128A",
11919
- "pinout": "DIP28_2764",
11919
+ "pinout": "DIP28_27128",
11920
11920
  "programming": {
11921
11921
  "algorithm": 7,
11922
11922
  "chip_id_check": true,
@@ -13314,7 +13314,7 @@
13314
13314
  "vpp_mv": 12000
13315
13315
  },
13316
13316
  "part_number": "M27128A",
13317
- "pinout": "DIP28_2764",
13317
+ "pinout": "DIP28_27128",
13318
13318
  "programming": {
13319
13319
  "algorithm": 7,
13320
13320
  "chip_id_check": true,
@@ -13997,7 +13997,7 @@
13997
13997
  "vpp_mv": 12000
13998
13998
  },
13999
13999
  "part_number": "ST27128A",
14000
- "pinout": "DIP28_2764",
14000
+ "pinout": "DIP28_27128",
14001
14001
  "programming": {
14002
14002
  "algorithm": 7,
14003
14003
  "chip_id_check": true,
@@ -14889,7 +14889,7 @@
14889
14889
  "vpp_mv": 13000
14890
14890
  },
14891
14891
  "part_number": "SMJ27C128,TMS27C128,TMS27PC128",
14892
- "pinout": "DIP28_2764",
14892
+ "pinout": "DIP28_27128",
14893
14893
  "programming": {
14894
14894
  "algorithm": 7,
14895
14895
  "chip_id_check": true,
@@ -16270,7 +16270,7 @@
16270
16270
  "vpp_mv": 13000
16271
16271
  },
16272
16272
  "part_number": "WS27C128F",
16273
- "pinout": "DIP28_2764",
16273
+ "pinout": "DIP28_27128",
16274
16274
  "programming": {
16275
16275
  "algorithm": 7,
16276
16276
  "chip_id_check": true,
@@ -16358,7 +16358,7 @@
16358
16358
  "vpp_mv": 13000
16359
16359
  },
16360
16360
  "part_number": "WS57C128FB",
16361
- "pinout": "DIP28_2764",
16361
+ "pinout": "DIP28_27128",
16362
16362
  "programming": {
16363
16363
  "algorithm": 7,
16364
16364
  "chip_id_check": false,
@@ -22,10 +22,33 @@
22
22
  }
23
23
  },
24
24
  "DIP28_2764": {
25
- "name": "JEDEC 2764/128",
25
+ "name": "JEDEC 2764/27C64",
26
+ "comment": "infoic.xml pin map 21, which leaves pin 26 unbonded: pin 26 NC, and pin 27 PGM. The host sends PGM as the rw line, so the firmware holds it high for read. See datasheets/TMS2764.pdf.",
26
27
  "pins": {
27
28
  "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
28
29
  "pgm-pin": [27], "nc-pin": [26],
30
+ "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2],
31
+ "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
32
+ "ce-pin": [20], "oe-pin": [22]
33
+ }
34
+ },
35
+ "DIP28_27128": {
36
+ "name": "JEDEC 27128/27C128",
37
+ "comment": "infoic.xml pin map 22 (pin_map 0x00000c16), which bonds pin 26 as A13. Pin 27 is PGM; the host sends it as the rw line.",
38
+ "pins": {
39
+ "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
40
+ "pgm-pin": [27],
41
+ "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2, 26],
42
+ "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
43
+ "ce-pin": [20], "oe-pin": [22]
44
+ }
45
+ },
46
+ "DIP28_27011": {
47
+ "name": "27011 page-addressed EPROM",
48
+ "comment": "infoic.xml pin map 22 with pin_map 0x90000c16, which only the 27011 rows carry. Connectivity is <maps> index 22. The pin functions are the 27128 functions these rows had before the split; no 27011 datasheet was found to confirm them. Page selection is not implemented (henols/firestarter#136).",
49
+ "pins": {
50
+ "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
51
+ "pgm-pin": [27],
29
52
  "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2, 26],
30
53
  "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
31
54
  "ce-pin": [20], "oe-pin": [22]
@@ -33,7 +56,7 @@
33
56
  },
34
57
  "DIP28_JEDEC_SRAM_8K": {
35
58
  "name": "JEDEC 28-pin SRAM/FRAM 8K (6264/FM1608 family)",
36
- "comment": "Standard JEDEC parallel SRAM/FRAM 28-pin layout. Same address bus as DIP28_2764 (A0-A12 at pins 10,9,...,2 — 13 address bits for 8K). Differs from DIP28_2764 at: pin 1 = NC (vs VPP), pin 27 = !WE (vs !PGM), pin 26 = NC. Used by 6264-class SRAM and Ramtron FM1608 FRAM. Tentative — bench-validation required for chip-specific layouts.",
59
+ "comment": "Standard JEDEC parallel SRAM/FRAM 28-pin layout. Same address bus as DIP28_2764 (A0-A12 at pins 10,9,...,2 — 13 address bits for 8K). Differs from DIP28_2764 at: pin 1 = NC (vs VPP), pin 27 = !WE (vs !PGM). Used by 6264-class SRAM and Ramtron FM1608 FRAM. Tentative — bench-validation required for chip-specific layouts.",
37
60
  "pins": {
38
61
  "vcc-pin": [28], "gnd-pin": [14],
39
62
  "rw-pin": [27], "nc-pin": [1, 26],
@@ -164,4 +187,4 @@
164
187
  "ce-pin": [22], "oe-pin": [24], "rw-pin": [30]
165
188
  }
166
189
  }
167
- }
190
+ }
@@ -235,6 +235,14 @@ class EpromDatabase:
235
235
  pin_maps_base[key][sub_key] = (
236
236
  sub_value # Replace existing or add new
237
237
  )
238
+ if "DIP28_2764" in manual_pin_map and not (
239
+ {"DIP28_27128", "DIP28_27011"} & manual_pin_map.keys()
240
+ ):
241
+ logger.warning(
242
+ "Your pin-map override for DIP28_2764 now applies only to 2764/27C64 "
243
+ "chips. 27128/27C128 chips use DIP28_27128 and 27011 chips use "
244
+ "DIP28_27011."
245
+ )
238
246
  return pin_maps_base
239
247
 
240
248
  def get_pin_map(self, pins: int, pin_map_id: str):
@@ -271,10 +279,14 @@ class EpromDatabase:
271
279
  )
272
280
  return None # Cannot form bus without address pins
273
281
 
282
+ # A UV EPROM's PGM pin is its rw line: the firmware holds it high for
283
+ # read and low for write. A map with its own rw-pin keeps that pin.
284
+ rw_source = "rw-pin" if "rw-pin" in pin_map_data else "pgm-pin"
285
+
274
286
  # Handle pins that can be a single value or a list
275
- for pin_func in ["rw-pin", "vpp-pin"]:
276
- if pin_func in pin_map_data:
277
- pin_val = pin_map_data[pin_func]
287
+ for pin_func, source in [("rw-pin", rw_source), ("vpp-pin", "vpp-pin")]:
288
+ if source in pin_map_data:
289
+ pin_val = pin_map_data[source]
278
290
  # The value can be a list (e.g., [22]) or a single int.
279
291
  # We'll take the first element if it's a list.
280
292
  pin_to_check = pin_val[0] if isinstance(pin_val, list) else pin_val
@@ -286,7 +298,7 @@ class EpromDatabase:
286
298
  map_config[pin_func] = resolved
287
299
  else:
288
300
  logger.warning(
289
- f"Pin function '{pin_func}' with pin number {pin_to_check} not in pin_conversions for {pins}-pin EPROM." # noqa: E501
301
+ f"Pin function '{source}' with pin number {pin_to_check} not in pin_conversions for {pins}-pin EPROM." # noqa: E501
290
302
  )
291
303
 
292
304
  if "static-high-pins" in pin_map_data and pins in pin_conversions:
@@ -127,15 +127,16 @@ class EpromSpecBuilder:
127
127
  self.db = db_instance
128
128
 
129
129
  @staticmethod
130
- def _first_pin(pin_field: list) -> int:
130
+ def _first_pin(pin_field: list | int) -> int:
131
131
  """Extract a scalar pin number from a single-element list pin field.
132
132
 
133
133
  Pin map fields like vpp-pin, oe-pin, and rw-pin are stored as
134
134
  single-element lists in pinouts.json (e.g. [22]). This helper
135
135
  returns the first element so the caller can use it as an integer
136
- index or in arithmetic comparisons.
136
+ index or in arithmetic comparisons. A local pin-map override may
137
+ give a bare int, as get_bus_config accepts; that is returned as is.
137
138
  """
138
- return pin_field[0]
139
+ return pin_field[0] if isinstance(pin_field, list) else pin_field
139
140
 
140
141
  def get_chip_type_string(self, protocol_id: int | None = None) -> str:
141
142
  """Return a user-facing chip-type label.
@@ -342,6 +343,14 @@ class EpromSpecBuilder:
342
343
  if "oe-pin" in pin_map_details
343
344
  else None
344
345
  ) # noqa: E501
346
+ pgm_pin = (
347
+ self._first_pin(pin_map_details["pgm-pin"])
348
+ if "pgm-pin" in pin_map_details
349
+ else None
350
+ )
351
+ # Label PGM first, so a map that also names a real WE keeps R/W(WE).
352
+ if pgm_pin is not None and pgm_pin <= pin_count:
353
+ pin_names[pgm_pin - 1] = "PGM"
345
354
  if rw_pin is not None and rw_pin <= pin_count:
346
355
  pin_names[rw_pin - 1] = "R/W(WE)"
347
356
  if vpp_pin is not None and vpp_pin <= pin_count:
@@ -302,6 +302,7 @@ JUMPER_TABLE: Mapping[str, JumperEntry] = {
302
302
  ),
303
303
  # --- 28-pin. JP1 gives A13 to socket pin 28 (chip pin 26). JP2 gives +5 V to socket pin 30
304
304
  # (chip pin 28, VCC). Chip pin 1 is socket pin 3.
305
+ # Chip pin 26 is NC on this map, so JP1 is A13 only to agree with DIP28_27128.
305
306
  "DIP28_2764": JumperEntry(
306
307
  vpp_lands=VppLanding.SOCKET_3,
307
308
  pin1_signal="VPP",
@@ -312,6 +313,26 @@ JUMPER_TABLE: Mapping[str, JumperEntry] = {
312
313
  rev22_jp4=Jp4Rev22.POLE_28,
313
314
  probe_pending=True,
314
315
  ),
316
+ "DIP28_27128": JumperEntry(
317
+ vpp_lands=VppLanding.SOCKET_3,
318
+ pin1_signal="VPP",
319
+ jp1=Jp1.A13,
320
+ jp2=Jp2.VCC,
321
+ jp3=Jp3.PIN28,
322
+ rev20_jp4=Jp4Rev20.CLOSED,
323
+ rev22_jp4=Jp4Rev22.POLE_28,
324
+ probe_pending=True,
325
+ ),
326
+ "DIP28_27011": JumperEntry(
327
+ vpp_lands=VppLanding.SOCKET_3,
328
+ pin1_signal="VPP",
329
+ jp1=Jp1.A13,
330
+ jp2=Jp2.VCC,
331
+ jp3=Jp3.PIN28,
332
+ rev20_jp4=Jp4Rev20.CLOSED,
333
+ rev22_jp4=Jp4Rev22.POLE_28,
334
+ probe_pending=True,
335
+ ),
315
336
  "DIP28_27256": JumperEntry(
316
337
  vpp_lands=VppLanding.SOCKET_3,
317
338
  pin1_signal="VPP",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: firestarter
3
- Version: 3.2.2
3
+ Version: 3.2.3
4
4
  Summary: EPROM programmer software for the Relatively Universal ROM Programmer
5
5
  Author-email: Henrik Olsson <henols@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/henols/firestarter_app
@@ -24,6 +24,7 @@
24
24
  "datasheets/MBM27C4001.pdf",
25
25
  "datasheets/MX27C4000.pdf",
26
26
  "datasheets/SST39SF0x0A.pdf",
27
+ "datasheets/TMS2764.pdf",
27
28
  "datasheets/W27C020.pdf",
28
29
  "datasheets/W27C512.pdf",
29
30
  "datasheets/W27E257.pdf",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "3.2.2",
2
+ "tag": "3.2.3",
3
3
  "distance": 0,
4
- "node": "ga7d562c",
4
+ "node": "g660e8c4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-25"