/************************************************/
/*                                              */
/* File        : rockhard.h                     */
/* Description : ROCK hardware base access      */
/*                                              */
/* Author: Sfiligoi Igor                        */
/*                                              */
/* Created      : 20.01.1997                    */
/* Last modified: 02.04.1997                    */
/*                                              */
/************************************************/

#ifndef ROCKHARD_H
#define ROCKHARD_H


/************************************************/
/*                                              */
/*   The result should be ROCKH_ERROR_OK,       */
/*   else there have been an error              */
/*   (see ROCKH_ERROR_.. constants)             */
/*   if not stated otherwise                    */
/*                                              */
/************************************************/

#define ROCKH_ERROR_OK            0     /* MUST be 0 */
#define ROCKH_ERROR_TEST          -1
#define ROCKH_ERROR_UNKNOWN       -10

/*********************************************************************/
/*                          ROCK hard id type                        */
/*********************************************************************/

typedef struct 
         {
	   int cid;			/* VME channel id  */

	   int chain;                   /* VIC chain */
	   int crate;                   /* position in the VIC chain */

	   unsigned int vme_addr;	/* VME address     */
	   unsigned int vme_am;		/* VME am          */
	   unsigned int offs;		/* ROCK offs       */
	   void *map_ptr;		/* VME map pointer */

	   unsigned int *DMAbuffer;	/* DMA buffer      */
	 } ROCKH_id_base;

typedef ROCKH_id_base *ROCKH_id;

/*********************************************************************/
/*                             readpage types                        */
/*********************************************************************/

typedef struct
         {
	   unsigned char reset;
	   unsigned char fifo;
	   unsigned char watchdog;
	   unsigned char csr0;
	   unsigned char csr1;
	   unsigned char csr2;
	   unsigned char elapsed;
	   unsigned char trigger;
         } ROCKH_INTERNAL_regs;

typedef struct
         {
	   unsigned short tque;
	   unsigned short tnow;
	   unsigned short rockinfo;
	   unsigned short golden;
         } ROCKH_INFO_regs;


#include "rockhard_private.h"

/*********************************************************************/
/*                          Query routines                           */
/*********************************************************************/

/* returns 0 if ROCK not present, 1 else */
int rockh_ispresent(int chain,                   /* IN, VIC chain */
		    int crate);                  /* IN, position in the VIC chain  */

/*********************************************************************/
/*                       Initialization routines                     */
/*********************************************************************/

int rockh_open(int chain,                   /* IN, VIC chain */
	       int crate,                   /* IN, position in the VIC chain  */
	       ROCKH_id *rock_id);          /* OUT */

  /* For test purpose only */
int rockh_open_raw(unsigned int vme_addr,       /* IN  */
		   int vme_size,                /* IN  */
		   int vme_am,                  /* IN  */
		   int offs,                    /* IN, rock offset  */
		   ROCKH_id *rock_id);          /* OUT */

int rockh_close(ROCKH_id rock_id);          /* IN  */

/*********************************************************************/
/*                       read routines                               */
/*                       return the read value                       */
/*********************************************************************/

/*  internal page */

#define rockh_read_reset(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_RESET_ofs)

#define rockh_read_fifo(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_FIFO_ofs)

#define rockh_read_watchdog(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_WATCHDOG_ofs)

#define rockh_read_csr0(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_CSR0_ofs)

#define rockh_read_csr1(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_CSR1_ofs)

#define rockh_read_csr2(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_CSR2_ofs)

#define rockh_read_elapsed(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_ELAPSED_ofs)

#define rockh_read_trigger(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg08(rock_id,ROCKH_TRIGGER_ofs)

/*  info page */

#define rockh_read_tque(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg16(rock_id,ROCKH_TQUE_ofs)

#define rockh_read_tnow(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg16(rock_id,ROCKH_TNOW_ofs)

#define rockh_read_rockinfo(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg16(rock_id,ROCKH_ROCKINFO_ofs)

#define rockh_read_golden(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg16(rock_id,ROCKH_GOLDEN_ofs)

/*  FIFO page */

#define rockh_read_efifo(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg32(rock_id,ROCKH_EFRD_ofs)

