/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2007                         */
/***********************************************************************/
/*                                                                     */
/*  FlashOS.H:  Data structures and entries                            */
/*              for Flash Programming Functions                        */
/*                                                                     */
/***********************************************************************/

#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 int Init(unsigned long adr, // Initialize Flash
                unsigned long clk,
                unsigned long fnc);
extern int UnInit(unsigned long fnc);    // De-initialize Flash
extern int BlankCheck(unsigned long adr, // Blank Check
                      unsigned long sz,
                      unsigned char pat);
extern int EraseChip(void);                // Erase complete Device
extern int EraseSector(unsigned long adr); // Erase Sector Function
extern int ProgramPage(unsigned long adr,  // Program Page Function
                       unsigned long sz,
                       unsigned char *buf);
extern unsigned long Verify(unsigned long adr, // Verify Function
                            unsigned long sz,
                            unsigned char *buf);
