Diego Ostuni / ST25R3911
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers st25r3911_interrupt.cpp Source File

st25r3911_interrupt.cpp

Go to the documentation of this file.
00001 
00002 /******************************************************************************
00003   * @attention
00004   *
00005   * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
00006   *
00007   * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
00008   * You may not use this file except in compliance with the License.
00009   * You may obtain a copy of the License at:
00010   *
00011   *        http://www.st.com/myliberty
00012   *
00013   * Unless required by applicable law or agreed to in writing, software 
00014   * distributed under the License is distributed on an "AS IS" BASIS, 
00015   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
00016   * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
00017   * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
00018   * See the License for the specific language governing permissions and
00019   * limitations under the License.
00020   *
00021 ******************************************************************************/
00022 
00023 
00024 /*
00025  *      PROJECT:   ST25R3911 firmware
00026  *      $Revision: $
00027  *      LANGUAGE:  ISO C99
00028  */
00029 
00030 /*! \file
00031  *
00032  *  \author Ulrich Herrmann
00033  *
00034  *  \brief ST25R3911 Interrupt handling
00035  *
00036  */
00037 
00038 /*
00039 ******************************************************************************
00040 * INCLUDES
00041 ******************************************************************************
00042 */
00043 #include "st25r3911_interrupt.h"
00044 #include "st25r3911_com.h"
00045 #include "ST25R3911.h"
00046 #include "st_errno.h"
00047 #include "utils.h"
00048 #include "rfal_rf.h"
00049 
00050 
00051 /*
00052 ******************************************************************************
00053 * GLOBAL DEFINES
00054 ******************************************************************************
00055 */
00056 
00057 /*! Length of the interrupt registers       */
00058 #define ST25R3911_INT_REGS_LEN          ( (ST25R3911_REG_IRQ_ERROR_WUP - ST25R3911_REG_IRQ_MAIN) + 1 )
00059 
00060 /*
00061  ******************************************************************************
00062  * LOCAL DATA TYPES
00063  ******************************************************************************
00064  */
00065 
00066 /*! Holds current and previous interrupt callback pointer as well as current Interrupt status and mask */
00067 typedef struct s_st25r3911Interrupt
00068 {
00069     void      (*prevCallback)(); /*!< call back function for 3911 interrupt               */
00070     void      (*callback)();     /*!< call back function for 3911 interrupt               */
00071     uint32_t  status;            /*!< latest interrupt status                             */
00072     uint32_t  mask;              /*!< Interrupt mask. Negative mask = ST25R3911 mask regs */
00073 }t_st25r3911Interrupt ;
00074 
00075 /*
00076 ******************************************************************************
00077 * GLOBAL VARIABLES
00078 ******************************************************************************
00079 */
00080 
00081 volatile t_st25r3911Interrupt  st25r3911interrupt ; /*!< Instance of ST25R3911 interrupt*/
00082 
00083 extern volatile bool wakeupFlag;
00084 /*
00085 ******************************************************************************
00086 * GLOBAL FUNCTIONS
00087 ******************************************************************************
00088 */
00089 void st25r3911InitInterrupts( DigitalOut* fieldLED_06 )
00090 {
00091 
00092     
00093     st25r3911interrupt .callback     = NULL;
00094     st25r3911interrupt .prevCallback = NULL;
00095     st25r3911interrupt .status       = 0;
00096     st25r3911interrupt .mask         = 0;
00097     
00098    fieldLED_06 -> write(0);
00099 
00100 }
00101 
00102 void st25r3911Isr( SPI * mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00103 {
00104     st25r3911CheckForReceivedInterrupts(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00105 
00106     if (NULL != st25r3911interrupt .callback)
00107         st25r3911interrupt .callback;
00108 }
00109 
00110 void st25r3911CheckForReceivedInterrupts( SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00111 {
00112     uint8_t  iregs[ST25R3911_INT_REGS_LEN];
00113     uint32_t irqStatus;
00114 
00115     ST_MEMSET( iregs, (uint8_t)ST25R3911_IRQ_MASK_ALL, ST25R3911_INT_REGS_LEN );
00116         
00117 
00118 
00119        mST25 -> readMultipleRegisters(ST25R3911_REG_IRQ_MAIN, iregs, sizeof(iregs), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00120 
00121        if (iregs[0] & ST25R3911_IRQ_MASK_TXE)
00122        {
00123            fieldLED_06 -> write(1);
00124        }
00125 
00126 
00127 
00128        irqStatus  = (uint32_t)iregs[0];
00129        irqStatus |= (uint32_t)iregs[1]<<8;
00130        irqStatus |= (uint32_t)iregs[2]<<16;
00131        /* forward all interrupts, even masked ones to application. */
00132        st25r3911interrupt .status |= irqStatus;
00133 
00134 }
00135 
00136 
00137 void st25r3911ModifyInterrupts(uint32_t clr_mask, uint32_t set_mask,SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00138 {
00139     int i;
00140     uint32_t old_mask;
00141     uint32_t new_mask;
00142 
00143     old_mask = st25r3911interrupt .mask;
00144     new_mask = (~old_mask & set_mask) | (old_mask & clr_mask);
00145     st25r3911interrupt .mask &= ~clr_mask;
00146     st25r3911interrupt .mask |= set_mask;
00147     for (i=0; i<3 ; i++)
00148     { 
00149         if (! ((new_mask >> (8*i)) & 0xff)) continue;
00150         mST25 -> writeRegister(ST25R3911_REG_IRQ_MASK_MAIN + i, (st25r3911interrupt .mask>>(8*i))&0xff, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00151     }
00152     return;
00153 }
00154 
00155 
00156 uint32_t st25r3911WaitForInterruptsTimed(uint32_t mask, uint16_t tmo, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00157 {
00158     uint32_t tmr;
00159     uint32_t status;
00160    
00161     tmr = platformTimerCreate(tmo);
00162     do 
00163     {
00164         st25r3911Isr(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00165         status = st25r3911interrupt .status & mask;
00166     } while ((!status) && !platformTimerIsExpired(tmr));
00167 
00168     status = st25r3911interrupt .status & mask;
00169     
00170     st25r3911interrupt .status &= ~status;
00171 
00172     
00173     return status;
00174 }
00175 
00176 
00177 uint32_t st25r3911GetInterrupt(uint32_t mask, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00178 {
00179     st25r3911Isr(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00180 
00181     mask &= st25r3911interrupt .status;
00182 
00183     if (mask)
00184     {
00185         st25r3911interrupt .status &= ~mask;
00186 
00187     }
00188     return mask;
00189 }
00190 
00191 void st25r3911EnableInterrupts(uint32_t mask,SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00192 {
00193     st25r3911ModifyInterrupts(mask,0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00194 }
00195 
00196 void st25r3911DisableInterrupts(uint32_t mask,SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00197 {
00198     st25r3911ModifyInterrupts(0,mask, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00199 }
00200 
00201 void st25r3911ClearInterrupts( SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00202 {
00203     uint8_t iregs[3];
00204 
00205     mST25 -> readMultipleRegisters(ST25R3911_REG_IRQ_MAIN, iregs, 3, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
00206 
00207     st25r3911interrupt .status = 0;
00208 
00209 
00210     return;
00211 }
00212 
00213 void st25r3911IRQCallbackSet( void (*cb)() )
00214 {
00215     st25r3911interrupt .prevCallback = st25r3911interrupt .callback;
00216     st25r3911interrupt .callback     = cb;
00217 }
00218 
00219 void st25r3911IRQCallbackRestore( void )
00220 {
00221     st25r3911interrupt .callback     = st25r3911interrupt .prevCallback;
00222     st25r3911interrupt .prevCallback = NULL;
00223 }
00224 
00225 uint8_t st25r3911ChipHasWoke( void )
00226 {
00227     uint8_t flagWake = 0;
00228 
00229      if( (st25r3911interrupt .status & 0x0001) == 1 )
00230      {
00231         flagWake = 1;
00232      }
00233      return flagWake;
00234 }
00235 
00236