187 lines
5.9 KiB
C
187 lines
5.9 KiB
C
/************************************************************************************//**
|
|
* \file Demo/ARMCM3_STM32F1_Olimex_STM32H103_GCC/Boot/usb_istr.c
|
|
* \brief Bootloader USB device interrupt/event handler source file.
|
|
* \ingroup Boot_ARMCM3_STM32F1_Olimex_STM32H103_GCC
|
|
* \internal
|
|
*----------------------------------------------------------------------------------------
|
|
* C O P Y R I G H T
|
|
*----------------------------------------------------------------------------------------
|
|
* Copyright (c) 2012 by Feaser http://www.feaser.com All rights reserved
|
|
*
|
|
*----------------------------------------------------------------------------------------
|
|
* L I C E N S E
|
|
*----------------------------------------------------------------------------------------
|
|
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You have received a copy of the GNU General Public License along with OpenBLT. It
|
|
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
|
|
*
|
|
* \endinternal
|
|
****************************************************************************************/
|
|
|
|
|
|
/****************************************************************************************
|
|
* Include files
|
|
****************************************************************************************/
|
|
#include "usb_lib.h"
|
|
#include "usb_prop.h"
|
|
#include "usb_pwr.h"
|
|
#include "usb_istr.h"
|
|
|
|
|
|
/****************************************************************************************
|
|
* Global data declarations
|
|
****************************************************************************************/
|
|
/** \brief ISTR register last read value. */
|
|
volatile uint16_t wIstr;
|
|
/** \brief SOFs received between 2 consecutive packets. */
|
|
volatile uint8_t bIntPackSOF = 0;
|
|
/** \brief Function pointers to non-control IN endpoints service routines. */
|
|
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,
|
|
};
|
|
|
|
/** \brief Function pointers to non-control OUT endpoints service routines. */
|
|
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,
|
|
};
|
|
|
|
|
|
/************************************************************************************//**
|
|
** \brief USB interrupt service routine to process USB related event. Note that
|
|
** this function can also be called by the software program to operate
|
|
** the USB functionality in a polling way.
|
|
** \return none.
|
|
**
|
|
****************************************************************************************/
|
|
void USB_Istr(void)
|
|
{
|
|
wIstr = _GetISTR();
|
|
|
|
#if (IMR_MSK & ISTR_SOF)
|
|
if (wIstr & ISTR_SOF & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_SOF);
|
|
bIntPackSOF++;
|
|
|
|
#ifdef SOF_CALLBACK
|
|
SOF_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
|
|
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
|
#if (IMR_MSK & ISTR_RESET)
|
|
if (wIstr & ISTR_RESET & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_RESET);
|
|
Device_Property.Reset();
|
|
#ifdef RESET_CALLBACK
|
|
RESET_Callback();
|
|
#endif
|
|
}
|
|
#endif
|
|
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
|
#if (IMR_MSK & ISTR_DOVR)
|
|
if (wIstr & ISTR_DOVR & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_DOVR);
|
|
#ifdef DOVR_CALLBACK
|
|
DOVR_Callback();
|
|
#endif
|
|
}
|
|
#endif
|
|
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
|
#if (IMR_MSK & ISTR_ERR)
|
|
if (wIstr & ISTR_ERR & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_ERR);
|
|
#ifdef ERR_CALLBACK
|
|
ERR_Callback();
|
|
#endif
|
|
}
|
|
#endif
|
|
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
|
#if (IMR_MSK & ISTR_WKUP)
|
|
if (wIstr & ISTR_WKUP & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_WKUP);
|
|
Resume(RESUME_EXTERNAL);
|
|
#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
|
|
{
|
|
/* if not possible then resume after xx ms */
|
|
Resume(RESUME_LATER);
|
|
}
|
|
/* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
|
|
_SetISTR((uint16_t)CLR_SUSP);
|
|
#ifdef SUSP_CALLBACK
|
|
SUSP_Callback();
|
|
#endif
|
|
}
|
|
#endif
|
|
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
|
#if (IMR_MSK & ISTR_ESOF)
|
|
if (wIstr & ISTR_ESOF & wInterrupt_Mask)
|
|
{
|
|
_SetISTR((uint16_t)CLR_ESOF);
|
|
/* resume handling timing is made with ESOFs */
|
|
Resume(RESUME_ESOF); /* request without change of the machine state */
|
|
|
|
#ifdef ESOF_CALLBACK
|
|
ESOF_Callback();
|
|
#endif
|
|
}
|
|
#endif
|
|
} /*** end of USB_Istr ***/
|
|
|
|
|
|
/*********************************** end of usb_istr.c *********************************/
|
|
|