machine: declare usb endpoints per-platform

This commit is contained in:
Michael Smith
2025-06-09 10:10:12 -04:00
committed by Ron Evans
parent 1880e82da6
commit b059de857c
5 changed files with 71 additions and 23 deletions
+15
View File
@@ -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.
+15
View File
@@ -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.
+13
View File
@@ -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
+20 -4
View File
@@ -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)
}
}
+8 -19
View File
@@ -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