/**
******************************************************************************
* @file flash_if.c
* @author MCD Application Team
* @version V4.0.0
* @date 21-January-2013
* @brief specific media access Layer for internal flash
******************************************************************************
* @attention
*
*
© COPYRIGHT 2013 STMicroelectronics
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* 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.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "flash_if.h"
#include "dfu_mal.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
uint32_t tHalfPage1[128/4];
uint32_t tHalfPage2[128/4];
#endif /* STM32L1XX_XD */
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : FLASH_If_Init
* Description : Initializes the Media on the STM32
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t FLASH_If_Init(void)
{
return MAL_OK;
}
/*******************************************************************************
* Function Name : FLASH_If_Erase
* Description : Erase sector
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t FLASH_If_Erase(uint32_t SectorAddress)
{
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
FLASH_ClearFlag(FLASH_FLAG_PGAERR | FLASH_FLAG_OPTVERR);
FLASH_ErasePage(SectorAddress);
#else
FLASH_ErasePage(SectorAddress);
#endif /* STM32L1XX_XD */
return MAL_OK;
}
/*******************************************************************************
* Function Name : FLASH_If_Write
* Description : Write sectors
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t FLASH_If_Write(uint32_t SectorAddress, uint32_t DataLength)
{
uint32_t idx = 0;
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
__IO uint32_t* malPointer = (uint32_t *)MAL_Buffer;
__IO uint32_t* memPointer = (uint32_t *)SectorAddress;
__IO uint32_t memBuffer[32]; /* Temporary buffer holding data that will be written in a half-page space */
__IO uint32_t* mempBuffer = memBuffer;
__IO uint32_t* tmp;
#endif /* STM32L1XX_XD */
if (DataLength & 0x3) /* Not an aligned data */
{
for (idx = DataLength; idx < ((DataLength & 0xFFFC) + 4); idx++)
{
MAL_Buffer[idx] = 0xFF;
}
}
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
/* Reinitialize the intermediate buffer pointer */
mempBuffer = memBuffer;
/* If the address is not aligned to half-page fill the first location with existing data */
if (((uint32_t)memPointer & 0x7F) != 0)
{
/* get the aligned address */
tmp = (uint32_t *)((uint32_t)memPointer & 0xFFFFFF80);
/* Read the first part from the memory */
while (tmp < memPointer)
{
*(uint32_t *)(mempBuffer++) = *(uint32_t *)(tmp++);
}
}
while (malPointer < (uint32_t*)(MAL_Buffer + DataLength))
{
/* Fill with the received buffer */
while (mempBuffer < (memBuffer + 32))
{
/* If there are still data available in the received buffer */
if (malPointer < ((uint32_t *)MAL_Buffer + DataLength))
{
*(uint32_t *)(mempBuffer++) = *(uint32_t *)(malPointer++);
}
else /* no more data available in the received buffer: fill remaining with dummy 0 */
{
*(uint32_t *)(mempBuffer++) = 0;
}
}
/* Write the buffer to the memory*/
FLASH_ProgramHalfPage(((uint32_t)memPointer & 0xFFFFFF80), (uint32_t *)(memBuffer));
/* Increment the memory pointer */
memPointer = (uint32_t *)(((uint32_t)memPointer & 0xFFFFFF80) + (32*4));
/* Reinitialize the intermediate buffer pointer */
mempBuffer = memBuffer;
}
#else
/* Data received are Word multiple */
for (idx = 0; idx < DataLength; idx = idx + 4)
{
FLASH_ProgramWord(SectorAddress, *(uint32_t *)(MAL_Buffer + idx));
SectorAddress += 4;
}
#endif /* STM32L1XX_XD */
return MAL_OK;
}
/*******************************************************************************
* Function Name : FLASH_If_Read
* Description : Read sectors
* Input : None
* Output : None
* Return : buffer address pointer
*******************************************************************************/
uint8_t *FLASH_If_Read (uint32_t SectorAddress, uint32_t DataLength)
{
return (uint8_t*)(SectorAddress);
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/