uint8_t usbGetHidDescriptor (void) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = 9; #ifdef NON_COMPOSITE_MULTIPLE_INTERFACES usbSendDataPacketOnEP0((uint8_t*)&abromConfigurationDescriptorGroupHID.stHid[ INTERFACE_OFFSET(tSetupPacket.wIndex)].blength_hid_descriptor); #else usbSendDataPacketOnEP0((uint8_t*)&abromConfigurationDescriptorGroup.stHid[ INTERFACE_OFFSET(tSetupPacket.wIndex)].blength_hid_descriptor); #endif return (FALSE); }
//---------------------------------------------------------------------------- //Line Coding Structure //dwDTERate | 4 | Data terminal rate, in bits per second //bCharFormat | 1 | Stop bits, 0 = 1 Stop bit, 1 = 1,5 Stop bits, 2 = 2 Stop bits //bParityType | 1 | Parity, 0 = None, 1 = Odd, 2 = Even, 3= Mark, 4 = Space //bDataBits | 1 | Data bits (5,6,7,8,16) //---------------------------------------------------------------------------- BYTE usbGetLineCoding (VOID) { BYTE infIndex; if(tSetupPacket.wIndex % 2) { infIndex = (tSetupPacket.wIndex-1) / 2; } else { infIndex = (tSetupPacket.wIndex) / 2; } abUsbRequestReturnData[6] = CdcControl[infIndex].bDataBits; //Data bits = 8 abUsbRequestReturnData[5] = CdcControl[infIndex].bParity; //No Parity abUsbRequestReturnData[4] = CdcControl[infIndex].bStopBits; //Stop bits = 1 abUsbRequestReturnData[3] = CdcControl[infIndex].lBaudrate >> 24; abUsbRequestReturnData[2] = CdcControl[infIndex].lBaudrate >> 16; abUsbRequestReturnData[1] = CdcControl[infIndex].lBaudrate >> 8; abUsbRequestReturnData[0] = CdcControl[infIndex].lBaudrate; wBytesRemainingOnIEP0 = 0x07; //amount of data to be send over EP0 to host usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); //send data to host return (FALSE); }
void usbGetConfiguration(void) { usbClearOEP0ByteCount(); // for status stage wBytesRemainingOnIEP0 = 1; usbSendDataPacketOnEP0((uint8_t*)&bConfigurationNumber); }
VOID usbGetConfiguration(VOID) { usbClearOEP0ByteCount(); // for status stage wBytesRemainingOnIEP0 = 1; usbSendDataPacketOnEP0((PBYTE)&bConfigurationNumber); }
uint8_t usbGetReportDescriptor (void) { wBytesRemainingOnIEP0 = report_desc_size[INTERFACE_OFFSET(tSetupPacket.wIndex)]; usbSendDataPacketOnEP0(report_desc[INTERFACE_OFFSET(tSetupPacket.wIndex)]); return (FALSE); }
BYTE usbGetHidDescriptor (VOID) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = 9; usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup.stHid[ INTERFACE_OFFSET(tSetupPacket.wIndex)].blength_hid_descriptor); return (FALSE); }
VOID usbGetInterface(VOID) { // not fully supported, return one byte, zero usbClearOEP0ByteCount(); // for status stage wBytesRemainingOnIEP0 = 0x02; abUsbRequestReturnData[0] = 0x00; // changed to report alternative setting byte abUsbRequestReturnData[1] = bInterfaceNumber; usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); }
//---------------------------------------------------------------------------- BYTE Get_MaxLUN (VOID) { BYTE maxLunNumber = MSC_MAX_LUN_NUMBER - 1; wBytesRemainingOnIEP0 = 1; MscState.isMSCConfigured = TRUE; usbSendDataPacketOnEP0((PBYTE)&maxLunNumber); return (FALSE); }
//---------------------------------------------------------------------------- uint8_t Get_MaxLUN (void) { uint8_t maxLunNumber = MSC_MAX_LUN_NUMBER - 1; wBytesRemainingOnIEP0 = 1; MscState.isMSCConfigured = TRUE; usbSendDataPacketOnEP0((uint8_t*)&maxLunNumber); return (FALSE); }
void usbGetInterfaceStatus(void) { // check bIndexL for index number (not supported) usbClearOEP0ByteCount(); // for status stage // Return two zero bytes wBytesRemainingOnIEP0 = 2; abUsbRequestReturnData[0] = 0x00; // changed to support multiple interfaces abUsbRequestReturnData[1] = bInterfaceNumber; usbSendDataPacketOnEP0((uint8_t*)&abUsbRequestReturnData[0]); }
void usbGetStringDescriptor(void) { uint16_t bIndex; uint8_t bVal = (uint8_t)tSetupPacket.wValue; usbClearOEP0ByteCount(); // for status stage #if (USB_STR_INDEX_SERNUM != 0) if(bVal == 0x03) { wBytesRemainingOnIEP0 = abramSerialStringDescriptor[0]; usbSendDataPacketOnEP0((uint8_t*)&abramSerialStringDescriptor); } else #endif { bIndex = 0x00; while(bVal-- > 0x00) bIndex += abromStringDescriptor[bIndex]; wBytesRemainingOnIEP0 = abromStringDescriptor[bIndex]; usbSendDataPacketOnEP0((uint8_t*)&abromStringDescriptor[bIndex]); } }
VOID usbGetStringDescriptor(VOID) { WORD bIndex; BYTE bVal = (BYTE)tSetupPacket.wValue; usbClearOEP0ByteCount(); // for status stage #if (USB_STR_INDEX_SERNUM != 0) if(bVal == 0x03) { wBytesRemainingOnIEP0 = abramSerialStringDescriptor[0]; usbSendDataPacketOnEP0((PBYTE)&abramSerialStringDescriptor); } else #endif { bIndex = 0x00; while(bVal-- > 0x00) bIndex += abromStringDescriptor[bIndex]; wBytesRemainingOnIEP0 = abromStringDescriptor[bIndex]; usbSendDataPacketOnEP0((PBYTE)&abromStringDescriptor[bIndex]); } }
//---------------------------------------------------------------------------- // Line Coding Structure // dwDTERate | 4 | Data terminal rate, in bits per second // bCharFormat | 1 | Stop bits, 0 = 1 Stop bit, 1 = 1,5 Stop bits, 2 = 2 Stop bits // bParityType | 1 | Parity, 0 = None, 1 = Odd, 2 = Even, 3= Mark, 4 = Space // bDataBits | 1 | Data bits (5,6,7,8,16) //---------------------------------------------------------------------------- VOID usbGetLineCoding(VOID) { abUsbRequestReturnData[6] = bDataBits; // Data bits = 8 abUsbRequestReturnData[5] = bParity; // No Parity abUsbRequestReturnData[4] = bStopBits; // Stop bits = 1 abUsbRequestReturnData[3] = lBaudrate >> 24; abUsbRequestReturnData[2] = lBaudrate >> 16; abUsbRequestReturnData[1] = lBaudrate >> 8; abUsbRequestReturnData[0] = lBaudrate; wBytesRemainingOnIEP0 = 0x07; // amount of data to be send over EP0 to host usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); // send data to host }
VOID usbGetDeviceStatus(VOID) { /* for Self Powerd USB device if((abromConfigurationDescriptorGroup[OFFSET_CONFIG_DESCRIPTOR_POWER] & CFG_DESC_ATTR_SELF_POWERED) == CFG_DESC_ATTR_SELF_POWERED) abUsbRequestReturnData[0] = DEVICE_STATUS_SELF_POWER; */ usbClearOEP0ByteCount(); // for status stage // Return self power status and remote wakeup status wBytesRemainingOnIEP0 = 2; usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); }
uint8_t usbGetReport (void) { uint8_t *buffer; //tSetupPacket.wValue = USB_REQ_HID_FEATURE or USB_REQ_HID_INPUT buffer = USBHID_handleEP0GetReport(tSetupPacket.wValue >> 8, tSetupPacket.wValue, tSetupPacket.wLength, tSetupPacket.wIndex); if (buffer != 0){ usbSendDataPacketOnEP0((uint8_t*)buffer); } return (FALSE); }
BYTE usbGetReport (VOID) { BYTE *buffer; //tSetupPacket.wValue = USB_REQ_HID_FEATURE or USB_REQ_HID_INPUT buffer = Handler_GetReport((BYTE)tSetupPacket.wValue, tSetupPacket.wLength, tSetupPacket.wIndex); if (buffer != 0){ usbSendDataPacketOnEP0((PBYTE)buffer); } return (FALSE); }
void usbGetDeviceStatus(void) { if((abromConfigurationDescriptorGroup[OFFSET_CONFIG_DESCRIPTOR_POWER] & CFG_DESC_ATTR_SELF_POWERED) == CFG_DESC_ATTR_SELF_POWERED) abUsbRequestReturnData[0] = DEVICE_STATUS_SELF_POWER; if(bRemoteWakeup == ENABLE) abUsbRequestReturnData[0] |= DEVICE_STATUS_REMOTE_WAKEUP; usbClearOEP0ByteCount(); // for status stage // Return self power status and remote wakeup status wBytesRemainingOnIEP0 = 2; usbSendDataPacketOnEP0((uint8_t*)&abUsbRequestReturnData[0]); }
VOID Handler_InFeature(VOID) { switch((BYTE)tSetupPacket.wValue) // tSetupPacket.wValue is contains HID-Report-ID { case 1: // user's specified code... break; case 2: // user's specified code... break; default:; } usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData); }
void usbGetEndpointStatus(void) { uint8_t bEndpointNumber; // Endpoint number is bIndexL bEndpointNumber = tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM; if(bEndpointNumber == 0x00){ if((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == EP_DESC_ADDR_DIR_IN){ // input endpoint 0 abUsbRequestReturnData[0] = (uint8_t)(tEndPoint0DescriptorBlock.bIEPCNFG & EPCNF_STALL); }else{ // output endpoint 0 abUsbRequestReturnData[0] = (uint8_t)(tEndPoint0DescriptorBlock.bOEPCNFG & EPCNF_STALL); } abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 usbClearOEP0ByteCount(); // for status stage wBytesRemainingOnIEP0 = 0x02; usbSendDataPacketOnEP0((uint8_t*)&abUsbRequestReturnData[0]); }else{
VOID usbGetEndpointStatus(VOID) { BYTE bEndpointNumber; // Endpoint number is bIndexL bEndpointNumber = tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM; if(bEndpointNumber == 0x00){ if((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == EP_DESC_ADDR_DIR_IN){ // input endpoint 0 abUsbRequestReturnData[0] = (BYTE)(tEndPoint0DescriptorBlock.bIEPCNFG & EPCNF_STALL); }else{ // output endpoint 0 abUsbRequestReturnData[0] = (BYTE)(tEndPoint0DescriptorBlock.bOEPCNFG & EPCNF_STALL); } abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 usbClearOEP0ByteCount(); // for status stage wBytesRemainingOnIEP0 = 0x02; usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); }else{ // EP is from EP1 to EP7 while C language start from 0 // Firmware should NOT response if specified endpoint is not supported. (charpter 8) if(tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN){
//---------------------------------------------------------------------------- //Line Coding Structure //dwDTERate | 4 | Data terminal rate, in bits per second //bCharFormat | 1 | Stop bits, 0 = 1 Stop bit, 1 = 1,5 Stop bits, 2 = 2 Stop bits //bParityType | 1 | Parity, 0 = None, 1 = Odd, 2 = Even, 3= Mark, 4 = Space //bDataBits | 1 | Data bits (5,6,7,8,16) //---------------------------------------------------------------------------- uint8_t USBPHDC_GetDataStatusReq (void) { uint8_t i; //Initialize response abUsbRequestReturnData[0] = 0; abUsbRequestReturnData[1] = 0; for (i = 0; i < PHDC_NUM_INTERFACES; i++) { #ifdef NON_COMPOSITE_MULTIPLE_INTERFACES if (abromConfigurationDescriptorGroupPHDC.stPhdc[i].bInterfaceNumber == tSetupPacket.wIndex){ #else if (abromConfigurationDescriptorGroup.stPhdc[i].bInterfaceNumber == tSetupPacket.wIndex){ #endif if (PHDCWriteCtrl[i].nPHDCBytesToSendLeft){ abUsbRequestReturnData[0] |= 1 << (stUsbHandle[PHDC0_INTFNUM + i].ep_Out_Addr); } if (PHDCReadCtrl[i].nBytesInEp){ abUsbRequestReturnData[0] |= 1 << (stUsbHandle[PHDC0_INTFNUM + i].ep_In_Addr & 0x7F); } break; } } /* * edbIndex = stUsbHandle[intfNum].edb_Index; * tInputEndPointDescriptorBlock[edbIndex].bEPCNF = 0; * * abromConfigurationDescriptorGroup.stPhdc[0].bEndpointAddress_intp #ifdef PHDC_USE_INT_ENDPOINT * // ENDPOINT #1 INPUT DESCRIPTOR, (7 bytes) * SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size * DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint * PHDC0_INTEP_ADDR, // bEndpointAddress: * * for (i=0; i < PHDC_NUM_INTERFACES; i++) * { * for (j=0; j< abromConfigurationDescriptorGroup.stPhdc[i].bNumEndpoints; j++) * { * * } * } * bNumEndpoints * abromConfigurationDescriptorGroup.stPhdc[PHDC_NUM_INTERFACES] * if(tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) * { * // input endpoint * abUsbRequestReturnData[0] = (uint8_t)(tInputEndPointDescriptorBlock[bEndpointNumber].bEPCNF & EPCNF_STALL); * }else * { * // output endpoint * abUsbRequestReturnData[0] = (uint8_t)(tOutputEndPointDescriptorBlock[bEndpointNumber].bEPCNF & EPCNF_STALL); * } * } // no response if endpoint is not supported. * abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 */ wBytesRemainingOnIEP0 = 0x02; usbSendDataPacketOnEP0((uint8_t*)&abUsbRequestReturnData[0]); return (FALSE); }
uint8_t usbGetProtocol (void) { usbSendDataPacketOnEP0(&hidProtocol[INTERFACE_OFFSET(tSetupPacket.wIndex)]); return (FALSE); }
void usbGetDeviceDescriptor(void) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = SIZEOF_DEVICE_DESCRIPTOR; usbSendDataPacketOnEP0((uint8_t*) &abromDeviceDescriptor); }
VOID usbGetConfigurationDescriptor(VOID) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = sizeof(abromConfigurationDescriptorGroup); usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup); }
VOID usbGetDeviceDescriptor(VOID) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = SIZEOF_DEVICE_DESCRIPTOR; usbSendDataPacketOnEP0((PBYTE) &abromDeviceDescriptor); }
void usbGetConfigurationDescriptor(void) { usbClearOEP0ByteCount(); wBytesRemainingOnIEP0 = sizeof(abromConfigurationDescriptorGroup); usbSendDataPacketOnEP0((uint8_t*)&abromConfigurationDescriptorGroup); }