📄 usbdrv.c
字号:
/*********************************************************************
* FileName: usbdrv.c
********************************************************************/
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h" // Required for USBCheckBusStatus()
#pragma udata
byte bTRNIFCount; // Bug fix - Work around.
/** P R I V A T E P R O T O T Y P E S ***************************************/
void USBModuleEnable(void);
void USBModuleDisable(void);
void USBSuspend(void);
void USBWakeFromSuspend(void);
void USBProtocolResetHandler(void);
void USB_SOF_Handler(void);
void USBStallHandler(void);
void USBErrorHandler(void);
/** D E C L A R A T I O N S **************************************************/
#pragma code
/******************************************************************************
* 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.
*****************************************************************************/
void USBCheckBusStatus(void)
{
/**************************************************************************
* Bus Attachment & Detachment Detection
*************************************************************************/
#define USB_BUS_ATTACHED 1
#define USB_BUS_DETACHED 0
if(UCONbits.USBEN == 0) // Is the module off?
USBModuleEnable(); // When Vbus is high, it is okay
// to turn on the USB module.
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 USBModuleEnable(void)
* PreCondition: None
* Input: None
* Output: None
* Side Effects: None
* Overview: This routine enables the USB module.
* An end designer should never have to call this routine
* manually. This routine should only be called from
* USBCheckBusStatus().
* Note: See USBCheckBusStatus() for more information.
*****************************************************************************/
void USBModuleEnable(void)
{
UCON = 0;
UIE = 0; // Mask all USB interrupts
UCONbits.USBEN = 1; // Enable module & attach to bus
usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h
}//end USBModuleEnable
/******************************************************************************
* Function: void USBModuleDisable(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine disables the USB module.
* An end designer should never have to call this routine
* manually. This routine should only be called from
* USBCheckBusStatus().
*
* Note: See USBCheckBusStatus() for more information.
*****************************************************************************/
void USBModuleDisable(void)
{
UCON = 0; // Disable module & detach from bus
UIE = 0; // Mask all USB interrupts
usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h
}//end USBModuleDisable
/******************************************************************************
* 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
/******************************************************************************
* Function: void USBDriverService(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine is the heart of this firmware. It manages
* all USB interrupts.
*
* Note: Device state transitions through the following stages:
* DETACHED -> ATTACHED -> POWERED -> DEFAULT ->
* ADDRESS_PENDING -> ADDRESSED -> CONFIGURED -> READY
*****************************************************************************/
void USBDriverService(void)
{
if(usb_device_state == DETACHED_STATE) return;
if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend();
if(UCONbits.SUSPND==1) return;
if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler();
if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend();
if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler();
if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler();
if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler();
if(usb_device_state < DEFAULT_STATE) return;
/********************************************************************
Bug Fix: August 14, 2007
********************************************************************/
for(bTRNIFCount = 0; bTRNIFCount < 4; bTRNIFCount++)
{
if(UIRbits.TRNIF && UIEbits.TRNIE)
{
if(USBCtrlEPService() == 0) // If not an EP0 transaction, then clear TRNIF.
{
UIRbits.TRNIF = 0;
}
}
else
break;
}
}
/******************************************************************************
* Function: void USBSuspend(void)
* PreCondition: None
* Input: None
* Output: None
* Side Effects: None
* Overview:
*****************************************************************************/
void USBSuspend(void)
{
UIEbits.ACTVIE = 1; // Enable bus activity interrupt
UIRbits.IDLEIF = 0;
UCONbits.SUSPND = 1; // Put USB module in power conserve
// mode, SIE clock inactive
PIR2bits.USBIF = 0;
PIE2bits.USBIE = 1; // Set USB wakeup source
Sleep(); // Goto sleep
PIE2bits.USBIE = 0;
}
/******************************************************************************
* Function: void USBWakeFromSuspend(void)
* PreCondition: None
* Input: None
* Output: None
* Side Effects: None
* Overview:
*****************************************************************************/
void USBWakeFromSuspend(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -