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

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

@ -307,21 +307,24 @@ type USBBuffer struct {
var ( var (
usbDPSRAM = (*USBDPSRAM)(unsafe.Pointer(uintptr(0x50100000))) usbDPSRAM = (*USBDPSRAM)(unsafe.Pointer(uintptr(0x50100000)))
epXdata0 [16]bool epXdata0 [16]bool
setupBytes [8]byte
) )
func (d *USBDPSRAM) setupBytes() []byte { func (d *USBDPSRAM) setupBytes() []byte {
var buf [8]byte
buf[0] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get()) data := d.EPxControl[usb.CONTROL_ENDPOINT].In.Get()
buf[1] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 8) setupBytes[0] = byte(data)
buf[2] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 16) setupBytes[1] = byte(data >> 8)
buf[3] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 24) setupBytes[2] = byte(data >> 16)
buf[4] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get()) setupBytes[3] = byte(data >> 24)
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)
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() { func (d *USBDPSRAM) clear() {

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

@ -72,6 +72,13 @@ var udd_ep_in_cache_buffer [7][64]uint8
//go:align 4 //go:align 4
var udd_ep_out_cache_buffer [7][64]uint8 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 ( var (
usbTxHandler [usb.NumberOfEndpoints]func() usbTxHandler [usb.NumberOfEndpoints]func()
usbRxHandler [usb.NumberOfEndpoints]func([]byte) usbRxHandler [usb.NumberOfEndpoints]func([]byte)
@ -113,16 +120,19 @@ func sendDescriptor(setup usb.Setup) {
case usb.STRING_DESCRIPTOR_TYPE: case usb.STRING_DESCRIPTOR_TYPE:
switch setup.WValueL { switch setup.WValueL {
case 0: case 0:
b := []byte{0x04, 0x03, 0x09, 0x04} usb_trans_buffer[0] = 0x04
sendUSBPacket(0, b, setup.WLength) 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: 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) strToUTF16LEDescriptor(usb_STRING_PRODUCT, b)
sendUSBPacket(0, b, setup.WLength) sendUSBPacket(0, b, setup.WLength)
case usb.IMANUFACTURER: 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) strToUTF16LEDescriptor(usb_STRING_MANUFACTURER, b)
sendUSBPacket(0, b, setup.WLength) sendUSBPacket(0, b, setup.WLength)
@ -149,15 +159,16 @@ func sendDescriptor(setup usb.Setup) {
func handleStandardSetup(setup usb.Setup) bool { func handleStandardSetup(setup usb.Setup) bool {
switch setup.BRequest { switch setup.BRequest {
case usb.GET_STATUS: case usb.GET_STATUS:
buf := []byte{0, 0} usb_trans_buffer[0] = 0
usb_trans_buffer[1] = 0
if setup.BmRequestType != 0 { // endpoint if setup.BmRequestType != 0 { // endpoint
if isEndpointHalt { 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 return true
case usb.CLEAR_FEATURE: case usb.CLEAR_FEATURE:
@ -189,8 +200,8 @@ func handleStandardSetup(setup usb.Setup) bool {
return false return false
case usb.GET_CONFIGURATION: case usb.GET_CONFIGURATION:
buff := []byte{usbConfiguration} usb_trans_buffer[0] = usbConfiguration
sendUSBPacket(0, buff, setup.WLength) sendUSBPacket(0, usb_trans_buffer[:1], setup.WLength)
return true return true
case usb.SET_CONFIGURATION: case usb.SET_CONFIGURATION:
@ -208,8 +219,8 @@ func handleStandardSetup(setup usb.Setup) bool {
} }
case usb.GET_INTERFACE: case usb.GET_INTERFACE:
buff := []byte{usbSetInterface} usb_trans_buffer[0] = usbSetInterface
sendUSBPacket(0, buff, setup.WLength) sendUSBPacket(0, usb_trans_buffer[:1], setup.WLength)
return true return true
case usb.SET_INTERFACE: case usb.SET_INTERFACE:

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

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