📄 freescale
字号:
* Output: None
* Overview: The routine forces endpoint 0 OUT to be ready for a new Setup
* transaction, and forces endpoint0 IN to be owned by MCU.
* Note: None
*****************************************************************************/
void USB_Prepare_Next_Trf(void)
{
Bdtmap.ep0Bo.Cnt = EP0_BUFF_SIZE;
Bdtmap.ep0Bo.Addr = 0x0C; //((byte)(((byte*) &Setup_Pkt)-0x1880) >> 2 ); //
Bdtmap.ep0Bo.Stat._byte = _SIE|_DATA0|_DTS;
Bdtmap.ep0Bi.Stat._byte = _CPU;
CTL_TSUSPEND = 0;
Ctrl_Trf_State = WAIT_SETUP;
return;
}
/******************************************************************************
* Function: void USB_StdReq_Handler(void)
* Input: None
* Output: None
* Overview: This function checks the setup data packet to see if it
* knows how to handle it
* Note: None
*****************************************************************************/
void USB_StdReq_Handler(void)
{
if(Setup_Pkt.CtlReqT.RequestType != STANDARD)
return;
switch(Setup_Pkt.StdCtl.bRequest)
{
case GET_DSC:
USB_StdGetDsc_Handler();
break;
case SET_CFG:
USB_StdSetCfg_Handler();
break;
case SET_ADR:
Usb_Device_State = ADDR_PENDING_STATE;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case GET_CFG:
pSrc = (byte*)&Usb_Active_Cfg;
Transfer_Cnt = 1;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case GET_STATUS:
USB_StdGetStatus_Handler();
break;
case CLR_FEATURE:
case SET_FEATURE:
USB_StdFeatureReq_Handler();
break;
case GET_INTF: /*Notice when the Setup_Pkt.bIntfId > 1*/
if(Setup_Pkt.CtlIntf.bIntfID < MAX_NUM_INTF)
{
pSrc = (byte*)&Usb_Alt_Intf + Setup_Pkt.CtlIntf.bIntfID;
Transfer_Cnt = 1;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
}
/*
else
{
//add code for more than 1 interface, notice the value of MAX_NUM_INTF
}
*/
break;
case SET_INTF:
Usb_Alt_Intf[Setup_Pkt.CtlIntf.bIntfID] = Setup_Pkt.CtlIntf.bAltID;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case SET_DSC:
case SYNCH_FRAME:
default:
break;
}
return;
}
/******************************************************************************
* Function: void USB_ClassReq_Handler(void)
* Input: None
* Output: None
* Overview: The routine will be called when the request in setup packet
* can not be parsed. It will call the routines in Std_Class_Req_Handler,
* The new routine for new class can be added to this array when
* a new standard class is required. The user can also add its owner
* processing for customize protocol.
* Note: None
*****************************************************************************/
void USB_ClassReq_Handler(void)
{
byte i;
for(i=0;i < (sizeof(Class_Req_Handler)/sizeof(pFunc)); i++)
{
if(Ctrl_Trf_Session_Owner != CLASS_NULL) /*if the request has been parsed, return*/
return;
if(Class_Req_Handler[i]) /*if the routine is valid, then call*/
Class_Req_Handler[i]();
}
return;
}
/******************************************************************************
* Function: void USB_StdGetDsc_Handler(void)
* Input: None
* Output: None
* Overview: This function handles the standard GET_DESCRIPTOR request.
*****************************************************************************/
void USB_StdGetDsc_Handler(void)
{
if(Setup_Pkt.StdCtl.bmRequestType == 0x80)
{
switch(Setup_Pkt.ReqWval.bDscType)
{
case DSC_DEV:
Transfer_Cnt = sizeof(Device_Dsc);
pSrc = (byte*)&Device_Dsc;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case DSC_CFG:
Transfer_Cnt = sizeof(USB_CFG);
pSrc = Cfg_Des[Setup_Pkt.ReqWval.bDscIndex];
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case DSC_STR:
Transfer_Cnt = *pSrc;
pSrc = Str_Des[Setup_Pkt.ReqWval.bDscIndex];
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
default:
break;
}
}
return;
}
/******************************************************************************
* Function: void USB_StdSetCfg_Handler(void)
* Input: None
* Output: None
* Overview: This function disables all endpoints except 0 by clearing
* EPCTL registers, then initializes these endpoints
*
* Note: None
*****************************************************************************/
void USB_StdSetCfg_Handler(void)
{
Clear_Mem((byte*)&EPCTL1,6);
Clear_Mem((byte*)&Usb_Alt_Intf,MAX_NUM_INTF);
Usb_Active_Cfg = Setup_Pkt.CtrCfg.bCfgValue;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
if(Setup_Pkt.CtrCfg.bCfgValue == 0)
Usb_Device_State = ADDRESS_STATE;
else
{
Usb_Device_State = CONFIGURED_STATE;
Usr_Ep_Init(); /*it can also be placed to the USB initialization routine*/
}
return;
}
/******************************************************************************
* Function: void USB_StdGetStatus_Handler(void)
* Input: None
* Output: None
* Overview: This function handles the standard GET_STATUS request
* Note: None
*****************************************************************************/
void USB_StdGetStatus_Handler(void)
{
CtrlTrf_Data.EachByte._byte0 = 0;
CtrlTrf_Data.EachByte._byte1 = 0;
switch(Setup_Pkt.CtlReqT.Recipient)
{
case RCPT_DEV:
/* _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered */
/* bit1: RemoteWakeup [0] Disabled [1] Enabled */
if(Usb_Stat.BitCtl.Self_Power)
CtrlTrf_Data.EachByte._byte0|=0b000000001;
if(Usb_Stat.BitCtl.RemoteWakeup == 1)
CtrlTrf_Data.EachByte._byte0|=0b00000010;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case RCPT_INTF:
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
break;
case RCPT_EP:
if((Setup_Pkt.EpND.EPNum == 0b0001 ) && (Setup_Pkt.EpND.EPDir))
{
if(Bdtmap.ep1Bio.Stat.McuCtlBit.BDTSTALL)
CtrlTrf_Data.EachByte._byte0 |= 0x01;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
}
break;
default:
break;
}
if(Ctrl_Trf_Session_Owner == STANDARD_CLASS_ID)
{
Transfer_Cnt = 2;
pSrc = (byte*)&CtrlTrf_Data;
}
return;
}
/******************************************************************************
* Function: void USB_StdFeatureReq_Handler(void)
* Input: None
* Output: None
* Overview: This function dealt with the standard SET & CLEAR FEATURES
* requests
* Note: None
*****************************************************************************/
void USB_StdFeatureReq_Handler(void)
{
if((Setup_Pkt.CtlReqT.bFeature == DEVICE_REMOTE_WAKEUP)&&
(Setup_Pkt.CtlReqT.Recipient == RCPT_DEV))
{
if(Setup_Pkt.StdCtl.bRequest == SET_FEATURE)
Usb_Stat.BitCtl.RemoteWakeup = 1;
else
Usb_Stat.BitCtl.RemoteWakeup = 0;
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
}
if((Setup_Pkt.CtlReqT.bFeature == ENDPOINT_HALT)&&
(Setup_Pkt.CtlReqT.Recipient == RCPT_EP)&&
(Setup_Pkt.EpND.EPNum != 0))
{
if(Setup_Pkt.EpND.EPNum == 0b0001)
{
if(Setup_Pkt.StdCtl.bRequest == SET_FEATURE)
{
if(Setup_Pkt.EpND.EPDir)
{
Bdtmap.ep1Bio.Stat.McuCtlBit.BDTSTALL = 1;
}
}
else
{
if(Setup_Pkt.EpND.EPDir)
{
Bdtmap.ep1Bio.Stat.McuCtlBit.BDTSTALL = 0;
}
}
Ctrl_Trf_Session_Owner = STANDARD_CLASS_ID;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -