@@ -21,26 +21,33 @@ func initEndpoint(ep, config uint32) {
21
21
offset := ep * 2 * usbBufferLen + 0x100
22
22
val |= offset
23
23
24
+ // Bulk and interrupt endpoints must have their Packet ID reset to DATA0 when un-stalled.
25
+ epXPIDReset [ep ] = false // Default to false in case an endpoint is re-initialized.
26
+
24
27
switch config {
25
28
case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointIn :
26
29
val |= usbEpControlEndpointTypeInterrupt
27
30
_usbDPSRAM .EPxControl [ep ].In .Set (val )
31
+ epXPIDReset [ep ] = true
28
32
29
33
case usb .ENDPOINT_TYPE_BULK | usb .EndpointOut :
30
34
val |= usbEpControlEndpointTypeBulk
31
35
_usbDPSRAM .EPxControl [ep ].Out .Set (val )
32
36
_usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
33
37
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
38
+ epXPIDReset [ep ] = true
34
39
35
40
case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointOut :
36
41
val |= usbEpControlEndpointTypeInterrupt
37
42
_usbDPSRAM .EPxControl [ep ].Out .Set (val )
38
43
_usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
39
44
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
45
+ epXPIDReset [ep ] = true
40
46
41
47
case usb .ENDPOINT_TYPE_BULK | usb .EndpointIn :
42
48
val |= usbEpControlEndpointTypeBulk
43
49
_usbDPSRAM .EPxControl [ep ].In .Set (val )
50
+ epXPIDReset [ep ] = true
44
51
45
52
case usb .ENDPOINT_TYPE_CONTROL :
46
53
val |= usbEpControlEndpointTypeControl
@@ -109,7 +116,12 @@ func handleEndpointRx(ep uint32) []byte {
109
116
}
110
117
111
118
func handleEndpointRxComplete (ep uint32 ) {
112
- epXdata0 [ep ] = ! epXdata0 [ep ]
119
+ setEPDataPID (ep , ! epXdata0 [ep ])
120
+ }
121
+
122
+ // Set the USB endpoint Packet ID to DATA0 or DATA1.
123
+ func setEPDataPID (ep uint32 , dataOne bool ) {
124
+ epXdata0 [ep ] = dataOne
113
125
if epXdata0 [ep ] || ep == 0 {
114
126
_usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlData1Pid )
115
127
}
@@ -138,7 +150,8 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
138
150
_usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
139
151
}
140
152
141
- func sendStallViaEPIn (ep uint32 ) {
153
+ // Set ENDPOINT_HALT/stall status on a USB IN endpoint.
154
+ func (dev * USBDevice ) SetStallEPIn (ep uint32 ) {
142
155
// Prepare buffer control register value
143
156
if ep == 0 {
144
157
armEPZeroStall ()
@@ -149,6 +162,37 @@ func sendStallViaEPIn(ep uint32) {
149
162
_usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
150
163
}
151
164
165
+ // Set ENDPOINT_HALT/stall status on a USB OUT endpoint.
166
+ func (dev * USBDevice ) SetStallEPOut (ep uint32 ) {
167
+ if ep == 0 {
168
+ panic ("SetStallEPOut: EP0 OUT not valid" )
169
+ }
170
+ val := uint32 (usbBuf0CtrlStall )
171
+ _usbDPSRAM .EPxBufferControl [ep & 0x7F ].Out .Set (val )
172
+ }
173
+
174
+ // Clear the ENDPOINT_HALT/stall on a USB IN endpoint.
175
+ func (dev * USBDevice ) ClearStallEPIn (ep uint32 ) {
176
+ ep = ep & 0x7F
177
+ val := uint32 (usbBuf0CtrlStall )
178
+ _usbDPSRAM .EPxBufferControl [ep ].In .ClearBits (val )
179
+ if epXPIDReset [ep ] {
180
+ // Reset the PID to DATA0
181
+ setEPDataPID (ep & 0x7F , false )
182
+ }
183
+ }
184
+
185
+ // Clear the ENDPOINT_HALT/stall on a USB OUT endpoint.
186
+ func (dev * USBDevice ) ClearStallEPOut (ep uint32 ) {
187
+ ep = ep & 0x7F
188
+ val := uint32 (usbBuf0CtrlStall )
189
+ _usbDPSRAM .EPxBufferControl [ep ].Out .ClearBits (val )
190
+ if epXPIDReset [ep ] {
191
+ // Reset the PID to DATA0
192
+ setEPDataPID (ep , false )
193
+ }
194
+ }
195
+
152
196
type usbDPSRAM struct {
153
197
// Note that EPxControl[0] is not EP0Control but 8-byte setup data.
154
198
EPxControl [16 ]usbEndpointControlRegister
@@ -173,9 +217,10 @@ type usbBuffer struct {
173
217
}
174
218
175
219
var (
176
- _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
177
- epXdata0 [16 ]bool
178
- setupBytes [8 ]byte
220
+ _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
221
+ epXdata0 [16 ]bool
222
+ epXPIDReset [16 ]bool
223
+ setupBytes [8 ]byte
179
224
)
180
225
181
226
func (d * usbDPSRAM ) setupBytes () []byte {
0 commit comments