@@ -77,7 +77,7 @@ func handleUSBIRQ(intr interrupt.Interrupt) {
7777
7878 if ! ok {
7979 // Stall endpoint?
80- sendStallViaEPIn (0 )
80+ SetStallEPIn (0 )
8181 }
8282
8383 }
@@ -139,26 +139,33 @@ func initEndpoint(ep, config uint32) {
139139 offset := ep * 2 * usbBufferLen + 0x100
140140 val |= offset
141141
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+
142145 switch config {
143146 case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointIn :
144147 val |= usbEpControlEndpointTypeInterrupt
145148 _usbDPSRAM .EPxControl [ep ].In .Set (val )
149+ epXPIDReset [ep ] = true
146150
147151 case usb .ENDPOINT_TYPE_BULK | usb .EndpointOut :
148152 val |= usbEpControlEndpointTypeBulk
149153 _usbDPSRAM .EPxControl [ep ].Out .Set (val )
150154 _usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
151155 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
156+ epXPIDReset [ep ] = true
152157
153158 case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointOut :
154159 val |= usbEpControlEndpointTypeInterrupt
155160 _usbDPSRAM .EPxControl [ep ].Out .Set (val )
156161 _usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
157162 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
163+ epXPIDReset [ep ] = true
158164
159165 case usb .ENDPOINT_TYPE_BULK | usb .EndpointIn :
160166 val |= usbEpControlEndpointTypeBulk
161167 _usbDPSRAM .EPxControl [ep ].In .Set (val )
168+ epXPIDReset [ep ] = true
162169
163170 case usb .ENDPOINT_TYPE_CONTROL :
164171 val |= usbEpControlEndpointTypeControl
@@ -245,7 +252,12 @@ func handleEndpointRx(ep uint32) []byte {
245252}
246253
247254func 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
249261 if epXdata0 [ep ] || ep == 0 {
250262 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlData1Pid )
251263 }
@@ -274,7 +286,8 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
274286 _usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
275287}
276288
277- func sendStallViaEPIn (ep uint32 ) {
289+ // Enable ENDPOINT_HALT/stall on a USB IN endpoint
290+ func SetStallEPIn (ep uint32 ) {
278291 // Prepare buffer control register value
279292 if ep == 0 {
280293 rp .USBCTRL_REGS .EP_STALL_ARM .Set (rp .USBCTRL_REGS_EP_STALL_ARM_EP0_IN )
@@ -285,6 +298,35 @@ func sendStallViaEPIn(ep uint32) {
285298 _usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
286299}
287300
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+
288330type usbDPSRAM struct {
289331 // Note that EPxControl[0] is not EP0Control but 8-byte setup data.
290332 EPxControl [16 ]usbEndpointControlRegister
@@ -309,9 +351,10 @@ type usbBuffer struct {
309351}
310352
311353var (
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
315358)
316359
317360func (d * usbDPSRAM ) setupBytes () []byte {
0 commit comments