Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
st25r3911_interrupt.cpp
00001 00002 /****************************************************************************** 00003 * @attention 00004 * 00005 * <h2><center>© 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
Generated on Tue Jul 12 2022 18:07:56 by
1.7.2