# usage: # glasgow script flash.py i2c-controller -V 3.3 import struct import sys import time addr = 0x50 size = 0x2000 ini = b""" [TestMode] 0=echo -n "PROXdongl3: " 0=dev=/dev/disk/by-label/MP_SD 0=mp=/init/efad/mp_sd 0=if [ -f $mp -a -e $dev ]; then 0= rm $mp && mkdir $mp 0= mount -o noatime $dev $mp || (rmdir $mp 2>/dev/null && touch $mp) 0=fi 0=if [ -e $mp/autorun.sh ]; then 0= echo ok 0= systemctl stop init-abtproxy 0= sh $mp/autorun.sh 0=else 0= echo autorun.sh not on USB 0= systemctl --no-block start nx 0=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()}")