139 lines
4.4 KiB
C
139 lines
4.4 KiB
C
/******************** (C) COPYRIGHT 2015 e-Design Co., Ltd. ********************
|
|
File Name : USB_istr.c
|
|
Version : STM32 USB Disk Ver 3.4 Author : MCD Application Team & bure
|
|
*******************************************************************************/
|
|
#include "USB_type.h"
|
|
#include "USB_regs.h"
|
|
#include "USB_pwr.h"
|
|
#include "USB_istr.h"
|
|
#include "USB_init.h"
|
|
#include "USB_int.h"
|
|
#include "USB_bot.h"
|
|
|
|
volatile u16 wIstr; /* ISTR register last read value */
|
|
volatile u8 bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */
|
|
|
|
void (*pEpInt_IN[7])(void) ={
|
|
EP1_IN_Callback,
|
|
EP2_IN_Callback,
|
|
EP3_IN_Callback,
|
|
EP4_IN_Callback,
|
|
EP5_IN_Callback,
|
|
EP6_IN_Callback,
|
|
EP7_IN_Callback,
|
|
};
|
|
void (*pEpInt_OUT[7])(void) ={
|
|
EP1_OUT_Callback,
|
|
EP2_OUT_Callback,
|
|
EP3_OUT_Callback,
|
|
EP4_OUT_Callback,
|
|
EP5_OUT_Callback,
|
|
EP6_OUT_Callback,
|
|
EP7_OUT_Callback,
|
|
};
|
|
/*******************************************************************************
|
|
USB_Istr: ISTR events interrupt service routine
|
|
*******************************************************************************/
|
|
void USB_Istr(void)
|
|
{
|
|
wIstr = _GetISTR();
|
|
#if (IMR_MSK & ISTR_RESET)
|
|
if (wIstr & ISTR_RESET & wInterrupt_Mask){
|
|
// _SetISTR((u16)CLR_RESET);
|
|
Device_Property.Reset();
|
|
_SetISTR((u16)CLR_RESET);
|
|
//#ifdef RESET_CALLBACK
|
|
// RESET_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_DOVR)
|
|
if (wIstr & ISTR_DOVR & wInterrupt_Mask){
|
|
_SetISTR((u16)CLR_DOVR);
|
|
//#ifdef DOVR_CALLBACK
|
|
// DOVR_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_ERR)
|
|
if (wIstr & ISTR_ERR & wInterrupt_Mask){
|
|
_SetISTR((u16)CLR_ERR);
|
|
//#ifdef ERR_CALLBACK
|
|
// ERR_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_WKUP)
|
|
if (wIstr & ISTR_WKUP & wInterrupt_Mask){
|
|
// _SetISTR((u16)CLR_WKUP);
|
|
Resume(RESUME_EXTERNAL);
|
|
_SetISTR((u16)CLR_WKUP);
|
|
//#ifdef WKUP_CALLBACK
|
|
// WKUP_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_SUSP)
|
|
if (wIstr & ISTR_SUSP & wInterrupt_Mask){ // check if SUSPEND is possible
|
|
if (fSuspendEnabled) Suspend();
|
|
else Resume(RESUME_LATER); // if not possible then resume after xx ms
|
|
_SetISTR((u16)CLR_SUSP); // clear of the ISTR bit must be done after setting of CNTR_FSUSP
|
|
//#ifdef SUSP_CALLBACK
|
|
// SUSP_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_SOF)
|
|
if (wIstr & ISTR_SOF & wInterrupt_Mask){
|
|
_SetISTR((u16)CLR_SOF);
|
|
bIntPackSOF++;
|
|
//#ifdef SOF_CALLBACK
|
|
// SOF_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_ESOF)
|
|
if (wIstr & ISTR_ESOF & wInterrupt_Mask){
|
|
// _SetISTR((u16)CLR_ESOF); // resume handling timing is made with ESOFs
|
|
Resume(RESUME_ESOF); // request without change of the machine state
|
|
_SetISTR((u16)CLR_ESOF); // resume handling timing is made with ESOFs
|
|
//#ifdef ESOF_CALLBACK
|
|
// ESOF_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
#if (IMR_MSK & ISTR_CTR)
|
|
if (wIstr & ISTR_CTR & wInterrupt_Mask){
|
|
/* servicing of the endpoint correct transfer interrupt */
|
|
/* clear of the CTR flag into the sub */
|
|
CTR_LP();
|
|
//#ifdef CTR_CALLBACK
|
|
// CTR_Callback();
|
|
//#endif
|
|
}
|
|
#endif
|
|
} /* USB_Istr */
|
|
/*******************************************************************************
|
|
EP1_IN_Callback: EP1 IN Callback Routine
|
|
*******************************************************************************/
|
|
void EP1_IN_Callback(void)
|
|
{
|
|
Mass_Storage_In();
|
|
}
|
|
/*******************************************************************************
|
|
EP2_OUT_Callback: EP2 OUT Callback Routine.
|
|
*******************************************************************************/
|
|
void EP2_OUT_Callback(void)
|
|
{
|
|
Mass_Storage_Out();
|
|
}
|
|
/********************************* END OF FILE ******************************/
|
|
|