/****************************************************************************** * Function: void USBCtrlEPService(void) * * PreCondition: USTAT is loaded with a valid endpoint address. * * Input: None * * Output: None * * Side Effects: None * * Overview: USBCtrlEPService checks for three transaction types that * it knows how to service and services them: * 1. EP0 SETUP * 2. EP0 OUT * 3. EP0 IN * It ignores all other types (i.e. EP1, EP2, etc.) * * Note: None *****************************************************************************/ void USBCtrlEPService(void) { if(USTAT == EP00_OUT) { if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP USBCtrlTrfSetupHandler(); else // EP0 OUT USBCtrlTrfOutHandler(); } else if(USTAT == EP00_IN) // EP0 IN USBCtrlTrfInHandler(); }//end USBCtrlEPService
/******************************************************************** Bug Fix: May 14, 2007 ********************************************************************/ byte USBCtrlEPService(void) { if(USTAT == EP00_OUT) { UIRbits.TRNIF = 0; //If the current EP0 OUT buffer has a SETUP packet if(ep0Bo.Stat.PID == SETUP_TOKEN) { //Check if the SETUP transaction data went into the CtrlTrfData buffer. //If so, need to copy it to the SetupPkt buffer so that it can be //processed correctly by USBCtrlTrfSetupHandler(). if(ep0Bo.ADR == (byte*)(&CtrlTrfData)) { unsigned char setup_cnt; ep0Bo.ADR = (byte*)(&SetupPkt); for(setup_cnt = 0; setup_cnt < sizeof(CTRL_TRF_SETUP); setup_cnt++) { *(((byte*)&SetupPkt)+setup_cnt) = *(((byte*)&CtrlTrfData)+setup_cnt); }//end for } //Handle the control transfer (parse the 8-byte SETUP command and figure out what to do) USBCtrlTrfSetupHandler(); } else { //Handle the DATA transfer USBCtrlTrfOutHandler(); } } else if(USTAT == EP00_IN) // EP0 IN { UIRbits.TRNIF = 0; USBCtrlTrfInHandler(); } else { return 0; // Return '0', if not an EP0 transaction } return 1; // Return '1', if TRNIF has been cleared }//end USBCtrlEPService
/******************************************************************** Bug Fix: May 14, 2007 ********************************************************************/ byte USBCtrlEPService(void) { if(USTAT == EP00_OUT) { UIRbits.TRNIF = 0; if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP USBCtrlTrfSetupHandler(); else // EP0 OUT USBCtrlTrfOutHandler(); } else if(USTAT == EP00_IN) // EP0 IN { UIRbits.TRNIF = 0; USBCtrlTrfInHandler(); } else { return 0; // Return '0', if not an EP0 transaction } return 1; // Return '1', if TRNIF has been cleared }//end USBCtrlEPService
/****************************************************************************** * Function: void USBCtrlEPService(void) * * PreCondition: USTAT is loaded with a valid endpoint address. * * Input: None * * Output: None * * Side Effects: None * * Overview: USBCtrlEPService checks for three transaction types that * it knows how to service and services them: * 1. EP0 SETUP * 2. EP0 OUT * 3. EP0 IN * It ignores all other types (i.e. EP1, EP2, etc.) * * Note: None *****************************************************************************/ void USBCtrlEPService(void) { if(USTAT == EP00_OUT) { //If the current EP0 OUT buffer has a SETUP packet if(ep0Bo.Stat.PID == SETUP_TOKEN) { ep0Bi.Stat.UOWN = 0; //Clear the UOWN bit for EP0 IN, in case it was set (ex: due to a stall) //Check if the SETUP transaction data went into the CtrlTrfData buffer. //If so, need to copy it to the SetupPkt buffer so that it can be //processed correctly by USBCtrlTrfSetupHandler(). if(ep0Bo.ADR == (byte*)(&CtrlTrfData)) { unsigned char setup_cnt; ep0Bo.ADR = (byte*)(&SetupPkt); for(setup_cnt = 0; setup_cnt < sizeof(CTRL_TRF_SETUP); setup_cnt++) { *(((byte*)&SetupPkt)+setup_cnt) = *(((byte*)&CtrlTrfData)+setup_cnt); }//end for } //Handle the control transfer (parse the 8-byte SETUP command and figure out what to do) USBCtrlTrfSetupHandler(); } else { //Handle the DATA transfer USBCtrlTrfOutHandler(); } } else if(USTAT == EP00_IN) // EP0 IN USBCtrlTrfInHandler(); }//end USBCtrlEPService