Skip to content

Commit 7aefcc4

Browse files
committed
Add an alternative way to number the USB endpoints
Two options available: - relative numbering (USB_RELATIVE_EP_NUM = 1) - default - absolute numbering (USB_RELATIVE_EP_NUM = 0) - new!
1 parent f4922a5 commit 7aefcc4

3 files changed

Lines changed: 80 additions & 26 deletions

File tree

ports/atmel-samd/mpconfigport.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ CIRCUITPY_FREQUENCYIO = 0
2222
CIRCUITPY_TOUCHIO_USE_NATIVE = 1
2323

2424
# SAMD21 needs separate endpoint pairs for MSC BULK IN and BULK OUT, otherwise it's erratic.
25-
USB_MSC_NUM_ENDPOINT_PAIRS = 2
25+
USB_MSC_EP_NUM_OUT = 1
2626
endif
2727

2828
# Put samd51-only choices here.

supervisor/supervisor.mk

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,40 @@ ifndef USB_HID_DEVICES
9494
USB_HID_DEVICES = "KEYBOARD,MOUSE,CONSUMER,GAMEPAD"
9595
endif
9696

97-
# SAMD21 needs separate endpoint pairs for MSC BULK IN and BULK OUT, otherwise it's erratic.
98-
ifndef USB_MSC_NUM_ENDPOINT_PAIRS
99-
USB_MSC_NUM_ENDPOINT_PAIRS = 1
97+
ifndef USB_RELATIVE_EP_NUM
98+
USB_RELATIVE_EP_NUM = 1
99+
endif
100+
101+
ifndef USB_CDC_EP_NUM_NOTIFICATION
102+
USB_CDC_EP_NUM_NOTIFICATION = 0
103+
endif
104+
105+
ifndef USB_CDC_EP_NUM_DATA_OUT
106+
USB_CDC_EP_NUM_DATA_OUT = 0
107+
endif
108+
109+
ifndef USB_CDC_EP_NUM_DATA_IN
110+
USB_CDC_EP_NUM_DATA_IN = 0
111+
endif
112+
113+
ifndef USB_MSC_EP_NUM_OUT
114+
USB_MSC_EP_NUM_OUT = 0
115+
endif
116+
117+
ifndef USB_MSC_EP_NUM_IN
118+
USB_MSC_EP_NUM_IN = 0
119+
endif
120+
121+
ifndef USB_HID_EP_NUM_IN
122+
USB_HID_EP_NUM_IN = 0
123+
endif
124+
125+
ifndef USB_MIDI_EP_NUM_OUT
126+
USB_MIDI_EP_NUM_OUT = 0
127+
endif
128+
129+
ifndef USB_MIDI_EP_NUM_IN
130+
USB_MIDI_EP_NUM_IN = 0
100131
endif
101132

102133
SUPERVISOR_O = $(addprefix $(BUILD)/, $(SRC_SUPERVISOR:.c=.o)) $(BUILD)/autogen_display_resources.o
@@ -116,9 +147,17 @@ autogen_usb_descriptor.intermediate: ../../tools/gen_usb_descriptor.py Makefile
116147
--vid $(USB_VID)\
117148
--pid $(USB_PID)\
118149
--serial_number_length $(USB_SERIAL_NUMBER_LENGTH)\
119-
--devices $(USB_DEVICES)\
150+
--devices $(USB_DEVICES)\
120151
--hid_devices $(USB_HID_DEVICES)\
121-
--msc_num_endpoint_pairs $(USB_MSC_NUM_ENDPOINT_PAIRS)\
152+
--relative_ep_num $(USB_RELATIVE_EP_NUM)\
153+
--cdc_ep_num_notification $(USB_CDC_EP_NUM_NOTIFICATION)\
154+
--cdc_ep_num_data_out $(USB_CDC_EP_NUM_DATA_OUT)\
155+
--cdc_ep_num_data_in $(USB_CDC_EP_NUM_DATA_IN)\
156+
--msc_ep_num_out $(USB_MSC_EP_NUM_OUT)\
157+
--msc_ep_num_in $(USB_MSC_EP_NUM_IN)\
158+
--hid_ep_num_in $(USB_HID_EP_NUM_IN)\
159+
--midi_ep_num_out $(USB_MIDI_EP_NUM_OUT)\
160+
--midi_ep_num_in $(USB_MIDI_EP_NUM_IN)\
122161
--output_c_file $(BUILD)/autogen_usb_descriptor.c\
123162
--output_h_file $(BUILD)/genhdr/autogen_usb_descriptor.h
124163

