mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 03:27:48 +00:00
machine: declare usb endpoints per-platform
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user