Files
CherryUSB/demo/es32/Drivers/ALD/ES32F36xx/Source/ald_iap.c

260 lines
6.4 KiB
C
Raw Normal View History

2022-05-29 15:22:56 +08:00
/**
*********************************************************************************
*
* @file ald_iap.c
* @brief IAP module driver.
*
* @version V1.0
* @date 04 Dec 2019
* @author AE Team
* @note
* Change Logs:
* Date Author Notes
* 04 Dec 2019 AE Team The first version
*
* Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**********************************************************************************
*/
#include "ald_conf.h"
/** @addtogroup ES32FXXX_ALD
* @{
*/
/** @defgroup IAP IAP
* @brief IAP module driver
* @{
*/
#ifdef ALD_IAP
/** @defgroup IAP_Public_Functions IAP Public Functions
*
* @verbatim
==============================================================================
##### Erase and Program flash functions #####
==============================================================================
[..] This section provides functions allowing to:
(+) Erase flash.
(+) Program flash.
@endverbatim
* @{
*/
/**
* @brief Erases a specified page.
* @param addr: The beginning address of the page to be erased.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_erase_page(uint32_t addr)
{
uint32_t status;
IAP_PE iap_pe = (IAP_PE)(*(uint32_t *)IAP_PE_ADDR);
__disable_irq();
status = (*iap_pe)(addr);
__enable_irq();
return !status;
}
/**
* @brief Programs a word at a specified address.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data: Specifies the data to be programmed.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_word(uint32_t addr, uint32_t data)
{
uint32_t status;
IAP_WP iap_wp = (IAP_WP)(*(uint32_t *)IAP_WP_ADDR);
if (addr & 0x3)
return 1;
__disable_irq();
status = (*iap_wp)(addr, data);
__enable_irq();
return !status;
}
/**
* @brief Programs double words at a specified address.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data_l: Specifies the LSB data to be programmed.
* @param data_h: Specifies the MSB data to be programmed.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_dword(uint32_t addr, uint32_t data_l, uint32_t data_h)
{
uint32_t status;
IAP_DWP iap_dwp = (IAP_DWP)(*(uint32_t *)IAP_DWP_ADDR);
if (addr & 0x3)
return 1;
__disable_irq();
status = (*iap_dwp)(addr, data_l, data_h);
__enable_irq();
return !status;
}
/**
* @brief Programs datas at a specified address.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data: Specifies the data to be programmed.
* @param len: Specifies the data length to be programmed.
* Bit0-1 must be zero.
* @param erase: Erase page flag before programming.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_words(uint32_t addr, uint8_t *data, uint32_t len, uint32_t erase)
{
uint32_t status;
IAP_WSP iap_wsp = (IAP_WSP)(*(uint32_t *)IAP_WSP_ADDR);
if ((addr & 0x3) || (len & 0x3))
return 1;
__disable_irq();
status = (*iap_wsp)(addr, data, len, erase);
__enable_irq();
return !status;
}
/**
* @brief Erases a specified page of dataflash.
* @param addr: The beginning address of the page to be erased.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_erase_page_df(uint32_t addr)
{
uint32_t status;
IAP_PE iap_pe = (IAP_PE)(*(uint32_t *)IAP_PageErase_DF);
__disable_irq();
status = (*iap_pe)(addr);
__enable_irq();
return !status;
}
/**
* @brief Programs a word at a specified address of dataflash.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data: Specifies the data to be programmed.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_word_df(uint32_t addr, uint32_t data)
{
uint32_t status;
IAP_WP iap_wp = (IAP_WP)(*(uint32_t *)IAP_WordProgram_DF);
if (addr & 0x3)
return 1;
__disable_irq();
status = (*iap_wp)(addr, data);
__enable_irq();
return !status;
}
/**
* @brief Programs double words at a specified address of dataflash.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data_l: Specifies the LSB data to be programmed.
* @param data_h: Specifies the MSB data to be programmed.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_dword_df(uint32_t addr, uint32_t data_l, uint32_t data_h)
{
uint32_t status;
IAP_DWP iap_dwp = (IAP_DWP)(*(uint32_t *)IAP_DWordProgram_DF);
if (addr & 0x3)
return 1;
__disable_irq();
status = (*iap_dwp)(addr, data_l, data_h);
__enable_irq();
return !status;
}
/**
* @brief Programs datas at a specified address of dataflash.
* @param addr: Specifies the address to be programmed.
* Bit0-1 must be zero.
* @param data: Specifies the data to be programmed.
* @param len: Specifies the data length to be programmed.
* Bit0-1 must be zero.
* @param erase: Erase page flag before programming.
* @retval The result:
* - 0: SUCCESS
* - 1: ERROR
*/
uint32_t ald_iap_program_words_df(uint32_t addr, uint8_t *data, uint32_t len, uint32_t erase)
{
uint32_t status;
IAP_WSP iap_wsp = (IAP_WSP)(*(uint32_t *)IAP_WordsProgram_DF);
if ((addr & 0x3) || (len & 0x3))
return 1;
__disable_irq();
status = (*iap_wsp)(addr, data, len, erase);
__enable_irq();
return !status;
}
/**
* @}
*/
#endif /* ALD_IAP */
/**
* @}
*/
/**
* @}
*/