mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

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?

UserRevisionLine numberNew 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. ***/