/********************************************************************* * * Microchip USB C18 Firmware Version 1.0 * ********************************************************************* * FileName: usb9.c * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 2.30.01+ * Company: Microchip Technology, Inc. * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rawin Rojvanit 11/19/04 Original. * Dario Greggio 28/02/05 Aggiunto ClrWdt() qua e lÿà. ********************************************************************/ #if defined(__18F4550) || defined(__18F2550) || defined(__18F2455) /** I N C L U D E S **********************************************************/ #include #include #include "system\usb\usb.h" #include "io_cfg.h" // Required for self_power status /** V A R I A B L E S ********************************************************/ #pragma udata /** P R I V A T E P R O T O T Y P E S ***************************************/ void USBStdGetDscHandler(void); void USBStdSetCfgHandler(void); void USBStdGetStatusHandler(void); void USBStdFeatureReqHandler(void); /** D E C L A R A T I O N S **************************************************/ #pragma code /****************************************************************************** * Function: void USBCheckStdRequest(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine checks the setup data packet to see if it * knows how to handle it * * Note: None *****************************************************************************/ void USBCheckStdRequest(void) { if(SetupPkt.RequestType != STANDARD) return; switch(SetupPkt.bRequest) { case SET_ADR: ctrl_trf_session_owner = MUID_USB9; usb_device_state = ADR_PENDING_STATE; // Update state only /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ break; case GET_DSC: USBStdGetDscHandler(); break; case SET_CFG: USBStdSetCfgHandler(); break; case GET_CFG: ctrl_trf_session_owner = MUID_USB9; pSrc.bRam = (byte*)&usb_active_cfg; // Set Source usb_stat.ctrl_trf_mem = _RAM; // Set memory type LSB(wCount) = 1; // Set data count break; case GET_STATUS: USBStdGetStatusHandler(); break; case CLR_FEATURE: case SET_FEATURE: USBStdFeatureReqHandler(); break; case GET_INTF: ctrl_trf_session_owner = MUID_USB9; pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source usb_stat.ctrl_trf_mem = _RAM; // Set memory type LSB(wCount) = 1; // Set data count break; case SET_INTF: ctrl_trf_session_owner = MUID_USB9; usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; break; case SET_DSC: case SYNCH_FRAME: default: break; } //end switch } //end USBCheckStdRequest /****************************************************************************** * Function: void USBStdGetDscHandler(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine handles the standard GET_DESCRIPTOR request. * It utilizes tables dynamically looks up descriptor size. * This routine should never have to be modified if the tables * in usbdsc.c are declared correctly. * * Note: None *****************************************************************************/ void USBStdGetDscHandler(void) { if(SetupPkt.bmRequestType == 0x80) { switch(SetupPkt.bDscType) { case DSC_DEV: ctrl_trf_session_owner = MUID_USB9; pSrc.bRom = (rom byte*)&device_dsc; wCount._word = sizeof(device_dsc); // Set data count break; case DSC_CFG: ctrl_trf_session_owner = MUID_USB9; pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); wCount._word = *(pSrc.wRom+1); // Set data count break; case DSC_STR: ctrl_trf_session_owner = MUID_USB9; pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); wCount._word = *pSrc.bRom; // Set data count break; } //end switch usb_stat.ctrl_trf_mem = _ROM; // Set memory type } //end if } //end USBStdGetDscHandler /****************************************************************************** * 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 */ #if defined(USB_USE_CDC) // See autofiles\usbcfg.h CDCInitEP(); #endif #if defined(USB_USE_HID) // See autofiles\usbcfg.h HIDInitEP(); #endif /* End modifiable section */ } //end if(SetupPkt.bcfgValue == 0) } //end USBStdSetCfgHandler /****************************************************************************** * Function: void USBStdGetStatusHandler(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine handles the standard GET_STATUS request * * Note: None *****************************************************************************/ void USBStdGetStatusHandler(void) { CtrlTrfData._byte0 = 0; // Initialize content CtrlTrfData._byte1 = 0; switch(SetupPkt.Recipient) { case RCPT_DEV: ctrl_trf_session_owner = MUID_USB9; /* * _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered * bit1: RemoteWakeup [0] Disabled [1] Enabled */ if(self_power == 1) // self_power defined in io_cfg.h CtrlTrfData._byte0 |= 0b000000001; // Set bit0 if(usb_stat.RemoteWakeup == 1) // usb_stat defined in usbmmap.c CtrlTrfData._byte0 |= 0b00000010; // Set bit1 break; case RCPT_INTF: ctrl_trf_session_owner = MUID_USB9; // No data to update break; case RCPT_EP: ctrl_trf_session_owner = MUID_USB9; /* * _byte0: bit0: Halt Status [0] Not Halted [1] Halted */ pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); if(*pDst.bRam & _BSTALL) // Use _BSTALL as a bit mask CtrlTrfData._byte0=0x01;// Set bit0 break; } //end switch if(ctrl_trf_session_owner == MUID_USB9) { pSrc.bRam = (byte*)&CtrlTrfData; // Set Source usb_stat.ctrl_trf_mem = _RAM; // Set memory type LSB(wCount) = 2; // Set data count } //end if(...) } //end USBStdGetStatusHandler /****************************************************************************** * Function: void USBStdFeatureReqHandler(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This routine handles the standard SET & CLEAR FEATURES * requests * * Note: None *****************************************************************************/ void USBStdFeatureReqHandler(void) { if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP) && (SetupPkt.Recipient == RCPT_DEV)) { ctrl_trf_session_owner = MUID_USB9; if(SetupPkt.bRequest == SET_FEATURE) usb_stat.RemoteWakeup = 1; else usb_stat.RemoteWakeup = 0; } //end if if((SetupPkt.bFeature == ENDPOINT_HALT) && (SetupPkt.Recipient == RCPT_EP) && (SetupPkt.EPNum != 0)) { ctrl_trf_session_owner = MUID_USB9; /* Must do address calculation here */ pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); if(SetupPkt.bRequest == SET_FEATURE) *pDst.bRam = _USIE|_BSTALL; else { if(SetupPkt.EPDir == 1) // IN *pDst.bRam = _UCPU; else *pDst.bRam = _USIE|_DAT0|_DTSEN; } //end if } //end if } //end USBStdFeatureReqHandler #endif /** EOF usb9.c ***************************************************************/ static char dummy;