📄 usb9.c
字号:
/*********************************************************************
* FileName: usb9.c
********************************************************************/
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
#include "io_cfg.h"
#pragma udata
void USBStdGetDscHandler(void);
void USBStdSetCfgHandler(void);
void USBStdGetStatusHandler(void);
void USBStdFeatureReqHandler(void);
#pragma code
/******************************************************************************
* Function: void USBCheckStdRequest(void)
* PreCondition: None
* Input: None
* Output: 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;
}
}
/******************************************************************************
* Function: void USBStdGetDscHandler(void)
* PreCondition: None
* Input: None
* Output: 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;
}
usb_stat.ctrl_trf_mem = _ROM; // Set memory type
}
}
/******************************************************************************
* Function: void USBStdSetCfgHandler(void)
* PreCondition: None
* Input: None
* Output: 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;
CDCInitEP();
}
}
/******************************************************************************
* Function: void USBStdGetStatusHandler(void)
* PreCondition: None
* Input: None
* Output: None
*****************************************************************************/
void USBStdGetStatusHandler(void)
{
CtrlTrfData._byte0 = 0; // Initialize content
CtrlTrfData._byte1 = 0;
switch(SetupPkt.Recipient)
{
case RCPT_DEV:
ctrl_trf_session_owner = MUID_USB9;
if(self_power == 1) // self_power defined in io_cfg.h
CtrlTrfData._byte0|=0b00000001; // 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;
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;
}
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
}
}
/******************************************************************************
* Function: void USBStdFeatureReqHandler(void)
* PreCondition: None
* Input: None
* Output: 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;
}
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|_DAT1;
else
*pDst.bRam = _USIE|_DAT0|_DTSEN;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -