/* <St> *******************************************************************
  cifdev_i.h

  -------------------------------------------------------------------------
  CREATETED     : D. Tsaava,  Hilscher GmbH
  DATE          : 18.07.2000
  PROJEKT       : CIF device driver
  =========================================================================

  DISCRIPTION

    Internal driver interface definition

  =========================================================================

  CHANGES

  version name        date        Discription                  
                   March 2001
    		      Juli  2004     Redesigned for the 2.6 Kernel
  		                     Copyright changed to GNU Lesser GPL
 -------------------------------------------------------------------------
  V2.601

  NOTE: as groundwork for this header served Windows version of 
        the CIF device driver

  ======================== Copyright =====================================

  Copyright (C) 2004  Hilscher GmbH

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
   
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

  ========================================================================
******************************************************************** <En> */
#ifndef CIFDEV_I_H
# define CIFDEV_I_H

#ifdef _cplusplus
  extern "C" {
#endif  /* _cplusplus */

#ifndef	_GNUC_
#    define  _GNUC_
#endif	/* _GNUC_ */

/* ------------------------------------------------------------------------------------ */
/*  global definitions                                                                  */
/* ------------------------------------------------------------------------------------ */

#define MAX_DEV_BOARDS              4       // maximum numbers of boards

/* ------------------------------------------------------------------------------------ */
/*  driver errors                                                                       */
/* ------------------------------------------------------------------------------------ */

#define DRV_NO_ERROR                 0      // no error
#define DRV_BOARD_NOT_INITIALIZED   -1      // DRIVER board not initialized
#define DRV_INIT_STATE_ERROR        -2      // DRIVER error in internal init state
#define DRV_READ_STATE_ERROR        -3      // DRIVER error in internal read state
#define DRV_CMD_ACTIVE              -4      // DRIVER command on this chanal is activ
#define DRV_PARAMETER_UNKNOWN       -5      // DRIVER unknown parameter in function occured
#define DRV_WRONG_DRIVER_VERSION    -6      // DRIVER driver version is incompatible with DLL

#define DRV_PCI_SET_CONFIG_MODE     -7      // DRIVER error during PCI set config mode
#define DRV_PCI_READ_DPM_LENGTH     -8      // DRIVER could not read PCI DPM length
#define DRV_PCI_SET_RUN_MODE        -9      // DRIVER error during PCI set run mode

#define DRV_DEV_DPM_ACCESS_ERROR    -10     // DEVICE dual port ram not accessable
#define DRV_DEV_NOT_READY           -11     // DEVICE not ready (ready flag failed)
#define DRV_DEV_NOT_RUNNING         -12     // DEVICE not running (running flag failed)
#define DRV_DEV_WATCHDOG_FAILED     -13     // DEVICE watch dog test failed
#define DRV_DEV_OS_VERSION_ERROR    -14     // DEVICE signals wrong OS version
#define DRV_DEV_SYSERR              -15     // DEVICE error in dual port flags
#define DRV_DEV_MAILBOX_FULL        -16     // DEVICE send mailbox is full
#define DRV_DEV_PUT_TIMEOUT         -17     // DEVICE PutMessage timeout
#define DRV_DEV_GET_TIMEOUT         -18     // DEVICE GetMessage timeout
#define DRV_DEV_GET_NO_MESSAGE      -19     // DEVICE no message available
#define DRV_DEV_RESET_TIMEOUT       -20     // DEVICE RESET command timeout
#define DRV_DEV_NO_COM_FLAG         -21     // DEVICE COM-flag not set
#define DRV_DEV_EXCHANGE_FAILED     -22     // DEVICE IO data exchange failed
#define DRV_DEV_EXCHANGE_TIMEOUT    -23     // DEVICE IO data exchange timeout
#define DRV_DEV_COM_MODE_UNKNOWN    -24     // DEVICE IO data mode unknown
#define DRV_DEV_FUNCTION_FAILED     -25     // DEVICE Function call failed
#define DRV_DEV_DPMSIZE_MISMATCH    -26     // DEVICE DPM size differs from configuration
#define DRV_DEV_STATE_MODE_UNKNOWN  -27     // DEVICE State mode unknown

// Error from Interface functions
#define DRV_USR_OPEN_ERROR          -30     // USER driver not opened
#define DRV_USR_INIT_DRV_ERROR      -31     // USER can't connect with DEV board
#define DRV_USR_NOT_INITIALIZED     -32     // USER board not initialized
#define DRV_USR_COMM_ERR            -33     // USER IOCTRL function faild
#define DRV_USR_DEV_NUMBER_INVALID  -34     // USER parameter for DEV number invalid
#define DRV_USR_INFO_AREA_INVALID   -35     // USER parameter InfoArea unknown
#define DRV_USR_NUMBER_INVALID      -36     // USER parameter Number invalid
#define DRV_USR_MODE_INVALID        -37     // USER parameter Mode invalid
#define DRV_USR_MSG_BUF_NULL_PTR    -38     // USER NULL pointer assignment
#define DRV_USR_MSG_BUF_TOO_SHORT   -39     // USER Messagebuffer too short
#define DRV_USR_SIZE_INVALID        -40     // USER size parameter invalid
#define DRV_USR_SIZE_ZERO           -42     // USER size parameter with zero length
#define DRV_USR_SIZE_TOO_LONG       -43     // USER size parameter too long
#define DRV_USR_DEV_PTR_NULL        -44     // USER device address null pointer
#define DRV_USR_BUF_PTR_NULL        -45     // USER pointer to buffer is a null pointer

#define DRV_USR_SENDSIZE_TOO_LONG   -46     // USER SendSize parameter too long
#define DRV_USR_RECVSIZE_TOO_LONG   -47     // USER ReceiveSize parameter too long
#define DRV_USR_SENDBUF_PTR_NULL    -48     // USER pointer to buffer is a null pointer
#define DRV_USR_RECVBUF_PTR_NULL    -49     // USER pointer to buffer is a null pointer

#define DRV_DEV_NO_VIRTUAL_MEM      -60     // DEVICE Virtual memory not available
#define DRV_DEV_UNMAP_VIRTUAL_MEM   -61     // DEVICE Unmap virtual memory failed
#define DRV_DEV_REQUEST_IRQ_FAILED  -62     // DEVICE Request irq failed

#define DRV_USR_FILE_OPEN_FAILED    -100    // USER file not opend
#define DRV_USR_FILE_SIZE_ZERO      -101    // USER file size zero
#define DRV_USR_FILE_NO_MEMORY      -102    // USER not enough memory to load file
#define DRV_USR_FILE_READ_FAILED    -103    // USER file read failed
#define DRV_USR_INVALID_FILETYPE    -104    // USER file type invalid
#define DRV_USR_FILENAME_INVALID    -105    // USER file name not valid

#define DRV_RCS_ERROR_OFFSET       1000     // RCS error number start


/* ------------------------------------------------------------------------------------ */
/*  message definition                                                                  */
/* ------------------------------------------------------------------------------------ */

#ifdef		_GNUC_
#  ifndef	PACKED
#    define	PACKED	__attribute__((packed, aligned(1)))
#  endif	/* PACKED */
#else
#  define	PACKED
#endif

#ifndef CIFUSER_H_INCLUDED
// max. length is 255 + 8 Bytes
typedef struct tagMSG_STRUC {
  unsigned char   rx        PACKED;
  unsigned char   tx        PACKED;
  unsigned char   ln        PACKED;
  unsigned char   nr        PACKED;
  unsigned char   a         PACKED;
  unsigned char   f         PACKED;
  unsigned char   b         PACKED;
  unsigned char   e         PACKED;
  unsigned char   data[255] PACKED;
  unsigned char   dummy[25] PACKED;      
} MSG_STRUC;
#endif

/* ------------------------------------------------------------------------------------ */
/* DEV DPM DATA structures                                                              */
/* ------------------------------------------------------------------------------------ */

#ifndef CIFUSER_H_INCLUDED
typedef struct tagIOINFO {
  unsigned char   bComBit          PACKED;
  unsigned char   bIOExchangeMode  PACKED;
  unsigned long   ulIOExchangeCnt  PACKED;
} IOINFO;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagVERSIONINFO {             /* DEV serial number and OS versions           */
  unsigned long   ulDate PACKED    PACKED;
  unsigned long   ulDeviceNo       PACKED;
  unsigned long   ulSerialNo       PACKED;
  unsigned long   ulReserved       PACKED;
  unsigned char   PcOsName0[4]     PACKED;
  unsigned char   PcOsName1[4]     PACKED;
  unsigned char   PcOsName2[4]     PACKED;
  unsigned char   OemIdentifier[4] PACKED;
} VERSIONINFO;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagFIRMWAREINFO {
  unsigned char   FirmwareName[16]     PACKED;
  unsigned char   FirmwareVersion[16]  PACKED;
} FIRMWAREINFO;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagTASKSTATE {
  unsigned char   TaskState[64]    PACKED;
} TASKSTATE;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagTASKPARAM {
  unsigned char   TaskParameter[64] PACKED;
} TASKPARAM;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagRAWDATA {
  unsigned char   abRawData[1022] PACKED;
} RAWDATA;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagTASKINFO {
  struct {
    char           TaskName[8]   PACKED;          /* Task name            */
    unsigned short Version       PACKED;          /* Task version         */
    unsigned char  TaskCondition PACKED;
    unsigned char  reserved[5]   PACKED;          /* n.c.                 */
  } tInfo [7];
} TASKINFO;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagRCSINFO {
  unsigned short   RcsVersion   PACKED;           /* Operationsystem Version */
  unsigned char    RcsError     PACKED;
  unsigned char    HostWatchDog PACKED;
  unsigned char    DevWatchDog  PACKED;
  unsigned char    SegmentCount PACKED;
  unsigned char    DeviceAdress PACKED;
  unsigned char    DriverType   PACKED;
} RCSINFO;
#endif

#ifndef CIFUSER_H_INCLUDED
typedef struct tagDEVINFO {
  unsigned char    DpmSize          PACKED;
  unsigned char    DevType          PACKED;
  unsigned char    DevModel         PACKED;
  unsigned char    DevIdentifier[3] PACKED;
} DEVINFO;
#endif

/* ------------------------------------------------------------------------------------ */
/*  driver info structure definitions                                                   */
/* ------------------------------------------------------------------------------------ */

// Board information structure
#ifndef CIFUSER_H_INCLUDED
typedef struct tagBOARD_INFO{
  unsigned char   abDriverVersion[16] PACKED; // DRV driver information string
  struct {
    unsigned short  usBoard           PACKED; // DRV board number
    unsigned short  usAvailable       PACKED; // DRV board is available
    unsigned long   ulPhysicalAddress PACKED; // DRV physical DPM address
    unsigned short  usIrq             PACKED; // DRV irq number
  } tBoard [MAX_DEV_BOARDS];
  unsigned short    usBoards_detected PACKED;
} BOARD_INFO;
#endif

// Driver information structure
#ifndef CIFUSER_H_INCLUDED
typedef struct tagDRIVERINFO{
  unsigned long      OpenCnt      PACKED;     // number of driver open
  unsigned long      CloseCnt     PACKED;     // number of driver close
  unsigned long      ReadCnt      PACKED;     // number of DevGetMessage commands
  unsigned long      WriteCnt     PACKED;     // number of DevPutMessage commands
  unsigned long      IRQCnt       PACKED;     // number of IRQs
  unsigned char      InitMsgFlag  PACKED;     // DPM state init
  unsigned char      ReadMsgFlag  PACKED;     // DPM state read  message
  unsigned char      WriteMsgFlag PACKED;     // DPM state write message
  unsigned char      LastFunction PACKED;     // DRV last function in driver
  unsigned char      WriteState   PACKED;     // DRV actual write state
  unsigned char      ReadState    PACKED;     // DRV actual read state
  unsigned char      HostFlags    PACKED;     // DPM HostFlags (PcFlags)
  unsigned char      MyDevFlags   PACKED;     // DPM (internal) DevFlags
  unsigned char      ExComBit     PACKED;     // COM bit
  unsigned long      ExIOCnt      PACKED;     // IO data exchange count
} DRIVERINFO;
#endif

// Extended board information structure
#ifndef CIFUSER_H_INCLUDED
typedef struct tagBOARD_INFOEX{
  unsigned char       abDriverVersion[16] PACKED;   // DRV driver information string
  struct {
    unsigned short    usBoard             PACKED;   // DRV board number
    unsigned short    usAvailable         PACKED;   // DRV board is available
    unsigned long     ulPhysicalAddress   PACKED;   // DRV physical DPM address
    unsigned short    usIrq               PACKED;   // DRV irq number
    DRIVERINFO        tDriverInfo         PACKED;   // Driver information
    FIRMWAREINFO      tFirmware           PACKED;
    DEVINFO           tDeviceInfo         PACKED;
    RCSINFO           tRcsInfo            PACKED;
    VERSIONINFO       tVersion            PACKED;
  } tBoard [MAX_DEV_BOARDS];
} BOARD_INFOEX;
#endif

// State field structure
#ifndef CIFUSER_H_INCLUDED
typedef struct tagCOMSTATE {
  unsigned short      usMode      PACKED;       // Actual STATE mode
  unsigned short      usStateFlag PACKED;       // State flag
  unsigned char       abState[64] PACKED;       // State area
} COMSTATE;
#endif

// state information in bLastFunction
#define  FKT_OPEN       1;
#define  FKT_CLOSE      2;
#define  FKT_READ       3;
#define  FKT_WRITE      4;
#define  FKT_IO         5;
// state information in bWriteState and bReadState
#define  STATE_IN       0x01;
#define  STATE_WAIT     0x02;
#define  STATE_OUT      0x03;
#define  STATE_IN_IRQ   0x04;

/* ------------------------------------------------------------------------------------ */
/*  IOCTRL data structures                                                              */
/* ------------------------------------------------------------------------------------ */

// IOCTRL funktion defines, always step 8
/*
 * Ioctl definitions
 */

/* Use 'c' as magic number */
#define CIF_IOC_MAGIC         'c'

#define CIF_IOCRESET          _IO(CIF_IOC_MAGIC, 0)

#define CIF_IOCTLNOFUNCTION   _IO  (CIF_IOC_MAGIC, 0)
#define CIF_IOCTLBOARDINFO    _IOWR(CIF_IOC_MAGIC, 1, char[256])
#define CIF_IOCTLINITDRV      _IOWR(CIF_IOC_MAGIC, 2, char[13])
#define CIF_IOCTLPARAMETER    _IOW (CIF_IOC_MAGIC, 3, char[71])
#define CIF_IOCTLRESETDEV     _IOW (CIF_IOC_MAGIC, 4, char[13])
#define CIF_IOCTLPUTMSG       _IO  (CIF_IOC_MAGIC, 5)
#define CIF_IOCTLGETMSG       _IO  (CIF_IOC_MAGIC, 6)
#define CIF_IOCTLTASKSTATE    _IO  (CIF_IOC_MAGIC, 7)
#define CIF_IOCTLMBXINFO      _IO  (CIF_IOC_MAGIC, 8)
#define CIF_IOCTLTRIGGERWD    _IO  (CIF_IOC_MAGIC, 9)
#define CIF_IOCTLGETINFO      _IO  (CIF_IOC_MAGIC, 10)
#define CIF_IOCTLEXITDRV      _IO  (CIF_IOC_MAGIC, 11)
#define CIF_IOCTLGETPARAMETER _IO  (CIF_IOC_MAGIC, 12)
#define CIF_IOCTLEXIO         _IO  (CIF_IOC_MAGIC, 13)
#define CIF_IOCTLSETHOST      _IO  (CIF_IOC_MAGIC, 14)
#define CIF_IOCTLREADSEND     _IO  (CIF_IOC_MAGIC, 15)
#define CIF_IOCTLEXTDATA      _IO  (CIF_IOC_MAGIC, 16)
#define CIF_IOCTLGETMBX       _IO  (CIF_IOC_MAGIC, 17)
#define CIF_IOCTLBOARDINFOEX  _IO  (CIF_IOC_MAGIC, 18)

#define CIF_IOCTLEXIOEX       _IO  (CIF_IOC_MAGIC, 19)
#define CIF_IOCTLEXIOERR      _IO  (CIF_IOC_MAGIC, 20)
#define CIF_IOCTLRWRAW        _IO  (CIF_IOC_MAGIC, 21)
#define CIF_IOCTLSPCONTROL    _IO  (CIF_IOC_MAGIC, 22)
#define CIF_IOCTLGETDPMPTR    _IO  (CIF_IOC_MAGIC, 23)
#define CIF_IOCTLRWDPMDATA    _IO  (CIF_IOC_MAGIC, 24)

#define CIF_IOCTL_IRQ_POLL    _IOWR(CIF_IOC_MAGIC, 25, char[13])

#define CIF_IOC_MAXNR   25

// interface structure for ioctl's
typedef struct cif_ioctl_data {
  unsigned long   lInpBuffLen PACKED;
  unsigned long   lOutBuffLen PACKED;
  unsigned char  *pInpBuff    PACKED;
  unsigned char  *pOutBuff    PACKED;
} cif_ioctl_data;

// SET BOARD OPERATION MODE
typedef struct tagDEVIO_SETOPMODE {
  unsigned short  usBoard PACKED; 
  unsigned short  usMode  PACKED;               // Interrupt/polling mode
  unsigned short  usIrq   PACKED;
  short           sError  PACKED;
} DEVIO_SETOPMODE;

// GETBOARDINFORMATION
typedef struct tagDEVIO_GETBOARDINFOCMD {
  unsigned short   usDevNumber  PACKED;         // n.a.
  unsigned short   usInfoLen    PACKED;         // Information length
  BOARD_INFO      *ptBoardInfo  PACKED;
  short            sError       PACKED;
} DEVIO_GETBOARDINFOCMD;

// Extnded GETBOARDINFORMATION
typedef struct tagDEVIO_GETBOARDINFOEXCMD {
  unsigned short  usDevNumber PACKED;           // n.a.
  unsigned short  usInfoLen   PACKED;           // Information length
  BOARD_INFOEX  * ptBoard     PACKED;
  short           sError      PACKED;
} DEVIO_GETBOARDINFOEXCMD;

// RESETDEV

#define COLDSTART 2
#define WARMSTART 3
#define BOOTSTART 4

typedef struct tagDEVIO_RESETCMD {
  unsigned short   usBoard   PACKED;            // DEV board number
  unsigned short   usMode    PACKED;            // DEV function
  unsigned long    ulTimeout PACKED;            // Service timeout
  unsigned long    ulDpmSize PACKED;
  short            sError    PACKED;
} DEVIO_RESETCMD;

// PUTTASKPARAMETER
typedef struct tagDEVIO_PUTPARAMETERCMD {
  unsigned short   usBoard           PACKED;    // DEV board number
  unsigned short   usTaskParamNum    PACKED;    // Number of the parameter area
  unsigned short   usTaskParamLen    PACKED;    // Lenght of parameter data
  unsigned char    TaskParameter[64] PACKED;
  short            sError            PACKED;
} DEVIO_PUTPARAMETERCMD;

// PUTMESSAGE
typedef struct tagDEVIO_PUTMESSAGECMD {
  unsigned short  usBoard   PACKED;             // DEV board number
  MSG_STRUC       tMsg      PACKED;             // Message data
  unsigned long   ulTimeout PACKED;             // Service timeout
  short           sError    PACKED;
} DEVIO_PUTMESSAGECMD;

// GETMESSAGE
typedef struct tagDEVIO_GETMESSAGECMD {
  unsigned short  usBoard   PACKED;             // DEV board number
  unsigned long   ulTimeout PACKED;             // Service timeout
  unsigned long   ulMsgSize PACKED;             // User message buffer size
  MSG_STRUC       tMsg      PACKED;             // Message data
  short           sError    PACKED;
} DEVIO_GETMESSAGECMD;

// GETTASKSTATE
typedef struct tagDEVIO_GETTASKSTATECMD {
  unsigned char   ucBoard       PACKED;         // DEV board number
  unsigned short  usStateNum    PACKED;         // Task state field number
  unsigned short  usStateLen    PACKED;         // Lenght of state data
  unsigned char   TaskState[64] PACKED;
  short           sError        PACKED;
} DEVIO_GETTASKSTATECMD;

// DEVMBXINFO

#define DEVICE_MBX_EMPTY    0
#define DEVICE_MBX_FULL     1
#define HOST_MBX_EMPTY      0
#define HOST_MBX_FULL       1
#define HOST_MBX_SYSERR     2

typedef struct tagDEVIO_MBXINFOCMD {
  unsigned char   ucBoard        PACKED;        // DEV board number
  unsigned short  usDevMbxState  PACKED;        // State of the device mailbox
  unsigned short  usHostMbxState PACKED;        // State of the host mailbox
  short           sError         PACKED;
} DEVIO_MBXINFOCMD;

// Board operation mode
#define POLLING_MODE        0
#define INTERRUPT_MODE      1

// TRIGGERWATCHDOG  and SETHOSTSTATE
#define WATCHDOG_STOP          0
#define WATCHDOG_START         1
#define HOST_NOT_READY         0
#define HOST_READY             1
#define SPECIAL_CONTROL_CLEAR  0
#define SPECIAL_CONTROL_SET    1

typedef struct tagDEVIO_TRIGGERCMD {
  unsigned short  usBoard        PACKED;        // DEV board number
  unsigned short  usMode         PACKED;        // DEV function
  unsigned long   ulTimeout      PACKED;        // DEV timeout
  unsigned short  usTriggerValue PACKED;        // DEV trigger value
  short           sError         PACKED;
} DEVIO_TRIGGERCMD;

// GETINFO
// InfoArea definitions

#define GET_DRIVER_INFO     1
#define GET_VERSION_INFO    2
#define GET_FIRMWARE_INFO   3
#define GET_TASK_INFO       4
#define GET_RCS_INFO        5
#define GET_DEV_INFO        6
#define GET_IO_INFO         7
#define GET_IO_SEND_DATA    8

typedef struct tagDEVIO_GETDEVINFOCMD {
  unsigned short     usBoard     PACKED;        // DEV board number
  unsigned short     usInfoArea  PACKED;        // Number of info area
  unsigned short     usInfoLen   PACKED;        // Lenght of info data
  unsigned char   *  pabInfoData PACKED;        // Pointer to info data area
  short              sError      PACKED;
} DEVIO_GETDEVINFOCMD;

// EXITDRV
typedef struct tagDEVIO_EXITCMD {
  unsigned short  usBoard        PACKED;        // DEV board number
  unsigned short  usDrvOpenCount PACKED;        // dr�er opencount
  short           sError         PACKED;
} DEVIO_EXITCMD;

// GETTASKPARAMETER
typedef struct tagDEVIO_GETPARAMETERCMD {
  unsigned short  usBoard           PACKED;     // DEV board number
  unsigned short  usTaskParamNum    PACKED;     // Number of the parameter area
  unsigned short  usTaskParamLen    PACKED;     // Lenght of parameter data
  unsigned char   TaskParameter[64] PACKED;
  short           sError            PACKED;
} DEVIO_GETPARAMETERCMD;

// EXIO
typedef struct tagDEVIO_EXIOCMD {
  unsigned short usBoard         PACKED;        // DEV board number
  unsigned short usSendOffset    PACKED;        // Byte offset send data
  unsigned short usSendLen       PACKED;        // Length of send data
  unsigned char  *pabSendData    PACKED;        // Send data buffer
  unsigned short usReceiveOffset PACKED;        // Byte offset receive data
  unsigned short usReceiveLen    PACKED;        // Length of receive data
  unsigned char  *pabReceiveData PACKED;        // Receive data buffer
  unsigned long  ulTimeout       PACKED;        // Service timeout
  short          sError          PACKED;
} DEVIO_EXIOCMD;

// EXIOEX
typedef struct tagDEVIO_EXIOCMDEX {
  unsigned short     usBoard         PACKED;    // DEV board number
  unsigned short     usSendOffset    PACKED;    // Byte offset send data
  unsigned short     usSendLen       PACKED;    // Length of send data
  unsigned char   *  pabSendData     PACKED;    // Send data buffer
  unsigned short     usReceiveOffset PACKED;    // Byte offset receive data
  unsigned short     usReceiveLen    PACKED;    // Length of receive data
  unsigned char   *  pabReceiveData  PACKED;    // Receive data buffer
  unsigned long      ulTimeout       PACKED;    // Service timeout
  short              sError          PACKED;    // --- Equal to "ExcahangeIOCmd"
  unsigned short     usMode          PACKED;    // External exchange mode
} DEVIO_EXIOCMDEX;

// EXIOERR
#define STATE_ERR_NON       0
#define STATE_ERR           1

#define STATE_MODE_2        2
#define STATE_MODE_3        3
#define STATE_MODE_4        4

typedef struct tagDEVIO_EXIOCMDERR {
  unsigned short    usBoard         PACKED;     // DEV board number
  unsigned short    usSendOffset    PACKED;     // Byte offset send data
  unsigned short    usSendLen       PACKED;     // Length of send data
  unsigned char    *pabSendData     PACKED;     // Send data buffer
  unsigned short    usReceiveOffset PACKED;     // Byte offset receive data
  unsigned short    usReceiveLen    PACKED;     // Length of receive data
  unsigned char    *pabReceiveData  PACKED;     // Receive data buffer
  unsigned long     ulTimeout       PACKED;     // Service timeout
  short             sError          PACKED;     // --- Equal to "ExcahangeIOCmd"
  COMSTATE         *ptStateData     PACKED;     // State data buffer
} DEVIO_EXIOCMDERR;

// READIO
typedef struct tagDEVIO_READSENDCMD {
  unsigned short     usBoard      PACKED;       // DEV board number
  unsigned short     usReadOffset PACKED;       // Byte offset send/receive data
  unsigned short     usReadLen    PACKED;       // Length of send/receive data
  unsigned char   *  pabReadData  PACKED;       // Read send data buffer
  short              sError       PACKED;
} DEVIO_READSENDCMD;

// ExtData
#define EXTDATASIZE 20
typedef struct tagDEVIO_EXTDATACMD {
  unsigned short  usBoard    PACKED;           // DEV board number
  unsigned short  usMode     PACKED;           // DEV mode
  unsigned char  *pabExtData PACKED;           // DEV Extended data
  short           sError     PACKED;
} DEVIO_EXTDATACMD;

// GetMbxData
typedef struct tagDEVIO_GETMBXCMD {
  unsigned short  usBoard        PACKED;       // DEV board number
  unsigned short  usDevLen       PACKED;       // DEV length of dev data
  unsigned short  usHostLen      PACKED;       // DEV length of host data
  unsigned char   abHostMbx[288] PACKED;       // DEV pointer to host data buffer
  unsigned char   abDevMbx[288]  PACKED;       // DEV pointer to device data buffer
  short           sError         PACKED;
} DEVIO_GETMBXCMD;

// ReadWriteRawData
#define PARAMETER_READ    1
#define PARAMETER_WRITE   2
typedef struct tagDEVIO_RWRAWDATACMD {
  unsigned short  usBoard  PACKED;             // DEV board number
  unsigned short  usMode   PACKED;             // DEV read or write
  unsigned short  usOffset PACKED;             // DEV offset in the DPM last kByte
  unsigned short  usLen    PACKED;             // DEV length of data
  unsigned char   *pabData PACKED;             // DEV pointer to data buffer
  short           sError   PACKED;
} DEVIO_RWRAWDATACMD;
// ReadWriteDPMData
typedef struct tagDEVIO_RWDPMDATACMD {
  unsigned short  usBoard  PACKED;             // DEV board number
  unsigned short  usMode   PACKED;             // DEV read or write
  unsigned short  usOffset PACKED;             // DEV offset in the DPM last kByte
  unsigned short  usLen    PACKED;             // DEV length of data
  unsigned char   *pabData PACKED;             // DEV pointer to data buffer
  short           sError   PACKED;
} DEVIO_RWDPMDATACMD;


// GetDPMPtr
#define DPM_PTR_OPEN_DRV  1
#define DPM_PTR_OPEN_USR  2
#define DPM_PTR_CLOSE     3

typedef struct tagDEVIO_GETDPMPTR {
  unsigned  short  usMode     PACKED;          // DEV mode
  unsigned  short  usBoard    PACKED;          // DEV board number
  void            *pvUserData PACKED;          // DEV user data for pmi
  unsigned long   *pulDPMSize PACKED;          // DEV DPM size in bytes
  unsigned char  **pDPMBase   PACKED;          // DEV pointer to data buffer
  unsigned long    lError     PACKED;          // DEV system error
  short            sError     PACKED;          // DEV driver error
} DEVIO_GETDPMPTR;

#ifdef _cplusplus
  }
#endif

#endif /* CIFDEV_I_H */
