?? usb_int.c
字號:
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
PROJECT : ARM7 USB Core
MODULE : USB_int.c
AUTHOR : MCD Application Team
CREATION DATE : 21/04/2004
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
DESCRIPTION : Endpoint CTR interrupt service routine
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
MODIFICATIONS :
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#include "USB_lib.h"
extern void const (*pEpInt[15])(void);
/*------------------------------------------------------------------------------*/
void CTR_ISR()
{
WORD wEPVal;
/* stay in loop while pending ints */
while(((wIstr = _GetISTR()) & ISTR_CTR)!= 0)
{
_SetISTR((WORD)CLR_CTR); /* clear CTR flag */
/* extract highest priority endpoint number */
EPindex = (BYTE)(wIstr & ISTR_EP_ID);
if(EPindex == 0)
{
/*==================================================================*/
/* Decode and service control endpoint interrupt */
/* calling related service routine */
/* (Setup0_Process, In0_Process, Out0_Process) */
/*==================================================================*/
/* save RX & TX status */
/* and set both to NAK */
SaveRState = _GetEPRxStatus(ENDP0);
SaveTState = _GetEPTxStatus(ENDP0);
_SetEPRxStatus(ENDP0, EP_RX_NAK);
_SetEPTxStatus(ENDP0, EP_TX_NAK);
/*-------------------------------------------------*/
/* DIR bit = origin of the interrupt */
/*-------------------------------------------------*/
if((wIstr & ISTR_DIR) == 0)
{/* DIR = 0 */
/*-------------------------------------------------*/
/* DIR = 0 => IN int */
/* DIR = 0 implies that (EP_CTR_TX = 1) always */
/*-------------------------------------------------*/
/* wEPVal = GetENDPOINT(ENDP0); */
/* if((wEPVal & EP_CTR_TX) != 0) */
/* { */
_ClearEP_CTR_TX(ENDP0);
In0_Process();
/* } */
/* check if SETUP arrived during IN processing */
wEPVal = _GetENDPOINT(ENDP0);
if((wEPVal & (EP_CTR_RX|EP_SETUP)) != 0)
{
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
}
}/* DIR = 0 */
else
{/* DIR = 1 */
/*-------------------------------------------------*/
/* DIR = 1 & CTR_RX => SETUP or OUT int */
/* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
/*-------------------------------------------------*/
wEPVal = _GetENDPOINT(ENDP0);
if((wEPVal & EP_CTR_TX) != 0)
{
_ClearEP_CTR_TX(ENDP0);
In0_Process();
}
if((wEPVal & (EP_CTR_RX|EP_SETUP)) != 0)
{
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
}
else if((wEPVal & EP_CTR_RX) != 0)
{
_ClearEP_CTR_RX(ENDP0);
Out0_Process();
}
}/* DIR = 1 */
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
}/* if(EPindex == 0) */
else
{
/*===============================================================*/
/* Decode and service non control endpoints interrupt */
/*===============================================================*/
/* process related endpoint register */
wEPVal = _GetENDPOINT(EPindex);
if((wEPVal & EP_CTR_RX) != 0)
{
/* clear int flag */
_ClearEP_CTR_RX(EPindex);
} /* if((wEPVal & EP_CTR_RX) */
if((wEPVal & EP_CTR_TX) != 0)
{
/* clear int flag */
_ClearEP_CTR_TX(EPindex);
} /* if((wEPVal & EP_CTR_TX) != 0) */
/* call service function */
(*pEpInt[EPindex-1])();
}/* if(EPindex == 0) else */
}/* while(...) */
} /* CTR_ISR */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -