diff --git a/src/machine/machine_atsamd21_usb.go b/src/machine/machine_atsamd21_usb.go index b68046d48..8bd265267 100644 --- a/src/machine/machine_atsamd21_usb.go +++ b/src/machine/machine_atsamd21_usb.go @@ -19,6 +19,21 @@ const ( usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Pos = 14 usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Mask = 0x3FFF + + NumberOfUSBEndpoints = 8 +) + +var ( + endPoints = []uint32{ + usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL, + usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn), + usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut), + usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn), + usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In + usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out + usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In + usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out + } ) // Configure the USB peripheral. The config is here for compatibility with the UART interface. diff --git a/src/machine/machine_atsamd51_usb.go b/src/machine/machine_atsamd51_usb.go index f33f68a93..abd344443 100644 --- a/src/machine/machine_atsamd51_usb.go +++ b/src/machine/machine_atsamd51_usb.go @@ -19,6 +19,21 @@ const ( usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Pos = 14 usb_DEVICE_PCKSIZE_MULTI_PACKET_SIZE_Mask = 0x3FFF + + NumberOfUSBEndpoints = 8 +) + +var ( + endPoints = []uint32{ + usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL, + usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn), + usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut), + usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn), + usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In + usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out + usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In + usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out + } ) // Configure the USB peripheral. The config is here for compatibility with the UART interface. diff --git a/src/machine/machine_nrf52840_usb.go b/src/machine/machine_nrf52840_usb.go index 46d6a66e5..2442a672d 100644 --- a/src/machine/machine_nrf52840_usb.go +++ b/src/machine/machine_nrf52840_usb.go @@ -11,6 +11,8 @@ import ( "unsafe" ) +const NumberOfUSBEndpoints = 8 + var ( sendOnEP0DATADONE struct { ptr *byte @@ -20,6 +22,17 @@ var ( epinen uint32 epouten uint32 easyDMABusy volatile.Register8 + + endPoints = []uint32{ + usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL, + usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn), + usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut), + usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn), + usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In + usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out + usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In + usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out + } ) // enterCriticalSection is used to protect access to easyDMA - only one thing diff --git a/src/machine/machine_rp2_usb.go b/src/machine/machine_rp2_usb.go index 96d8cda4f..e1a3a43ab 100644 --- a/src/machine/machine_rp2_usb.go +++ b/src/machine/machine_rp2_usb.go @@ -8,12 +8,25 @@ import ( "unsafe" ) +const NumberOfUSBEndpoints = 8 + var ( sendOnEP0DATADONE struct { offset int data []byte pid uint32 } + + endPoints = []uint32{ + usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL, + usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn), + usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut), + usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn), + usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In + usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out + usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In + usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out + } ) func initEndpoint(ep, config uint32) { @@ -116,6 +129,7 @@ func handleEndpointRx(ep uint32) []byte { } func handleEndpointRxComplete(ep uint32) { + ep = ep & 0x7F setEPDataPID(ep, !epXdata0[ep]) } @@ -152,23 +166,25 @@ func sendViaEPIn(ep uint32, data []byte, count int) { // Set ENDPOINT_HALT/stall status on a USB IN endpoint. func (dev *USBDevice) SetStallEPIn(ep uint32) { + ep = ep & 0x7F // Prepare buffer control register value if ep == 0 { armEPZeroStall() } val := uint32(usbBuf0CtrlFull) - _usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val) + _usbDPSRAM.EPxBufferControl[ep].In.Set(val) val |= uint32(usbBuf0CtrlStall) - _usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val) + _usbDPSRAM.EPxBufferControl[ep].In.Set(val) } // Set ENDPOINT_HALT/stall status on a USB OUT endpoint. func (dev *USBDevice) SetStallEPOut(ep uint32) { + ep = ep & 0x7F if ep == 0 { panic("SetStallEPOut: EP0 OUT not valid") } val := uint32(usbBuf0CtrlStall) - _usbDPSRAM.EPxBufferControl[ep&0x7F].Out.Set(val) + _usbDPSRAM.EPxBufferControl[ep].Out.Set(val) } // Clear the ENDPOINT_HALT/stall on a USB IN endpoint. @@ -178,7 +194,7 @@ func (dev *USBDevice) ClearStallEPIn(ep uint32) { _usbDPSRAM.EPxBufferControl[ep].In.ClearBits(val) if epXPIDReset[ep] { // Reset the PID to DATA0 - setEPDataPID(ep&0x7F, false) + setEPDataPID(ep, false) } } diff --git a/src/machine/usb.go b/src/machine/usb.go index 866334815..e55ff3aa1 100644 --- a/src/machine/usb.go +++ b/src/machine/usb.go @@ -94,7 +94,7 @@ var ( ) var ( - usbEndpointDescriptors [usb.NumberOfEndpoints]descriptor.Device + usbEndpointDescriptors [NumberOfUSBEndpoints]descriptor.Device isEndpointHalt = false isRemoteWakeUpEnabled = false @@ -107,10 +107,10 @@ var ( var udd_ep_control_cache_buffer [256]uint8 //go:align 4 -var udd_ep_in_cache_buffer [usb.NumberOfEndpoints][64]uint8 +var udd_ep_in_cache_buffer [NumberOfUSBEndpoints][64]uint8 //go:align 4 -var udd_ep_out_cache_buffer [usb.NumberOfEndpoints][64]uint8 +var udd_ep_out_cache_buffer [NumberOfUSBEndpoints][64]uint8 // usb_trans_buffer max size is 255 since that is max size // 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 var usb_trans_buffer [255]uint8 var ( - usbTxHandler [usb.NumberOfEndpoints]func() - usbRxHandler [usb.NumberOfEndpoints]func([]byte) + usbTxHandler [NumberOfUSBEndpoints]func() + usbRxHandler [NumberOfUSBEndpoints]func([]byte) bool usbSetupHandler [usb.NumberOfInterfaces]func(usb.Setup) bool - usbStallHandler [usb.NumberOfEndpoints]func(usb.Setup) bool - - endPoints = []uint32{ - usb.CONTROL_ENDPOINT: usb.ENDPOINT_TYPE_CONTROL, - usb.CDC_ENDPOINT_ACM: (usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn), - usb.CDC_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_BULK | usb.EndpointOut), - usb.CDC_ENDPOINT_IN: (usb.ENDPOINT_TYPE_BULK | usb.EndpointIn), - usb.HID_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt In - usb.HID_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Interrupt Out - usb.MIDI_ENDPOINT_IN: (usb.ENDPOINT_TYPE_DISABLE), // Bulk In - usb.MIDI_ENDPOINT_OUT: (usb.ENDPOINT_TYPE_DISABLE), // Bulk Out - } + usbStallHandler [NumberOfUSBEndpoints]func(usb.Setup) bool ) // sendDescriptor creates and sends the various USB descriptor types that @@ -213,7 +202,7 @@ func handleStandardSetup(setup usb.Setup) bool { if setup.WValueL == 1 { // DEVICEREMOTEWAKEUP isRemoteWakeUpEnabled = false } else if setup.WValueL == 0 { // ENDPOINTHALT - if idx := setup.WIndex & 0x7F; idx < usb.NumberOfEndpoints && usbStallHandler[idx] != nil { + if idx := setup.WIndex & 0x7F; idx < NumberOfUSBEndpoints && usbStallHandler[idx] != nil { // Host has requested to clear an endpoint stall. If the request is addressed to // an endpoint with a configured StallHandler, forward the message on. // The 0x7F mask is used to clear the direction bit from the endpoint number @@ -228,7 +217,7 @@ func handleStandardSetup(setup usb.Setup) bool { if setup.WValueL == 1 { // DEVICEREMOTEWAKEUP isRemoteWakeUpEnabled = true } else if setup.WValueL == 0 { // ENDPOINTHALT - if idx := setup.WIndex & 0x7F; idx < usb.NumberOfEndpoints && usbStallHandler[idx] != nil { + if idx := setup.WIndex & 0x7F; idx < NumberOfUSBEndpoints && usbStallHandler[idx] != nil { // Host has requested to stall an endpoint. If the request is addressed to // an endpoint with a configured StallHandler, forward the message on. // The 0x7F mask is used to clear the direction bit from the endpoint number