@@ -20,38 +20,56 @@ var (
2020
2121func initEndpoint (ep , config uint32 ) {
2222 val := uint32 (usbEpControlEnable ) | uint32 (usbEpControlInterruptPerBuff )
23+
24+ // Each endpoint has 128 bytes of DPRAM buffer space allocated (2 * usbBufferLen).
25+ // To support bidirectional configurations using the same endpoint number,
26+ // we allocate the first 64 bytes (Buffer0) to OUT transfers, and the remaining
27+ // 64 bytes (Buffer1) to IN transfers by shifting the IN offset by usbBufferLen.
2328 offset := ep * 2 * usbBufferLen + 0x100
24- val |= offset
2529
2630 // Bulk and interrupt endpoints must have their Packet ID reset to DATA0 when un-stalled.
27- epXPIDReset [ep ] = false // Default to false in case an endpoint is re-initialized.
31+ // Since both directions share the same ep, we reset their PID flags independently.
32+ if (config & usb .EndpointIn ) != 0 {
33+ epXPIDResetIn [ep ] = false
34+ } else {
35+ epXPIDResetOut [ep ] = false
36+ }
2837
2938 switch config {
3039 case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointIn :
40+ epXPIDResetIn [ep ] = true
41+ epXdata0In [ep ] = false
42+ val |= offset + usbBufferLen
3143 val |= usbEpControlEndpointTypeInterrupt
3244 _usbDPSRAM .EPxControl [ep ].In .Set (val )
33- epXPIDReset [ep ] = true
3445
3546 case usb .ENDPOINT_TYPE_BULK | usb .EndpointOut :
47+ epXPIDResetOut [ep ] = true
48+ epXdata0Out [ep ] = false
49+ val |= offset
3650 val |= usbEpControlEndpointTypeBulk
3751 _usbDPSRAM .EPxControl [ep ].Out .Set (val )
3852 _usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
3953 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
40- epXPIDReset [ep ] = true
4154
4255 case usb .ENDPOINT_TYPE_INTERRUPT | usb .EndpointOut :
56+ epXPIDResetOut [ep ] = true
57+ epXdata0Out [ep ] = false
58+ val |= offset
4359 val |= usbEpControlEndpointTypeInterrupt
4460 _usbDPSRAM .EPxControl [ep ].Out .Set (val )
4561 _usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBufferLen & usbBuf0CtrlLenMask )
4662 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
47- epXPIDReset [ep ] = true
4863
4964 case usb .ENDPOINT_TYPE_BULK | usb .EndpointIn :
65+ epXPIDResetIn [ep ] = true
66+ epXdata0In [ep ] = false
67+ val |= offset + usbBufferLen
5068 val |= usbEpControlEndpointTypeBulk
5169 _usbDPSRAM .EPxControl [ep ].In .Set (val )
52- epXPIDReset [ep ] = true
5370
5471 case usb .ENDPOINT_TYPE_CONTROL :
72+ val |= offset
5573 val |= usbEpControlEndpointTypeControl
5674 _usbDPSRAM .EPxBufferControl [ep ].Out .Set (usbBuf0CtrlData1Pid )
5775 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
@@ -79,7 +97,7 @@ func sendUSBPacket(ep uint32, data []byte) {
7997 } else {
8098 sendOnEP0DATADONE .offset = 0
8199 }
82- epXdata0 [ep ] = true
100+ epXdata0In [ep ] = true
83101 }
84102
85103 sendViaEPIn (ep , data , count )
@@ -116,19 +134,29 @@ func handleEndpointRx(ep uint32) []byte {
116134// AckUsbOutTransfer is called to acknowledge the completion of a USB OUT transfer.
117135func AckUsbOutTransfer (ep uint32 ) {
118136 ep = ep & 0x7F
119- setEPDataPID (ep , ! epXdata0 [ep ])
137+ setEPDataPIDOut (ep , ! epXdata0Out [ep ])
120138}
121139
122- // Set the USB endpoint Packet ID to DATA0 or DATA1.
123- func setEPDataPID (ep uint32 , dataOne bool ) {
124- epXdata0 [ep ] = dataOne
125- if epXdata0 [ep ] || ep == 0 {
140+ // Set the USB endpoint Packet ID to DATA0 or DATA1 for OUT direction .
141+ func setEPDataPIDOut (ep uint32 , dataOne bool ) {
142+ epXdata0Out [ep ] = dataOne
143+ if epXdata0Out [ep ] || ep == 0 {
126144 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlData1Pid )
127145 }
128146
129147 _usbDPSRAM .EPxBufferControl [ep ].Out .SetBits (usbBuf0CtrlAvail )
130148}
131149
150+ // Set the USB endpoint Packet ID to DATA0 or DATA1 for IN direction.
151+ func setEPDataPIDIn (ep uint32 , dataOne bool ) {
152+ epXdata0In [ep ] = dataOne
153+ if epXdata0In [ep ] || ep == 0 {
154+ _usbDPSRAM .EPxBufferControl [ep ].In .SetBits (usbBuf0CtrlData1Pid )
155+ }
156+
157+ _usbDPSRAM .EPxBufferControl [ep ].In .SetBits (usbBuf0CtrlAvail )
158+ }
159+
132160func SendZlp () {
133161 sendUSBPacket (0 , nil )
134162}
@@ -138,15 +166,19 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
138166 val := uint32 (count ) | usbBuf0CtrlAvail
139167
140168 // DATA0 or DATA1
141- epXdata0 [ep & 0x7F ] = ! epXdata0 [ep & 0x7F ]
142- if ! epXdata0 [ep & 0x7F ] {
169+ epXdata0In [ep & 0x7F ] = ! epXdata0In [ep & 0x7F ]
170+ if ! epXdata0In [ep & 0x7F ] {
143171 val |= usbBuf0CtrlData1Pid
144172 }
145173
146174 // Mark as full
147175 val |= usbBuf0CtrlFull
148176
149- copy (_usbDPSRAM .EPxBuffer [ep & 0x7F ].Buffer0 [:], data [:count ])
177+ if (ep & 0x7F ) == 0 {
178+ copy (_usbDPSRAM .EPxBuffer [0 ].Buffer0 [:], data [:count ])
179+ } else {
180+ copy (_usbDPSRAM .EPxBuffer [ep & 0x7F ].Buffer1 [:], data [:count ])
181+ }
150182 _usbDPSRAM .EPxBufferControl [ep & 0x7F ].In .Set (val )
151183}
152184
@@ -178,9 +210,9 @@ func (dev *USBDevice) ClearStallEPIn(ep uint32) {
178210 ep = ep & 0x7F
179211 val := uint32 (usbBuf0CtrlStall )
180212 _usbDPSRAM .EPxBufferControl [ep ].In .ClearBits (val )
181- if epXPIDReset [ep ] {
213+ if epXPIDResetIn [ep ] {
182214 // Reset the PID to DATA0
183- setEPDataPID (ep , false )
215+ setEPDataPIDIn (ep , false )
184216 }
185217}
186218
@@ -189,9 +221,9 @@ func (dev *USBDevice) ClearStallEPOut(ep uint32) {
189221 ep = ep & 0x7F
190222 val := uint32 (usbBuf0CtrlStall )
191223 _usbDPSRAM .EPxBufferControl [ep ].Out .ClearBits (val )
192- if epXPIDReset [ep ] {
224+ if epXPIDResetOut [ep ] {
193225 // Reset the PID to DATA0
194- setEPDataPID (ep , false )
226+ setEPDataPIDOut (ep , false )
195227 }
196228}
197229
@@ -219,10 +251,12 @@ type usbBuffer struct {
219251}
220252
221253var (
222- _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
223- epXdata0 [16 ]bool
224- epXPIDReset [16 ]bool
225- setupBytes [8 ]byte
254+ _usbDPSRAM = (* usbDPSRAM )(unsafe .Pointer (uintptr (0x50100000 )))
255+ epXdata0In [16 ]bool
256+ epXdata0Out [16 ]bool
257+ epXPIDResetIn [16 ]bool
258+ epXPIDResetOut [16 ]bool
259+ setupBytes [8 ]byte
226260)
227261
228262func (d * usbDPSRAM ) setupBytes () []byte {
0 commit comments