Skip to content

Commit 0dbb066

Browse files
committed
machine: declare usb endpoints per-platform
1 parent 2da9d26 commit 0dbb066

File tree

5 files changed

+71
-23
lines changed

5 files changed

+71
-23
lines changed

src/machine/machine_atsamd21_usb.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ const (
1919

2020
usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Pos = 14
2121
usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Mask = 0x3FFF
22+
23+
NumberOfUSBEndpoints = 8
24+
)
25+
26+
var (
27+
endPoints = []uint32{
28+
usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL,
29+
usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn),
30+
usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut),
31+
usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn),
32+
usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In
33+
usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out
34+
usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In
35+
usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out
36+
}
2237
)
2338

2439
// Configure the USB peripheral. The config is here for compatibility with the UART interface.

src/machine/machine_atsamd51_usb.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ const (
1919

2020
usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Pos = 14
2121
usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Mask = 0x3FFF
22+
23+
NumberOfUSBEndpoints = 8
24+
)
25+
26+
var (
27+
endPoints = []uint32{
28+
usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL,
29+
usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn),
30+
usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut),
31+
usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn),
32+
usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In
33+
usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out
34+
usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In
35+
usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out
36+
}
2237
)
2338

2439
// Configure the USB peripheral. The config is here for compatibility with the UART interface.

src/machine/machine_nrf52840_usb.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"unsafe"
1212
)
1313

14+
const NumberOfUSBEndpoints = 8
15+
1416
var (
1517
sendOnEP0DATADONE struct {
1618
ptr *byte
@@ -20,6 +22,17 @@ var (
2022
epinen uint32
2123
epouten uint32
2224
easyDMABusy volatile.Register8
25+
26+
endPoints = []uint32{
27+
usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL,
28+
usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn),
29+
usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut),
30+
usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn),
31+
usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In
32+
usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out
33+
usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In
34+
usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out
35+
}
2336
)
2437

2538
// enterCriticalSection is used to protect access to easyDMA - only one thing

src/machine/machine_rp2_usb.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,25 @@ import (
88
"unsafe"
99
)
1010

11+
const NumberOfUSBEndpoints = 8
12+
1113
var (
1214
sendOnEP0DATADONE struct {
1315
offset int
1416
data []byte
1517
pid uint32
1618
}
19+
20+
endPoints = []uint32{
21+
usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL,
22+
usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn),
23+
usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut),
24+
usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn),
25+
usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In
26+
usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out
27+
usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In
28+
usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out
29+
}
1730
)
1831

