Skip to content

Commit e5eaea2

Browse files
committed
usb: Add control proxy interface.
1 parent 0be61e0 commit e5eaea2

3 files changed

Lines changed: 27 additions & 7 deletions

File tree

orbtrace/soc.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,19 @@ def add_trace(self):
458458
e.bEndpointAddress = 0x80 | ep_num
459459
e.wMaxPacketSize = 512
460460

461+
# Control proxy interface.
462+
proxy_if_num = self.usb_alloc.interface()
463+
464+
with self.usb_conf_desc.InterfaceDescriptor() as i:
465+
i.bInterfaceNumber = proxy_if_num
466+
i.bInterfaceClass = 0xff
467+
i.bInterfaceSubclass = 0x58
468+
i.bInterfaceProtocol = 0x00
469+
470+
i.iInterface = 'Control Proxy'
471+
461472
# Control handler.
462-
handler = TraceUSBHandler(if_num)
473+
handler = TraceUSBHandler(if_num, proxy_if_num)
463474

464475
self.add_usb_control_handler(handler)
465476

orbtrace/trace/usb_handler.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
from luna.gateware.usb.usb2.request import USBRequestHandler
44

55
class TraceUSBHandler(USBRequestHandler):
6-
def __init__(self, if_num):
6+
def __init__(self, if_num, proxy_if_num):
77
super().__init__()
88

99
self.if_num = if_num
10+
self.proxy_if_num = proxy_if_num
1011

1112
self.input_format = Signal(8)
1213

@@ -41,7 +42,7 @@ def transition(self, m):
4142
with m.If(self.request_done):
4243
m.next = 'IDLE'
4344

44-
targeting_if = (setup.recipient == USBRequestRecipient.INTERFACE) & (setup.index[:8] == self.if_num)
45+
targeting_if = (setup.recipient == USBRequestRecipient.INTERFACE) & ((setup.index[:8] == self.if_num) | (setup.index[:8] == self.proxy_if_num))
4546

4647
with m.If(setup.received & targeting_if):
4748
m.next = 'DISPATCH'

orbtrace_util.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,16 @@ def parse_power(value):
3333
parser_actions.add_argument('--vtref', type = parse_power, help = 'Set VTREF')
3434
parser_actions.add_argument('--vtpwr', type = parse_power, help = 'Set VTPWR')
3535

36+
parser_options = parser.add_argument_group('Options')
37+
parser_options.add_argument('--proxy', action = 'store_true', help = 'Use proxy interface')
38+
3639
args = parser.parse_args()
3740

3841
class Orbtrace:
3942
def __init__(self, device):
4043
self.trace_if = None
4144
self.power_if = None
45+
self.proxy_if = None
4246

4347
self.read_config(device)
4448

@@ -58,11 +62,15 @@ def read_config(self, device):
5862

5963
if setting.getSubClass() == ord('P'):
6064
self.power_if = setting.getNumber()
65+
66+
if setting.getSubClass() == ord('X'):
67+
self.proxy_if = setting.getNumber()
6168

62-
def trace_set_input_format(self, format):
63-
assert self.trace_if is not None
69+
def trace_set_input_format(self, format, use_proxy = False):
70+
if_num = self.proxy_if if use_proxy else self.trace_if
71+
assert if_num is not None
6472

65-
self.handle.controlWrite(0x41, 0x01, input_formats[format], self.trace_if, b'')
73+
self.handle.controlWrite(0x41, 0x01, input_formats[format], if_num, b'')
6674

6775
def power_set_enable(self, channel, enable):
6876
assert self.power_if is not None
@@ -105,7 +113,7 @@ def power_set_voltage(self, channel, voltage):
105113
orbtrace = Orbtrace(devices[0])
106114

107115
if args.input_format:
108-
orbtrace.trace_set_input_format(args.input_format)
116+
orbtrace.trace_set_input_format(args.input_format, args.proxy)
109117

110118
if args.vtref:
111119
if args.vtref in ['off', 'on']:

0 commit comments

Comments
 (0)