tools/gen_usb_descriptor.py

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,24 @@
3232
help='devices to include in descriptor (AUDIO includes MIDI support)')
3333
parser.add_argument('--hid_devices', type=lambda l: tuple(l.split(',')), default=DEFAULT_HID_DEVICES,
3434
help='HID devices to include in HID report descriptor')
35-
parser.add_argument('--msc_num_endpoint_pairs', type=int, default=1,
36-
help='Use 1 or 2 endpoint pairs for MSC (1 bidirectional, or 1 input + 1 output (required by SAMD21))')
35+
parser.add_argument('--relative_ep_num', type=int, default=1,
36+
help='use relative(1) or absolute(0) endpoint number')
37+
parser.add_argument('--cdc_ep_num_notification', type=int, default=0,
38+
help='endpoint number of CDC NOTIFICATION')
39+
parser.add_argument('--cdc_ep_num_data_out', type=int, default=0,
40+
help='endpoint number of CDC DATA OUT')
41+
parser.add_argument('--cdc_ep_num_data_in', type=int, default=0,
42+
help='endpoint number of CDC DATA IN')
43+
parser.add_argument('--msc_ep_num_out', type=int, default=0,
44+
help='endpoint number of MSC OUT')
45+
parser.add_argument('--msc_ep_num_in', type=int, default=0,
46+
help='endpoint number of MSC IN')
47+
parser.add_argument('--hid_ep_num_in', type=int, default=0,
48+
help='endpoint number of HID IN')
49+
parser.add_argument('--midi_ep_num_out', type=int, default=0,
50+
help='endpoint number of MIDI OUT')
51+
parser.add_argument('--midi_ep_num_in', type=int, default=0,
52+
help='endpoint number of MIDI IN')
3753
parser.add_argument('--output_c_file', type=argparse.FileType('w'), required=True)
3854
parser.add_argument('--output_h_file', type=argparse.FileType('w'), required=True)
3955

@@ -47,10 +63,6 @@
4763
if unknown_hid_devices:
4864
raise ValueError("Unknown HID devices(s)", unknown_hid_devices)
4965

50-
if args.msc_num_endpoint_pairs not in (1, 2):
51-
raise ValueError("--msc_num_endpoint_pairs must be 1 or 2")
52-
53-
5466
class StringIndex:
5567
"""Assign a monotonically increasing index to each unique string. Start with 0."""
5668
string_to_index = {}
@@ -120,7 +132,7 @@ def strings_in_order(cls):
120132
cdc_union,
121133
standard.EndpointDescriptor(
122134
description="CDC comm in",
123-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN,
135+
bEndpointAddress=args.cdc_ep_num_notification | standard.EndpointDescriptor.DIRECTION_IN,
124136
bmAttributes=standard.EndpointDescriptor.TYPE_INTERRUPT,
125137
wMaxPacketSize=0x0040,
126138
bInterval=0x10)
@@ -133,11 +145,11 @@ def strings_in_order(cls):
133145
subdescriptors=[
134146
standard.EndpointDescriptor(
135147
description="CDC data out",
136-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_OUT,
148+
bEndpointAddress=args.cdc_ep_num_data_out | standard.EndpointDescriptor.DIRECTION_OUT,
137149
bmAttributes=standard.EndpointDescriptor.TYPE_BULK),
138150
standard.EndpointDescriptor(
139151
description="CDC data in",
140-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN,
152+
bEndpointAddress=args.cdc_ep_num_data_in | standard.EndpointDescriptor.DIRECTION_IN,
141153
bmAttributes=standard.EndpointDescriptor.TYPE_BULK),
142154
])
143155

