Free ECU Tools

Professional tools
for African techs

Browser-based ECU utilities — no software install, no Windows required. Work directly with your binary files.

VAG EDC16 — 95320 IMMO Remover
VW · Audi · Škoda · SEAT  |  EDC16C3 / C34 / C39 / U  |  Bosch
Free
📂

Drop 95320 EEPROM .bin here or click to browse

Read directly from 95320 chip — must be exactly 4096 bytes
Algorithm reference — VAG EDC16 95320 patch logic
# Validation
assert len(eeprom) == 0x1000 # 4096 bytes
assert eeprom[0x17F] == eeprom[0x15F] # mirror block intact

# Computation
val = (eeprom[0x15E] << 8) + eeprom[0x156] + eeprom[0x15F] - 0x60

# Patch primary block
eeprom[0x156] = 0x60
eeprom[0x15E] = (val >> 8) & 0xFF
eeprom[0x15F] = val & 0xFF

# Mirror block (redundancy copy)
eeprom[0x176] = 0x60
eeprom[0x17E] = (val >> 8) & 0xFF
eeprom[0x17F] = val & 0xFF
VAG EDC16 — Dash ↔ ECU PDD Learn
VW · Audi · Škoda · SEAT  |  EDC16C3 / C34 / C39 / U  |  95320 / 93C66
Free
Upload the source ECU EEPROM and the cluster to be fitted. The PDD coupling block is extracted from the ECU and written into the cluster so it authenticates with this car.
ECU EEPROM (95320)
🔌

Drop ECU .bin

95320 — must be 4096 bytes
CLUSTER EEPROM (95320 OR 93C66)
🖥️

Drop Cluster .bin

95320 (4096 B) or 93C66 (512 B)
Algorithm reference — PDD block layout & sync logic
# EDC16 ECU 95320 (4096 bytes) — PDD block layout
ECU_PDD_PRIMARY = 0x100 # 64 bytes — device coupling block A
ECU_PDD_MIRROR = 0x180 # 64 bytes — redundancy copy

# Cluster 95320 (4096 bytes) — PDD block layout
CLUSTER_PDD_4K = 0x080 # 64 bytes — cluster coupling block
CLUSTER_PDD_MIRR = 0x0C0 # 64 bytes — mirror copy

# Cluster 93C66 (512 bytes) — PDD block layout
CLUSTER_PDD_512 = 0x020 # 32 bytes — coupling block
CLUSTER_PDD_M512 = 0x040 # 32 bytes — mirror copy

# ── Mode A: ECU → Cluster ────
pdd = ecu[0x100:0x140] # extract 64-byte PDD
if len(cluster) == 4096:
cluster[0x080:0x0C0] = pdd # primary
cluster[0x0C0:0x100] = pdd # mirror
elif len(cluster) == 512:
cluster[0x020:0x040] = pdd[:32] # primary (32 bytes)
cluster[0x040:0x060] = pdd[:32] # mirror

# ── Mode B: Cluster → ECU ────
if len(cluster) == 4096:
pdd = cluster[0x080:0x0C0]
elif len(cluster) == 512:
pdd = cluster[0x020:0x040].ljust(64, b'\xff')
ecu[0x100:0x140] = pdd # primary
ecu[0x180:0x1C0] = pdd # mirror

# ── Mode C: Cluster Clone ────
if len(src) == len(dst) == 4096:
dst[0x080:0x100] = src[0x080:0x100] # PDD + mirror
if keep_mileage:
dst[0x000:0x040] = src[0x000:0x040] # mileage block
elif len(src) == len(dst) == 512:
dst[0x020:0x060] = src[0x020:0x060] # PDD + mirror
if keep_mileage:
dst[0x000:0x020] = src[0x000:0x020] # mileage block