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.
Fork of mbed-dev by
targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_sc.c@149:156823d33999, 2016-10-28 (annotated)
- Committer:
- <>
- Date:
- Fri Oct 28 11:17:30 2016 +0100
- Revision:
- 149:156823d33999
- Parent:
- targets/cmsis/TARGET_NUVOTON/TARGET_NUC472/StdDriver/nuc472_sc.c@144:ef7eb2e8f9f7
This updates the lib to the mbed lib v128
NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| <> | 144:ef7eb2e8f9f7 | 1 | /**************************************************************************//** |
| <> | 144:ef7eb2e8f9f7 | 2 | * @file sc.c |
| <> | 144:ef7eb2e8f9f7 | 3 | * @version V1.00 |
| <> | 144:ef7eb2e8f9f7 | 4 | * $Revision: 6 $ |
| <> | 144:ef7eb2e8f9f7 | 5 | * $Date: 14/08/12 7:25p $ |
| <> | 144:ef7eb2e8f9f7 | 6 | * @brief NUC472/NUC442 Smartcard(SC) driver source file |
| <> | 144:ef7eb2e8f9f7 | 7 | * |
| <> | 144:ef7eb2e8f9f7 | 8 | * @note |
| <> | 144:ef7eb2e8f9f7 | 9 | * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved. |
| <> | 144:ef7eb2e8f9f7 | 10 | *****************************************************************************/ |
| <> | 144:ef7eb2e8f9f7 | 11 | #include "NUC472_442.h" |
| <> | 144:ef7eb2e8f9f7 | 12 | |
| <> | 144:ef7eb2e8f9f7 | 13 | // Below are variables used locally by SC driver and does not want to parse by doxygen unless HIDDEN_SYMBOLS is defined |
| <> | 144:ef7eb2e8f9f7 | 14 | /// @cond HIDDEN_SYMBOLS |
| <> | 144:ef7eb2e8f9f7 | 15 | static uint32_t u32CardStateIgnore[SC_INTERFACE_NUM] = {0, 0, 0, 0, 0, 0}; |
| <> | 144:ef7eb2e8f9f7 | 16 | |
| <> | 144:ef7eb2e8f9f7 | 17 | /// @endcond HIDDEN_SYMBOLS |
| <> | 144:ef7eb2e8f9f7 | 18 | |
| <> | 144:ef7eb2e8f9f7 | 19 | /** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver |
| <> | 144:ef7eb2e8f9f7 | 20 | @{ |
| <> | 144:ef7eb2e8f9f7 | 21 | */ |
| <> | 144:ef7eb2e8f9f7 | 22 | |
| <> | 144:ef7eb2e8f9f7 | 23 | /** @addtogroup NUC472_442_SC_Driver SC Driver |
| <> | 144:ef7eb2e8f9f7 | 24 | @{ |
| <> | 144:ef7eb2e8f9f7 | 25 | */ |
| <> | 144:ef7eb2e8f9f7 | 26 | |
| <> | 144:ef7eb2e8f9f7 | 27 | |
| <> | 144:ef7eb2e8f9f7 | 28 | /** @addtogroup NUC472_442_SC_EXPORTED_FUNCTIONS SC Exported Functions |
| <> | 144:ef7eb2e8f9f7 | 29 | @{ |
| <> | 144:ef7eb2e8f9f7 | 30 | */ |
| <> | 144:ef7eb2e8f9f7 | 31 | |
| <> | 144:ef7eb2e8f9f7 | 32 | /** |
| <> | 144:ef7eb2e8f9f7 | 33 | * @brief This function indicates specified smartcard slot status |
| <> | 144:ef7eb2e8f9f7 | 34 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 35 | * @return Card insert status |
| <> | 144:ef7eb2e8f9f7 | 36 | * @retval TRUE Card insert |
| <> | 144:ef7eb2e8f9f7 | 37 | * @retval FALSE Card remove |
| <> | 144:ef7eb2e8f9f7 | 38 | */ |
| <> | 144:ef7eb2e8f9f7 | 39 | uint32_t SC_IsCardInserted(SC_T *sc) |
| <> | 144:ef7eb2e8f9f7 | 40 | { |
| <> | 144:ef7eb2e8f9f7 | 41 | // put conditions into two variable to remove IAR compilation warning |
| <> | 144:ef7eb2e8f9f7 | 42 | uint32_t cond1 = ((sc->STATUS & SC_STATUS_CDPINSTS_Msk) >> SC_STATUS_CDPINSTS_Pos); |
| <> | 144:ef7eb2e8f9f7 | 43 | uint32_t cond2 = ((sc->CTL & SC_CTL_CDLV_Msk) >> SC_CTL_CDLV_Pos); |
| <> | 144:ef7eb2e8f9f7 | 44 | |
| <> | 144:ef7eb2e8f9f7 | 45 | if(sc == SC0 && u32CardStateIgnore[0] == 1) |
| <> | 144:ef7eb2e8f9f7 | 46 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 47 | else if(sc == SC1 && u32CardStateIgnore[1] == 1) |
| <> | 144:ef7eb2e8f9f7 | 48 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 49 | else if(sc == SC2 && u32CardStateIgnore[2] == 1) |
| <> | 144:ef7eb2e8f9f7 | 50 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 51 | else if(sc == SC3 && u32CardStateIgnore[3] == 1) |
| <> | 144:ef7eb2e8f9f7 | 52 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 53 | else if(sc == SC4 && u32CardStateIgnore[4] == 1) |
| <> | 144:ef7eb2e8f9f7 | 54 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 55 | else if(sc == SC5 && u32CardStateIgnore[5] == 1) |
| <> | 144:ef7eb2e8f9f7 | 56 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 57 | else if(cond1 != cond2) |
| <> | 144:ef7eb2e8f9f7 | 58 | return FALSE; |
| <> | 144:ef7eb2e8f9f7 | 59 | else |
| <> | 144:ef7eb2e8f9f7 | 60 | return TRUE; |
| <> | 144:ef7eb2e8f9f7 | 61 | } |
| <> | 144:ef7eb2e8f9f7 | 62 | |
| <> | 144:ef7eb2e8f9f7 | 63 | /** |
| <> | 144:ef7eb2e8f9f7 | 64 | * @brief This function reset both transmit and receive FIFO of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 65 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 66 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 67 | */ |
| <> | 144:ef7eb2e8f9f7 | 68 | void SC_ClearFIFO(SC_T *sc) |
| <> | 144:ef7eb2e8f9f7 | 69 | { |
| <> | 144:ef7eb2e8f9f7 | 70 | sc->ALTCTL |= (SC_ALTCTL_TXRST_Msk | SC_ALTCTL_RXRST_Msk); |
| <> | 144:ef7eb2e8f9f7 | 71 | } |
| <> | 144:ef7eb2e8f9f7 | 72 | |
| <> | 144:ef7eb2e8f9f7 | 73 | /** |
| <> | 144:ef7eb2e8f9f7 | 74 | * @brief This function disable specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 75 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 76 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 77 | */ |
| <> | 144:ef7eb2e8f9f7 | 78 | void SC_Close(SC_T *sc) |
| <> | 144:ef7eb2e8f9f7 | 79 | { |
| <> | 144:ef7eb2e8f9f7 | 80 | sc->INTEN = 0; |
| <> | 144:ef7eb2e8f9f7 | 81 | while(sc->PINCTL & SC_PINCTL_SYNC_Msk); |
| <> | 144:ef7eb2e8f9f7 | 82 | sc->PINCTL = 0; |
| <> | 144:ef7eb2e8f9f7 | 83 | sc->ALTCTL = 0; |
| <> | 144:ef7eb2e8f9f7 | 84 | while(sc->CTL & SC_CTL_SYNC_Msk); |
| <> | 144:ef7eb2e8f9f7 | 85 | sc->CTL = 0; |
| <> | 144:ef7eb2e8f9f7 | 86 | } |
| <> | 144:ef7eb2e8f9f7 | 87 | |
| <> | 144:ef7eb2e8f9f7 | 88 | /** |
| <> | 144:ef7eb2e8f9f7 | 89 | * @brief This function initialized smartcard module |
| <> | 144:ef7eb2e8f9f7 | 90 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 91 | * @param[in] u32CD Card detect polarity, select the CD pin state which indicates card insert. Could be |
| <> | 144:ef7eb2e8f9f7 | 92 | * -\ref SC_PIN_STATE_HIGH |
| <> | 144:ef7eb2e8f9f7 | 93 | * -\ref SC_PIN_STATE_LOW |
| <> | 144:ef7eb2e8f9f7 | 94 | * -\ref SC_PIN_STATE_IGNORE, no card detect pin, always assumes card present |
| <> | 144:ef7eb2e8f9f7 | 95 | * @param[in] u32PWR Power on polarity, select the PWR pin state which could set smartcard VCC to high level. Could be |
| <> | 144:ef7eb2e8f9f7 | 96 | * -\ref SC_PIN_STATE_HIGH |
| <> | 144:ef7eb2e8f9f7 | 97 | * -\ref SC_PIN_STATE_LOW |
| <> | 144:ef7eb2e8f9f7 | 98 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 99 | */ |
| <> | 144:ef7eb2e8f9f7 | 100 | void SC_Open(SC_T *sc, uint32_t u32CD, uint32_t u32PWR) |
| <> | 144:ef7eb2e8f9f7 | 101 | { |
| <> | 144:ef7eb2e8f9f7 | 102 | uint32_t u32Reg = 0, u32Intf; |
| <> | 144:ef7eb2e8f9f7 | 103 | |
| <> | 144:ef7eb2e8f9f7 | 104 | if(sc == SC0) |
| <> | 144:ef7eb2e8f9f7 | 105 | u32Intf = 0; |
| <> | 144:ef7eb2e8f9f7 | 106 | else if(sc == SC1) |
| <> | 144:ef7eb2e8f9f7 | 107 | u32Intf = 1; |
| <> | 144:ef7eb2e8f9f7 | 108 | else if(sc == SC2) |
| <> | 144:ef7eb2e8f9f7 | 109 | u32Intf = 2; |
| <> | 144:ef7eb2e8f9f7 | 110 | else if(sc == SC3) |
| <> | 144:ef7eb2e8f9f7 | 111 | u32Intf = 3; |
| <> | 144:ef7eb2e8f9f7 | 112 | else if(sc == SC4) |
| <> | 144:ef7eb2e8f9f7 | 113 | u32Intf = 4; |
| <> | 144:ef7eb2e8f9f7 | 114 | else |
| <> | 144:ef7eb2e8f9f7 | 115 | u32Intf = 5; |
| <> | 144:ef7eb2e8f9f7 | 116 | |
| <> | 144:ef7eb2e8f9f7 | 117 | if(u32CD != SC_PIN_STATE_IGNORE) { |
| <> | 144:ef7eb2e8f9f7 | 118 | u32Reg = u32CD ? 0: SC_CTL_CDLV_Msk; |
| <> | 144:ef7eb2e8f9f7 | 119 | u32CardStateIgnore[u32Intf] = 0; |
| <> | 144:ef7eb2e8f9f7 | 120 | } else { |
| <> | 144:ef7eb2e8f9f7 | 121 | u32CardStateIgnore[u32Intf] = 1; |
| <> | 144:ef7eb2e8f9f7 | 122 | } |
| <> | 144:ef7eb2e8f9f7 | 123 | sc->PINCTL = u32PWR ? 0 : SC_PINCTL_PWRINV_Msk; |
| <> | 144:ef7eb2e8f9f7 | 124 | while(sc->CTL & SC_CTL_SYNC_Msk); |
| <> | 144:ef7eb2e8f9f7 | 125 | sc->CTL = SC_CTL_SCEN_Msk | u32Reg; |
| <> | 144:ef7eb2e8f9f7 | 126 | } |
| <> | 144:ef7eb2e8f9f7 | 127 | |
| <> | 144:ef7eb2e8f9f7 | 128 | /** |
| <> | 144:ef7eb2e8f9f7 | 129 | * @brief This function reset specified smartcard module to its default state for activate smartcard |
| <> | 144:ef7eb2e8f9f7 | 130 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 131 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 132 | */ |
| <> | 144:ef7eb2e8f9f7 | 133 | void SC_ResetReader(SC_T *sc) |
| <> | 144:ef7eb2e8f9f7 | 134 | { |
| <> | 144:ef7eb2e8f9f7 | 135 | uint32_t u32Intf; |
| <> | 144:ef7eb2e8f9f7 | 136 | |
| <> | 144:ef7eb2e8f9f7 | 137 | if(sc == SC0) |
| <> | 144:ef7eb2e8f9f7 | 138 | u32Intf = 0; |
| <> | 144:ef7eb2e8f9f7 | 139 | else if(sc == SC1) |
| <> | 144:ef7eb2e8f9f7 | 140 | u32Intf = 1; |
| <> | 144:ef7eb2e8f9f7 | 141 | else if(sc == SC2) |
| <> | 144:ef7eb2e8f9f7 | 142 | u32Intf = 2; |
| <> | 144:ef7eb2e8f9f7 | 143 | else if(sc == SC3) |
| <> | 144:ef7eb2e8f9f7 | 144 | u32Intf = 3; |
| <> | 144:ef7eb2e8f9f7 | 145 | else if(sc == SC4) |
| <> | 144:ef7eb2e8f9f7 | 146 | u32Intf = 4; |
| <> | 144:ef7eb2e8f9f7 | 147 | else |
| <> | 144:ef7eb2e8f9f7 | 148 | u32Intf = 5; |
| <> | 144:ef7eb2e8f9f7 | 149 | |
| <> | 144:ef7eb2e8f9f7 | 150 | // Reset FIFO, enable auto de-activation while card removal |
| <> | 144:ef7eb2e8f9f7 | 151 | sc->ALTCTL |= (SC_ALTCTL_TXRST_Msk | SC_ALTCTL_RXRST_Msk | SC_ALTCTL_ADACEN_Msk); |
| <> | 144:ef7eb2e8f9f7 | 152 | // Set Rx trigger level to 1 character, longest card detect debounce period, disable error retry (EMV ATR does not use error retry) |
| <> | 144:ef7eb2e8f9f7 | 153 | while(sc->CTL & SC_CTL_SYNC_Msk); |
| <> | 144:ef7eb2e8f9f7 | 154 | sc->CTL &= ~(SC_CTL_RXTRGLV_Msk | SC_CTL_CDDBSEL_Msk | SC_CTL_TXRTY_Msk | SC_CTL_RXRTY_Msk); |
| <> | 144:ef7eb2e8f9f7 | 155 | // Enable auto convention, and all three smartcard internal timers |
| <> | 144:ef7eb2e8f9f7 | 156 | sc->CTL |= SC_CTL_AUTOCEN_Msk | SC_CTL_TMRSEL_Msk; |
| <> | 144:ef7eb2e8f9f7 | 157 | // Disable Rx timeout |
| <> | 144:ef7eb2e8f9f7 | 158 | sc->RXTOUT = 0; |
| <> | 144:ef7eb2e8f9f7 | 159 | // 372 clocks per ETU by default |
| <> | 144:ef7eb2e8f9f7 | 160 | sc->ETUCTL= 371; |
| <> | 144:ef7eb2e8f9f7 | 161 | |
| <> | 144:ef7eb2e8f9f7 | 162 | |
| <> | 144:ef7eb2e8f9f7 | 163 | /* Enable necessary interrupt for smartcard operation */ |
| <> | 144:ef7eb2e8f9f7 | 164 | if(u32CardStateIgnore[u32Intf]) // Do not enable card detect interrupt if card present state ignore |
| <> | 144:ef7eb2e8f9f7 | 165 | sc->INTEN = (SC_INTEN_RDAIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 166 | SC_INTEN_TERRIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 167 | SC_INTEN_TMR0IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 168 | SC_INTEN_TMR1IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 169 | SC_INTEN_TMR2IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 170 | SC_INTEN_BGTIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 171 | SC_INTEN_ACERRIEN_Msk); |
| <> | 144:ef7eb2e8f9f7 | 172 | else |
| <> | 144:ef7eb2e8f9f7 | 173 | sc->INTEN = (SC_INTEN_RDAIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 174 | SC_INTEN_TERRIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 175 | SC_INTEN_TMR0IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 176 | SC_INTEN_TMR1IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 177 | SC_INTEN_TMR2IEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 178 | SC_INTEN_BGTIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 179 | SC_INTEN_CDIEN_Msk | |
| <> | 144:ef7eb2e8f9f7 | 180 | SC_INTEN_ACERRIEN_Msk); |
| <> | 144:ef7eb2e8f9f7 | 181 | |
| <> | 144:ef7eb2e8f9f7 | 182 | return; |
| <> | 144:ef7eb2e8f9f7 | 183 | } |
| <> | 144:ef7eb2e8f9f7 | 184 | |
| <> | 144:ef7eb2e8f9f7 | 185 | /** |
| <> | 144:ef7eb2e8f9f7 | 186 | * @brief This function block guard time (BGT) of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 187 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 188 | * @param[in] u32BGT Block guard time using ETU as unit, valid range are between 1 ~ 32 |
| <> | 144:ef7eb2e8f9f7 | 189 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 190 | */ |
| <> | 144:ef7eb2e8f9f7 | 191 | void SC_SetBlockGuardTime(SC_T *sc, uint32_t u32BGT) |
| <> | 144:ef7eb2e8f9f7 | 192 | { |
| <> | 144:ef7eb2e8f9f7 | 193 | sc->CTL = (sc->CTL & ~SC_CTL_BGT_Msk) | ((u32BGT - 1) << SC_CTL_BGT_Pos); |
| <> | 144:ef7eb2e8f9f7 | 194 | } |
| <> | 144:ef7eb2e8f9f7 | 195 | |
| <> | 144:ef7eb2e8f9f7 | 196 | /** |
| <> | 144:ef7eb2e8f9f7 | 197 | * @brief This function character guard time (CGT) of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 198 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 199 | * @param[in] u32CGT Character guard time using ETU as unit, valid range are between 11 ~ 267 |
| <> | 144:ef7eb2e8f9f7 | 200 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 201 | */ |
| <> | 144:ef7eb2e8f9f7 | 202 | void SC_SetCharGuardTime(SC_T *sc, uint32_t u32CGT) |
| <> | 144:ef7eb2e8f9f7 | 203 | { |
| <> | 144:ef7eb2e8f9f7 | 204 | u32CGT -= sc->CTL & SC_CTL_NSB_Msk ? 11: 12; |
| <> | 144:ef7eb2e8f9f7 | 205 | sc->EGT = u32CGT; |
| <> | 144:ef7eb2e8f9f7 | 206 | } |
| <> | 144:ef7eb2e8f9f7 | 207 | |
| <> | 144:ef7eb2e8f9f7 | 208 | /** |
| <> | 144:ef7eb2e8f9f7 | 209 | * @brief This function stop all smartcard timer of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 210 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 211 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 212 | * @note This function stop the timers within smartcard module, \b not timer module |
| <> | 144:ef7eb2e8f9f7 | 213 | */ |
| <> | 144:ef7eb2e8f9f7 | 214 | void SC_StopAllTimer(SC_T *sc) |
| <> | 144:ef7eb2e8f9f7 | 215 | { |
| <> | 144:ef7eb2e8f9f7 | 216 | sc->ALTCTL &= ~(SC_ALTCTL_CNTEN0_Msk | SC_ALTCTL_CNTEN1_Msk | SC_ALTCTL_CNTEN2_Msk); |
| <> | 144:ef7eb2e8f9f7 | 217 | } |
| <> | 144:ef7eb2e8f9f7 | 218 | |
| <> | 144:ef7eb2e8f9f7 | 219 | /** |
| <> | 144:ef7eb2e8f9f7 | 220 | * @brief This function configure and start a smartcard timer of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 221 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 222 | * @param[in] u32TimerNum Timer(s) to start. Valid values are 0, 1, 2. |
| <> | 144:ef7eb2e8f9f7 | 223 | * @param[in] u32Mode Timer operating mode, valid values are: |
| <> | 144:ef7eb2e8f9f7 | 224 | * - \ref SC_TMR_MODE_0 |
| <> | 144:ef7eb2e8f9f7 | 225 | * - \ref SC_TMR_MODE_1 |
| <> | 144:ef7eb2e8f9f7 | 226 | * - \ref SC_TMR_MODE_2 |
| <> | 144:ef7eb2e8f9f7 | 227 | * - \ref SC_TMR_MODE_3 |
| <> | 144:ef7eb2e8f9f7 | 228 | * - \ref SC_TMR_MODE_4 |
| <> | 144:ef7eb2e8f9f7 | 229 | * - \ref SC_TMR_MODE_5 |
| <> | 144:ef7eb2e8f9f7 | 230 | * - \ref SC_TMR_MODE_6 |
| <> | 144:ef7eb2e8f9f7 | 231 | * - \ref SC_TMR_MODE_7 |
| <> | 144:ef7eb2e8f9f7 | 232 | * - \ref SC_TMR_MODE_8 |
| <> | 144:ef7eb2e8f9f7 | 233 | * - \ref SC_TMR_MODE_F |
| <> | 144:ef7eb2e8f9f7 | 234 | * @param[in] u32ETUCount Timer timeout duration, ETU based. For timer 0, valid range are between 1~0x1000000ETUs. |
| <> | 144:ef7eb2e8f9f7 | 235 | * For timer 1 and timer 2, valid range are between 1 ~ 0x100 ETUs |
| <> | 144:ef7eb2e8f9f7 | 236 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 237 | * @note This function start the timer within smartcard module, \b not timer module |
| <> | 144:ef7eb2e8f9f7 | 238 | * @note Depend on the timer operating mode, timer may not start counting immediately |
| <> | 144:ef7eb2e8f9f7 | 239 | */ |
| <> | 144:ef7eb2e8f9f7 | 240 | void SC_StartTimer(SC_T *sc, uint32_t u32TimerNum, uint32_t u32Mode, uint32_t u32ETUCount) |
| <> | 144:ef7eb2e8f9f7 | 241 | { |
| <> | 144:ef7eb2e8f9f7 | 242 | uint32_t reg = u32Mode | (SC_TMRCTL0_CNT_Msk & (u32ETUCount - 1)); |
| <> | 144:ef7eb2e8f9f7 | 243 | |
| <> | 144:ef7eb2e8f9f7 | 244 | if(u32TimerNum == 0) { |
| <> | 144:ef7eb2e8f9f7 | 245 | sc->TMRCTL0 = reg; |
| <> | 144:ef7eb2e8f9f7 | 246 | sc->ALTCTL |= SC_ALTCTL_CNTEN0_Msk; |
| <> | 144:ef7eb2e8f9f7 | 247 | } else if(u32TimerNum == 1) { |
| <> | 144:ef7eb2e8f9f7 | 248 | sc->TMRCTL1 = reg; |
| <> | 144:ef7eb2e8f9f7 | 249 | sc->ALTCTL |= SC_ALTCTL_CNTEN1_Msk; |
| <> | 144:ef7eb2e8f9f7 | 250 | } else { // timer 2 |
| <> | 144:ef7eb2e8f9f7 | 251 | sc->TMRCTL2 = reg; |
| <> | 144:ef7eb2e8f9f7 | 252 | sc->ALTCTL |= SC_ALTCTL_CNTEN2_Msk; |
| <> | 144:ef7eb2e8f9f7 | 253 | } |
| <> | 144:ef7eb2e8f9f7 | 254 | } |
| <> | 144:ef7eb2e8f9f7 | 255 | |
| <> | 144:ef7eb2e8f9f7 | 256 | /** |
| <> | 144:ef7eb2e8f9f7 | 257 | * @brief This function stop a smartcard timer of specified smartcard module |
| <> | 144:ef7eb2e8f9f7 | 258 | * @param[in] sc Base address of smartcard module |
| <> | 144:ef7eb2e8f9f7 | 259 | * @param[in] u32TimerNum Timer(s) to stop. Valid values are 0, 1, 2. |
| <> | 144:ef7eb2e8f9f7 | 260 | * @return None |
| <> | 144:ef7eb2e8f9f7 | 261 | * @note This function stop the timer within smartcard module, \b not timer module |
| <> | 144:ef7eb2e8f9f7 | 262 | */ |
| <> | 144:ef7eb2e8f9f7 | 263 | void SC_StopTimer(SC_T *sc, uint32_t u32TimerNum) |
| <> | 144:ef7eb2e8f9f7 | 264 | { |
| <> | 144:ef7eb2e8f9f7 | 265 | if(u32TimerNum == 0) |
| <> | 144:ef7eb2e8f9f7 | 266 | sc->ALTCTL &= ~SC_ALTCTL_CNTEN0_Msk; |
| <> | 144:ef7eb2e8f9f7 | 267 | else if(u32TimerNum == 1) |
| <> | 144:ef7eb2e8f9f7 | 268 | sc->ALTCTL &= ~SC_ALTCTL_CNTEN1_Msk; |
| <> | 144:ef7eb2e8f9f7 | 269 | else // timer 2 |
| <> | 144:ef7eb2e8f9f7 | 270 | sc->ALTCTL &= ~SC_ALTCTL_CNTEN2_Msk; |
| <> | 144:ef7eb2e8f9f7 | 271 | } |
| <> | 144:ef7eb2e8f9f7 | 272 | |
| <> | 144:ef7eb2e8f9f7 | 273 | |
| <> | 144:ef7eb2e8f9f7 | 274 | |
| <> | 144:ef7eb2e8f9f7 | 275 | /*@}*/ /* end of group NUC472_442_SC_EXPORTED_FUNCTIONS */ |
| <> | 144:ef7eb2e8f9f7 | 276 | |
| <> | 144:ef7eb2e8f9f7 | 277 | /*@}*/ /* end of group NUC472_442_SC_Driver */ |
| <> | 144:ef7eb2e8f9f7 | 278 | |
| <> | 144:ef7eb2e8f9f7 | 279 | /*@}*/ /* end of group NUC472_442_Device_Driver */ |
| <> | 144:ef7eb2e8f9f7 | 280 | |
| <> | 144:ef7eb2e8f9f7 | 281 | /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/ |
