/* * 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 #include #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 */