/*
 * Copyright (c) 2010-2018 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.
 */
 /**
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "memory_wrapper.h"

#define VERS 1 // Interface Version 1.01


#define UNKNOWN 0  // Unknown
#define ONCHIP 1   // On-chip Flash Memory
#define EXT8BIT 2  // External Flash Device on 8-bit  Bus
#define EXT16BIT 3 // External Flash Device on 16-bit Bus
#define EXT32BIT 4 // External Flash Device on 32-bit Bus
#define EXTSPI 5   // External Flash Device on SPI


#define SECTOR_NUM 512 // Max Number of Sector Items
#define PAGE_MAX 65536 // Max Page Size for Programming

struct FlashSectors
{
  unsigned long szSector;   // Sector Size in Bytes
  unsigned long AddrSector; // Address of Sector
};

#define SECTOR_END 0xFFFFFFFF, 0xFFFFFFFF

struct FlashDevice
{
  unsigned short Vers;    // Version Number and Architecture
  char DevName[128];      // Device Name and Description
  unsigned short DevType; // Device Type: ONCHIP, EXT8BIT, EXT16BIT, ...
  unsigned long DevAdr;   // Default Device Start Address
  unsigned long szDev;    // Total Size of Device
  unsigned long szPage;   // Programming Page Size
  unsigned long Res;      // Reserved for future Extension
  unsigned char valEmpty; // Content of Erased Memory

  unsigned long toProg;  // Time Out of Program Page Function
  unsigned long toErase; // Time Out of Erase Sector Function

  struct FlashSectors sectors[SECTOR_NUM];
};

#define FLASH_DRV_VERS (0x0100 + VERS) // Driver Version, do not modify!

// Flash Programming Functions (Called by FlashOS)
extern KeepInCompilation int Init(unsigned long adr, // Initialize Flash
                unsigned long clk,
                unsigned long fnc);
extern KeepInCompilation int UnInit(unsigned long fnc);    // De-initialize Flash
extern KeepInCompilation int BlankCheck(unsigned long adr, // Blank Check
                      unsigned long sz,
                      unsigned char pat);
extern KeepInCompilation int EraseChip(void);                // Erase complete Device
extern KeepInCompilation int EraseSector(unsigned long adr); // Erase Sector Function
extern KeepInCompilation int ProgramPage(unsigned long adr,  // Program Page Function
                       unsigned long sz,
                       unsigned char *buf);
extern KeepInCompilation unsigned long Verify(unsigned long adr, // Verify Function
                            unsigned long sz,
                            unsigned char *buf);
