machine/atsamd21,atsamd51,nrf52840: correct USB CDC composite descriptors
Signed-off-by: Ron Evans <ron@hybridgroup.com>
Этот коммит содержится в:
		
							родитель
							
								
									0596b3c003
								
							
						
					
					
						коммит
						06797b6d1a
					
				
					 3 изменённых файлов: 28 добавлений и 74 удалений
				
			
		| 
						 | 
				
			
			@ -1477,6 +1477,8 @@ func handleUSB(intr interrupt.Interrupt) {
 | 
			
		|||
			// clear stall request
 | 
			
		||||
			setEPINTENCLR(0, sam.USB_DEVICE_EPINTENCLR_STALL1)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		sendZlp(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
			
		||||
| 
						 | 
				
			
			@ -1796,53 +1798,29 @@ func sendDescriptor(setup usbSetup) {
 | 
			
		|||
		sendConfiguration(setup)
 | 
			
		||||
		return
 | 
			
		||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
			
		||||
		if setup.wLength == 8 {
 | 
			
		||||
			// composite descriptor requested, so only send 8 bytes
 | 
			
		||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
			
		||||
		} else {
 | 
			
		||||
			// complete descriptor requested so send entire packet
 | 
			
		||||
			dd := NewDeviceDescriptor(0x02, 0x00, 0x00, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes())
 | 
			
		||||
		// composite descriptor
 | 
			
		||||
		dd := NewDeviceDescriptor(0xef, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
		l := deviceDescriptorSize
 | 
			
		||||
		if setup.wLength < deviceDescriptorSize {
 | 
			
		||||
			l = int(setup.wLength)
 | 
			
		||||
		}
 | 
			
		||||
		sendUSBPacket(0, dd.Bytes()[:l])
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
			
		||||
		switch setup.wValueL {
 | 
			
		||||
		case 0:
 | 
			
		||||
			b := make([]byte, 4)
 | 
			
		||||
			b[0] = 0x04
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
			b[2] = 0x09
 | 
			
		||||
			b[3] = 0x04
 | 
			
		||||
			b := []byte{0x04, 0x03, 0x09, 0x04}
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		case usb_IPRODUCT:
 | 
			
		||||
			prod := []byte(usb_STRING_PRODUCT)
 | 
			
		||||
			b := make([]byte, len(prod)*2+2)
 | 
			
		||||
			b[0] = byte(len(prod)*2 + 2)
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
 | 
			
		||||
			for i, val := range prod {
 | 
			
		||||
				b[i*2+2] = val
 | 
			
		||||
				b[i*2+3] = 0
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			b := strToUTF16LEDescriptor(usb_STRING_PRODUCT)
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		case usb_IMANUFACTURER:
 | 
			
		||||
			prod := []byte(usb_STRING_MANUFACTURER)
 | 
			
		||||
			b := make([]byte, len(prod)*2+2)
 | 
			
		||||
			b[0] = byte(len(prod)*2 + 2)
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
 | 
			
		||||
			for i, val := range prod {
 | 
			
		||||
				b[i*2+2] = val
 | 
			
		||||
				b[i*2+3] = 0
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			b := strToUTF16LEDescriptor(usb_STRING_MANUFACTURER)
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1648,6 +1648,8 @@ func handleUSBIRQ(interrupt.Interrupt) {
 | 
			
		|||
			// clear stall request
 | 
			
		||||
			setEPINTENCLR(0, sam.USB_DEVICE_ENDPOINT_EPINTENCLR_STALL1)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		sendZlp(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
			
		||||
| 
						 | 
				
			
			@ -1967,53 +1969,29 @@ func sendDescriptor(setup usbSetup) {
 | 
			
		|||
		sendConfiguration(setup)
 | 
			
		||||
		return
 | 
			
		||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
			
		||||
		if setup.wLength == 8 {
 | 
			
		||||
			// composite descriptor requested, so only send 8 bytes
 | 
			
		||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
			
		||||
		} else {
 | 
			
		||||
			// complete descriptor requested so send entire packet
 | 
			
		||||
			dd := NewDeviceDescriptor(0x02, 0x00, 0x00, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes())
 | 
			
		||||
		// composite descriptor
 | 
			
		||||
		dd := NewDeviceDescriptor(0xef, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
		l := deviceDescriptorSize
 | 
			
		||||
		if setup.wLength < deviceDescriptorSize {
 | 
			
		||||
			l = int(setup.wLength)
 | 
			
		||||
		}
 | 
			
		||||
		sendUSBPacket(0, dd.Bytes()[:l])
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
			
		||||
		switch setup.wValueL {
 | 
			
		||||
		case 0:
 | 
			
		||||
			b := make([]byte, 4)
 | 
			
		||||
			b[0] = 0x04
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
			b[2] = 0x09
 | 
			
		||||
			b[3] = 0x04
 | 
			
		||||
			b := []byte{0x04, 0x03, 0x09, 0x04}
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		case usb_IPRODUCT:
 | 
			
		||||
			prod := []byte(usb_STRING_PRODUCT)
 | 
			
		||||
			b := make([]byte, len(prod)*2+2)
 | 
			
		||||
			b[0] = byte(len(prod)*2 + 2)
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
 | 
			
		||||
			for i, val := range prod {
 | 
			
		||||
				b[i*2+2] = val
 | 
			
		||||
				b[i*2+3] = 0
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			b := strToUTF16LEDescriptor(usb_STRING_PRODUCT)
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		case usb_IMANUFACTURER:
 | 
			
		||||
			prod := []byte(usb_STRING_MANUFACTURER)
 | 
			
		||||
			b := make([]byte, len(prod)*2+2)
 | 
			
		||||
			b[0] = byte(len(prod)*2 + 2)
 | 
			
		||||
			b[1] = 0x03
 | 
			
		||||
 | 
			
		||||
			for i, val := range prod {
 | 
			
		||||
				b[i*2+2] = val
 | 
			
		||||
				b[i*2+3] = 0
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			b := strToUTF16LEDescriptor(usb_STRING_MANUFACTURER)
 | 
			
		||||
			sendUSBPacket(0, b)
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -408,15 +408,13 @@ func sendDescriptor(setup usbSetup) {
 | 
			
		|||
		sendConfiguration(setup)
 | 
			
		||||
		return
 | 
			
		||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
			
		||||
		if setup.wLength == 8 {
 | 
			
		||||
			// composite descriptor requested, so only send 8 bytes
 | 
			
		||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
			
		||||
		} else {
 | 
			
		||||
			// complete descriptor requested so send entire packet
 | 
			
		||||
			dd := NewDeviceDescriptor(0x02, 0x00, 0x00, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
			sendUSBPacket(0, dd.Bytes())
 | 
			
		||||
		// composite descriptor
 | 
			
		||||
		dd := NewDeviceDescriptor(0xef, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
			
		||||
		l := deviceDescriptorSize
 | 
			
		||||
		if setup.wLength < deviceDescriptorSize {
 | 
			
		||||
			l = int(setup.wLength)
 | 
			
		||||
		}
 | 
			
		||||
		sendUSBPacket(0, dd.Bytes()[:l])
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче