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_fmc.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 fmc.c
<> 144:ef7eb2e8f9f7 3 * @version V1.10
<> 144:ef7eb2e8f9f7 4 * $Revision: 16 $
<> 144:ef7eb2e8f9f7 5 * $Date: 14/10/06 11:57a $
<> 144:ef7eb2e8f9f7 6 * @brief NUC472/NUC442 FMC driver source file
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * @note
<> 144:ef7eb2e8f9f7 9 * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
<> 144:ef7eb2e8f9f7 10 *****************************************************************************/
<> 144:ef7eb2e8f9f7 11
<> 144:ef7eb2e8f9f7 12 //* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 13 #include <stdio.h>
<> 144:ef7eb2e8f9f7 14 #include "NUC472_442.h"
<> 144:ef7eb2e8f9f7 15
<> 144:ef7eb2e8f9f7 16
<> 144:ef7eb2e8f9f7 17 /** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver
<> 144:ef7eb2e8f9f7 18 @{
<> 144:ef7eb2e8f9f7 19 */
<> 144:ef7eb2e8f9f7 20
<> 144:ef7eb2e8f9f7 21 /** @addtogroup NUC472_442_FMC_Driver FMC Driver
<> 144:ef7eb2e8f9f7 22 @{
<> 144:ef7eb2e8f9f7 23 */
<> 144:ef7eb2e8f9f7 24
<> 144:ef7eb2e8f9f7 25
<> 144:ef7eb2e8f9f7 26 /** @addtogroup NUC472_442_FMC_EXPORTED_FUNCTIONS FMC Exported Functions
<> 144:ef7eb2e8f9f7 27 @{
<> 144:ef7eb2e8f9f7 28 */
<> 144:ef7eb2e8f9f7 29
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 /**
<> 144:ef7eb2e8f9f7 32 * @brief Set boot from APROM or LDROM of next software reset.
<> 144:ef7eb2e8f9f7 33 * @param[in] i32BootSrc Next software boot selection.
<> 144:ef7eb2e8f9f7 34 * - \ref IS_BOOT_FROM_LDROM
<> 144:ef7eb2e8f9f7 35 * - \ref IS_BOOT_FROM_APROM
<> 144:ef7eb2e8f9f7 36 * @return None
<> 144:ef7eb2e8f9f7 37 */
<> 144:ef7eb2e8f9f7 38 void FMC_SetBootSource (int32_t i32BootSrc)
<> 144:ef7eb2e8f9f7 39 {
<> 144:ef7eb2e8f9f7 40 if (i32BootSrc == 1)
<> 144:ef7eb2e8f9f7 41 FMC->ISPCTL |= FMC_ISPCTL_BS_Msk;
<> 144:ef7eb2e8f9f7 42 else
<> 144:ef7eb2e8f9f7 43 FMC->ISPCTL &= ~FMC_ISPCTL_BS_Msk;
<> 144:ef7eb2e8f9f7 44 }
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46
<> 144:ef7eb2e8f9f7 47 /**
<> 144:ef7eb2e8f9f7 48 * @brief Disable FMC ISP function.
<> 144:ef7eb2e8f9f7 49 * @return None
<> 144:ef7eb2e8f9f7 50 */
<> 144:ef7eb2e8f9f7 51 void FMC_Close(void)
<> 144:ef7eb2e8f9f7 52 {
<> 144:ef7eb2e8f9f7 53 FMC->ISPCTL &= ~FMC_ISPCTL_ISPEN_Msk;
<> 144:ef7eb2e8f9f7 54 }
<> 144:ef7eb2e8f9f7 55
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 /**
<> 144:ef7eb2e8f9f7 58 * @brief Disable ISP erase/program APROM function.
<> 144:ef7eb2e8f9f7 59 * @return None
<> 144:ef7eb2e8f9f7 60 */
<> 144:ef7eb2e8f9f7 61 void FMC_DisableAPUpdate(void)
<> 144:ef7eb2e8f9f7 62 {
<> 144:ef7eb2e8f9f7 63 FMC->ISPCTL &= ~FMC_ISPCTL_APUEN_Msk;
<> 144:ef7eb2e8f9f7 64 }
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66
<> 144:ef7eb2e8f9f7 67 /**
<> 144:ef7eb2e8f9f7 68 * @brief Disable ISP erase/program User Configuration function.
<> 144:ef7eb2e8f9f7 69 * @return None
<> 144:ef7eb2e8f9f7 70 */
<> 144:ef7eb2e8f9f7 71 void FMC_DisableConfigUpdate(void)
<> 144:ef7eb2e8f9f7 72 {
<> 144:ef7eb2e8f9f7 73 FMC->ISPCTL &= ~FMC_ISPCTL_CFGUEN_Msk;
<> 144:ef7eb2e8f9f7 74 }
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76
<> 144:ef7eb2e8f9f7 77 /**
<> 144:ef7eb2e8f9f7 78 * @brief Disable ISP erase/program LDROM function.
<> 144:ef7eb2e8f9f7 79 * @return None
<> 144:ef7eb2e8f9f7 80 */
<> 144:ef7eb2e8f9f7 81 void FMC_DisableLDUpdate(void)
<> 144:ef7eb2e8f9f7 82 {
<> 144:ef7eb2e8f9f7 83 FMC->ISPCTL &= ~FMC_ISPCTL_LDUEN_Msk;
<> 144:ef7eb2e8f9f7 84 }
<> 144:ef7eb2e8f9f7 85
<> 144:ef7eb2e8f9f7 86
<> 144:ef7eb2e8f9f7 87 /**
<> 144:ef7eb2e8f9f7 88 * @brief Enable ISP erase/program APROM function.
<> 144:ef7eb2e8f9f7 89 * @return None
<> 144:ef7eb2e8f9f7 90 */
<> 144:ef7eb2e8f9f7 91 void FMC_EnableAPUpdate(void)
<> 144:ef7eb2e8f9f7 92 {
<> 144:ef7eb2e8f9f7 93 FMC->ISPCTL |= FMC_ISPCTL_APUEN_Msk;
<> 144:ef7eb2e8f9f7 94 }
<> 144:ef7eb2e8f9f7 95
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 /**
<> 144:ef7eb2e8f9f7 98 * @brief Enable ISP erase/program User Configuration function.
<> 144:ef7eb2e8f9f7 99 * @return None
<> 144:ef7eb2e8f9f7 100 */
<> 144:ef7eb2e8f9f7 101 void FMC_EnableConfigUpdate(void)
<> 144:ef7eb2e8f9f7 102 {
<> 144:ef7eb2e8f9f7 103 FMC->ISPCTL |= FMC_ISPCTL_CFGUEN_Msk;
<> 144:ef7eb2e8f9f7 104 }
<> 144:ef7eb2e8f9f7 105
<> 144:ef7eb2e8f9f7 106
<> 144:ef7eb2e8f9f7 107 /**
<> 144:ef7eb2e8f9f7 108 * @brief Enable ISP erase/program LDROM function.
<> 144:ef7eb2e8f9f7 109 * @return None
<> 144:ef7eb2e8f9f7 110 */
<> 144:ef7eb2e8f9f7 111 void FMC_EnableLDUpdate(void)
<> 144:ef7eb2e8f9f7 112 {
<> 144:ef7eb2e8f9f7 113 FMC->ISPCTL |= FMC_ISPCTL_LDUEN_Msk;
<> 144:ef7eb2e8f9f7 114 }
<> 144:ef7eb2e8f9f7 115
<> 144:ef7eb2e8f9f7 116
<> 144:ef7eb2e8f9f7 117 /**
<> 144:ef7eb2e8f9f7 118 * @brief Erase a page. The page size is 2048 bytes.
<> 144:ef7eb2e8f9f7 119 * @param[in] u32PageAddr Flash page address. Must be a 2048-byte aligned address.
<> 144:ef7eb2e8f9f7 120 * @return Success or not.
<> 144:ef7eb2e8f9f7 121 * @retval 0 Success
<> 144:ef7eb2e8f9f7 122 * @retval -1 Erase failed
<> 144:ef7eb2e8f9f7 123 */
<> 144:ef7eb2e8f9f7 124 int32_t FMC_Erase(uint32_t u32PageAddr)
<> 144:ef7eb2e8f9f7 125 {
<> 144:ef7eb2e8f9f7 126 FMC->ISPCMD = FMC_ISPCMD_PAGE_ERASE;
<> 144:ef7eb2e8f9f7 127 FMC->ISPADDR = u32PageAddr;
<> 144:ef7eb2e8f9f7 128 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 129
<> 144:ef7eb2e8f9f7 130 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 131
<> 144:ef7eb2e8f9f7 132 if (FMC->ISPCTL & FMC_ISPCTL_ISPFF_Msk) {
<> 144:ef7eb2e8f9f7 133 FMC->ISPCTL |= FMC_ISPCTL_ISPFF_Msk;
<> 144:ef7eb2e8f9f7 134 return -1;
<> 144:ef7eb2e8f9f7 135 }
<> 144:ef7eb2e8f9f7 136 return 0;
<> 144:ef7eb2e8f9f7 137 }
<> 144:ef7eb2e8f9f7 138
<> 144:ef7eb2e8f9f7 139
<> 144:ef7eb2e8f9f7 140 /**
<> 144:ef7eb2e8f9f7 141 * @brief Get the current boot source.
<> 144:ef7eb2e8f9f7 142 * @return The current boot source.
<> 144:ef7eb2e8f9f7 143 * @retval 0 Is boot from APROM.
<> 144:ef7eb2e8f9f7 144 * @retval 1 Is boot from LDROM.
<> 144:ef7eb2e8f9f7 145 */
<> 144:ef7eb2e8f9f7 146 int32_t FMC_GetBootSource (void)
<> 144:ef7eb2e8f9f7 147 {
<> 144:ef7eb2e8f9f7 148 if (FMC->ISPCTL & FMC_ISPCTL_BS_Msk)
<> 144:ef7eb2e8f9f7 149 return 1;
<> 144:ef7eb2e8f9f7 150 else
<> 144:ef7eb2e8f9f7 151 return 0;
<> 144:ef7eb2e8f9f7 152 }
<> 144:ef7eb2e8f9f7 153
<> 144:ef7eb2e8f9f7 154
<> 144:ef7eb2e8f9f7 155 /**
<> 144:ef7eb2e8f9f7 156 * @brief Enable FMC ISP function
<> 144:ef7eb2e8f9f7 157 * @return None
<> 144:ef7eb2e8f9f7 158 */
<> 144:ef7eb2e8f9f7 159 void FMC_Open(void)
<> 144:ef7eb2e8f9f7 160 {
<> 144:ef7eb2e8f9f7 161 FMC->ISPCTL |= FMC_ISPCTL_ISPEN_Msk;
<> 144:ef7eb2e8f9f7 162 }
<> 144:ef7eb2e8f9f7 163
<> 144:ef7eb2e8f9f7 164
<> 144:ef7eb2e8f9f7 165 /**
<> 144:ef7eb2e8f9f7 166 * @brief Execute ISP command to read a word from flash.
<> 144:ef7eb2e8f9f7 167 * @param[in] u32Addr Address of the flash location to be read.
<> 144:ef7eb2e8f9f7 168 * It must be a word aligned address.
<> 144:ef7eb2e8f9f7 169 * @return The word data read from specified flash address.
<> 144:ef7eb2e8f9f7 170 */
<> 144:ef7eb2e8f9f7 171 uint32_t FMC_Read(uint32_t u32Addr)
<> 144:ef7eb2e8f9f7 172 {
<> 144:ef7eb2e8f9f7 173 FMC->ISPCMD = FMC_ISPCMD_READ;
<> 144:ef7eb2e8f9f7 174 FMC->ISPADDR = u32Addr;
<> 144:ef7eb2e8f9f7 175 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 176
<> 144:ef7eb2e8f9f7 177 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 178
<> 144:ef7eb2e8f9f7 179 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 180 }
<> 144:ef7eb2e8f9f7 181
<> 144:ef7eb2e8f9f7 182
<> 144:ef7eb2e8f9f7 183 /**
<> 144:ef7eb2e8f9f7 184 * @brief Execute ISP 64-bits read command to read two words from flash.
<> 144:ef7eb2e8f9f7 185 * @param[in] u32Addr Flash word address. Must be a double word aligned address.
<> 144:ef7eb2e8f9f7 186 * @param[out] u32Data0 The first word read from flash.
<> 144:ef7eb2e8f9f7 187 * @param[out] u32Data1 The second word read from flash.
<> 144:ef7eb2e8f9f7 188 * @return None
<> 144:ef7eb2e8f9f7 189 */
<> 144:ef7eb2e8f9f7 190 void FMC_Read_64(uint32_t u32Addr, uint32_t *u32Data0, uint32_t *u32Data1)
<> 144:ef7eb2e8f9f7 191 {
<> 144:ef7eb2e8f9f7 192 FMC->ISPCMD = FMC_ISPCMD_READ_64;
<> 144:ef7eb2e8f9f7 193 FMC->ISPADDR = u32Addr;
<> 144:ef7eb2e8f9f7 194 FMC->ISPDAT = 0x0;
<> 144:ef7eb2e8f9f7 195 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 198
<> 144:ef7eb2e8f9f7 199 *u32Data0 = FMC->MPDAT0;
<> 144:ef7eb2e8f9f7 200 *u32Data1 = FMC->MPDAT1;
<> 144:ef7eb2e8f9f7 201 }
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203
<> 144:ef7eb2e8f9f7 204 /**
<> 144:ef7eb2e8f9f7 205 * @brief Read company ID.
<> 144:ef7eb2e8f9f7 206 * @return The company ID.
<> 144:ef7eb2e8f9f7 207 */
<> 144:ef7eb2e8f9f7 208 uint32_t FMC_ReadCID(void)
<> 144:ef7eb2e8f9f7 209 {
<> 144:ef7eb2e8f9f7 210 FMC->ISPCMD = FMC_ISPCMD_READ_CID;
<> 144:ef7eb2e8f9f7 211 FMC->ISPADDR = 0x0;
<> 144:ef7eb2e8f9f7 212 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 213 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 214 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 215 }
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 /**
<> 144:ef7eb2e8f9f7 219 * @brief Read device ID.
<> 144:ef7eb2e8f9f7 220 * @return The device ID.
<> 144:ef7eb2e8f9f7 221 */
<> 144:ef7eb2e8f9f7 222 uint32_t FMC_ReadDID(void)
<> 144:ef7eb2e8f9f7 223 {
<> 144:ef7eb2e8f9f7 224 FMC->ISPCMD = FMC_ISPCMD_READ_DID;
<> 144:ef7eb2e8f9f7 225 FMC->ISPADDR = 0;
<> 144:ef7eb2e8f9f7 226 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 227 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 228 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 229 }
<> 144:ef7eb2e8f9f7 230
<> 144:ef7eb2e8f9f7 231
<> 144:ef7eb2e8f9f7 232 /**
<> 144:ef7eb2e8f9f7 233 * @brief Read product ID.
<> 144:ef7eb2e8f9f7 234 * @return The product ID.
<> 144:ef7eb2e8f9f7 235 */
<> 144:ef7eb2e8f9f7 236 uint32_t FMC_ReadPID(void)
<> 144:ef7eb2e8f9f7 237 {
<> 144:ef7eb2e8f9f7 238 FMC->ISPCMD = FMC_ISPCMD_READ_DID;
<> 144:ef7eb2e8f9f7 239 FMC->ISPADDR = 0x04;
<> 144:ef7eb2e8f9f7 240 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 241 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 242 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245
<> 144:ef7eb2e8f9f7 246 /**
<> 144:ef7eb2e8f9f7 247 * @brief This function reads one of the four UCID.
<> 144:ef7eb2e8f9f7 248 * @param[in] u32Index Index of the UCID to read. u32Index must be 0, 1, 2, or 3.
<> 144:ef7eb2e8f9f7 249 * @return The UCID.
<> 144:ef7eb2e8f9f7 250 */
<> 144:ef7eb2e8f9f7 251 uint32_t FMC_ReadUCID(uint32_t u32Index)
<> 144:ef7eb2e8f9f7 252 {
<> 144:ef7eb2e8f9f7 253 FMC->ISPCMD = FMC_ISPCMD_READ_UID;
<> 144:ef7eb2e8f9f7 254 FMC->ISPADDR = (0x04 * u32Index) + 0x10;
<> 144:ef7eb2e8f9f7 255 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 256
<> 144:ef7eb2e8f9f7 257 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 258
<> 144:ef7eb2e8f9f7 259 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 260 }
<> 144:ef7eb2e8f9f7 261
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 /**
<> 144:ef7eb2e8f9f7 264 * @brief This function reads one of the three UID.
<> 144:ef7eb2e8f9f7 265 * @param[in] u32Index Index of the UID to read. u32Index must be 0, 1, or 2.
<> 144:ef7eb2e8f9f7 266 * @return The UID.
<> 144:ef7eb2e8f9f7 267 */
<> 144:ef7eb2e8f9f7 268 uint32_t FMC_ReadUID(uint32_t u32Index)
<> 144:ef7eb2e8f9f7 269 {
<> 144:ef7eb2e8f9f7 270 FMC->ISPCMD = FMC_ISPCMD_READ_UID;
<> 144:ef7eb2e8f9f7 271 FMC->ISPADDR = 0x04 * u32Index;
<> 144:ef7eb2e8f9f7 272 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 273
<> 144:ef7eb2e8f9f7 274 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 275
<> 144:ef7eb2e8f9f7 276 return FMC->ISPDAT;
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278
<> 144:ef7eb2e8f9f7 279
<> 144:ef7eb2e8f9f7 280 /**
<> 144:ef7eb2e8f9f7 281 * @brief Get the base address of Data Flash if enabled.
<> 144:ef7eb2e8f9f7 282 * @return Base address of Data Flash
<> 144:ef7eb2e8f9f7 283 */
<> 144:ef7eb2e8f9f7 284 uint32_t FMC_ReadDataFlashBaseAddr(void)
<> 144:ef7eb2e8f9f7 285 {
<> 144:ef7eb2e8f9f7 286 return FMC->DFBA;
<> 144:ef7eb2e8f9f7 287 }
<> 144:ef7eb2e8f9f7 288
<> 144:ef7eb2e8f9f7 289
<> 144:ef7eb2e8f9f7 290 /**
<> 144:ef7eb2e8f9f7 291 * @brief This function will force re-map assigned flash page to CPU address 0x0.
<> 144:ef7eb2e8f9f7 292 * @param[in] u32PageAddr Address of the page to be mapped to CPU address 0x0.
<> 144:ef7eb2e8f9f7 293 * @return None
<> 144:ef7eb2e8f9f7 294 */
<> 144:ef7eb2e8f9f7 295 void FMC_SetVectorPageAddr(uint32_t u32PageAddr)
<> 144:ef7eb2e8f9f7 296 {
<> 144:ef7eb2e8f9f7 297 FMC->ISPCMD = FMC_ISPCMD_VECMAP;
<> 144:ef7eb2e8f9f7 298 FMC->ISPADDR = u32PageAddr;
<> 144:ef7eb2e8f9f7 299 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 300 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 301 }
<> 144:ef7eb2e8f9f7 302
<> 144:ef7eb2e8f9f7 303
<> 144:ef7eb2e8f9f7 304 /**
<> 144:ef7eb2e8f9f7 305 * @brief Execute ISP command to program a word to flash.
<> 144:ef7eb2e8f9f7 306 * @param[in] u32Addr Address of the flash location to be programmed.
<> 144:ef7eb2e8f9f7 307 * It must be a word aligned address.
<> 144:ef7eb2e8f9f7 308 * @param[out] u32Data The word data to be programmed.
<> 144:ef7eb2e8f9f7 309 * @return None
<> 144:ef7eb2e8f9f7 310 */
<> 144:ef7eb2e8f9f7 311 void FMC_Write(uint32_t u32Addr, uint32_t u32Data)
<> 144:ef7eb2e8f9f7 312 {
<> 144:ef7eb2e8f9f7 313 FMC->ISPCMD = FMC_ISPCMD_WRITE;
<> 144:ef7eb2e8f9f7 314 FMC->ISPADDR = u32Addr;
<> 144:ef7eb2e8f9f7 315 FMC->ISPDAT = u32Data;
<> 144:ef7eb2e8f9f7 316 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 317 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 318 }
<> 144:ef7eb2e8f9f7 319
<> 144:ef7eb2e8f9f7 320
<> 144:ef7eb2e8f9f7 321 /**
<> 144:ef7eb2e8f9f7 322 * @brief Execute ISP 64-bits write command to program two words to flash.
<> 144:ef7eb2e8f9f7 323 * @param[in] u32Addr Destination address. It must be double word aligned.
<> 144:ef7eb2e8f9f7 324 * @param[in] u32Data0 First word data to be written.
<> 144:ef7eb2e8f9f7 325 * @param[in] u32Data1 Second word data to be written.
<> 144:ef7eb2e8f9f7 326 * @return None
<> 144:ef7eb2e8f9f7 327 */
<> 144:ef7eb2e8f9f7 328 void FMC_Write_64(uint32_t u32Addr, uint32_t u32Data0, uint32_t u32Data1)
<> 144:ef7eb2e8f9f7 329 {
<> 144:ef7eb2e8f9f7 330 FMC->ISPCMD = FMC_ISPCMD_WRITE_64;
<> 144:ef7eb2e8f9f7 331 FMC->ISPADDR = u32Addr;
<> 144:ef7eb2e8f9f7 332 FMC->MPDAT0 = u32Data0;
<> 144:ef7eb2e8f9f7 333 FMC->MPDAT1 = u32Data0;
<> 144:ef7eb2e8f9f7 334 FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
<> 144:ef7eb2e8f9f7 335 while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) ;
<> 144:ef7eb2e8f9f7 336 }
<> 144:ef7eb2e8f9f7 337
<> 144:ef7eb2e8f9f7 338
<> 144:ef7eb2e8f9f7 339 /**
<> 144:ef7eb2e8f9f7 340 * @brief CRC8 Calculator
<> 144:ef7eb2e8f9f7 341 * @param[in] au32Data CRC8 input data words.
<> 144:ef7eb2e8f9f7 342 * @param[in] i32Count Number of words in au32Data[].
<> 144:ef7eb2e8f9f7 343 * @return The CRC8 value.
<> 144:ef7eb2e8f9f7 344 */
<> 144:ef7eb2e8f9f7 345 uint32_t FMC_CRC8(uint32_t au32Data[], int i32Count)
<> 144:ef7eb2e8f9f7 346 {
<> 144:ef7eb2e8f9f7 347 int i32ByteIdx;
<> 144:ef7eb2e8f9f7 348 uint8_t i, u8Cnt, u8InData;
<> 144:ef7eb2e8f9f7 349 uint8_t au8CRC[4] = { 0xff, 0xff, 0xff, 0xff };
<> 144:ef7eb2e8f9f7 350
<> 144:ef7eb2e8f9f7 351 for (i32ByteIdx = 0; i32ByteIdx < 4; i32ByteIdx++) {
<> 144:ef7eb2e8f9f7 352 for (u8Cnt = 0; u8Cnt < i32Count; u8Cnt++) {
<> 144:ef7eb2e8f9f7 353 for (i = 0x80; i != 0; i /= 2) {
<> 144:ef7eb2e8f9f7 354 if ((au8CRC[i32ByteIdx] & 0x80)!=0) {
<> 144:ef7eb2e8f9f7 355 au8CRC[i32ByteIdx] *= 2;
<> 144:ef7eb2e8f9f7 356 au8CRC[i32ByteIdx] ^= 7;
<> 144:ef7eb2e8f9f7 357 } else
<> 144:ef7eb2e8f9f7 358 au8CRC[i32ByteIdx] *= 2;
<> 144:ef7eb2e8f9f7 359
<> 144:ef7eb2e8f9f7 360 u8InData = (au32Data[u8Cnt] >> (i32ByteIdx * 8)) & 0xff;
<> 144:ef7eb2e8f9f7 361
<> 144:ef7eb2e8f9f7 362 if ((u8InData & i) != 0)
<> 144:ef7eb2e8f9f7 363 au8CRC[i32ByteIdx]^=0x7;
<> 144:ef7eb2e8f9f7 364 }
<> 144:ef7eb2e8f9f7 365 }
<> 144:ef7eb2e8f9f7 366 }
<> 144:ef7eb2e8f9f7 367 return (au8CRC[0] | au8CRC[1] << 8 | au8CRC[2] << 16 | au8CRC[3] << 24);
<> 144:ef7eb2e8f9f7 368 }
<> 144:ef7eb2e8f9f7 369
<> 144:ef7eb2e8f9f7 370
<> 144:ef7eb2e8f9f7 371 /**
<> 144:ef7eb2e8f9f7 372 * @brief Read the User Configuration words.
<> 144:ef7eb2e8f9f7 373 * @param[out] u32Config: The word array to store words read from flash.
<> 144:ef7eb2e8f9f7 374 * @param[in] u32Count: Maximum length of u32Config.
<> 144:ef7eb2e8f9f7 375 * @return Success or not.
<> 144:ef7eb2e8f9f7 376 * @retval 0 Success
<> 144:ef7eb2e8f9f7 377 * @retval -1 User Configuration CRC check error
<> 144:ef7eb2e8f9f7 378 */
<> 144:ef7eb2e8f9f7 379 int32_t FMC_ReadConfig(uint32_t *u32Config, uint32_t u32Count)
<> 144:ef7eb2e8f9f7 380 {
<> 144:ef7eb2e8f9f7 381 int i;
<> 144:ef7eb2e8f9f7 382
<> 144:ef7eb2e8f9f7 383 for (i = 0; i < u32Count; i++) {
<> 144:ef7eb2e8f9f7 384 u32Config[i] = FMC_Read(FMC_CONFIG_BASE + i*4);
<> 144:ef7eb2e8f9f7 385 }
<> 144:ef7eb2e8f9f7 386
<> 144:ef7eb2e8f9f7 387 if (FMC->ISPSTS & FMC_ISPSTS_CFGCRCF_Msk)
<> 144:ef7eb2e8f9f7 388 return -1;
<> 144:ef7eb2e8f9f7 389
<> 144:ef7eb2e8f9f7 390 return 0;
<> 144:ef7eb2e8f9f7 391 }
<> 144:ef7eb2e8f9f7 392
<> 144:ef7eb2e8f9f7 393
<> 144:ef7eb2e8f9f7 394 /**
<> 144:ef7eb2e8f9f7 395 * @brief Write User Configuration
<> 144:ef7eb2e8f9f7 396 * @param[in] u32Config The word array to store data. MUST be a four word array.
<> 144:ef7eb2e8f9f7 397 * @param[in] u32Count MUST be 4.
<> 144:ef7eb2e8f9f7 398 * @return Success or not.
<> 144:ef7eb2e8f9f7 399 * @retval 0 Success
<> 144:ef7eb2e8f9f7 400 * @retval -1 Failed
<> 144:ef7eb2e8f9f7 401 */
<> 144:ef7eb2e8f9f7 402 int32_t FMC_WriteConfig(uint32_t *u32Config, uint32_t u32Count)
<> 144:ef7eb2e8f9f7 403 {
<> 144:ef7eb2e8f9f7 404 uint32_t i, u32CRC, u32Data;
<> 144:ef7eb2e8f9f7 405
<> 144:ef7eb2e8f9f7 406 FMC_Erase(FMC_CONFIG_BASE);
<> 144:ef7eb2e8f9f7 407
<> 144:ef7eb2e8f9f7 408 u32CRC = FMC_CRC8(u32Config, 3);
<> 144:ef7eb2e8f9f7 409
<> 144:ef7eb2e8f9f7 410 for (i = 0; i < 4; i++) {
<> 144:ef7eb2e8f9f7 411 FMC_Write(FMC_CONFIG_BASE + i * 4, (i < 3) ? u32Config[i] : u32CRC);
<> 144:ef7eb2e8f9f7 412 }
<> 144:ef7eb2e8f9f7 413
<> 144:ef7eb2e8f9f7 414 for (i = 0; i < 4; i++) {
<> 144:ef7eb2e8f9f7 415 u32Data = FMC_Read(FMC_CONFIG_BASE + i * 4);
<> 144:ef7eb2e8f9f7 416
<> 144:ef7eb2e8f9f7 417 if (u32Data != ((i < 3) ? u32Config[i] : u32CRC))
<> 144:ef7eb2e8f9f7 418 return -1;
<> 144:ef7eb2e8f9f7 419 }
<> 144:ef7eb2e8f9f7 420 return 0;
<> 144:ef7eb2e8f9f7 421 }
<> 144:ef7eb2e8f9f7 422
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 /*@}*/ /* end of group NUC472_442_FMC_EXPORTED_FUNCTIONS */
<> 144:ef7eb2e8f9f7 425
<> 144:ef7eb2e8f9f7 426 /*@}*/ /* end of group NUC472_442_FMC_Driver */
<> 144:ef7eb2e8f9f7 427
<> 144:ef7eb2e8f9f7 428 /*@}*/ /* end of group NUC472_442_Device_Driver */
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
<> 144:ef7eb2e8f9f7 431
<> 144:ef7eb2e8f9f7 432