void USB_SOF_Event(void) { uint32_t cnt; if (USB_Configuration) { LPC_USB->Ctrl = ((USB_ENDPOINT_OUT(4) & 0x0F) << 2) | CTRL_RD_EN; // enable read // 3 clock cycles to fetch the packet length from RAM. asm("nop"); asm("nop"); asm("nop"); asm("nop"); if ((cnt = LPC_USB->RxPLen) & PKT_DV) { // We have data... cnt &= PKT_LNGTH_MASK; // Get length in bytes lasershark_process_data(cnt); LPC_USB->Ctrl = 0; } LPC_USB->Ctrl = 0; // Disable read mode.. do this if you ever want to see a USB packet again } }
//CLASS SPECIFIC REQUEST static void VIDEO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req) { /* Send the current mute state */ DCD_EP_Flush (pdev,USB_ENDPOINT_OUT(0)); if(req->wValue == 256) { //Probe Request USBD_CtlSendData (pdev, (uint8_t*)&videoProbeControl, req->wLength); } else if (req->wValue == 512) { //Commit Request USBD_CtlSendData (pdev, (uint8_t*)&videoCommitControl, req->wLength); } }
ErrorCode_t UsbdCdc_Bulk_OUT_Hdlr(USBD_HANDLE_T hUsb, void* data, uint32_t event) { uint8_t EpAdd = USB_ENDPOINT_OUT(CALLBACK_UsbdCdc_Register_DataOutEndpointNumber()); if (event == USB_EVT_OUT) { UsbdCdc_EPOUT_buffer_count = USBD_API->hw->ReadEP(UsbHandle, EpAdd, UsbdCdc_EPOUT_buffer); } else if(event == USB_EVT_OUT_NAK) { if(UsbdCdc_EPOUT_buffer_count == 0) { /* Reset EP OUT buffer */ UsbdCdc_EPOUT_buffer_index = 0; /* Send DMA request */ USBD_API->hw->ReadReqEP(UsbHandle, EpAdd, UsbdCdc_EPOUT_buffer, CDC_EP_SIZE); } } return LPC_OK; }
// --------------------------------------------------------------------------- static ErrorCode_t USB_Reset_Event_Handler(USBD_HANDLE_T hUsb) { int core = USB_CORE(hUsb); USB_CONTROLLER_STATE *State = USB_STATE(core); // Clear all flags USB_ClearEvent(0, USB_EVENT_ALL); State->FirstGetDescriptor = TRUE; //State->Address = 0; //State->DeviceState = USB_DEVICE_STATE_DEFAULT; //USB_StateCallback(State); USB_FLAGS(core) = 0; // Reset endpoints USBD_ResetEP(hUsb, USB_ENDPOINT_IN(INT_IN_EP)); USBD_ResetEP(hUsb, USB_ENDPOINT_IN(BULK_IN_EP)); USBD_ResetEP(hUsb, USB_ENDPOINT_OUT(BULK_OUT_EP)); ep_out_count[core] = 0; ep_in_count[core] = 0; return RET_OK; }
0x02, /* bNumEndpoints */ USB_DEVICE_CLASS_STORAGE, /* bInterfaceClass */ MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ 0x62, /* iInterface */ /* Bulk In Endpoint */ USB_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_IN(2), /* bEndpointAddress */ USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ WBVAL(0x0040), /* wMaxPacketSize */ 0, /* bInterval */ /* Bulk Out Endpoint */ USB_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_OUT(2), /* bEndpointAddress */ USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ WBVAL(0x0040), /* wMaxPacketSize */ 0, /* bInterval */ /* Terminator */ 0 /* bLength */ }; /* USB String Descriptor (optional) */ const uint8_t USB_StringDescriptor[] = { /* Index 0x00: LANGID Codes */ 0x04, /* bLength */ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(0x0409), /* US English */ /* wLANGID */ /* Index 0x04: Manufacturer */ 0x1C, /* bLength */
extern const CDCDescriptor _cdcInterface PROGMEM; const CDCDescriptor _cdcInterface = { D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), // CDC communication interface D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not) D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), // CDC data interface D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0), D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0) }; int WEAK CDC_GetInterface(u8* interfaceNum) { interfaceNum[0] += 2; // uses 2 return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface)); } bool WEAK CDC_Setup(Setup& setup) { u8 r = setup.bRequest; u8 requestType = setup.bmRequestType; if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType)
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ AUDIO_FORMAT_TYPE_I, /* bFormatType */ 0x01, /* bNrChannels */ 0x02, /* bSubFrameSize */ 0x10, /* bBitResolution */ 0x05, /* bSamFreqType */ B3VAL(8000), /* tSamFreq 1 */ B3VAL(11025), /* tSamFreq 2 */ B3VAL(22050), /* tSamFreq 3 */ B3VAL(44100), /* tSamFreq 4 */ B3VAL(48000), /* tSamFreq 5 */ /* Endpoint - Standard Descriptor */ AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_OUT(0x81), /* bEndpointAddress */ USB_ENDPOINT_TYPE_ISOCHRONOUS | USB_ENDPOINT_SYNC_ASYNCHRONOUS, /* bmAttributes */ WBVAL(0x0064), /* wMaxPacketSize */ 0x01, /* bInterval */ 0x00, /* bRefresh */ 0x00, /* bSynchAddress */ /* Endpoint - Audio Streaming */ AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ 0x01, /* bmAttributes */ 0x00, /* bLockDelayUnits */ WBVAL(0x0000), /* wLockDelay */
extern const CDCDescriptor _cdcInterface PROGMEM; const CDCDescriptor _cdcInterface = { D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), // CDC communication interface D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not) D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), // CDC data interface D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) }; int WEAK CDC_GetInterface(u8* interfaceNum) { interfaceNum[0] += 2; // uses 2 return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface)); } bool WEAK CDC_Setup(Setup& setup) { u8 r = setup.bRequest; u8 requestType = setup.bmRequestType; if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType)
if ( ret == false) { sendZlp(0); } return ret; #endif return false; } uint32_t EndPoints[] = { USB_ENDPOINT_TYPE_CONTROL, #ifdef CDC_ENABLED USB_ENDPOINT_TYPE_INTERRUPT | USB_ENDPOINT_IN(0), // CDC_ENDPOINT_ACM USB_ENDPOINT_TYPE_BULK | USB_ENDPOINT_OUT(0), // CDC_ENDPOINT_OUT USB_ENDPOINT_TYPE_BULK | USB_ENDPOINT_IN(0), // CDC_ENDPOINT_IN #endif #ifdef PLUGGABLE_USB_ENABLED //allocate 6 endpoints and remove const so they can be changed by the user 0, 0, 0, 0, 0, 0, #endif }; void USBDeviceClass::initEndpoints() {
D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 (?) D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM), // IN endpoint for CDC_ENDPOINT_ACM USB_ENDPOINT_TYPE_INTERRUPT, // INTERRUPT type 0x10, // max packet size 16 0x40), // interval 64 frames i.e. 64 msec (see USB spec table 9-13) // SECOND INTERFACE // CDC data interface (endpoints 1, 2) D_INTERFACE(CDC_DATA_INTERFACE, // 'n' 2, // number of endpoints CDC_DATA_INTERFACE_CLASS, // interface class 0, // interface sub-class 0), // protocol D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT), // OUT endpoint, index 'CDC_ENDPOINT_OUT' USB_ENDPOINT_TYPE_BULK, // BULK data transfers 0x40, // max packet size 64 1), // interval 1 (was 0) D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN), // IN endpoint, index 'CDC_ENDPOINT_IN' USB_ENDPOINT_TYPE_BULK, // BULK data transfers 0x40, // max packet size 64 0) // interval 0 (apparently not needed) }; void WEAK CDC_Reset(void) { _usbLineInfo.dwDTERate = 115200; _usbLineInfo.bCharFormat
static const uint8_t vcom_configuration_descriptor_data[] = { /* Configuration Descriptor.*/ USB_DESC_CONFIGURATION( USB_DESC_CONFIGURATION_SIZE + (IAD_CDC_IF_DESC_SET_SIZE * 2), /* wTotalLength. */ USB_NUM_INTERFACES, /* bNumInterfaces. */ 0x01, /* bConfigurationValue. */ 0, /* iConfiguration. */ 0xC0, /* bmAttributes (self powered). */ 50 /* bMaxPower (100mA). */ ), IAD_CDC_IF_DESC_SET( USB_CDC_CIF_NUM0, USB_CDC_DIF_NUM0, USB_ENDPOINT_IN(USB_INTERRUPT_REQUEST_EP_A), USB_ENDPOINT_OUT(USB_DATA_AVAILABLE_EP_A), USB_ENDPOINT_IN(USB_DATA_REQUEST_EP_A) ), IAD_CDC_IF_DESC_SET( USB_CDC_CIF_NUM1, USB_CDC_DIF_NUM1, USB_ENDPOINT_IN(USB_INTERRUPT_REQUEST_EP_B), USB_ENDPOINT_OUT(USB_DATA_AVAILABLE_EP_B), USB_ENDPOINT_IN(USB_DATA_REQUEST_EP_B) ), }; /* * Configuration Descriptor wrapper. */ static const USBDescriptor vcom_configuration_descriptor = {
ErrorCode_t EP0_hdlr(USBD_HANDLE_T hUsb, void* data, uint32_t event) { USB_CORE_CTRL_T* pCtrl = (USB_CORE_CTRL_T*)hUsb; static USB_SETUP_PACKET packet; pUsbApi->hw->ReadSetupPkt( hUsb, USB_ENDPOINT_OUT(0), (uint32_t *)&packet ); switch (event) { case USB_EVT_SETUP: if (packet.bmRequestType.B == 0x80 // Setup Device to Host && packet.bRequest == 0x06 // Get descriptor && packet.wValue.WB.H == 0x06 // Get Device Qualifier Descriptor ) { pUsbApi->hw->WriteEP(pUsbHandle, USB_ENDPOINT_IN(0), UPER_DeviceQualifierDescriptor, USB_DEVICE_QUALI_SIZE); return LPC_OK; } if (packet.bmRequestType.B == 0x80 // Setup Device to Host && packet.bRequest == 0x06 // Get descriptor && packet.wValue.WB.H == 0x03 // Get String Descriptor && packet.wValue.WB.L == 3 // Serial number string ) { uint32_t descSize = UPER_USBSerialStringDescriptor[0]; if (descSize > packet.wLength) descSize = packet.wLength; pUsbApi->hw->WriteEP(pUsbHandle, USB_ENDPOINT_IN(0), UPER_USBSerialStringDescriptor, descSize); return LPC_OK; } pCtrl->EP0Data.Count = packet.wLength; // Number of bytes to transfer if ( (packet.bmRequestType.B == REQ_TYPE(REQUEST_HOST_TO_DEVICE,REQUEST_CLASS,REQUEST_TO_INTERFACE) ) && (packet.bRequest == 0x20 ) // SetLineCoding && (packet.wValue.W == 0 ) // Zero && (packet.wIndex.W == USB_CDC_SFP_CIF_NUM) // Interface number ) { pCtrl->EP0Data.pData = pCtrl->EP0Buf; pCtrl->EP0Data.Count = 7; //pUsbApi->core->DataOutStage( hUsb ); pUsbApi->core->StatusInStage(hUsb); return LPC_OK; } if ( (packet.bmRequestType.B == REQ_TYPE(REQUEST_DEVICE_TO_HOST,REQUEST_CLASS,REQUEST_TO_INTERFACE) ) && (packet.bRequest == 0x21 ) // GetLineCoding && (packet.wValue.W == 0 ) // Zero && (packet.wIndex.W == USB_CDC_SFP_CIF_NUM) // Interface number ) { uint8_t lcs[] = { 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }; // Default 9600 8n1 pCtrl->EP0Data.Count = 7; pCtrl->EP0Data.pData = (uint8_t*)&lcs; pUsbApi->core->DataInStage(hUsb); return LPC_OK; } if ( (packet.bmRequestType.B == REQ_TYPE(REQUEST_HOST_TO_DEVICE,REQUEST_CLASS,REQUEST_TO_INTERFACE) ) && (packet.bRequest == 0x22 ) // SetControlLineState && (packet.wIndex.W == USB_CDC_SFP_CIF_NUM) // Both interfaces ) { pUsbApi->core->StatusInStage(hUsb); return LPC_OK; } break; case USB_EVT_OUT: if (pCtrl->EP0Data.Count > 0) { pUsbApi->core->DataOutStage(hUsb); } else { pUsbApi->core->StatusInStage(hUsb); } return LPC_OK; break; case USB_EVT_IN: /*if (pCtrl->EP0Data.Count > 0) { pUsbApi->core->DataInStage( hUsb ); return LPC_OK; } else { pUsbApi->core->StatusOutStage( hUsb ); return LPC_OK; }*/ break; default: break; } return ERR_USBD_UNHANDLED; }
{ interfaceNum[0] += 1; // uses 1 return USB_SendControl(TRANSFER_PGM,&_acInterface,sizeof(_acInterface)); } extern const MIDIDescriptor _midiInterface PROGMEM; const MIDIDescriptor _midiInterface = { D_INTERFACE(MIDI_INTERFACE,MIDI_ENDPOINT_COUNT,CLASS_AUDIO,SUBCLASS_MIDISTREAMING,0), {7, TYPE_CS_INTERFACE, SUBTYPE_HEADER, 0x0100, 34}, {6, TYPE_CS_INTERFACE, SUBTYPE_MIDI_IN_JACK, JACK_EMBEDDED, JACK1, 0x00}, {9, TYPE_CS_INTERFACE, SUBTYPE_MIDI_OUT_JACK, JACK_EMBEDDED, JACK2, 1, JACK3, 1, 0x00}, {6, TYPE_CS_INTERFACE, SUBTYPE_MIDI_IN_JACK, JACK_EXTERNAL, JACK3, 0x00}, {9, TYPE_CS_INTERFACE, SUBTYPE_MIDI_OUT_JACK, JACK_EXTERNAL, JACK4, 1, JACK1, 1, 0x00}, { D_ENDPOINT(USB_ENDPOINT_OUT(MIDI_ENDPOINT_OUT), USB_ENDPOINT_TYPE_BULK, 0x0040, 0x00), { 5, 0x25, 0x01, 0x01, JACK1 } }, { D_ENDPOINT(USB_ENDPOINT_IN(MIDI_ENDPOINT_IN), USB_ENDPOINT_TYPE_BULK, 0x0040, 0x00), { 5, 0x25, 0x01, 0x01, JACK2 } } }; int WEAK MIDI_GetInterface(u8* interfaceNum) { interfaceNum[0] += 1; // uses 1 return USB_SendControl(TRANSFER_PGM,&_midiInterface,sizeof(_midiInterface)); }
/******************************************************************************** Endpoint 1, Mass Storage Bulk In *********************************************************************************/ USB_ENDPOINT_DESCRIPTOR_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_IN(MASS_STORAGE_READ_EP_NUM), /* bEndpointAddress */ USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ WBVAL(MASS_STORAGE_MAX_PACKET_SIZE),/* wMaxPacketSize */ 0x0, /* bInterval */ /******************************************************************************** Endpoint 2, Mass Storage Bulk Out *********************************************************************************/ USB_ENDPOINT_DESCRIPTOR_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_OUT(MASS_STORAGE_WRITE_EP_NUM), /* bEndpointAddress */ USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ WBVAL(MASS_STORAGE_MAX_PACKET_SIZE), /* wMaxPacketSize */ 0x00, /* bInterval: Ignore bulk transfer */ }; /* USB String Descriptors */ const uint8 MASS_StringLangID[MASS_SIZ_STRING_LANGID] = { MASS_SIZ_STRING_LANGID, USB_STRING_DESCRIPTOR_TYPE, WBVAL(0x0409) /* LangID = 0x0409: U.S. English */