@@ -153,14 +165,12 @@ def strings_in_order(cls):
153165
subdescriptors=[
154166
standard.EndpointDescriptor(
155167
description="MSC in",
156-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN,
168+
bEndpointAddress=args.msc_ep_num_in | standard.EndpointDescriptor.DIRECTION_IN,
157169
bmAttributes=standard.EndpointDescriptor.TYPE_BULK,
158170
bInterval=0),
159171
standard.EndpointDescriptor(
160172
description="MSC out",
161-
# SAMD21 needs to use a separate pair of endpoints for MSC.
162-
bEndpointAddress=((0x1 if args.msc_num_endpoint_pairs == 2 else 0x0) |
163-
standard.EndpointDescriptor.DIRECTION_OUT),
173+
bEndpointAddress=(args.msc_ep_num_out | standard.EndpointDescriptor.DIRECTION_OUT),
164174
bmAttributes=standard.EndpointDescriptor.TYPE_BULK,
165175
bInterval=0)
166176
]
@@ -197,7 +207,7 @@ def strings_in_order(cls):
197207
# and will fail (possibly silently) if both are not supplied.
198208
hid_endpoint_in_descriptor = standard.EndpointDescriptor(
199209
description="HID in",
200-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN,
210+
bEndpointAddress=args.hid_ep_num_in | standard.EndpointDescriptor.DIRECTION_IN,
201211
bmAttributes=standard.EndpointDescriptor.TYPE_INTERRUPT,
202212
bInterval=8)
203213

@@ -267,12 +277,12 @@ def strings_in_order(cls):
267277
),
268278
standard.EndpointDescriptor(
269279
description="MIDI data out to CircuitPython",
270-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_OUT,
280+
bEndpointAddress=args.midi_ep_num_out | standard.EndpointDescriptor.DIRECTION_OUT,
271281
bmAttributes=standard.EndpointDescriptor.TYPE_BULK),
272282
midi.DataEndpointDescriptor(baAssocJack=[midi_in_jack_emb]),
273283
standard.EndpointDescriptor(
274284
description="MIDI data in from CircuitPython",
275-
bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN,
285+
bEndpointAddress=args.midi_ep_num_in | standard.EndpointDescriptor.DIRECTION_IN,
276286
bmAttributes=standard.EndpointDescriptor.TYPE_BULK,
277287
bInterval = 0x0),
278288
midi.DataEndpointDescriptor(baAssocJack=[midi_out_jack_emb]),
@@ -313,10 +323,15 @@ def strings_in_order(cls):
313323
if 'AUDIO' in args.devices:
314324
interfaces_to_join.append(audio_interfaces)
315325

316-
# util.join_interfaces() will renumber the endpoints to make them unique across descriptors,
317-
# and renumber the interfaces in order. But we still need to fix up certain
318-
# interface cross-references.
319-
interfaces = util.join_interfaces(*interfaces_to_join)
326+
if args.relative_ep_num:
327+
# util.join_interfaces() will renumber the endpoints to make them unique across descriptors,
328+
# and renumber the interfaces in order. But we still need to fix up certain
329+
# interface cross-references.
330+
interfaces = util.join_interfaces(*interfaces_to_join)
331+
else:
332+
# util.renumbers_interfaces() will renumber the interfaces in order. But we still need to
333+
# fix up certain interface cross-references.
334+
interfaces = util.renumbers_interfaces(*interfaces_to_join)
320335

321336
# Now adjust the CDC interface cross-references.
322337

0 commit comments

Comments
 (0)