/****************************************************************************** * Function: void USBProtocolResetHandler(void) * * PreCondition: A USB bus reset is received from the host. * * Input: None * * Output: None * * Side Effects: Currently, this routine flushes any pending USB * transactions. It empties out the USTAT FIFO. This action * might not be desirable in some applications. * * Overview: Once a USB bus reset is received from the host, this * routine should be called. It resets the device address to * zero, disables all non-EP0 endpoints, initializes EP0 to * be ready for default communication, clears all USB * interrupt flags, unmasks applicable USB interrupts, and * reinitializes internal state-machine variables. * * Note: None *****************************************************************************/ void USBProtocolResetHandler(void) { UEIR = 0; // Clear all USB error flags UIR = 0; // Clears all USB interrupts //UEIE = 0b10011111; // Unmask all USB error interrupts //UIE = 0b01111011; // Enable all interrupts except ACTVIE UADDR = 0x00; // Reset to default address mDisableEP1to15(); // Reset all non-EP0 UEPn registers UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h while(UIRbits.TRNIF == 1) // Flush any pending transactions { UIRbits.TRNIF = 0; /******************************************************************** Bug Fix: August 14, 2007 ********************************************************************* Clearing the transfer complete flag bit, TRNIF, causes the SIE to advance the FIFO. If the next data in the FIFO holding register is valid, the SIE will reassert the interrupt within 6Tcy of clearing TRNIF. If no additional data is preset, TRNIF will remain clear. Additional nops were added in this fix to guarantee that TRNIF is properly updated before being checked again. ********************************************************************/ Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); } UCONbits.PKTDIS = 0; // Make sure packet processing is enabled USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c usb_stat.RemoteWakeup = 0; // Default status flag to disable usb_active_cfg = 0; // Clear active configuration usb_device_state = DEFAULT_STATE; }//end USBProtocolResetHandler
/****************************************************************************** * Function: void USBProtocolResetHandler(void) * * PreCondition: A USB bus reset is received from the host. * * Input: None * * Output: None * * Side Effects: Currently, this routine flushes any pending USB * transactions. It empties out the USTAT FIFO. This action * might not be desirable in some applications. * * Overview: Once a USB bus reset is received from the host, this * routine should be called. It resets the device address to * zero, disables all non-EP0 endpoints, initializes EP0 to * be ready for default communication, clears all USB * interrupt flags, unmasks applicable USB interrupts, and * reinitializes internal state-machine variables. * * Note: None *****************************************************************************/ void USBProtocolResetHandler(void) { UEIR = 0; // Clear all USB error flags UIR = 0; // Clears all USB interrupts UEIE = 0b10011111; // Unmask all USB error interrupts //UIE = 0b01111011; // Enable all interrupts except ACTVIE UIE = 0b00111011; // Enable all interrupts except ACTVIE and SOFIE UADDR = 0x00; // Reset to default address mDisableEP1to15(); // Reset all non-EP0 UEPn registers UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h while(UIRbits.TRNIF == 1) // Flush any pending transactions { UIRbits.TRNIF = 0; /******************************************************************** Bug Fix: August 14, 2007 ********************************************************************* Clearing the transfer complete flag bit, TRNIF, causes the SIE to advance the FIFO. If the next data in the FIFO holding register is valid, the SIE will reassert the interrupt within 6Tcy of clearing TRNIF. If no additional data is preset, TRNIF will remain clear. Additional nops were added in this fix to guarantee that TRNIF is properly updated before being checked again. ********************************************************************/ _asm bra 0 //Equivalent to bra $+2, which takes half as much code as 2 nop instructions bra 0 //Equivalent to bra $+2, which takes half as much code as 2 nop instructions _endasm Nop(); } UCONbits.PKTDIS = 0; // Make sure packet processing is enabled USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c //Prepare EP0 OUT to receive the first SETUP packet ep0Bo.Cnt = EP0_BUFF_SIZE; ep0Bo.ADR = (byte*)(&SetupPkt); ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN|_BSTALL; usb_stat.RemoteWakeup = 0; // Default status flag to disable usb_active_cfg = 0; // Clear active configuration usb_device_state = DEFAULT_STATE; }//end USBProtocolResetHandler
/****************************************************************************** * Function: void USBStdSetCfgHandler(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine first disables all endpoints by clearing * UEP registers. It then configures (initializes) endpoints * specified in the modifiable section. * * Note: None *****************************************************************************/ void USBStdSetCfgHandler(void) { ctrl_trf_session_owner = MUID_USB9; mDisableEP1to15(); // See usbdrv.h ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); usb_active_cfg = SetupPkt.bCfgValue; if(SetupPkt.bCfgValue == 0) usb_device_state = ADDRESS_STATE; else { usb_device_state = CONFIGURED_STATE; /* Modifiable Section */ PyUSBInitEP(); /* End modifiable section */ }//end if(SetupPkt.bcfgValue == 0) }//end USBStdSetCfgHandler
/****************************************************************************** * Function: void USBProtocolResetHandler(void) * * PreCondition: A USB bus reset is received from the host. * * Input: None * * Output: None * * Side Effects: Currently, this routine flushes any pending USB * transactions. It empties out the USTAT FIFO. This action * might not be desirable in some applications. * * Overview: Once a USB bus reset is received from the host, this * routine should be called. It resets the device address to * zero, disables all non-EP0 endpoints, initializes EP0 to * be ready for default communication, clears all USB * interrupt flags, unmasks applicable USB interrupts, and * reinitializes internal state-machine variables. * * Note: None *****************************************************************************/ void USBProtocolResetHandler(void) { UEIR = 0; // Clear all USB error flags UIR = 0; // Clears all USB interrupts UEIE = 0b10011111; // Unmask all USB error interrupts UIE = 0b01111011; // Enable all interrupts except ACTVIE UADDR = 0x00; // Reset to default address mDisableEP1to15(); // Reset all non-EP0 UEPn registers UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h while(UIRbits.TRNIF == 1) // Flush any pending transactions UIRbits.TRNIF = 0; UCONbits.PKTDIS = 0; // Make sure packet processing is enabled USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c usb_stat.RemoteWakeup = 0; // Default status flag to disable usb_active_cfg = 0; // Clear active configuration usb_device_state = DEFAULT_STATE; }//end USBProtocolResetHandler