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
 | 
								// clear stall request
 | 
				
			||||||
			setEPINTENCLR(0, sam.USB_DEVICE_EPINTENCLR_STALL1)
 | 
								setEPINTENCLR(0, sam.USB_DEVICE_EPINTENCLR_STALL1)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							sendZlp(0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
						// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
				
			||||||
| 
						 | 
					@ -1796,53 +1798,29 @@ func sendDescriptor(setup usbSetup) {
 | 
				
			||||||
		sendConfiguration(setup)
 | 
							sendConfiguration(setup)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
						case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
				
			||||||
		if setup.wLength == 8 {
 | 
							// composite descriptor
 | 
				
			||||||
			// 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)
 | 
				
			||||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
							l := deviceDescriptorSize
 | 
				
			||||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
							if setup.wLength < deviceDescriptorSize {
 | 
				
			||||||
		} else {
 | 
								l = int(setup.wLength)
 | 
				
			||||||
			// 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())
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							sendUSBPacket(0, dd.Bytes()[:l])
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
						case usb_STRING_DESCRIPTOR_TYPE:
 | 
				
			||||||
		switch setup.wValueL {
 | 
							switch setup.wValueL {
 | 
				
			||||||
		case 0:
 | 
							case 0:
 | 
				
			||||||
			b := make([]byte, 4)
 | 
								b := []byte{0x04, 0x03, 0x09, 0x04}
 | 
				
			||||||
			b[0] = 0x04
 | 
					 | 
				
			||||||
			b[1] = 0x03
 | 
					 | 
				
			||||||
			b[2] = 0x09
 | 
					 | 
				
			||||||
			b[3] = 0x04
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case usb_IPRODUCT:
 | 
							case usb_IPRODUCT:
 | 
				
			||||||
			prod := []byte(usb_STRING_PRODUCT)
 | 
								b := strToUTF16LEDescriptor(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
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case usb_IMANUFACTURER:
 | 
							case usb_IMANUFACTURER:
 | 
				
			||||||
			prod := []byte(usb_STRING_MANUFACTURER)
 | 
								b := strToUTF16LEDescriptor(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
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1648,6 +1648,8 @@ func handleUSBIRQ(interrupt.Interrupt) {
 | 
				
			||||||
			// clear stall request
 | 
								// clear stall request
 | 
				
			||||||
			setEPINTENCLR(0, sam.USB_DEVICE_ENDPOINT_EPINTENCLR_STALL1)
 | 
								setEPINTENCLR(0, sam.USB_DEVICE_ENDPOINT_EPINTENCLR_STALL1)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							sendZlp(0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
						// Now the actual transfer handlers, ignore endpoint number 0 (setup)
 | 
				
			||||||
| 
						 | 
					@ -1967,53 +1969,29 @@ func sendDescriptor(setup usbSetup) {
 | 
				
			||||||
		sendConfiguration(setup)
 | 
							sendConfiguration(setup)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
						case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
				
			||||||
		if setup.wLength == 8 {
 | 
							// composite descriptor
 | 
				
			||||||
			// 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)
 | 
				
			||||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
							l := deviceDescriptorSize
 | 
				
			||||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
							if setup.wLength < deviceDescriptorSize {
 | 
				
			||||||
		} else {
 | 
								l = int(setup.wLength)
 | 
				
			||||||
			// 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())
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							sendUSBPacket(0, dd.Bytes()[:l])
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
						case usb_STRING_DESCRIPTOR_TYPE:
 | 
				
			||||||
		switch setup.wValueL {
 | 
							switch setup.wValueL {
 | 
				
			||||||
		case 0:
 | 
							case 0:
 | 
				
			||||||
			b := make([]byte, 4)
 | 
								b := []byte{0x04, 0x03, 0x09, 0x04}
 | 
				
			||||||
			b[0] = 0x04
 | 
					 | 
				
			||||||
			b[1] = 0x03
 | 
					 | 
				
			||||||
			b[2] = 0x09
 | 
					 | 
				
			||||||
			b[3] = 0x04
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case usb_IPRODUCT:
 | 
							case usb_IPRODUCT:
 | 
				
			||||||
			prod := []byte(usb_STRING_PRODUCT)
 | 
								b := strToUTF16LEDescriptor(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
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case usb_IMANUFACTURER:
 | 
							case usb_IMANUFACTURER:
 | 
				
			||||||
			prod := []byte(usb_STRING_MANUFACTURER)
 | 
								b := strToUTF16LEDescriptor(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
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			sendUSBPacket(0, b)
 | 
								sendUSBPacket(0, b)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -408,15 +408,13 @@ func sendDescriptor(setup usbSetup) {
 | 
				
			||||||
		sendConfiguration(setup)
 | 
							sendConfiguration(setup)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
						case usb_DEVICE_DESCRIPTOR_TYPE:
 | 
				
			||||||
		if setup.wLength == 8 {
 | 
							// composite descriptor
 | 
				
			||||||
			// 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)
 | 
				
			||||||
			dd := NewDeviceDescriptor(0xEF, 0x02, 0x01, 64, usb_VID, usb_PID, 0x100, usb_IMANUFACTURER, usb_IPRODUCT, usb_ISERIAL, 1)
 | 
							l := deviceDescriptorSize
 | 
				
			||||||
			sendUSBPacket(0, dd.Bytes()[:8])
 | 
							if setup.wLength < deviceDescriptorSize {
 | 
				
			||||||
		} else {
 | 
								l = int(setup.wLength)
 | 
				
			||||||
			// 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())
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							sendUSBPacket(0, dd.Bytes()[:l])
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case usb_STRING_DESCRIPTOR_TYPE:
 | 
						case usb_STRING_DESCRIPTOR_TYPE:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче