text: /******************** (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  ******************************/
  
  