blob: 0fca991f9cddeb7da86749b1508785b6856901bc [file] [log] [blame]
/*
* Copyright (c) 2013-2022 Arm Limited. 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 "Driver_Flash.h"
#include "RTE_Device.h"
#include "emulated_flash_drv.h"
#include "platform_base_address.h"
#include <stdint.h>
#include <string.h>
#ifndef ARG_UNUSED
#define ARG_UNUSED(arg) ((void) arg)
#endif
#define FLASH0_BASE_S QSPI_SRAM_BASE_S
#define FLASH0_BASE_NS QSPI_SRAM_BASE_NS
#define FLASH0_SIZE QSPI_SRAM_SIZE
#define FLASH0_SECTOR_SIZE 0x00001000 /* 4 kB */
#define FLASH0_PAGE_SIZE 0x00001000 /* 4 kB */
#define FLASH0_PROGRAM_UNIT 0x1 /* Minimum write size */
/* Driver version */
#define ARM_FLASH_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 1)
/**
* Data width values for ARM_FLASH_CAPABILITIES::data_width
* \ref ARM_FLASH_CAPABILITIES
*/
enum
{
DATA_WIDTH_8BIT = 0u,
DATA_WIDTH_16BIT,
DATA_WIDTH_32BIT,
DATA_WIDTH_ENUM_SIZE
};
static const uint32_t data_width_byte[DATA_WIDTH_ENUM_SIZE] = {
sizeof(uint8_t),
sizeof(uint16_t),
sizeof(uint32_t),
};
/* Driver Version */
static const ARM_DRIVER_VERSION DriverVersion = { ARM_FLASH_API_VERSION, ARM_FLASH_DRV_VERSION };
/* Driver Capabilities */
static const ARM_FLASH_CAPABILITIES DriverCapabilities = {
0, /* event_ready */
0, /* data_width = 0:8-bit, 1:16-bit, 2:32-bit */
1, /* erase_chip */
0 /* reserved */
};
static ARM_DRIVER_VERSION ARM_Flash_GetVersion(void)
{
return DriverVersion;
}
static ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities(void)
{
return DriverCapabilities;
}
static int32_t ARM_Flash_Initialize(ARM_Flash_SignalEvent_t cb_event)
{
ARG_UNUSED(cb_event);
if (DriverCapabilities.data_width >= DATA_WIDTH_ENUM_SIZE)
{
return ARM_DRIVER_ERROR;
}
/* Nothing to be done */
return ARM_DRIVER_OK;
}
static int32_t ARM_Flash_Uninitialize(void)
{
/* Nothing to be done */
return ARM_DRIVER_OK;
}
static int32_t ARM_Flash_PowerControl(ARM_POWER_STATE state)
{
switch (state)
{
case ARM_POWER_FULL:
/* Nothing to be done */
return ARM_DRIVER_OK;
case ARM_POWER_OFF:
case ARM_POWER_LOW:
default:
return ARM_DRIVER_ERROR_UNSUPPORTED;
}
}
#if (RTE_FLASH0)
/* Flash Status */
static ARM_FLASH_STATUS FlashStatus_FLASH0 = { 0, 0, 0 };
static ARM_FLASH_INFO ARM_FLASH0_DEV_INFO = { .sector_info = NULL, /* Uniform sector layout */
.sector_count = FLASH0_SIZE / FLASH0_SECTOR_SIZE,
.sector_size = FLASH0_SECTOR_SIZE,
.page_size = FLASH0_PAGE_SIZE,
.program_unit = FLASH0_PROGRAM_UNIT,
.erased_value = EMULATED_FLASH_DRV_ERASE_VALUE };
static struct emulated_flash_dev_t ARM_FLASH0_DEV = {
#if (defined(__DOMAIN_NS) && (__DOMAIN_NS == 1))
.memory_base_ns = FLASH0_BASE_NS,
#else
.memory_base_ns = FLASH0_BASE_NS,
.memory_base_s = FLASH0_BASE_S,
#endif /* __DOMAIN_NS == 1 */
.data = &(ARM_FLASH0_DEV_INFO)
};
struct emulated_flash_dev_t * FLASH0_DEV = &ARM_FLASH0_DEV;
/*
* Functions
*/
static int32_t ARM_Flash_FLASH0_ReadData(uint32_t addr, void * data, uint32_t cnt)
{
/* Conversion between data items and bytes */
cnt *= data_width_byte[DriverCapabilities.data_width];
enum emulated_flash_error_t rc = emulated_flash_read_data(FLASH0_DEV, addr, data, cnt);
if (EMULATED_FLASH_ERR_NONE == rc)
{
cnt /= data_width_byte[DriverCapabilities.data_width];
return cnt;
}
else if (EMULATED_FLASH_ERR_INVALID_PARAM == rc)
{
return ARM_DRIVER_ERROR_PARAMETER;
}
else
{
return ARM_DRIVER_ERROR;
}
}
static int32_t ARM_Flash_FLASH0_ProgramData(uint32_t addr, const void * data, uint32_t cnt)
{
/* Conversion between data items and bytes */
cnt *= data_width_byte[DriverCapabilities.data_width];
enum emulated_flash_error_t rc = emulated_flash_program_data(FLASH0_DEV, addr, data, cnt);
if (EMULATED_FLASH_ERR_NONE == rc)
{
cnt /= data_width_byte[DriverCapabilities.data_width];
return (int32_t) cnt;
}
else if (EMULATED_FLASH_ERR_INVALID_PARAM == rc)
{
return ARM_DRIVER_ERROR_PARAMETER;
}
else if (EMULATED_FLASH_NOT_READY == rc)
{
return ARM_DRIVER_ERROR;
}
else
{
return ARM_DRIVER_ERROR;
}
}
static int32_t ARM_Flash_FLASH0_EraseSector(uint32_t addr)
{
enum emulated_flash_error_t rc = emulated_flash_erase_sector(FLASH0_DEV, addr);
if (EMULATED_FLASH_ERR_NONE == rc)
{
return ARM_DRIVER_OK;
}
else if (EMULATED_FLASH_ERR_INVALID_PARAM == rc)
{
return ARM_DRIVER_ERROR_PARAMETER;
}
else
{
return ARM_DRIVER_ERROR;
}
}
static int32_t ARM_Flash_FLASH0_EraseChip(void)
{
emulated_flash_erase_chip(FLASH0_DEV);
return ARM_DRIVER_OK;
}
static ARM_FLASH_INFO * ARM_Flash_FLASH0_GetInfo(void)
{
return &ARM_FLASH0_DEV_INFO;
}
static ARM_FLASH_STATUS ARM_Flash_FLASH0_GetStatus(void)
{
return FlashStatus_FLASH0;
}
ARM_DRIVER_FLASH Driver_FLASH0 = { ARM_Flash_GetVersion, ARM_Flash_GetCapabilities, ARM_Flash_Initialize,
ARM_Flash_Uninitialize, ARM_Flash_PowerControl, ARM_Flash_FLASH0_ReadData,
ARM_Flash_FLASH0_ProgramData, ARM_Flash_FLASH0_EraseSector, ARM_Flash_FLASH0_EraseChip,
ARM_Flash_FLASH0_GetStatus, ARM_Flash_FLASH0_GetInfo };
#endif /* RTE_FLASH0 */