scc.h
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

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