/*
 * $Log:   V:/Flite/archives/TrueFFS5/Src/DOC2EXB.H_V  $
 * 
 *    Rev 1.11   Apr 15 2002 07:35:22   oris
 * Make sure all relevant structures will allow easy little endian conversion.
 * 
 *    Rev 1.10   Feb 19 2002 20:58:38   oris
 * Moved include directive and routine  prototypes to C file.
 * 
 *    Rev 1.9   Jan 21 2002 20:44:12   oris
 * Added DiskOnChip Millennium Plus 16MB firmware family definition.
 * 
 *    Rev 1.8   Jan 17 2002 22:58:42   oris
 * Added INFTL_NEAR_HEAP_SIZE, FIRMWARE_NO_MASK, STRONG_ARM_IPL  definitions.
 * Removed different firmware STACK sizes.
 * Added parameter to getExbInfo() (firmware add to).
 * Added tffsFarHeapSize to exbStruct record.
 * 
 *    Rev 1.7   Jul 13 2001 01:01:06   oris
 * Added constant stack space for each of the different DiskOnChip.
 * 
 *    Rev 1.6   Jun 17 2001 08:17:24   oris
 * Changed placeExbByBuffer exbflags argument to word instead of byte to  support /empty flag.
 * Added LEAVE_EMPTY and EXB_IN_ROM flags.
 * 
 *    Rev 1.5   Apr 09 2001 15:05:14   oris
 * End with an empty line.
 * 
 *    Rev 1.4   Apr 03 2001 14:39:54   oris
 * Add iplMod512 and splMod512 fields to the exbStruct record.
 *
 *    Rev 1.3   Apr 02 2001 00:56:48   oris
 * Added EBDA_SUPPORT flag.
 * Bug fix of NO_PNP_HEADER flag.
 * Changed ifdef of h file from doc2hdrs_h to doc2exb_h.
 *
 *    Rev 1.2   Apr 01 2001 07:50:00   oris
 * Updated copywrite notice.
 * Changed LEmin to dword
 * Added DOC2300_FAMILY_FIRMWARE firmware types.
 *
 *    Rev 1.1   Feb 08 2001 10:32:06   oris
 * Seperated file signature into 2 fields signature and TrueFFS vesion to make it eligned
 *
 *    Rev 1.0   Feb 02 2001 13:10:58   oris
 * Initial revision.
 *
 */


/***********************************************************************************/
/*                        M-Systems Confidential                                   */
/*           Copyright (C) M-Systems Flash Disk Pioneers Ltd. 1995-2001            */
/*                         All Rights Reserved                                     */
/***********************************************************************************/
/*                            NOTICE OF M-SYSTEMS OEM                              */
/*                           SOFTWARE LICENSE AGREEMENT                            */
/*                                                                                 */
/*      THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE                 */
/*      AGREEMENT BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT           */
/*      FOR THE SPECIFIC TERMS AND CONDITIONS OF USE,                              */
/*      OR CONTACT M-SYSTEMS FOR LICENSE ASSISTANCE:                               */
/*      E-MAIL = info@m-sys.com                                                    */
/***********************************************************************************/

/*****************************************************************************
* File Header                                                                *
* -----------                                                                *
* Project : TrueFFS source code                                              *
*                                                                            *
* Name : doc2exb.h                                                           *
*                                                                            *
* Description : M-Systems EXB firmware files and media definitions and       *
*               data structures                                              *
*                                                                            *
*****************************************************************************/

#ifndef DOC2EXB_H
#define DOC2EXB_H

#include "docbdk.h"

#ifdef BDK_ACCESS
extern BDKVol*  bdkVol;         /* pointer to current binary partition */
#endif

/**********************************/
/* EXB file structure definitions */
/**********************************/

/* EXB Flag definitions */
#define INSTALL_FIRST     1
#define EXB_IN_ROM        2
#define QUIET             4
#define INT15_DISABLE     8
#define FLOPPY            0x10
#define SIS5598           0x20
#define EBDA_SUPPORT      0x40
#define NO_PNP_HEADER     0x80
#define LEAVE_EMPTY       0x100 
#define FIRMWARE_NO_MASK  0xd00 /* Up to 8 firmwares */
#define FIRMWARE_NO_SHIFT 9

/* Firmware types */
#define DOC2000_FAMILY_FIRMWARE      1
#define DOCPLUS_FAMILY_FIRMWARE      2
#define DOC2300_FAMILY_FIRMWARE      3
#define DOCPLUS_INT1_FAMILY_FIRMWARE 4

/* Firmware stack constant */
#ifdef VERIFY_WRITE
#define INFTL_NEAR_HEAP_SIZE sizeof(FLBuffer)+(SECTOR_SIZE<<1)+READ_BACK_BUFFER_SIZE
#else
#define INFTL_NEAR_HEAP_SIZE sizeof(FLBuffer)+(SECTOR_SIZE<<1)
#endif /* VERIFY_WRITE */
#define DEFAULT_DOC_STACK 2*1024

/*General definitions */
#define MAX_CODE_MODULES        6
#define ANAND_MARK_ADDRESS      0x406
#define ANAND_MARK_SIZE         2
#define EXB_SIGN_OFFSET         8
#define INVALID_MODULE_NO       0xff
#define SIGN_SPL                "„¨¬ "    /* EXB binary signature */
#define SIGN_MSYS               "OSAK"    /* EXB file signature   */
#define SIGN_MSYS_SIZE          4
/* File specific record specifing data for all firmwares in the file */

