# usage: # glasgow script flash.py i2c-controller -V 3.3 import struct import sys import time addr = 0x50 size = 0x2000 ini = b""" [FzgParam] Fahrzeugadresse=11111111 MontageplattenNr=22222222 [TestMode] 0=echo -n "PROXdongl3: " 1=if [ -e /init/efad/mp_sd/autorun.sh ]; then 2= echo ok 3= systemctl stop init-abtproxy 4= sh /init/efad/mp_sd/autorun.sh 5=else 6= echo autorun.sh not on USB 7= systemctl --no-block start nx 8=fi """.lstrip() write_data = ini.strip().replace(b'\n', b'\r\n').ljust(size, b'\xff') await i2c_iface.write(addr, struct.pack('>h', 0)) print("reading eeprom data") read_data = await i2c_iface.read(addr, len(write_data)) if read_data == write_data: print("already written, skipping") sys.exit(0) else: print(f"overwriting eeprom data: {read_data.hex()}") chunk_size = 32 for i in range(0, size, chunk_size): read_chunk = read_data[i:i+chunk_size] write_chunk = write_data[i:i+chunk_size] if read_chunk == write_chunk: continue print(f"writing chunk {struct.pack('>h', i).hex()}") await i2c_iface.write(addr, struct.pack('>h', i) + write_chunk) time.sleep(0.01) print("wrote, reading back") await i2c_iface.write(addr, struct.pack('>h', i)) read_chunk = await i2c_iface.read(addr, chunk_size) if read_chunk == write_chunk: print(f"wrote {i+chunk_size}") print("write complete") await i2c_iface.write(addr, struct.pack('>h', 0)) read_data = await i2c_iface.read(addr, len(write_data)) if read_data == write_data: print("read back successful") else: print("read back unsuccessful") print(f"expected: {write_data.hex()}") print(f" got: {read_data.hex()}")