From 00aae2dbfc357ba5048ca6ee871c155bfbacf040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Frohm=C3=BCller?= Date: Sat, 18 Jul 2026 17:17:52 +0200 Subject: [PATCH] Update F3 scripts and fix minor issues --- res/oscscripts/seagate_f3_cap_info.osc | 69 ++++++++ res/oscscripts/seagate_f3_clear_glist.osc | 78 +++++++++ res/oscscripts/seagate_f3_clear_smart.osc | 77 +++++++++ res/oscscripts/seagate_f3_head_test.osc | 67 ++++++++ .../seagate_f3_regen_translator.osc | 152 ++++++++++++++++++ .../seagate_f3_restore_f_defaults.osc | 53 ++++++ res/oscscripts/seagate_f3_spin_down.osc | 59 +++++++ res/oscscripts/seagate_f3_spin_up.osc | 58 +++++++ .../seagate_f3_tune_for_imaging.osc | 78 +++++++++ src/opensuperclone/asclepius.c | 1 - src/opensuperclone/clone_gui.c | 1 + 11 files changed, 692 insertions(+), 1 deletion(-) create mode 100644 res/oscscripts/seagate_f3_cap_info.osc create mode 100644 res/oscscripts/seagate_f3_clear_glist.osc create mode 100644 res/oscscripts/seagate_f3_clear_smart.osc create mode 100644 res/oscscripts/seagate_f3_head_test.osc create mode 100644 res/oscscripts/seagate_f3_regen_translator.osc create mode 100644 res/oscscripts/seagate_f3_restore_f_defaults.osc create mode 100644 res/oscscripts/seagate_f3_spin_down.osc create mode 100644 res/oscscripts/seagate_f3_spin_up.osc create mode 100644 res/oscscripts/seagate_f3_tune_for_imaging.osc diff --git a/res/oscscripts/seagate_f3_cap_info.osc b/res/oscscripts/seagate_f3_cap_info.osc new file mode 100644 index 0000000..301ee14 --- /dev/null +++ b/res/oscscripts/seagate_f3_cap_info.osc @@ -0,0 +1,69 @@ +# Seagate F3 CAP and Drive Info +# Retrieves comprehensive identification from a Seagate F3 drive: +# Ctrl+A - Package version, serial, model, servo FW +# Ctrl+L - Head count, preamp type, family ID +# T>J - CAP info (internal model, family ID, serials) +# T>V1 - User slip defect list (confirms translator loaded) +# Default baud: 38400, 8N1, no flow control. +# +# Useful when the drive label is missing or when you need +# detailed firmware/family information before repair. + +echo "============================================" +echo " Seagate F3 CAP and Drive Info" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "--- Drive Info (Ctrl+A) ---" +serialsend \x01 +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "--- Detailed Drive Info (Ctrl+L) ---" +serialsend \x0c +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "--- CAP Info (J command) ---" +serialsend \x4a\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "--- User Slip List / Translator check (V1) ---" +serialsend \x56\x31\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "============================================" +echo " Info collection complete." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_clear_glist.osc b/res/oscscripts/seagate_f3_clear_glist.osc new file mode 100644 index 0000000..67ad3d6 --- /dev/null +++ b/res/oscscripts/seagate_f3_clear_glist.osc @@ -0,0 +1,78 @@ +# Seagate F3 Clear G-List +# Clears the Grown Defect List (G-List) on a Seagate F3 drive. +# Useful as a standalone step before translator regeneration +# or when G-List corruption is suspected. +# Default baud: 38400, 8N1, no flow control. +# +# WARNING: Sectors reallocated into the G-List will be lost. +# The LBAs they occupied will map back to the original (defective) +# physical sectors. + +echo "============================================" +echo " Seagate F3 Clear G-List" +echo "============================================" +echo "" +echo "WARNING: Sectors in G-list will be lost from user data." +echo "" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "--- G-List before clear (V4) ---" +serialsend \x56\x34\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "--- Resident G-List before clear (V80) ---" +serialsend \x56\x38\x30\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "=== Clearing G-List (i4,1,22) ===" +serialsend \x69\x34\x2c\x31\x2c\x32\x32\x0d +usleep 500000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "--- G-List after clear (V4) ---" +serialsend \x56\x34\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "--- Resident G-List after clear (V80) ---" +serialsend \x56\x38\x30\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "============================================" +echo " G-List clear complete." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_clear_smart.osc b/res/oscscripts/seagate_f3_clear_smart.osc new file mode 100644 index 0000000..4601e59 --- /dev/null +++ b/res/oscscripts/seagate_f3_clear_smart.osc @@ -0,0 +1,77 @@ +# Seagate F3 Clear SMART +# Clears the SMART table on a Seagate F3 drive. +# Useful as a standalone step when SMART values show false errors +# or when clearing SMART resolves LED:000000BD / FAddr:00009887 +# media cache related errors. +# Default baud: 38400, 8N1, no flow control. +# +# Steps: show current SMART, clear SMART, verify +# +# WARNING: This resets SMART attribute values. Power-on hours, +# error counts, and reallocated sector counts will be cleared. +# Use for diagnostics, not to conceal genuine drive health issues. + +echo "============================================" +echo " Seagate F3 Clear SMART" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Changing to level 1..." +serialsend \x2f\x31\x0d +usleep 200000 + +echo "--- Current SMART Values (N5) ---" +serialsend \x4e\x35\x0d +usleep 500000 +buffersize 2048 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "=== Clearing SMART (N1) ===" +serialsend \x4e\x31\x0d +usleep 500000 + +echo "--- Clear Response ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "--- SMART After Clear (N5) ---" +serialsend \x4e\x35\x0d +usleep 500000 +buffersize 2048 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "Returning to level T..." +serialsend \x2f\x54\x0d +usleep 200000 + +echo "" +echo "============================================" +echo " SMART clear complete." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_head_test.osc b/res/oscscripts/seagate_f3_head_test.osc new file mode 100644 index 0000000..c424804 --- /dev/null +++ b/res/oscscripts/seagate_f3_head_test.osc @@ -0,0 +1,67 @@ +# Seagate F3 Head Resistance Test +# Tests read/write head resistance on a Seagate F3 drive. +# Run at level 7 with the X command. +# Default baud: 38400, 8N1, no flow control. +# +# Head resistance values are displayed as hex for each head. +# Normal range varies by family, but values significantly +# higher or lower than others may indicate a damaged head. + +echo "============================================" +echo " Seagate F3 Head Resistance Test" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "Changing to level 7..." +serialsend \x2f\x37\x0d +usleep 300000 + +echo "--- Level Change ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Running head resistance test (X command)..." +serialsend \x58\x0d +usleep 500000 + +echo "--- Head Resistance Results ---" +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "Returning to level T..." +serialsend \x2f\x54\x0d +usleep 200000 + +echo "--- Level T ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "============================================" +echo " Head resistance test complete." +echo " Each head shows a hex resistance value." +echo " Compare across heads -- outliers may be bad." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_regen_translator.osc b/res/oscscripts/seagate_f3_regen_translator.osc new file mode 100644 index 0000000..24c9cfe --- /dev/null +++ b/res/oscscripts/seagate_f3_regen_translator.osc @@ -0,0 +1,152 @@ +# Seagate F3 Translator Regeneration +# Safe workflow for BSY/LED or translator corruption on Seagate F3 drives. +# +# PREREQUISITES: +# 1. Backup SA modules before running (especially 0x02B, 0x02A, 0x02C) +# using Y-Modem transfer (r command) via your terminal program. +# OSC serial commands do NOT support Y-Modem, so this must be done +# externally or skipped if you accept the risk. +# 2. Default baud: 38400, 8N1, no flow control. +# 3. Power-cycle the drive after this script completes. +# +# This script will: +# - Wake the terminal and display drive info +# - Snapshot defect lists (V1, V4, V10, V40, V80) for documentation +# - Clear G-list (i4,1,22) +# - Clear SMART (1>N1) +# - Regenerate translator (m0,6,2) +# - Verify translator loaded (V1) +# - Remind you to power-cycle + +echo "============================================" +echo " Seagate F3 Translator Regeneration" +echo "============================================" +echo "" +echo "IMPORTANT: Back up SA modules before proceeding!" +echo " r0x2B,3,1 (translator module)" +echo " r0x2A,3,1 (related module)" +echo " r0x2C,3,1" +echo "" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 2048 +serialread 2048 +printbuffer 0 2048 + +echo "Sending Ctrl+L for drive info..." +serialsend \x0c +usleep 300000 + +echo "--- Drive Info ---" +serialread 2048 +printbuffer 0 2048 + +echo "--- Snapshot: User Slip List (V1) ---" +serialsend \x56\x31\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "--- Snapshot: G-List before clear (V4) ---" +serialsend \x56\x34\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "--- Snapshot: P-List (V10) ---" +serialsend \x56\x31\x30\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "--- Snapshot: Non-resident G-List (V40) ---" +serialsend \x56\x34\x30\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "--- Snapshot: Resident G-List (V80) ---" +serialsend \x56\x38\x30\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "=== Clearing G-List (i4,1,22) ===" +echo "WARNING: Sectors in G-list will be lost from user data." +echo " Comment out lines 93-95 to skip this step." +serialsend \x69\x34\x2c\x31\x2c\x32\x32\x0d +usleep 500000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "=== Clearing SMART (1>N1) ===" +echo "Changing to level 1..." +serialsend \x2f\x31\x0d +usleep 200000 +serialsend \x4e\x31\x0d +usleep 500000 +serialread 1024 +printbuffer 0 1024 + +echo "Returning to level T..." +serialsend \x2f\x54\x0d +usleep 200000 + +echo "" +echo "=== Regenerating Translator (m0,6,2) ===" +echo "This may take 30-120 seconds. Reading progress..." +serialsend \x6d\x30\x2c\x36\x2c\x32\x2c\x2c\x2c\x2c\x2c\x32\x32\x0d +usleep 5000000 + +echo "--- Initial status (5s) ---" +serialread 1024 +printbuffer 0 1024 +usleep 60000000 + +echo "--- Progress (65s) ---" +serialread 1024 +printbuffer 0 1024 +usleep 60000000 + +echo "--- Final status (125s) ---" +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "=== Verification: Translator check (V1) ===" +serialsend \x56\x31\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "=== Verification: G-List after regen (V4) ===" +serialsend \x56\x34\x0d +usleep 300000 +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "============================================" +echo " Translator regeneration complete." +echo " POWER-CYCLE the drive before use." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_restore_f_defaults.osc b/res/oscscripts/seagate_f3_restore_f_defaults.osc new file mode 100644 index 0000000..d38b9cb --- /dev/null +++ b/res/oscscripts/seagate_f3_restore_f_defaults.osc @@ -0,0 +1,53 @@ +# Seagate F3 Restore F Parameters to Defaults +# Resets all F parameters (RWRecoveryFlags, BGMSFlags, +# PerformanceFlags, ReadRetries, etc.) to factory defaults. +# Default baud: 38400, 8N1, no flow control. +# +# Use after running tune_for_imaging to re-enable read retries, +# sparing, and background media scan without a power cycle. +# +# Command: T> F,,22 +# +# WARNING: Also resets any custom F tuning that may have been +# set for data recovery purposes. Power-cycle after imaging +# is still recommended for complete reset. + +echo "============================================" +echo " Seagate F3 Restore F Defaults" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "=== Restoring F parameters to defaults (F,,22) ===" +serialsend \x46\x2c\x2c\x32\x32\x0d +usleep 300000 + +echo "--- Response ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "============================================" +echo " F parameters restored to factory defaults." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_spin_down.osc b/res/oscscripts/seagate_f3_spin_down.osc new file mode 100644 index 0000000..52e8322 --- /dev/null +++ b/res/oscscripts/seagate_f3_spin_down.osc @@ -0,0 +1,59 @@ +# Seagate F3 Spin Down +# Sends the spin down (sleep) command to a Seagate F3 drive. +# Changes to level 2 and issues the Z command. +# Default baud: 38400, 8N1, no flow control. +# +# Use before: +# - Transporting the drive +# - Swapping PCB +# - Safe hot-swap +# - Preparing for imaging (spin down + remove power) + +echo "============================================" +echo " Seagate F3 Spin Down" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Changing to level 2..." +serialsend \x2f\x32\x0d +usleep 200000 + +echo "--- Level Change ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "=== Spinning Down (Z) ===" +serialsend \x5a\x0d +usleep 500000 + +echo "--- Spin Down Response ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "============================================" +echo " Drive should now be spun down (idle/standby)." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_spin_up.osc b/res/oscscripts/seagate_f3_spin_up.osc new file mode 100644 index 0000000..ad98b06 --- /dev/null +++ b/res/oscscripts/seagate_f3_spin_up.osc @@ -0,0 +1,58 @@ +# Seagate F3 Spin Up +# Sends the spin up command to a Seagate F3 drive. +# Changes to level 2 and issues the U command. +# Default baud: 38400, 8N1, no flow control. +# +# Use after spin down (Z) to restart the spindle motor. +# The drive should respond with "SpinUp" or similar +# confirmation before becoming ready for further commands. + +echo "============================================" +echo " Seagate F3 Spin Up" +echo "============================================" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Changing to level 2..." +serialsend \x2f\x32\x0d +usleep 200000 + +echo "--- Level Change ---" +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "=== Spinning Up (U) ===" +serialsend \x55\x0d +usleep 2000000 + +echo "--- Spin Up Response ---" +serialread 2048 +printbuffer 0 2048 + +echo "" +echo "============================================" +echo " Spin up command sent." +echo " Drive should be ready for operation." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/res/oscscripts/seagate_f3_tune_for_imaging.osc b/res/oscscripts/seagate_f3_tune_for_imaging.osc new file mode 100644 index 0000000..4046b6a --- /dev/null +++ b/res/oscscripts/seagate_f3_tune_for_imaging.osc @@ -0,0 +1,78 @@ +# Seagate F3 Tune for Imaging +# Disables retries, sparing, and background tasks so the drive +# won't hang or reallocate sectors during ddrescue/imaging. +# Run this BEFORE cloning a failing Seagate F3 drive. +# Default baud: 38400, 8N1, no flow control. +# +# Changes made (all reversible with F,,22 reset to defaults): +# RWRecoveryFlags = 00 (disable read/write sparing, enable ECC correction) +# BGMSFlags = 00 (disable background media scan) +# PerformanceFlags = 0060 (disable offline sparing, deferred realloc, idle activities) +# ReadRetries = 00 (disable read retries) +# +# Power-cycle the drive after imaging to restore defaults. + +echo "============================================" +echo " Seagate F3 Tune for Imaging" +echo "============================================" +echo "" +echo "Disables retries/sparing/BGMS to prevent hangs." +echo "Power-cycle after imaging to restore defaults." +echo "" + +if $gui_mode = 0 + serialopen /dev/ttyUSB0 38400 +else + serialopen +endif +usleep 200000 + +echo "Waking terminal (Ctrl+Z)..." +serialsend \x1a +usleep 500000 + +echo "--- Terminal Banner ---" +buffersize 1024 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Setting RWRecoveryFlags = 00 (disable sparing, enable correction)..." +serialsend \x46\x22\x52\x57\x52\x65\x63\x6f\x76\x65\x72\x79\x46\x6c\x61\x67\x73\x22\x2c\x30\x30\x2c\x32\x32\x0d +usleep 300000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Setting BGMSFlags = 00 (disable background media scan)..." +serialsend \x46\x22\x42\x47\x4d\x53\x46\x6c\x61\x67\x73\x22\x2c\x30\x30\x2c\x32\x32\x0d +usleep 300000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Setting PerformanceFlags = 0060 (disable sparing/idle)..." +serialsend \x46\x22\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x46\x6c\x61\x67\x73\x22\x2c\x30\x30\x36\x30\x2c\x32\x32\x0d +usleep 300000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "Setting ReadRetries = 00 (disable read retries)..." +serialsend \x46\x22\x52\x65\x61\x64\x52\x65\x74\x72\x69\x65\x73\x22\x2c\x30\x30\x2c\x32\x32\x0d +usleep 300000 +serialread 1024 +printbuffer 0 1024 + +echo "" +echo "============================================" +echo " Tuning complete. Ready for imaging." +echo " POWER-CYCLE the drive after imaging" +echo " to restore default F parameters." +echo "============================================" + +if $gui_mode = 0 + serialclose +endif +echo "=== Done ===" +end diff --git a/src/opensuperclone/asclepius.c b/src/opensuperclone/asclepius.c index 5fe2b14..51ac80e 100644 --- a/src/opensuperclone/asclepius.c +++ b/src/opensuperclone/asclepius.c @@ -13,7 +13,6 @@ int asclepius_serial_port = -1; bool asclepius_ext_connected = false; int asclepius_ext_serial_port = -1; -char asclepius_ext_tty_device_ccc[256]; int asclepius_ext_baud_rate_ccc = 38400; void (*asclepius_ext_output_ccc)(const char *text, int byte_count) = NULL; diff --git a/src/opensuperclone/clone_gui.c b/src/opensuperclone/clone_gui.c index c7ddfc2..2236cc3 100644 --- a/src/opensuperclone/clone_gui.c +++ b/src/opensuperclone/clone_gui.c @@ -7303,6 +7303,7 @@ void on_ext_terminal_script_clicked_ccc(GtkWidget *button) _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filechooser), OSC_SCRIPT_PATH); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT) {