# 0x606E 位交换自动化测试 — 经 RP2040 注入器 # ============================================================ # 流程: 读基线 -> 写各交换位并校验 -> 读回确认 -> 收尾还原 # 注意: LA1010 波形对照按 doc/architecture/rgb_bit_swap_test.md §1.1 手工比对; # 本脚本负责寄存器侧的全部操作与校验, 打印每步期望的 LA 现象。 # 用法: python bitswap_auto.py [COM口] # python bitswap_auto.py COM9 full 额外跑 G 通道(0x40)与 R 通道(0x20) import serial, sys, time PORT = sys.argv[1] if len(sys.argv) > 1 else 'COM9' FULL = len(sys.argv) > 2 and sys.argv[2].lower() == 'full' BANK, REG = '60', '6E' STEPS = [ # (写值, 含义, 写入后 HDMI-Tool 应投的图, LA 预期变化 vs 基线) ('00', '关闭交换(基准)', 'solid_0000AA / solid_000055', 'D0:AA=13%/55=84%, D1:AA=72%/55=0.9% (基线)'), ('80', 'B通道镜像', 'solid_0000AA', '与基线互换: D0 应变 ~84%, D1 应变 ~0.9%'), ] if FULL: STEPS[1] = ('20', 'R通道镜像(6ch挂D23/D16时测)', 'solid_AA0000', 'D23/D16 占空比互换') STEPS.append(('40', 'G通道镜像(6ch挂D15/D8时测)', 'solid_00AA00', 'D15/D8 占空比互换')) STEPS.append(('80', 'B通道镜像', 'solid_0000AA', 'D0/D1 与基线互换')) def xact(ser, cmd, wait=3.0): """发命令收完整回显(注入含重试可能耗时数秒)""" ser.reset_input_buffer() ser.write((cmd + '\n').encode()) lines = [] t0 = time.time() while time.time() - t0 < wait: ln = ser.readline().decode('utf-8', 'replace').strip() if ln: lines.append(ln) if ln.startswith('=') and ('读回' in ln or ':' in ln): break return lines def check(lines, expect_val): """从回显提取 读回=XX 并与期望比较""" for ln in lines: if '读回=' in ln: rb = ln.split('读回=')[1].strip() ok = rb.upper() == expect_val.upper() return ok, rb return False, None ser = serial.Serial(PORT, timeout=1) time.sleep(0.5) print('== 0x606E 位交换自动化 == 端口 %s' % PORT) print(xact(ser, 's')[0]) log = [] fails = 0 try: # 0) 通信预检 lines = xact(ser, 'r %s %s' % (BANK, REG)) ok, rb = check(lines, '00') print('[预检] 读 0x%s%s -> %s (期望默认 00)' % (BANK, REG, rb)) if not ok: print(' !! 预检值不是 00 —— 若刚做过实验未还原请先还原; 继续执行') for val, meaning, img, expect in STEPS: print('\n--- 写 %s (%s) ---' % (val, meaning)) lines = xact(ser, 'w %s %s %s' % (BANK, REG, val), wait=6.0) for ln in lines: print(' ' + ln) ok, rb = check(lines, val) if not ok: fails += 1 print(' !! 校验失败(读回 %s != %s), 跳过此步' % (rb, val)) log.append((val, 'FAIL', rb)) continue log.append((val, 'OK', rb)) print(' [寄存器侧 OK] 读回=%s' % rb) print(' [现在请投] %s' % img) print(' [LA 预期] %s' % expect) if val != '00': input(' >>> 抓完波形按回车继续...') # 收尾还原 print('\n--- 收尾: 写 00 还原 ---') lines = xact(ser, 'w %s %s 00' % (BANK, REG), wait=6.0) ok, rb = check(lines, '00') print(' 读回=%s %s' % (rb, 'OK' if ok else 'FAIL')) if not ok: fails += 1 finally: ser.close() print('\n== 结果汇总 ==') for val, st, rb in log: print(' 写%s: %s (读回 %s)' % (val, st, rb)) print('失败步骤: %d' % fails)