typedef struct {
  byte  mSysSign[SIGN_MSYS_SIZE];       /* identification signature */
  byte  osakVer[SIGN_MSYS_SIZE];        /* identification signature */
  LEmin fileSize;                       /* Total file size */
  LEmin noOfFirmwares;                  /* Number of firmware supported by this file */
} ExbGlobalHeader;
/*-------------------------------------*/

/* File specific record specifing data for a specific firmwares in the file */

typedef struct {
  LEmin type;                           /* Firmware type (must fit the H/W)  */
  LEmin startOffset;                    /* Firmware start offset in the file */
  LEmin endOffset;                      /* Firmware end offset in the file   */
  LEmin splStartOffset;                 /* SPL start offset in the file      */
  LEmin splEndOffset;                   /* SPL end offset in the file        */
} FirmwareHeader;
/*-------------------------------------*/

/* data structure representing BIOS extention header */

typedef struct{
  unsigned char  signature[2]; /* BIOS extention signature (0xAA55) */
  unsigned char  lenMod512; /* length in unsigned chars modulo 512 */
} BIOSHeader;
/*-------------------------------------*/

/* data structure representing IPL header */

typedef struct{
  BIOSHeader     biosHdr;
  byte           jmpOpcode[3];     /* jmp start_of_code                      */
  byte           dummy;            /* dummy byte                             */
  byte           msysStr[17];      /* ORG  7h ManStr DB '(C)M-Systems1998',0 */
  word           pciHeader;        /* ORG 18h   ; PCI header                 */
  word           pnpHeader;        /* ORG 1Ah   ; P&P header                 */
  byte           dummy0[4];        /* Actual address must be shifted by 4 '0'*/
  LEushort       windowBase;       /* ORG 20h   ; explicit DOC window base   */
  Unaligned      spl_offset;       /* DFORMAT !!!                            */
  Unaligned      spl_size;         /* spl actual size                        */
  byte           spl_chksum;       /* 55                                     */
} IplHeader;
/*-------------------------------------*/

/* data structure representing SPL header */

typedef struct{
  unsigned char  jmpOpcode[2];
  BIOSHeader     biosHdr;
      /* Note: At run-time biosHdr.lenMod512 contains size of entire DOC 2000
      boot area modulo 512 as set by DFORMAT  */
  Unaligned      runtimeID;        /* filled in by DFORMAT  */
  Unaligned      tffsHeapSize;     /* filled in by DFORMAT  */
  unsigned char  chksumFix;        /* changed by DFORMAT */
  unsigned char  version;
  unsigned char  subversion;
  char           copyright[29];    /* "SPL_DiskOnChip (c) M-Systems", 0 */
  Unaligned      windowBase;       /* filled in by DFORMAT */
  Unaligned4     exbOffset;        /* filled in by DFORMAT */
} SplHeader;
/*------------------------------------- */

/* data structure representing TFFS header */

typedef struct{
  BIOSHeader     biosHdr;
  unsigned char  jmpOpcode[3];
  char           tffsId[4];         /* "TFFS" */
  unsigned char  exbFlags;          /* filled in by writeExbDriverImage() */
  Unaligned      heapLen;           /* not used for now */
  Unaligned      windowBase;        /* passed by SPL and saved here */
  unsigned char  chksumFix;         /* changed by writeExbDriverImage() */
  Unaligned      runtimeID;         /* passed by SPL and saved here */
  unsigned char  firstDiskNumber;   /* filled in............  */
  unsigned char  lastDiskNumber;    /* ..........at run-time */
  Unaligned      versionNo;         /* filled in at run-time */
} TffsHeader;
/* ------------------------------------- */

/* data structure representing Socket Services  header */

typedef struct{
  BIOSHeader     biosHdr;
  unsigned char  jmpOpcode[3];
  char           tffsId[4];         /* "TFFS" */
  unsigned char  exbFlags;          /* filled in by writeExbDriverImage() */
  unsigned char  heapLen;           /* not used for now */
  Unaligned      windowBase;        /* filled in at run-time */
  unsigned char  chksumFix;         /* changed by writeExbDriverImage() */
} SSHeader;
/* ------------------------------------- */

/* Work space for writting the exb file */

typedef struct{
  word  exbFlags;            /* For the complete list see doc2hdrs.h     */
  word  iplMod512;           /* Size of the IPL module divided by 512    */
  word  splMod512;           /* Size of the SPL module divided by 512    */
  dword splMediaAddr;        /* Start of the SPL module media address    */
  dword ssMediaAddr;         /* Start of the SS module media address     */
  dword exbRealSize;         /* Actual binary area + bad blocks          */
  word  moduleLength;        /* Length of the modules in divided by 512  */
  dword tffsHeapSize;        /* TFFS needed heap size                    */
  word  tffsFarHeapSize;     /* TFFS needed far heap size                */
  word  bufferOffset;        /* Curret Offset inside the internal buffer */
  dword exbFileEnd;          /* Offset of the last Byte of the files     */
  dword exbFileOffset;       /* Current Offset inside the EXB file       */
  dword splStart;            /* First SPL byte offset                    */
  dword splEnd;              /* Last SPL byte offset                     */
  dword firmwareEnd;         /* End offset of the specific firmware      */
  dword firmwareStart;       /* Start offset of the specific firmware    */
  FLBuffer *buffer;          /* Internal 512 byte buffer                 */
} exbStruct;

#endif /* DOC2EXB_H */