#define rockh_read_dfifo(/*ROCKH_id*/ rock_id)  /* IN  */ \
	rockh_read_reg32(rock_id,ROCKH_DFRD_ofs)

/*********************************************************************/
/*                       write routines                              */
/*********************************************************************/

/* internal page */

#define rockh_write_reset(/*ROCKH_id      */ rock_id,  /* IN  */        \
			  /*unsigned char */ reset,    /* IN  */        \
			  /*char          */ test)     /* IN, bool  */  \
	rockh_write_reg08(rock_id,ROCKH_RESET_ofs,reset,test*0xff)

#define rockh_write_watchdog(/*ROCKH_id      */ rock_id,   /* IN  */      \
			     /*unsigned char */ wdog,      /* IN  */      \
			     /*char          */ test)      /* IN, bool */ \
	rockh_write_reg08(rock_id,ROCKH_WATCHDOG_ofs,wdog,test*0xff)

#define rockh_write_csr0(/*ROCKH_id      */ rock_id, /* IN  */      \
			 /*unsigned char */ csr0,     /* IN  */      \
			 /*char          */ test)     /* IN, bool */ \
	rockh_write_reg08(rock_id,ROCKH_CSR0_ofs,csr0,test*0x3f)

#define rockh_write_csr2(/*ROCKH_id      */ rock_id, /* IN  */      \
			 /*unsigned char */ csr2,     /* IN  */      \
			 /*char          */ test)     /* IN, bool */ \
	rockh_write_reg08(rock_id,ROCKH_CSR2_ofs,csr2,test*0x0f)

#define rockh_write_trigger(/*ROCKH_id      */ rock_id,  /* IN  */      \
			    /*unsigned char */ trigger,  /* IN  */      \
			    /*char          */ test)     /* IN, bool */ \
	rockh_write_reg08(rock_id,ROCKH_TRIGGER_ofs,trigger,0)

/* info page */

#define rockh_write_golden(/*ROCKH_id       */ rock_id, /* IN  */      \
			   /*unsigned short */ golden,  /* IN  */      \
			   /*char           */ test)    /* IN, bool */ \
	rockh_write_reg16(rock_id,ROCKH_GOLDEN_ofs,golden,test*0xffff)

/* FIFO page */

#define rockh_write_edfifo(/*ROCKH_id     */ rock_id,  /* IN  */ \
			   /*unsigned int */ edfifo,   /* IN  */ \
			   /*char         */ test)     /* IN, bool */ \
	rockh_write_reg32(rock_id,ROCKH_FWRT_ofs,edfifo,0)

/*********************************************************************/
/*                     readpage routines                             */
/*********************************************************************/

#define rockh_readpage_internal(/*ROCKH_id            */ rock_id,    /* IN  */  \
				/*ROCKH_INTERNAL_regs */ internal)   /* OUT */  \
	rockh_readpage_i_internal(rock_id,&(internal))

#define rockh_readpage_info(/*ROCKH_id        */ rock_id,  /* IN  */  \
			    /*ROCKH_INFO_regs */ info)     /* OUT */  \
        rockh_readpage_i_info(rock_id,&(info))

/*********************************************************************/
/*                     readfifo routines                             */
/*                 raw fifo values are returned                      */
/*********************************************************************/

#define rockh_readfifo_efifo(/*ROCKH_id       */ rock_id,	/* IN  */    \
			     /*unsigned int   */ count,		/* IN nr els to read, OUT nr els really read */    \
			     /*unsigned int * */ buffer)	/* IN/OUT */ \
	rockh_readfifo_fifo(rock_id,ROCKH_EFRD_ofs,count,1,buffer,&(count))

#define rockh_readfifo_dfifo(/*ROCKH_id       */ rock_id,	/* IN  */    \
			     /*unsigned int   */ count,		/* IN nr els to read, OUT nr els really read */    \
			     /*unsigned int * */ buffer)	/* IN/OUT */ \
	rockh_readfifo_fifo(rock_id,ROCKH_DFRD_ofs,count,1,buffer,&(count))

#endif /* ROCKHARD_H */