ReonV/software/spw/spwapi.h

245 lines
5.8 KiB
C

/*****************************************************************************/
/* This file is a part of the GRLIB VHDL IP LIBRARY */
/* Copyright (C) 2004 GAISLER RESEARCH */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* See the file COPYING for the full details of the license. */
/*****************************************************************************/
struct dmachanregs
{
volatile int ctrl;
volatile int rxmaxlen;
volatile int txdesc;
volatile int rxdesc;
volatile int addr;
volatile int unused[3];
};
struct intdistregs
{
volatile int ctrl;
volatile int intrx;
volatile int ackrx;
volatile int intto;
volatile int tomask;
volatile int aamask;
volatile int scaler;
volatile int isrtimer;
volatile int iatimer;
volatile int ctimer;
volatile int isr;
volatile int unused;
};
struct pnpregs
{
volatile int vendid;
volatile int linkinfo;
volatile int oa1;
volatile int oa2;
volatile int oa3;
volatile int devid;
volatile int uvendid;
volatile int usn;
};
struct spwregs
{
volatile int ctrl;
volatile int status;
volatile int nodeaddr;
volatile int clkdiv;
volatile int destkey;
volatile int timereg;
volatile int timer;
volatile int unused;
struct dmachanregs dma[4];
struct intdistregs intdist;
volatile int unused2;
struct pnpregs pnp;
};
struct txdescriptor
{
volatile int ctrl;
volatile int haddr;
volatile int dlen;
volatile int daddr;
};
struct rxstatus
{
int truncated;
int dcrcerr;
int hcrcerr;
int eep;
};
struct rxdescriptor
{
volatile int ctrl;
volatile int daddr;
};
struct dmachanvar
{
int nospill;
int rxmaxlen;
int rxpnt;
int rxchkpnt;
int txpnt;
int txchkpnt;
int addr;
int mask;
struct txdescriptor *txd;
struct rxdescriptor *rxd;
};
struct spwvars
{
struct spwregs *regs;
int rmap;
int rxunaligned;
int rmapcrc;
int timetxen;
int timerxen;
int ver;
int khz;
int dmachan;
int clkdiv;
int clkdivs;
int timer;
int dc;
int nodeaddr;
int mask;
int destkey;
int port;
struct dmachanvar dma[4];
int intdist;
int pnp;
int ntxdesc;
int nrxdesc;
int inttxen;
int intrxen;
int pnpen;
};
int spw_init(struct spwvars *spw);
int wait_running(struct spwvars *spw);
/*sets node specific parameters in the spwvars structure */
int spw_setparam(int nodeaddr, int clkdiv, int destkey,
int timetxen, int timerxen, int spwadr,
int khz, struct spwvars *spw, int port, int clkdivs);
int spw_setparam_dma(int dmachan, int addr, int mask, int nospill, int rxmaxlen, struct spwvars *spw);
/*set new transmit descriptor pointer*/
int set_txdesc(int dmachan, int pnt, struct spwvars *spw);
/*set new receive descriptor pointer*/
int set_rxdesc(int dmachan, int pnt, struct spwvars *spw);
/*disable spacewire link*/
void spw_disable(struct spwvars *spw);
/*enable spacewire link*/
void spw_enable(struct spwvars *spw);
/*start spacewire link*/
void spw_start(struct spwvars *spw);
/*stop spacewire link*/
void spw_stop(struct spwvars *spw);
/*set clock divisor value. returns 1 if the clockdiv parameter is illegal,
0 when operation completes successfully*/
int spw_setclockdiv(struct spwvars *spw);
/*set node address, returns 1 if the nodeaddr parameter is illegal,
0 when operation completes successfully*/
int spw_set_nodeadr(struct spwvars *spw);
int spw_set_chanadr(int dmachan, struct spwvars *spw);
/*set maximum receive packet length, returns 1 if the nodeaddr parameter is illegal,
0 when operation completes successfully*/
int spw_set_rxmaxlength(int dmachan, struct spwvars *spw);
/*Transmits hsize bytes from hbuf and dsize bytes from dbuf.returns 0 on success.
/*1 if there are no free buffers. 2 if there was an illegal parameter value.*/
int spw_tx(int dmachan, int hcrc, int dcrc, int skipcrcsize, int hsize, char *hbuf, int dsize, char *dbuf, struct spwvars *spw);
/*Receives one packet to buf. This function only initializes a descriptor, spw_checkrx should
be used to poll when a packet has arrived*/
int spw_rx(int dmachan, char *buf, struct spwvars *spw);
/*Polls receiver descriptor. Returns 0 if no packet has been received,
1 if packet has been received. Then size contains the number of
bytes received. rxs contains som status bits such as crc errors,
eep termination etc*/
int spw_checkrx(int dmachan, int *size, struct rxstatus *rxs, struct spwvars *spw);
/*Polls transmitter descriptor, returns 0 if packet has not been transmitted,
1 if packet was correctly transmitted and 2 if an error occured*/
int spw_checktx(int dmachan, struct spwvars *spw);
/*Send time-code*/
void send_time(struct spwvars *spw);
int send_time_exp(int ctrl, int time, struct spwvars *spw);
/*Check if time-code has been received*/
int check_time(struct spwvars *spw);
/* Get the current time-code count value */
int get_time(struct spwvars *spw);
/* Get the current time-code ctrl value */
int get_time_ctrl(struct spwvars *spw);
/*Reset GRSPW*/
void spw_reset(struct spwvars *spw);
/*Enable hardware RMAP*/
void spw_rmapen(struct spwvars *spw);
/*Disable hardware RMAP*/
void spw_rmapdis(struct spwvars *spw);
int spw_setdestkey(struct spwvars *spw);
void spw_setsepaddr(int dmachan, struct spwvars *spw);
void spw_disablesepaddr(int dmachan, struct spwvars *spw);
void spw_enablerx(int dmachan, struct spwvars *spw);
void spw_disablerx(int dmachan, struct spwvars *spw);
void spw_disable_promiscuous(struct spwvars *spw);
void spw_enable_promiscuous(struct spwvars *spw);