Этот коммит содержится в:
Kenneth Bell 2022-10-05 16:18:56 +01:00 коммит произвёл Ron Evans
родитель 7e9d84777e
коммит 8f33721b88
3 изменённых файлов: 47 добавлений и 32 удалений

Просмотреть файл

@ -305,23 +305,26 @@ type USBBuffer struct {
}
var (
usbDPSRAM = (*USBDPSRAM)(unsafe.Pointer(uintptr(0x50100000)))
epXdata0 [16]bool
usbDPSRAM = (*USBDPSRAM)(unsafe.Pointer(uintptr(0x50100000)))
epXdata0 [16]bool
setupBytes [8]byte
)
func (d *USBDPSRAM) setupBytes() []byte {
var buf [8]byte
buf[0] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get())
buf[1] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 8)
buf[2] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 16)
buf[3] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 24)
buf[4] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get())
buf[5] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 8)
buf[6] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 16)
buf[7] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 24)
data := d.EPxControl[usb.CONTROL_ENDPOINT].In.Get()
setupBytes[0] = byte(data)
setupBytes[1] = byte(data >> 8)
setupBytes[2] = byte(data >> 16)
setupBytes[3] = byte(data >> 24)
return buf[:]
data = d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get()
setupBytes[4] = byte(data)
setupBytes[5] = byte(data >> 8)
setupBytes[6] = byte(data >> 16)
setupBytes[7] = byte(data >> 24)
return setupBytes[:]
}
func (d *USBDPSRAM) clear() {

Просмотреть файл

@ -72,6 +72,13 @@ var udd_ep_in_cache_buffer [7][64]uint8
//go:align 4
var udd_ep_out_cache_buffer [7][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
// for this buffer is to transmit string descriptors. If
// this buffer is used for new purposes in future the length
// must be revisited.
var usb_trans_buffer [255]uint8
var (
usbTxHandler [usb.NumberOfEndpoints]func()
usbRxHandler [usb.NumberOfEndpoints]func([]byte)
@ -113,16 +120,19 @@ func sendDescriptor(setup usb.Setup) {
case usb.STRING_DESCRIPTOR_TYPE:
switch setup.WValueL {
case 0:
b := []byte{0x04, 0x03, 0x09, 0x04}
sendUSBPacket(0, b, setup.WLength)
usb_trans_buffer[0] = 0x04
usb_trans_buffer[1] = 0x03
usb_trans_buffer[2] = 0x09
usb_trans_buffer[3] = 0x04
sendUSBPacket(0, usb_trans_buffer[:4], setup.WLength)
case usb.IPRODUCT:
b := make([]byte, (len(usb_STRING_PRODUCT)<<1)+2)
b := usb_trans_buffer[:(len(usb_STRING_PRODUCT)<<1)+2]
strToUTF16LEDescriptor(usb_STRING_PRODUCT, b)
sendUSBPacket(0, b, setup.WLength)
case usb.IMANUFACTURER:
b := make([]byte, (len(usb_STRING_MANUFACTURER)<<1)+2)
b := usb_trans_buffer[:(len(usb_STRING_MANUFACTURER)<<1)+2]
strToUTF16LEDescriptor(usb_STRING_MANUFACTURER, b)
sendUSBPacket(0, b, setup.WLength)
@ -149,15 +159,16 @@ func sendDescriptor(setup usb.Setup) {
func handleStandardSetup(setup usb.Setup) bool {
switch setup.BRequest {
case usb.GET_STATUS:
buf := []byte{0, 0}
usb_trans_buffer[0] = 0
usb_trans_buffer[1] = 0
if setup.BmRequestType != 0 { // endpoint
if isEndpointHalt {
buf[0] = 1
usb_trans_buffer[0] = 1
}
}
sendUSBPacket(0, buf, setup.WLength)
sendUSBPacket(0, usb_trans_buffer[:2], setup.WLength)
return true
case usb.CLEAR_FEATURE:
@ -189,8 +200,8 @@ func handleStandardSetup(setup usb.Setup) bool {
return false
case usb.GET_CONFIGURATION:
buff := []byte{usbConfiguration}
sendUSBPacket(0, buff, setup.WLength)
usb_trans_buffer[0] = usbConfiguration
sendUSBPacket(0, usb_trans_buffer[:1], setup.WLength)
return true
case usb.SET_CONFIGURATION:
@ -208,8 +219,8 @@ func handleStandardSetup(setup usb.Setup) bool {
}
case usb.GET_INTERFACE:
buff := []byte{usbSetInterface}
sendUSBPacket(0, buff, setup.WLength)
usb_trans_buffer[0] = usbSetInterface
sendUSBPacket(0, usb_trans_buffer[:1], setup.WLength)
return true
case usb.SET_INTERFACE:

Просмотреть файл

@ -129,19 +129,20 @@ func cdcCallbackRx(b []byte) {
}
}
var cdcSetupBuff [cdcLineInfoSize]byte
func cdcSetup(setup usb.Setup) bool {
if setup.BmRequestType == usb_REQUEST_DEVICETOHOST_CLASS_INTERFACE {
if setup.BRequest == usb_CDC_GET_LINE_CODING {
var b [cdcLineInfoSize]byte
b[0] = byte(usbLineInfo.dwDTERate)
b[1] = byte(usbLineInfo.dwDTERate >> 8)
b[2] = byte(usbLineInfo.dwDTERate >> 16)
b[3] = byte(usbLineInfo.dwDTERate >> 24)
b[4] = byte(usbLineInfo.bCharFormat)
b[5] = byte(usbLineInfo.bParityType)
b[6] = byte(usbLineInfo.bDataBits)
cdcSetupBuff[0] = byte(usbLineInfo.dwDTERate)
cdcSetupBuff[1] = byte(usbLineInfo.dwDTERate >> 8)
cdcSetupBuff[2] = byte(usbLineInfo.dwDTERate >> 16)
cdcSetupBuff[3] = byte(usbLineInfo.dwDTERate >> 24)
cdcSetupBuff[4] = byte(usbLineInfo.bCharFormat)
cdcSetupBuff[5] = byte(usbLineInfo.bParityType)
cdcSetupBuff[6] = byte(usbLineInfo.bDataBits)
machine.SendUSBInPacket(0, b[:])
machine.SendUSBInPacket(0, cdcSetupBuff[:])
return true
}
}