You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
3.8 KiB
191 lines
3.8 KiB
import trezorio as io
|
|
import trezorui as ui
|
|
import utime
|
|
|
|
usb_vcp = io.VCP(
|
|
iface_num=0x00,
|
|
data_iface_num=0x01,
|
|
ep_in=0x81,
|
|
ep_out=0x01,
|
|
ep_cmd=0x82,
|
|
)
|
|
|
|
usb = io.USB(
|
|
vendor_id=0x1209,
|
|
product_id=0x53C1,
|
|
release_num=0x0200,
|
|
manufacturer="SatoshiLabs",
|
|
product="TREZOR",
|
|
serial_number="000000000000000000000000",
|
|
usb21_landing=False,
|
|
)
|
|
|
|
usb.add(usb_vcp)
|
|
|
|
usb.open()
|
|
|
|
d = ui.Display()
|
|
otp = io.FlashOTP()
|
|
sd = io.SDCard()
|
|
sbu = io.SBU()
|
|
|
|
|
|
def test_display(colors):
|
|
d.clear()
|
|
m = {
|
|
"R": 0xF800,
|
|
"G": 0x07E0,
|
|
"B": 0x001F,
|
|
"W": 0xFFFF,
|
|
}
|
|
w = 240 // len(colors)
|
|
for i, c in enumerate(colors):
|
|
c = m.get(c, 0x0000)
|
|
d.bar(i * w, 0, i * w + w, 240, c)
|
|
d.refresh()
|
|
print("OK")
|
|
|
|
|
|
def test_touch(v):
|
|
d.clear()
|
|
c, t = int(v[0]), int(v[1])
|
|
deadline = utime.ticks_add(utime.ticks_us(), t * 1000000)
|
|
if c == 1:
|
|
d.bar(0, 0, 120, 120, 0xFFFF)
|
|
elif c == 2:
|
|
d.bar(120, 0, 120, 120, 0xFFFF)
|
|
elif c == 3:
|
|
d.bar(120, 120, 120, 120, 0xFFFF)
|
|
else:
|
|
d.bar(0, 120, 120, 120, 0xFFFF)
|
|
d.refresh()
|
|
r = [0, 0]
|
|
# flush all events
|
|
while io.poll([io.TOUCH], r, 10000):
|
|
pass
|
|
# wait for event
|
|
touch = False
|
|
while True:
|
|
if not touch:
|
|
if (
|
|
io.poll([io.TOUCH], r, 10000)
|
|
and r[0] == io.TOUCH
|
|
and r[1][0] == io.TOUCH_START
|
|
):
|
|
touch = True
|
|
else:
|
|
if (
|
|
io.poll([io.TOUCH], r, 10000)
|
|
and r[0] == io.TOUCH
|
|
and r[1][0] == io.TOUCH_END
|
|
):
|
|
print(f"OK {r[1][1]} {r[1][2]}")
|
|
break
|
|
if utime.ticks_us() > deadline:
|
|
print("ERROR TIMEOUT")
|
|
break
|
|
# flush all events
|
|
while io.poll([io.TOUCH], r, 10000):
|
|
pass
|
|
d.clear()
|
|
d.refresh()
|
|
|
|
|
|
def test_pwm(v):
|
|
d.backlight(int(v))
|
|
d.refresh()
|
|
print("OK")
|
|
|
|
|
|
def test_sd():
|
|
if sd.present():
|
|
sd.power(True)
|
|
buf1 = bytearray(8 * 1024)
|
|
try:
|
|
sd.read(0, buf1)
|
|
except OSError:
|
|
print("ERROR READING DATA")
|
|
sd.power(False)
|
|
return
|
|
try:
|
|
sd.write(0, buf1)
|
|
except OSError:
|
|
print("ERROR WRITING DATA")
|
|
sd.power(False)
|
|
return
|
|
buf2 = bytearray(8 * 1024)
|
|
try:
|
|
sd.read(0, buf2)
|
|
except OSError:
|
|
print("ERROR READING DATA")
|
|
sd.power(False)
|
|
return
|
|
if buf1 == buf2:
|
|
print("OK")
|
|
else:
|
|
print("ERROR DATA MISMATCH")
|
|
sd.power(False)
|
|
else:
|
|
print("ERROR NOCARD")
|
|
|
|
|
|
def test_sbu(v):
|
|
sbu1 = v[0] == "1"
|
|
sbu2 = v[1] == "1"
|
|
sbu.set(sbu1, sbu2)
|
|
print("OK")
|
|
|
|
|
|
def test_otp_read():
|
|
data = bytearray(32)
|
|
otp.read(0, 0, data)
|
|
data = bytes(data).rstrip(b"\x00\xff").decode()
|
|
print("OK", data)
|
|
|
|
|
|
def test_otp_write(v):
|
|
if len(v) < 32:
|
|
v = v + "\x00" * (32 - len(v))
|
|
data = v[:32].encode()
|
|
otp.write(0, 0, data)
|
|
otp.lock(0)
|
|
print("OK")
|
|
|
|
|
|
d.clear()
|
|
|
|
while True:
|
|
|
|
try:
|
|
line = input()
|
|
|
|
if line == "PING":
|
|
print("OK")
|
|
|
|
elif line.startswith("DISP "):
|
|
test_display(line[5:])
|
|
|
|
elif line.startswith("TOUCH "):
|
|
test_touch(line[6:])
|
|
|
|
elif line.startswith("PWM "):
|
|
test_pwm(line[4:])
|
|
|
|
elif line == "SD":
|
|
test_sd()
|
|
|
|
elif line.startswith("SBU "):
|
|
test_sbu(line[4:])
|
|
|
|
elif line.startswith("OTP READ"):
|
|
test_otp_read()
|
|
|
|
elif line.startswith("OTP WRITE "):
|
|
test_otp_write(line[10:])
|
|
|
|
else:
|
|
print("UNKNOWN")
|
|
|
|
except Exception as ex:
|
|
print("ERROR", ex)
|