Skip to content

Commit eaed336

Browse files
committed
usb: Add a dummy handler for the ACM SET_LINE_CODING request.
1 parent 63428b5 commit eaed336

2 files changed

Lines changed: 83 additions & 0 deletions

File tree

orbtrace/cdc_acm.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from amaranth import *
2+
from usb_protocol.types import USBRequestType, USBRequestRecipient
3+
4+
from luna.gateware.usb.usb2.request import USBRequestHandler
5+
from luna.gateware.usb.stream import USBInStreamInterface
6+
from luna.gateware.stream.generator import StreamSerializer
7+
8+
class ACMRequestHandler(USBRequestHandler):
9+
def __init__(self, if_num):
10+
super().__init__()
11+
12+
self.if_num = if_num
13+
14+
self.new_request = Signal()
15+
self.request_done = Signal()
16+
17+
def handle_set_line_coding(self, m):
18+
with m.If(self.interface.rx_ready_for_response):
19+
m.d.comb += self.interface.handshakes_out.ack.eq(1)
20+
21+
with m.If(self.interface.status_requested):
22+
m.d.comb += self.send_zlp()
23+
m.d.comb += self.request_done.eq(1)
24+
25+
def handle_unhandled(self, m):
26+
interface = self.interface
27+
28+
with m.If(interface.rx_ready_for_response | interface.data_requested | interface.status_requested):
29+
m.d.comb += [
30+
interface.handshakes_out.stall.eq(1),
31+
self.request_done.eq(1),
32+
]
33+
34+
def transition(self, m):
35+
setup = self.interface.setup
36+
37+
with m.If(self.request_done):
38+
m.next = 'IDLE'
39+
40+
targeting_if = (setup.recipient == USBRequestRecipient.INTERFACE) & (setup.index == self.if_num)
41+
42+
with m.If(setup.received & targeting_if):
43+
m.next = 'DISPATCH'
44+
45+
def elaborate(self, platform):
46+
m = Module()
47+
48+
m.submodules.transmitter = self.transmitter = StreamSerializer(data_length = 6, domain = 'usb', stream_type=USBInStreamInterface)
49+
50+
interface = self.interface
51+
setup = self.interface.setup
52+
53+
m.d.usb += self.new_request.eq(0)
54+
55+
with m.FSM(domain = 'usb'):
56+
with m.State('IDLE'):
57+
self.transition(m)
58+
59+
with m.State('DISPATCH'):
60+
m.d.usb += self.new_request.eq(1)
61+
62+
m.next = 'UNHANDLED'
63+
64+
with m.If(setup.type == USBRequestType.CLASS):
65+
with m.Switch(setup.request):
66+
with m.Case(0x20): # SET_LINE_CODING
67+
m.next = 'SET_LINE_CODING'
68+
69+
with m.State('SET_LINE_CODING'):
70+
self.handle_set_line_coding(m)
71+
self.transition(m)
72+
73+
with m.State('UNHANDLED'):
74+
self.handle_unhandled(m)
75+
self.transition(m)
76+
77+
return m

orbtrace/soc.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
from .usb_serialnumber import USBSerialNumberHandler
2222

23+
from .cdc_acm import ACMRequestHandler
24+
2325
from .flash_uid import FlashUID
2426
from .flashwriter import FlashWriter
2527

@@ -601,6 +603,10 @@ def add_usb_uart(self, uart):
601603

602604
self.submodules += in_cdc, out_cdc, pipeline
603605

606+
# Control request handler.
607+
handler = ACMRequestHandler(comm_if)
608+
self.add_usb_control_handler(handler)
609+
604610
def add_usb_bridge(self):
605611
mem_request_handler = MemRequestHandler()
606612

0 commit comments

Comments
 (0)