@@ -77,7 +77,7 @@ func handleUSBIRQ(intr interrupt.Interrupt) {
77
77
78
78
if ! ok {
79
79
// Stall endpoint?
80
- sendStallViaEPIn (0 )
80
+ SetStallEPIn (0 )
81
81
}
82
82
83
83
}
@@ -139,26 +139,33 @@ func initEndpoint(ep, config uint32) {
139
139
offset := ep * 2 * usbBufferLen + 0x100
140
140
val |= offset
141
141
142
+ // Bulk and interrupt endpoints must have their Packet ID reset to DATA0 when un-stalled
143
+ epXPIDReset [ep ] = false // Default to false in case an endpoint is re-initialized
144
+
142
145
switch config {
143
146
case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointIn :
144
147
val |= usbEpControlEndpointTypeInterrupt
145
148
_usbDPSRAM .EPxControl [ep ].In .Set (val )
149
+ epXPIDReset [ep ] = true
146
150
147
151
case usb .ENDPOINT_TYPE_BULK | usb .EndpointOut :
148
152
val |= usbEpControlEndpointTypeBulk
149
153
_usbDPSRAM .EPxControl [ep ].Out .Set (val )
150
154
_usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
151
155
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
156
+ epXPIDReset [ep ] = true
152
157
153
158
case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointOut :
154
159
val |= usbEpControlEndpointTypeInterrupt
155
160
_usbDPSRAM .EPxControl [ep ].Out .Set (val )
156
161
_usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
157
162
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
163
+ epXPIDReset [ep ] = true
158
164
159
165
case usb .ENDPOINT_TYPE_BULK | usb .EndpointIn :
160
166
val |= usbEpControlEndpointTypeBulk
161
167
_usbDPSRAM .EPxControl [ep ].In .Set (val )
168
+ epXPIDReset [ep ] = true
162
169
163
170
case usb .ENDPOINT_TYPE_CONTROL :
164
171
val |= usbEpControlEndpointTypeControl
@@ -245,7 +252,12 @@ func handleEndpointRx(ep uint32) []byte {
245
252
}
246
253
247
254
func handleEndpointRxComplete (ep uint32 ) {
248
- epXdata0 [ep ] = ! epXdata0 [ep ]
255
+ setEPDataPID (ep , ! epXdata0 [ep ])
256
+ }
257
+
258
+ // Set the USB endpoint Packet ID to DATA0 or DATA1
259
+ func setEPDataPID (ep uint32 , dataOne bool ) {
260
+ epXdata0 [ep & 0x7F ] = dataOne
249
261
if epXdata0 [ep ] || ep == 0 {
250
262
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlData1Pid )
251
263
}
@@ -274,7 +286,8 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
274
286
_usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
275
287
}
276
288
277
- func sendStallViaEPIn (ep uint32 ) {
289
+ // Enable ENDPOINT_HALT/stall on a USB IN endpoint
290
+ func SetStallEPIn (ep uint32 ) {
278
291
// Prepare buffer control register value
279
292
if ep == 0 {
280
293
rp .USBCTRL_REGS .EP_STALL_ARM .Set (rp .USBCTRL_REGS_EP_STALL_ARM_EP0_IN )
@@ -285,6 +298,35 @@ func sendStallViaEPIn(ep uint32) {
285
298
_usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
286
299
}
287
300
301
+ // Enable ENDPOINT_HALT/stall on a USB OUT endpoint
302
+ func SetStallEPOut (ep uint32 ) {
303
+ if ep == 0 {
304
+ panic ("SetStallEPOut: EP0 OUT not valid" )
305
+ }
306
+ val := uint32 (usbBuf0CtrlStall )
307
+ _usbDPSRAM .EPxBufferControl [ep & 0x7F ].Out .Set (val )
308
+ }
309
+
310
+ // Clear the ENDPOINT_HALT/stall on a USB IN endpoint
311
+ func ClearStallEPIn (ep uint32 ) {
312
+ val := uint32 (usbBuf0CtrlStall )
313
+ _usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .ClearBits (val )
314
+ if epXPIDReset [ep ] {
315
+ // Reset the PID to DATA0
316
+ setEPDataPID (ep , false )
317
+ }
318
+ }
319
+
320
+ // Clear the ENDPOINT_HALT/stall on a USB OUT endpoint
321
+ func ClearStallEPOut (ep uint32 ) {
322
+ val := uint32 (usbBuf0CtrlStall )
323
+ _usbDPSRAM .EPxBufferControl [ep & 0x7F ].Out .ClearBits (val )
324
+ if epXPIDReset [ep ] {
325
+ // Reset the PID to DATA0
326
+ setEPDataPID (ep , false )
327
+ }
328
+ }
329
+
288
330
type usbDPSRAM struct {
289
331
// Note that EPxControl[0] is not EP0Control but 8-byte setup data.
290
332
EPxControl [16 ]usbEndpointControlRegister
@@ -309,9 +351,10 @@ type usbBuffer struct {
309
351
}
310
352
311
353
var (
312
- _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
313
- epXdata0 [16 ]bool
314
- setupBytes [8 ]byte
354
+ _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
355
+ epXdata0 [16 ]bool
356
+ epXPIDReset [16 ]bool
357
+ setupBytes [8 ]byte
315
358
)
316
359
317
360
func (d * usbDPSRAM ) setupBytes () []byte {
0 commit comments