1932
func initEndpoint(ep, config uint32) {
@@ -116,6 +129,7 @@ func handleEndpointRx(ep uint32) []byte {
116129
}
117130

118131
func handleEndpointRxComplete(ep uint32) {
132+
ep = ep & 0x7F
119133
setEPDataPID(ep, !epXdata0[ep])
120134
}
121135

@@ -152,23 +166,25 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
152166

153167
// Set ENDPOINT_HALT/stall status on a USB IN endpoint.
154168
func (dev *USBDevice) SetStallEPIn(ep uint32) {
169+
ep = ep & 0x7F
155170
// Prepare buffer control register value
156171
if ep == 0 {
157172
armEPZeroStall()
158173
}
159174
val := uint32(usbBuf0CtrlFull)
160-
_usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
175+
_usbDPSRAM.EPxBufferControl[ep].In.Set(val)
161176
val |= uint32(usbBuf0CtrlStall)
162-
_usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
177+
_usbDPSRAM.EPxBufferControl[ep].In.Set(val)
163178
}
164179

165180
// Set ENDPOINT_HALT/stall status on a USB OUT endpoint.
166181
func (dev *USBDevice) SetStallEPOut(ep uint32) {
182+
ep = ep & 0x7F
167183
if ep == 0 {
168184
panic("SetStallEPOut: EP0 OUT not valid")
169185
}
170186
val := uint32(usbBuf0CtrlStall)
171-
_usbDPSRAM.EPxBufferControl[ep&0x7F].Out.Set(val)
187+
_usbDPSRAM.EPxBufferControl[ep].Out.Set(val)
172188
}
173189

174190
// Clear the ENDPOINT_HALT/stall on a USB IN endpoint.
@@ -178,7 +194,7 @@ func (dev *USBDevice) ClearStallEPIn(ep uint32) {
178194
_usbDPSRAM.EPxBufferControl[ep].In.ClearBits(val)
179195
if epXPIDReset[ep] {
180196
// Reset the PID to DATA0
181-
setEPDataPID(ep&0x7F, false)
197+
setEPDataPID(ep, false)
182198
}
183199
}
184200

src/machine/usb.go

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ var (
9494
)
9595

9696
var (
97-
usbEndpointDescriptors [usb.NumberOfEndpoints]descriptor.Device
97+
usbEndpointDescriptors [NumberOfUSBEndpoints]descriptor.Device
9898

9999
isEndpointHalt = false
100100
isRemoteWakeUpEnabled = false
@@ -107,10 +107,10 @@ var (
107107
var udd_ep_control_cache_buffer [256]uint8
108108

109109
//go:align 4
110-
var udd_ep_in_cache_buffer [usb.NumberOfEndpoints][64]uint8
110+
var udd_ep_in_cache_buffer [NumberOfUSBEndpoints][64]uint8
111111

112112
//go:align 4
113-
var udd_ep_out_cache_buffer [usb.NumberOfEndpoints][64]uint8
113+
var udd_ep_out_cache_buffer [NumberOfUSBEndpoints][64]uint8
114114

115115
// usb_trans_buffer max size is 255 since that is max size
116116
// for a descriptor (bLength is 1 byte), and the biggest use
@@ -120,21 +120,10 @@ var udd_ep_out_cache_buffer [usb.NumberOfEndpoints][64]uint8
120120
var usb_trans_buffer [255]uint8
121121

122122
var (
123-
usbTxHandler [usb.NumberOfEndpoints]func()
124-
usbRxHandler [usb.NumberOfEndpoints]func([]byte)
123+
usbTxHandler [NumberOfUSBEndpoints]func()
124+
usbRxHandler [NumberOfUSBEndpoints]func([]byte) bool
125125
usbSetupHandler [usb.NumberOfInterfaces]func(usb.Setup) bool
126-
usbStallHandler [usb.NumberOfEndpoints]func(usb.Setup) bool
127-
128-
endPoints = []uint32{
129-
usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL,
130-
usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn),
131-
usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut),
132-
usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn),
133-
usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In
134-
usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out
135-
usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In
136-
usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out
137-
}
126+
usbStallHandler [NumberOfUSBEndpoints]func(usb.Setup) bool
138127
)
139128

140129
// sendDescriptor creates and sends the various USB descriptor types that
@@ -213,7 +202,7 @@ func handleStandardSetup(setup usb.Setup) bool {
213202
if setup.WValueL == 1 { // DEVICEREMOTEWAKEUP
214203
isRemoteWakeUpEnabled = false
215204
} else if setup.WValueL == 0 { // ENDPOINTHALT
216-
if idx := setup.WIndex & 0x7F; idx < usb.NumberOfEndpoints && usbStallHandler[idx] != nil {
205+
if idx := setup.WIndex & 0x7F; idx < NumberOfUSBEndpoints && usbStallHandler[idx] != nil {
217206
// Host has requested to clear an endpoint stall. If the request is addressed to
218207
// an endpoint with a configured StallHandler, forward the message on.
219208
// The 0x7F mask is used to clear the direction bit from the endpoint number
@@ -228,7 +217,7 @@ func handleStandardSetup(setup usb.Setup) bool {
228217
if setup.WValueL == 1 { // DEVICEREMOTEWAKEUP
229218
isRemoteWakeUpEnabled = true
230219
} else if setup.WValueL == 0 { // ENDPOINTHALT
231-
if idx := setup.WIndex & 0x7F; idx < usb.NumberOfEndpoints && usbStallHandler[idx] != nil {
220+
if idx := setup.WIndex & 0x7F; idx < NumberOfUSBEndpoints && usbStallHandler[idx] != nil {
232221
// Host has requested to stall an endpoint. If the request is addressed to
233222
// an endpoint with a configured StallHandler, forward the message on.
234223
// The 0x7F mask is used to clear the direction bit from the endpoint number

0 commit comments

Comments
 (0)