/** * \brief Perform the given command and wait until its completion (or an error). * * \note Unique ID commands are not supported, use efc_perform_read_sequence. * * \param p_efc Pointer to an EFC instance. * \param ul_command Command to perform. * \param ul_argument Optional command argument. * * \note This function will automatically choose to use IAP function. * * \return 0 if successful, otherwise returns an error code. */ uint32_t efc_perform_command(Efc *p_efc, uint32_t ul_command, uint32_t ul_argument) { /* Unique ID commands are not supported. */ if (ul_command == EFC_FCMD_STUI || ul_command == EFC_FCMD_SPUI) { return EFC_RC_NOT_SUPPORT; } /* Use RAM Function. */ return efc_perform_fcr(p_efc, EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); }
/** * \brief Perform the given command and wait until its completion (or an error). * * \note Unique ID commands are not supported, use efc_read_unique_id. * * \param p_efc Pointer to an EFC instance. * \param ul_command Command to perform. * \param ul_argument Optional command argument. * * \note This function will automatically choose to use IAP function. * * \return 0 if successful, otherwise returns an error code. */ uint32_t efc_perform_command(Efc *p_efc, uint32_t ul_command, uint32_t ul_argument) { // Unique ID commands are not supported. if (ul_command == EFC_FCMD_STUI || ul_command == EFC_FCMD_SPUI) { return EFC_RC_NOT_SUPPORT; } #if (SAM3XA_SERIES || SAM3U4) // Use IAP function with 2 parameters in ROM. static uint32_t(*iap_perform_command) (uint32_t, uint32_t); uint32_t ul_efc_nb = (p_efc == EFC0) ? 0 : 1; iap_perform_command = (uint32_t(*)(uint32_t, uint32_t)) *((uint32_t *) CHIP_FLASH_IAP_ADDRESS); iap_perform_command(ul_efc_nb, EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); return (p_efc->EEFC_FSR & EEFC_ERROR_FLAGS); #elif (SAM3N_SERIES || SAM3S_SERIES || SAM4S_SERIES || SAM3U_SERIES) // Use IAP function with 2 parameter in ROM. static uint32_t(*iap_perform_command) (uint32_t, uint32_t); iap_perform_command = (uint32_t(*)(uint32_t, uint32_t)) *((uint32_t *) CHIP_FLASH_IAP_ADDRESS); #if SAM4S_SERIES uint32_t ul_efc_nb = (p_efc == EFC0) ? 0 : 1; iap_perform_command(ul_efc_nb, EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); #else iap_perform_command(0, EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); #endif return (p_efc->EEFC_FSR & EEFC_ERROR_FLAGS); #else // Use RAM Function. return efc_perform_fcr(p_efc, EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); #endif }
/** * \brief Perform the given command and wait until its completion (or an error). * * \note Unique ID commands are not supported, use efc_perform_read_sequence. * * \param p_efc Pointer to an EFC instance. * \param ul_command Command to perform. * \param ul_argument Optional command argument. * * \note This function will automatically choose to use IAP function. * * \return 0 if successful, otherwise returns an error code. */ uint32_t efc_perform_command(Efc *p_efc, uint32_t ul_command, uint32_t ul_argument) { uint32_t result; irqflags_t flags; /* Unique ID commands are not supported. */ if (ul_command == EFC_FCMD_STUI || ul_command == EFC_FCMD_SPUI) { return EFC_RC_NOT_SUPPORT; } flags = cpu_irq_save(); /* Use RAM Function. */ result = efc_perform_fcr(p_efc, EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FARG(ul_argument) | EEFC_FCR_FCMD(ul_command)); cpu_irq_restore(flags); return result; }