PDL for FM0+  Version1.0
Peripheral Driverl Library for FM0+
C:/pdl_v10/library/driver/lvd/lvd.c
Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2013 Spansion LLC. All Rights Reserved. 
00003 *
00004 * This software is owned and published by: 
00005 * Spansion LLC, 915 DeGuigne Dr. Sunnyvale, CA  94088-3453 ("Spansion").
00006 *
00007 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND 
00008 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
00009 *
00010 * This software contains source code for use with Spansion 
00011 * components. This software is licensed by Spansion to be adapted only 
00012 * for use in systems utilizing Spansion components. Spansion shall not be 
00013 * responsible for misuse or illegal use of this software for devices not 
00014 * supported herein.  Spansion is providing this software "AS IS" and will 
00015 * not be responsible for issues arising from incorrect user implementation 
00016 * of the software.  
00017 *
00018 * SPANSION MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
00019 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS), 
00020 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING, 
00021 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED 
00022 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED 
00023 * WARRANTY OF NONINFRINGEMENT.  
00024 * SPANSION SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT, 
00025 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT 
00026 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, 
00027 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR 
00028 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT, 
00029 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA, 
00030 * SAVINGS OR PROFITS, 
00031 * EVEN IF SPANSION HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 
00032 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
00033 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED 
00034 * FROM, THE SOFTWARE.  
00035 *
00036 * This software may be replicated in part or whole for the licensed use, 
00037 * with the restriction that this Disclaimer and Copyright notice must be 
00038 * included with each copy of this software, whether used in part or whole, 
00039 * at all times.  
00040 */
00041 /******************************************************************************/
00052 /******************************************************************************/
00053 /* Include files                                                              */
00054 /******************************************************************************/
00055 #include "lvd.h"
00056 
00057 #if (defined(PDL_PERIPHERAL_LVD_ACTIVE))
00058 
00064 
00065 /******************************************************************************/
00066 /* Local pre-processor symbols/macros ('#define')                             */
00067 /******************************************************************************/
00068 
00069 /******************************************************************************/
00070 /* Local type definitions ('typedef')                                         */
00071 /******************************************************************************/
00072 
00073 /******************************************************************************/
00074 /* Local function prototypes ('static')                                       */
00075 /******************************************************************************/
00076 
00077 /******************************************************************************/
00078 /* Local variable definitions ('static')                                      */
00079 /******************************************************************************/
00080 #if (PDL_INTERRUPT_ENABLE_LVD == PDL_ON)
00081 static func_ptr_t  pfnLvdCallback;    
00082 #endif
00083 /******************************************************************************/
00084 /* Function implementation - global ('extern') and local ('static')           */
00085 /******************************************************************************/
00086 /* LVD enable timeout count */
00087 #define LVD_TIMEOUT     (SystemCoreClock/10)
00088 
00089 /* Unlock code for LVD_RLR */
00090 #define LvdCtlUnlock    (0x1ACCE553)
00091 
00092 #if (PDL_INTERRUPT_ENABLE_LVD == PDL_ON)
00093 
00098 void LvdIrqHandler(void)
00099 {
00100     FM0P_LVD->LVD_CLR = 0x00;  /* Clear LVD interrupt (LVDCL (bit #7)) */
00101 
00102     if (NULL != pfnLvdCallback)
00103     {
00104         pfnLvdCallback();
00105     }
00106 } /* LvdIrqHandler */
00107 
00121 en_result_t Lvd_ConfigInt(func_ptr_t pfnCallback)
00122 {
00123     /* If callback function is set, interrupt is used. */
00124     if (NULL != pfnCallback)
00125     {
00126         pfnLvdCallback = pfnCallback;
00127       
00128         /* Init NVIC */
00129         NVIC_ClearPendingIRQ(LVD_IRQn);
00130         NVIC_EnableIRQ(LVD_IRQn);
00131         NVIC_SetPriority(LVD_IRQn, PDL_IRQ_LEVEL_LVD);
00132 
00133     }
00134     else
00135     {
00136         pfnLvdCallback = NULL;
00137       
00138         /* DeInit NVIC */
00139         NVIC_ClearPendingIRQ(LVD_IRQn);
00140         NVIC_DisableIRQ(LVD_IRQn);
00141         NVIC_SetPriority(LVD_IRQn, PDL_DEFAULT_INTERRUPT_LEVEL);
00142     }
00143     
00144     return Ok;
00145 }
00146 #endif
00147 
00166 en_result_t Lvd_SetIntDetectVoltage(en_lvd_int_volt_t enVolt)
00167 {
00168     FM0P_LVD->LVD_RLR = LvdCtlUnlock;/* unlock LVD_CTL */   
00169     switch (enVolt)
00170     {
00171         case LvdIntVoltage280:  /* Interrupt when voltage is vicinity of 2.80 volts */
00172             FM0P_LVD->LVD_CTL_f.SVHI = 0x03u;
00173             break;
00174         case LvdIntVoltage300:  /* Interrupt when voltage is vicinity of 3.00 volts */
00175             FM0P_LVD->LVD_CTL_f.SVHI = 0x04u;
00176             break;
00177         case LvdIntVoltage320:  /* Interrupt when voltage is vicinity of 3.20 volts */
00178             FM0P_LVD->LVD_CTL_f.SVHI = 0x05u;
00179             break;
00180         case LvdIntVoltage360:  /* Interrupt when voltage is vicinity of 3.60 volts */
00181             FM0P_LVD->LVD_CTL_f.SVHI = 0x06u;
00182             break;
00183         case LvdIntVoltage370:  /* Interrupt when voltage is vicinity of 3.70 volts */
00184             FM0P_LVD->LVD_CTL_f.SVHI = 0x07u;
00185             break;
00186         case LvdIntVoltage400:  /* Interrupt when voltage is vicinity of 4.00 volts */
00187             FM0P_LVD->LVD_CTL_f.SVHI = 0x08u;
00188             break;
00189         case LvdIntVoltage410:  /* Interrupt when voltage is vicinity of 4.10 volts */
00190             FM0P_LVD->LVD_CTL_f.SVHI = 0x09u;
00191             break;
00192         case LvdIntVoltage420:  /* Interrupt when voltage is vicinity of 4.20 volts */
00193             FM0P_LVD->LVD_CTL_f.SVHI = 0x0Au;
00194             break;
00195         default:
00196             FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00197             return  ErrorInvalidParameter;
00198     }
00199     
00200     FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00201     
00202     return Ok;
00203 }
00204 
00226 en_result_t Lvd_SetResetDetectVoltage(en_lvd_reset_volt_t enVolt)
00227 {
00228     FM0P_LVD->LVD_RLR = LvdCtlUnlock;/* unlock LVD_CTL */            
00229     switch (enVolt)
00230     {
00231         case LvdResetVoltage245:  /* Interrupt when voltage is vicinity of 2.45 volts */
00232             FM0P_LVD->LVD_CTL_f.SVHR = 0x00u;
00233             break;
00234         case LvdResetVoltage260:  /* Interrupt when voltage is vicinity of 2.60 volts */
00235             FM0P_LVD->LVD_CTL_f.SVHR = 0x01u;
00236             break;
00237         case LvdResetVoltage270:  /* Interrupt when voltage is vicinity of 2.70 volts */
00238             FM0P_LVD->LVD_CTL_f.SVHR = 0x02u;
00239             break;
00240         case LvdResetVoltage280:  /* Interrupt when voltage is vicinity of 2.80 volts */
00241             FM0P_LVD->LVD_CTL_f.SVHR = 0x03u;
00242             break;
00243         case LvdResetVoltage300:  /* Interrupt when voltage is vicinity of 3.00 volts */
00244             FM0P_LVD->LVD_CTL_f.SVHR = 0x04u;
00245             break;
00246         case LvdResetVoltage320:  /* Interrupt when voltage is vicinity of 3.20 volts */
00247             FM0P_LVD->LVD_CTL_f.SVHR = 0x05u;
00248             break;
00249         case LvdResetVoltage360:  /* Interrupt when voltage is vicinity of 3.60 volts */
00250             FM0P_LVD->LVD_CTL_f.SVHR = 0x06u;
00251             break;
00252         case LvdResetVoltage370:  /* Interrupt when voltage is vicinity of 3.70 volts */
00253             FM0P_LVD->LVD_CTL_f.SVHR = 0x07u;
00254             break;
00255         case LvdResetVoltage400:  /* Interrupt when voltage is vicinity of 4.00 volts */
00256             FM0P_LVD->LVD_CTL_f.SVHR = 0x08u;
00257             break;
00258         case LvdResetVoltage410:  /* Interrupt when voltage is vicinity of 4.10 volts */
00259             FM0P_LVD->LVD_CTL_f.SVHR = 0x09u;
00260             break;
00261         case LvdResetVoltage420:  /* Interrupt when voltage is vicinity of 4.20 volts */
00262             FM0P_LVD->LVD_CTL_f.SVHR = 0x0Au;
00263             break;    
00264         default:
00265             FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00266             return  ErrorInvalidParameter;
00267     }
00268     
00269     FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00270     
00271     return Ok;
00272 }
00273 
00286 en_result_t Lvd_EnableFunc(en_lvd_func_t enFunc)
00287 {
00288     uint32_t u32TimeOut = LVD_TIMEOUT;
00289     
00290     FM0P_LVD->LVD_RLR = LvdCtlUnlock;/* unlock LVD_CTL */     
00291     switch(enFunc)
00292     {
00293         case LvdIntFunc:
00294             FM0P_LVD->LVD_CTL_f.LVDIE = 1;
00295             while(1)
00296             {
00297                 if(FM0P_LVD->LVD_STR2_f.LVDIRDY == 1)
00298                 {
00299                     break;
00300                 }
00301                 
00302                 u32TimeOut--;
00303                 
00304                 if(u32TimeOut == 0)
00305                 {
00306                     return ErrorTimeout;
00307                 }
00308             }
00309 
00310             break;
00311         case LvdResetFunc:
00312             FM0P_LVD->LVD_CTL_f.LVDRE = 1;
00313             while(1)
00314             {
00315                 if(FM0P_LVD->LVD_STR2_f.LVDRRDY == 1)
00316                 {
00317                     break;
00318                 }
00319                 
00320                 u32TimeOut--;
00321                 
00322                 if(u32TimeOut == 0)
00323                 {
00324                     return ErrorTimeout;
00325                 }
00326             }
00327             break;  
00328         default:
00329             FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00330             return  ErrorInvalidParameter;
00331     }
00332     
00333     FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00334     
00335     return Ok;
00336 }
00337 
00350 en_result_t Lvd_DisableFunc(en_lvd_func_t enFunc)
00351 { 
00352     FM0P_LVD->LVD_RLR = LvdCtlUnlock;/* unlock LVD_CTL */     
00353     switch(enFunc)
00354     {
00355         case LvdIntFunc:
00356             FM0P_LVD->LVD_CTL_f.LVDIE = 0;
00357             break;
00358         case LvdResetFunc:
00359             FM0P_LVD->LVD_CTL_f.LVDRE = 0;
00360             break;  
00361         default:
00362             FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00363             return  ErrorInvalidParameter;
00364     }
00365     
00366     FM0P_LVD->LVD_RLR = 0;           /* lock LVD_CTL */
00367     
00368     return Ok;
00369 }
00370 
00379 boolean_t Lvd_GetIntStatus(void)
00380 {
00381     boolean_t bRetVal = FALSE;
00382 
00383     /* Check the LVD interrupt status */
00384     if (TRUE == FM0P_LVD->LVD_STR_f.LVDIR)
00385     {
00386         bRetVal = TRUE;
00387     }
00388     
00389     return (bRetVal);
00390 } /* Lvd_GetIntOperationStatus */
00391 
00397 void Lvd_ClearIntStatus(void)
00398 {
00399     FM0P_LVD->LVD_CLR = 0x00;  /* Clear LVD interrupt (LVDCL (bit #7)) */
00400 } /* Lvd_ClearIntStatus */
00401 
00402 
00404 
00405 #endif /* #if (defined(PDL_PERIPHERAL_LVD_ACTIVE)) */
00406 
00407 /******************************************************************************/
00408 /* EOF (not truncated)                                                        */
00409 /******************************************************************************/