Files

102 lines
3.6 KiB
Python

# 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 = [ # (写值, 含义, 写入后 DLPilot 应投的图, 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)