#!/usr/bin/env python3 """ Strip OOB/spare area from NAND dump Converts 66 MB dump (with OOB) to 64 MB (without OOB) """ import sys import os INPUT = "W25N512GV_original_66MB.bin" OUTPUT = "W25N512GV_stripped_64MB.bin" PAGE_MAIN = 2048 # Main data PAGE_SPARE = 64 # OOB/spare PAGE_TOTAL = 2112 # Total per page TOTAL_PAGES = 32768 # 512 blocks * 64 pages/block def strip_oob(): print("OOB Stripper for W25N512GV NAND dump") print("=" * 50) print() if not os.path.exists(INPUT): print(f"ERROR: {INPUT} not found!") print() print("Download from:") print(" https://drive.usercontent.google.com/download?id=1GufkkjU6tJbbC6E2G3SigHb8DhyCoQA8") print(f" Save as: {INPUT}") sys.exit(1) input_size = os.path.getsize(INPUT) print(f"Input: {INPUT} ({input_size / 1024 / 1024:.1f} MB)") if input_size == 67108864: print("Already 64 MB (no OOB)! Just copying...") with open(INPUT, 'rb') as f_in, open(OUTPUT, 'wb') as f_out: f_out.write(f_in.read()) print(f"Done: {OUTPUT}") sys.exit(0) if input_size != 69206016: print(f"WARNING: Unexpected size (expected 66 MB)") print("Continuing anyway...") print(f"Output: {OUTPUT} (64 MB)") print() print(f"Processing {TOTAL_PAGES} pages...") print() with open(INPUT, 'rb') as f_in, open(OUTPUT, 'wb') as f_out: for page in range(TOTAL_PAGES): # Read page with OOB offset = page * PAGE_TOTAL f_in.seek(offset) # Read only main area (skip spare) data = f_in.read(PAGE_MAIN) f_out.write(data) # Progress if (page + 1) % 1024 == 0: percent = (page + 1) * 100 // TOTAL_PAGES print(f" Progress: {percent}% ({page + 1} / {TOTAL_PAGES} pages)") print() output_size = os.path.getsize(OUTPUT) if output_size == 67108864: print(f"SUCCESS: {OUTPUT} is exactly 64 MB!") print() print("You can now use this with repair_nand_final.sh") return 0 else: print(f"ERROR: Output is {output_size / 1024 / 1024:.1f} MB (expected 64 MB)") return 1 if __name__ == "__main__": sys.exit(strip_oob())