home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / SCC.H < prev    next >
C/C++ Source or Header  |  1994-04-17  |  7KB  |  154 lines

  1. #ifndef _SCC_H
  2. #define _SCC_H
  3.   
  4. /* Definitions for Z8530 SCC driver by PE1CHL
  5.  * Adapted for NOS 1/23/90
  6.  * Ken Mitchum KY3B
  7.  * km@speedy.cs.pitt.edu
  8.  * km@cadre.dsl.pitt.edu
  9.  */
  10. #ifndef _MBUF_H
  11. #include "mbuf.h"
  12. #endif
  13.   
  14. #ifndef _IFACE_H
  15. #include "iface.h"
  16. #endif
  17.   
  18. #define INLINE 1
  19.   
  20. typedef int16 ioaddr;       /* type definition for an 'io port address' */
  21. #define MAXSCC      4   /* maximal number of SCC chips supported */
  22. #define TPS     (1000/MSPTICK)  /* scctim() ticks per second  */
  23.   
  24. # if defined(INLINE)
  25. /* special delay construction only necessary when inline IN/OUT is used */
  26. #define D(v)        scc_delay(v)    /* delay for 5 PCLK cycles (or more) */
  27. #define RDREG(a)    (D(inportb(a)))     /* read any input port */
  28. #define WRREG(a,v)  {outportb(a,v); D(1);}  /* write any output port */
  29. #define RDSCC(c,r)  (outportb(c,r), D(1), D(inportb(c))) /* read SCC reg */
  30. #define WRSCC(c,r,v)    {outportb(c,r); D(1); outportb(c,v); D(1);} /* write SCC reg*/
  31. # else
  32. #define RDREG(a)    (inportb(a))        /* read any input port */
  33. #define WRREG(a,v)  {outportb(a,v);}    /* write any output port */
  34. #define RDSCC(c,r)  (outportb(c,r), inportb(c)) /* read SCC reg */
  35. #define WRSCC(c,r,v)    {outportb(c,r); outportb(c,v);} /* write SCC reg */
  36. # endif
  37.   
  38. #define HWEAGLE     0x01    /* hardware type for EAGLE card */
  39. #define HWPC100     0x02    /* hardware type for PC100 card */
  40. #define HWPRIMUS    0x04    /* hardware type for PRIMUS-PC (DG9BL) card */
  41. #define HWDRSI      0x08    /* hardware type for DRSI PC*Packet card */
  42. #define HWBAYCOM    0x10    /* Hardware type for the Baycom modem */
  43.   
  44. #ifndef VOID
  45. #define VOID(x)     (x) /* not necessary for most compilers */
  46. #endif
  47.   
  48. struct sccinfo {
  49.     int init;       /* SCC driver initialized? */
  50.     int nchips;     /* Number of SCC chips in system */
  51.     int maxchan;        /* Highest valid channel number */
  52.     ioaddr iobase;      /* Base address of first SCC */
  53.     int space;      /* Spacing between subsequent SCCs */
  54.     int off[2];     /* Offset to A and B channel control regs */
  55.     int doff;       /* Offset from control to data register */
  56.     int ivec;       /* System interrupt vector number */
  57.     long clk;       /* PCLK/RTxC frequency in Hz */
  58.     int pclk;       /* flag to use PCLK (instead of RTxC) */
  59.     int hwtype;     /* special hardware type indicator */
  60.     int hwparam;        /* special hardware parameter */
  61. };
  62. extern struct sccinfo sccinfo;
  63.   
  64. /* SCC channel control structure for AX.25 mode */
  65. struct scca {
  66.     unsigned int maxdefer;  /* Timer for CSMA defer time limit */
  67.   
  68.     unsigned int tstate;        /* Transmitter state */
  69. #define IDLE        0   /* Transmitter off, no data pending */
  70. #define DEFER       1   /* Receive Active - DEFER Transmit */
  71. #define KEYUP       2   /* Permission to keyup the transmitter */
  72. #define KEYWT       3   /* Transmitter switched on, waiting for CTS */
  73. #define ACTIVE      4   /* Transmitter on, sending data */
  74. #define FLUSH       5   /* CRC sent - attempt to start next frame */
  75. #define TAIL        6   /* End of transmission, send tail */
  76.   
  77.     unsigned char txdelay;  /* Transmit Delay 10 ms/cnt */
  78.     unsigned char persist;  /* Persistence (0-255) as a % */
  79.     unsigned char slottime; /* Delay to wait on persistence hit */
  80.     unsigned char tailtime; /* Delay after XMTR OFF */
  81.     unsigned char fulldup;  /* Full Duplex mode 0=CSMA 1=DUP 2=ALWAYS KEYED */
  82.     unsigned char waittime; /* Waittime before any transmit attempt */
  83.     unsigned char maxkeyup; /* Maximum time to transmit (seconds) */
  84.     unsigned char mintime;  /* Minimal offtime after MAXKEYUP timeout */
  85.     unsigned char idletime; /* Maximum idle time in ALWAYS KEYED mode (seconds) */
  86. };
  87.   
  88. /* SCC channel structure. one is allocated for each attached SCC channel, */
  89. /* so 2 of these are allocated for each fully utilized SCC chip */
  90. struct sccchan {
  91.     /* interrupt handlers for 4 different IP's */
  92.     /* MUST BE first 4 elements of this structure, and MUST remain */
  93.     /* in the sequence Transmit-Status-Receive-Special */
  94.     void (*int_transmit)(); /* Transmit Buffer Empty interrupt handler */
  95.     void (*int_extstat)();  /* External/Status Change interrupt handler */
  96.     void (*int_receive)();  /* Receive Character Avail. interrupt handler */
  97.     void (*int_special)();  /* Special Receive Condition interrupt handler */
  98.   
  99.     /* don't insert anything before "ctrl" (see assembly interrupt handler) */
  100.     ioaddr ctrl;        /* I/O address of CONTROL register */
  101.     ioaddr data;        /* I/O address of DATA register for this channel */
  102.   
  103.     unsigned char wreg[16]; /* Copy of last written value in WRx */
  104.     unsigned char status;   /* Copy of R0 at last external interrupt */
  105.     unsigned char txchar;   /* Char to transmit on next TX interrupt */
  106.   
  107.     struct fifo fifo;
  108.     struct scca a;  /* control structure for AX.25 use */
  109.   
  110.     struct mbuf *rbp;   /* Head of mbuf chain being filled */
  111.     struct mbuf *rbp1;  /* Pointer to mbuf currently being written */
  112.     struct mbuf *sndq;  /* Encapsulated packets awaiting transmission */
  113.     struct mbuf *tbp;   /* Transmit mbuf being sent */
  114.   
  115.     struct iface *iface; /* associated interface structure */
  116.   
  117.     int bufsiz;
  118.   
  119.     unsigned int timercount;/* 10ms timer for AX.25 use */
  120.     int group;      /* group ID for AX.25 TX interlocking */
  121. #define NOGROUP     0   /* not member of any group */
  122. #define RXGROUP     0x100   /* if set, only tx when all channels clear */
  123. #define TXGROUP     0x200   /* if set, don't transmit simultaneously */
  124.   
  125.     long speed;     /* Line speed, bps */
  126.     char extclock;      /* External clock source on RTxC/TRxC */
  127.     char fulldup;       /* External divider for fulldup available */
  128.     char tx_inhibit;    /* Transmit is not allowed when set */
  129.     char dum;       /* filler (keep addr even for speed) */
  130.   
  131.     /* statistic information on this channel */
  132.     long rxints;        /* Receiver interrupts */
  133.     long txints;        /* Transmitter interrupts */
  134.     long exints;        /* External/status interrupts */
  135.     long spints;        /* Special receiver interrupts */
  136.   
  137.     long enqueued;      /* Packets actually forwarded */
  138.     long rxframes;      /* Number of Frames Actally Received */
  139.     long rxerrs;        /* CRC Errors or KISS errors */
  140.     unsigned int nospace;   /* "Out of buffers" */
  141.     unsigned int rovers;    /* Receiver Overruns */
  142. };
  143. extern struct sccchan *sccchan[];
  144. #define NULLCHAN    (struct sccchan *)0
  145.   
  146. /* Z8530 SCC Register access macros */
  147.   
  148. #define rd(scc,reg) RDSCC((scc)->ctrl,(reg))
  149. #define wr(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] = val))
  150. #define or(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] |= val))
  151. #define cl(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] &= ~(val)))
  152.   
  153. #endif  /* _SCC_H */
  154.