mirror of
https://github.com/lcbcFoo/ReonV.git
synced 2025-04-22 04:27:08 -04:00
245 lines
5.8 KiB
C
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|