/****************************************************************************** * Function: void USBCheckBusStatus(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine enables/disables the USB module by monitoring * the USB power signal. * * Note: None *****************************************************************************/ void USBCheckBusStatus(void) { /************************************************************************** * Bus Attachment & Detachment Detection * usb_bus_sense is an i/o pin defined in io_cfg.h *************************************************************************/ #define USB_BUS_ATTACHED 1 #define USB_BUS_DETACHED 0 if(usb_bus_sense == USB_BUS_ATTACHED) // Is USB bus attached? { if(UCONbits.USBEN == 0) // Is the module off? USBModuleEnable(); // Is off, enable it } else { if(UCONbits.USBEN == 1) // Is the module on? USBModuleDisable(); // Is on, disable it }//end if(usb_bus_sense...) /* * After enabling the USB module, it takes some time for the voltage * on the D+ or D- line to rise high enough to get out of the SE0 condition. * The USB Reset interrupt should not be unmasked until the SE0 condition is * cleared. This helps preventing the firmware from misinterpreting this * unique event as a USB bus reset from the USB host. */ if(usb_device_state == ATTACHED_STATE) { if(!UCONbits.SE0) { UIR = 0; // Clear all USB interrupts UIE = 0; // Mask all USB interrupts UIEbits.URSTIE = 1; // Unmask RESET interrupt UIEbits.IDLEIE = 1; // Unmask IDLE interrupt usb_device_state = POWERED_STATE; }//end if // else wait until SE0 is cleared }//end if(usb_device_state == ATTACHED_STATE) }//end USBCheckBusStatus
/****************************************************************************** * Function: void USBSoftDetach(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: The device will have to be re-enumerated to function again. * * Overview: USBSoftDetach electrically disconnects the device from * the bus. This is done by stop supplying Vusb voltage to * pull-up resistor. The pull-down resistors on the host * side will pull both differential signal lines low and * the host registers the event as a disconnect. * * Since the USB cable is not physically disconnected, the * power supply through the cable can still be sensed by * the device. The next time USBCheckBusStatus() function * is called, it will reconnect the device back to the bus. * * Note: None *****************************************************************************/ void USBSoftDetach(void) { USBModuleDisable(); }//end USBSoftDetach