firestarter 3.2.1b1__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.
- {firestarter-3.2.1b1/firestarter.egg-info → firestarter-3.2.3}/PKG-INFO +2 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/_version.py +3 -3
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/chip_resolver.py +44 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/cli_handlers.py +41 -11
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/data/chip_database.json +29 -29
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/data/pinouts.json +26 -3
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/database.py +156 -37
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/diagnostic_report.py +4 -4
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/eprom_info.py +35 -7
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/eprom_operations.py +6 -6
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/exceptions.py +6 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/firmware.py +3 -2
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/ic_layout.py +12 -3
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/jumper_table.py +21 -0
- firestarter-3.2.3/firestarter/timestamps.py +83 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3/firestarter.egg-info}/PKG-INFO +2 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/SOURCES.txt +4 -9
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/requires.txt +1 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/scm_file_list.json +5 -9
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/scm_version.json +2 -2
- {firestarter-3.2.1b1 → firestarter-3.2.3}/pyproject.toml +1 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/__snapshots__/test_characterization.ambr +29 -28
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/conftest.py +35 -0
- firestarter-3.2.1b1/tests/golden/wire_dict_baseline.json → firestarter-3.2.3/tests/golden/wire_dict.json +276 -195
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/plan_corpus.py +11 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_pinout_fork.py +40 -0
- firestarter-3.2.3/tests/test_chip_name_resolution.py +199 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_resolver.py +2 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_derive_plan_no_drop_sweep.py +14 -22
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_derive_plan_structural_sentinel.py +20 -34
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_devtest_firmware_error_propagation.py +11 -4
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_database.py +58 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_erase_flag_invariants.py +20 -30
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_firmware_install.py +4 -2
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_hardware.py +10 -2
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_ic_layout.py +36 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_jumper_table.py +3 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_invariants.py +22 -44
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_probe_spurious_setup_ack.py +3 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protocol_not_implemented_production_path.py +4 -1
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_db_invariant.py +22 -62
- firestarter-3.2.3/tests/test_timestamps.py +87 -0
- firestarter-3.2.3/tests/test_wire_dict_equivalence.py +177 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_blank_guard_pinning.py +10 -6
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_149.json +0 -65
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_153.json +0 -265
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_182.json +0 -219
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_194.json +0 -86
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_197.json +0 -20
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_198.json +0 -17
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_199.json +0 -14
- firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_dip24_2816.json +0 -91
- firestarter-3.2.1b1/tests/test_wire_dict_equivalence.py +0 -821
- {firestarter-3.2.1b1 → firestarter-3.2.3}/LICENSE +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/MANIFEST.in +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/README.md +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/__init__.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/address_parser.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/avr_tool.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/channel.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/chip_test.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/codec.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/compare.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/config.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/constants.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/dip24_2816_erase_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/erase_support.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/flash4_erase_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/frame_parser.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/fw_release_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/hardware.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/jp5_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/lock_status.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/log_capture.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/logging_utils.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/main.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/messages.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/page_size_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/protection_readability.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/py32_dfu.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/sdp_capability.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/sdp_honesty.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/serial_comm.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/submit.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/transport_counters.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/utils.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/vpp_display.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/write_blank_guard.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/dependency_links.txt +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/entry_points.txt +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/top_level.txt +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/setup.cfg +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/__init__.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fake_chip.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/part_number_delta.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/report_shapes.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/at28c256-full-all-ok-sdp.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/attr01-status-axis-transport-fault.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh20-at28c256-fail.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh23-w27e257-fail.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh28-m27c512-fail.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh47-sst27sf512-pass.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-all-ok.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-blank-check-bad.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-canonical-name.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-comma-joined-name.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-runs-1.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/prune03-synthesized-fingerprint-match.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-full-all-ok.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step-readback-gated.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-empty-results.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-no-ok.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/uv-slot-write-pass.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/w27e257-full-all-ok.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/shape_ids.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/synthetic_nonzero_chip_id.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/golden/build_db_part_specific_constants.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/golden/chip_database_field_inventory.json +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_address_parser.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_b15_page_size_corroboration.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_blast_radius_invariance.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_boot_block_hint.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_budget_failure_render.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_bug_characterization.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_constant_census.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_inclusion.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_interpret_timing.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_canonical_part_number.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_characterization.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_database_field_inventory.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_blank_check_order.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_cycle.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_sdp_leg.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_timing.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_uv_slot_write.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_cli_handlers.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_click_group_gate_hook.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_cobs.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_codec.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_codec_format_message.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_compare.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_config.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_config_band_refusal.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_connect_cost_harness.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_consistency_check.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_coverage_floor_v18.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_database_conversion.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_datasheet_overrides.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_decoder.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_group_channel_gating.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_test_cmd.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_tools_channel_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dfu_opcode_anchors.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_diagnostic_report.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dip24_2816_erase_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_endpoint_constants.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_info.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_operations.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_erase_blank_step_nonregression.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_error_code_seam.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_even_block.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_extra_chips_supplement.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_flash4_erase_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_list_failure_vs_empty.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_port_targeting_and_blind_install.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_release_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_update_dead_endpoint.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_update_path_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_version_guard.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fwguard.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_hw_revision_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_info_vpp_and_erase.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_jp5_gate.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_class_partition.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_cli.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_wire.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_log_capture.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_logging_utils.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_matrix_artifact.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_alignment_refusal.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_write_refusal.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_parse_devtest_issue.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_programming_vcc_census.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protect_flags_doc_measurements.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_resolution.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_status_catalog.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_table_citations.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protocol_not_implemented.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_provenance.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_pulse_us_override.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_channel_gating.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_dfu.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_flash_map_host.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_pyusb_absent.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_pyusb_api_surface.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_capability.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_honesty.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_serial_characterization.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_serial_comm.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_session_lease.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_setup_refusals.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_submit.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_transport_counters.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_utils.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_uv_mask.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validate_family_cmd.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validate_oracle.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validated_parts_regression_surface.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vcc_margin_rail.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vpp_decode_table.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vpp_rail_classification.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_blank_guard.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_guard_port_pinning.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_progress.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_response_budget.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_skip_erase_0x0d.py +0 -0
- {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_skip_sdp_unlock.py +0 -0
- {firestarter-3.2.1b1 → 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.
|
|
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
|
|
@@ -37,6 +37,7 @@ Requires-Dist: syrupy<7,>=5.0; extra == "test"
|
|
|
37
37
|
Requires-Dist: ruff>=0.15.14; extra == "test"
|
|
38
38
|
Requires-Dist: mypy<3,>=2.1.0; extra == "test"
|
|
39
39
|
Requires-Dist: pytest-cov>=7.1.0; extra == "test"
|
|
40
|
+
Requires-Dist: pytest-xdist>=3.6; extra == "test"
|
|
40
41
|
Requires-Dist: types-pyserial>=3.5.0.20260519; extra == "test"
|
|
41
42
|
Dynamic: license-file
|
|
42
43
|
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (3, 2,
|
|
21
|
+
__version__ = version = '3.2.3'
|
|
22
|
+
__version_tuple__ = version_tuple = (3, 2, 3)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g660e8c4'
|
|
@@ -10,11 +10,50 @@ Single chokepoint between CLI dispatch and the EPROM database lookup/conversion.
|
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
12
|
from firestarter.database import EpromDatabase
|
|
13
|
-
from firestarter.exceptions import
|
|
13
|
+
from firestarter.exceptions import (
|
|
14
|
+
AmbiguousChipNameError,
|
|
15
|
+
ChipNotFoundError,
|
|
16
|
+
ChipNotImplementedError,
|
|
17
|
+
)
|
|
14
18
|
|
|
15
19
|
_NON_ZERO_WIRE_FIELDS = ("memory-size", "pin-count", "vpp_mv")
|
|
16
20
|
|
|
17
21
|
|
|
22
|
+
def _qualified_choices(name: str, db: EpromDatabase) -> list[str]:
|
|
23
|
+
"""The row `name` selects first, then each other row it selects that
|
|
24
|
+
programs differently, all as qualified names. Empty when one row, or rows
|
|
25
|
+
that program the same, are selected."""
|
|
26
|
+
alternatives = db.ambiguous_alternatives(name)
|
|
27
|
+
if not alternatives:
|
|
28
|
+
return []
|
|
29
|
+
raw_config, manufacturer = db.get_eprom_config(name)
|
|
30
|
+
return [db.qualified_chip_name(name, raw_config, manufacturer), *alternatives]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def refuse_if_ambiguous(name: str, db: EpromDatabase) -> None:
|
|
34
|
+
"""Refuse a name that selects chips that program differently: guessing
|
|
35
|
+
one would drive the wrong VPP, algorithm or timing."""
|
|
36
|
+
choices = _qualified_choices(name, db)
|
|
37
|
+
if choices:
|
|
38
|
+
listed = ", ".join(f"'{c}'" for c in choices)
|
|
39
|
+
raise AmbiguousChipNameError(
|
|
40
|
+
f"'{name}' names chips that program differently. Name one: {listed}."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def describe_ambiguity(name: str, db: EpromDatabase) -> str | None:
|
|
45
|
+
"""For display commands, which use the first row: the other rows `name`
|
|
46
|
+
selects, or None."""
|
|
47
|
+
choices = _qualified_choices(name, db)
|
|
48
|
+
if not choices:
|
|
49
|
+
return None
|
|
50
|
+
others = ", ".join(f"'{c}'" for c in choices[1:])
|
|
51
|
+
return (
|
|
52
|
+
f"'{name}' also names chips that program differently: {others}. "
|
|
53
|
+
f"This shows '{choices[0]}'."
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
18
57
|
def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
|
|
19
58
|
"""Resolve a chip name to its programmer-config dict.
|
|
20
59
|
|
|
@@ -26,6 +65,9 @@ def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
|
|
|
26
65
|
conversion (``convert_to_programmer`` returns ``{}``) are treated as the
|
|
27
66
|
not-found condition.
|
|
28
67
|
|
|
68
|
+
Raises ``AmbiguousChipNameError`` (a ``ChipNotFoundError``) when the name
|
|
69
|
+
selects rows that program differently; the message names each of them.
|
|
70
|
+
|
|
29
71
|
Raises ``ChipNotImplementedError`` when the chip exists in the database but
|
|
30
72
|
its ``support_status`` is not ``"supported"`` (covers protocol-not-implemented,
|
|
31
73
|
adapter-required, and vpp-exceeds-max). This guard fires BEFORE any wire dict
|
|
@@ -49,6 +91,7 @@ def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
|
|
|
49
91
|
# have a support_status, so raise ChipNotFoundError immediately.
|
|
50
92
|
if raw_config is None:
|
|
51
93
|
raise ChipNotFoundError(name)
|
|
94
|
+
refuse_if_ambiguous(name, db)
|
|
52
95
|
|
|
53
96
|
# Support-status guard: refuse every program-capable operation
|
|
54
97
|
# for non-supported chips BEFORE convert_to_programmer builds any wire dict.
|
|
@@ -4,7 +4,6 @@ This module is the production CLI surface; main.py re-exports `cli` as `main`
|
|
|
4
4
|
for the console-script entry point.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
import datetime
|
|
8
7
|
import functools
|
|
9
8
|
import hashlib
|
|
10
9
|
import json
|
|
@@ -39,7 +38,11 @@ from firestarter.channel import (
|
|
|
39
38
|
dev_command_gate_message,
|
|
40
39
|
is_dev_tools_enabled,
|
|
41
40
|
)
|
|
42
|
-
from firestarter.chip_resolver import
|
|
41
|
+
from firestarter.chip_resolver import (
|
|
42
|
+
describe_ambiguity,
|
|
43
|
+
refuse_if_ambiguous,
|
|
44
|
+
resolve_chip,
|
|
45
|
+
)
|
|
43
46
|
from firestarter.chip_test import (
|
|
44
47
|
OP_ID,
|
|
45
48
|
SDP_HOLD_NOT_RUN,
|
|
@@ -106,6 +109,7 @@ from firestarter.protection_readability import (
|
|
|
106
109
|
protection_gate_for_entry,
|
|
107
110
|
)
|
|
108
111
|
from firestarter.sdp_capability import SDP_PROTOCOL_ID, sdp_capability
|
|
112
|
+
from firestarter.timestamps import iso_cet
|
|
109
113
|
|
|
110
114
|
logger = logging.getLogger("Firestarter")
|
|
111
115
|
|
|
@@ -160,10 +164,17 @@ def _complete_eprom(
|
|
|
160
164
|
semantics at main.py:39-45.
|
|
161
165
|
""" # noqa: E501
|
|
162
166
|
db = EpromDatabase()
|
|
163
|
-
|
|
164
|
-
|
|
167
|
+
qualified = db.names_needing_qualifier()
|
|
168
|
+
# A row whose name also names chips that program differently is offered
|
|
169
|
+
# by the qualified name that selects it.
|
|
170
|
+
names = (
|
|
171
|
+
qualified.get((e["manufacturer"], e["name"]), e["name"])
|
|
165
172
|
for e in db.get_eproms()
|
|
166
|
-
|
|
173
|
+
)
|
|
174
|
+
return [
|
|
175
|
+
click.shell_completion.CompletionItem(name)
|
|
176
|
+
for name in names
|
|
177
|
+
if name.lower().startswith(incomplete.lower())
|
|
167
178
|
]
|
|
168
179
|
|
|
169
180
|
|
|
@@ -486,7 +497,11 @@ def _list_cmd(app: AppContext) -> None:
|
|
|
486
497
|
"""List all EPROMs in the database."""
|
|
487
498
|
eprom_data_list = app.db.get_eproms()
|
|
488
499
|
if eprom_data_list:
|
|
489
|
-
print_eprom_list_table(
|
|
500
|
+
print_eprom_list_table(
|
|
501
|
+
eprom_data_list,
|
|
502
|
+
app.eprom_presenter.spec_builder,
|
|
503
|
+
app.db.names_needing_qualifier(),
|
|
504
|
+
)
|
|
490
505
|
sys.exit(0)
|
|
491
506
|
sys.exit(1)
|
|
492
507
|
|
|
@@ -504,6 +519,9 @@ def info(app: AppContext, eprom: str, config: bool, adapter: bool) -> None:
|
|
|
504
519
|
logger.error(f"EPROM '{eprom}' not found in database.")
|
|
505
520
|
sys.exit(1)
|
|
506
521
|
|
|
522
|
+
ambiguity = describe_ambiguity(eprom, app.db)
|
|
523
|
+
if ambiguity:
|
|
524
|
+
logger.warning(ambiguity)
|
|
507
525
|
eprom_data_for_programmer = app.db.convert_to_programmer(eprom_details)
|
|
508
526
|
raw_config_data, manufacturer = app.db.get_eprom_config(eprom)
|
|
509
527
|
|
|
@@ -534,7 +552,11 @@ def search(app: AppContext, text: str) -> None:
|
|
|
534
552
|
"""Search for EPROMs in the database."""
|
|
535
553
|
search_results = app.db.search_eprom(text)
|
|
536
554
|
if search_results:
|
|
537
|
-
print_eprom_list_table(
|
|
555
|
+
print_eprom_list_table(
|
|
556
|
+
search_results,
|
|
557
|
+
app.eprom_presenter.spec_builder,
|
|
558
|
+
app.db.names_needing_qualifier(),
|
|
559
|
+
)
|
|
538
560
|
sys.exit(0)
|
|
539
561
|
sys.exit(1)
|
|
540
562
|
|
|
@@ -1505,7 +1527,9 @@ def chip_id(app: AppContext, eprom: str, force: bool) -> None:
|
|
|
1505
1527
|
for ic in found_eproms_for_detected_id
|
|
1506
1528
|
]
|
|
1507
1529
|
print_eprom_list_table(
|
|
1508
|
-
mapped_found_eproms,
|
|
1530
|
+
mapped_found_eproms,
|
|
1531
|
+
app.eprom_presenter.spec_builder,
|
|
1532
|
+
app.db.names_needing_qualifier(),
|
|
1509
1533
|
)
|
|
1510
1534
|
else:
|
|
1511
1535
|
logger.warning(
|
|
@@ -1908,10 +1932,10 @@ def fw(
|
|
|
1908
1932
|
|
|
1909
1933
|
print(_json.dumps(releases, indent=2))
|
|
1910
1934
|
else:
|
|
1911
|
-
print(f"{'Version':<12} {'Channel':<14} {'Published':<
|
|
1935
|
+
print(f"{'Version':<12} {'Channel':<14} {'Published':<25} Asset URL")
|
|
1912
1936
|
for r in releases:
|
|
1913
1937
|
print(
|
|
1914
|
-
f"{r['version']:<12} {r['channel']:<14} {r['published']:<
|
|
1938
|
+
f"{r['version']:<12} {r['channel']:<14} {r['published']:<25} {r['asset_url']}" # noqa: E501
|
|
1915
1939
|
)
|
|
1916
1940
|
if not releases:
|
|
1917
1941
|
print(f"No releases found for board {board}.")
|
|
@@ -2638,7 +2662,7 @@ def _write_artifact(
|
|
|
2638
2662
|
out_path.mkdir(parents=True, exist_ok=True)
|
|
2639
2663
|
|
|
2640
2664
|
artifact: Dict[str, Any] = { # noqa: UP006
|
|
2641
|
-
"generated":
|
|
2665
|
+
"generated": iso_cet(),
|
|
2642
2666
|
"harness_version": "71",
|
|
2643
2667
|
"cells": cells,
|
|
2644
2668
|
}
|
|
@@ -3058,6 +3082,8 @@ def _canonical_part_number(part_number: str | None, raw_token: str) -> str | Non
|
|
|
3058
3082
|
def _strip_paren(s: str) -> str:
|
|
3059
3083
|
return re.sub(r"\([^)]*\)", "", s).strip().lower()
|
|
3060
3084
|
|
|
3085
|
+
# A manufacturer qualifier (PART@MANUFACTURER) is not part of the name.
|
|
3086
|
+
raw_token = raw_token.partition("@")[0].strip()
|
|
3061
3087
|
query = raw_token.lower()
|
|
3062
3088
|
if query == part_number.lower():
|
|
3063
3089
|
return part_number
|
|
@@ -3166,6 +3192,10 @@ def dev_test(app: "AppContext", chip: str, fast: bool, submit: bool) -> None:
|
|
|
3166
3192
|
# still runs the full community-validation sweep below.
|
|
3167
3193
|
if not app.db.get_eprom(chip):
|
|
3168
3194
|
raise ChipNotFoundError(f"{chip}: not found in database")
|
|
3195
|
+
# A name that selects chips that program differently is refused here,
|
|
3196
|
+
# not step by step: every step would be SKIPPED and the report would
|
|
3197
|
+
# name no chip.
|
|
3198
|
+
refuse_if_ambiguous(chip, app.db)
|
|
3169
3199
|
|
|
3170
3200
|
# The chip must be known to be in the DB (see above) before its
|
|
3171
3201
|
# electrical type can be read, so the UV-scope resolution happens here,
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
"vpp_mv": 13000
|
|
191
191
|
},
|
|
192
192
|
"part_number": "AM27128A",
|
|
193
|
-
"pinout": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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/
|
|
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)
|
|
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
|
+
}
|