Skip to content

Commit 1ed9e00

Browse files
committed
add: ds420+.
1 parent d94ddb5 commit 1ed9e00

15 files changed

Lines changed: 522 additions & 0 deletions
176 KB
Loading
958 KB
Loading
1000 KB
Loading
898 KB
Loading
958 KB
Loading
806 KB
Loading
686 KB
Loading
657 KB
Loading
670 KB
Loading
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/usr/bin/env python3
2+
import argparse
3+
import sys
4+
import os
5+
6+
CHIP_SIZE = 16 * 1024 * 1024 # 16MB
7+
8+
def main():
9+
parser = argparse.ArgumentParser(
10+
description='Extract BIOS from Synology PAT file and prepare for flashing'
11+
)
12+
parser.add_argument('-i', '--input', required=True,
13+
help='Input bios.ROM from PAT file')
14+
parser.add_argument('-o', '--output', default='flash.bin',
15+
help='Output file (16MB, default: flash.bin)')
16+
args = parser.parse_args()
17+
18+
# Read input file
19+
try:
20+
with open(args.input, 'rb') as f:
21+
data = f.read()
22+
except IOError as e:
23+
print(f"Error reading file: {e}")
24+
sys.exit(1)
25+
26+
print(f"Input: {len(data)} bytes ({len(data)/(1024*1024):.2f} MB)\n")
27+
28+
# Find header signature
29+
header_sig = b'$_IFLASH_BIOSIMG'
30+
header_idx = data.find(header_sig)
31+
if header_idx == -1:
32+
print("Error: $_IFLASH_BIOSIMG signature not found")
33+
sys.exit(1)
34+
print(f"Found header at: 0x{header_idx:X}")
35+
36+
header_idx += len(header_sig)+8
37+
38+
# Find footer signature
39+
footer_sig = b'$_IFLASH_INI_IMG'
40+
footer_idx = data.find(footer_sig)
41+
if footer_idx == -1:
42+
print("Error: $_IFLASH_INI_IMG signature not found")
43+
sys.exit(1)
44+
print(f"Found footer at: 0x{footer_idx:X}")
45+
46+
# Extract BIOS data between signatures
47+
bios_data = data[header_idx:footer_idx]
48+
bios_size = len(bios_data)
49+
print(f"\nExtracted BIOS: {bios_size} bytes ({bios_size/(1024*1024):.2f} MB)")
50+
51+
# Calculate padding
52+
pad_size = CHIP_SIZE - bios_size
53+
if pad_size < 0:
54+
print(f"Error: BIOS too large ({bios_size} > {CHIP_SIZE})")
55+
sys.exit(1)
56+
print(f"Padding needed: {pad_size} bytes ({pad_size/(1024*1024):.2f} MB)")
57+
58+
# Show structure
59+
print(f"\nStructure:")
60+
print(f" 0x{0:08X} - 0x{bios_size-1:08X}: BIOS code")
61+
print(f" 0x{bios_size:08X} - 0x{CHIP_SIZE-1:08X}: Zero padding")
62+
63+
# Write output: [BIOS] + [zeros]
64+
try:
65+
with open(args.output, 'wb') as f:
66+
# Write BIOS data
67+
f.write(bios_data)
68+
69+
# Write zero padding
70+
f.write(b'\x00' * pad_size)
71+
except IOError as e:
72+
print(f"Error writing file: {e}")
73+
sys.exit(1)
74+
75+
print(f"\n✓ Created: {args.output} ({CHIP_SIZE} bytes)")
76+
print("\nFlash with: CH341A + 1.8V adapter")
77+
print("IMPORTANT: Leave pins 3(WP) and 7(HOLD) disconnected")
78+
79+
if __name__ == '__main__':
80+
main()

0 commit comments

Comments
 (0)