ines.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /***************************************************************************
  2. nec7210/ines.h - description
  3. -------------------
  4. Header for ines GPIB boards
  5. copyright : (C) 2002 by Frank Mori Hess
  6. email : fmhess@users.sourceforge.net
  7. ***************************************************************************/
  8. /***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************/
  16. #ifndef _INES_GPIB_H
  17. #define _INES_GPIB_H
  18. #include "nec7210.h"
  19. #include "gpibP.h"
  20. #include "plx9050.h"
  21. #include "amcc5920.h"
  22. #include "quancom_pci.h"
  23. #include <linux/interrupt.h>
  24. enum ines_pci_chip
  25. {
  26. PCI_CHIP_NONE,
  27. PCI_CHIP_PLX9050,
  28. PCI_CHIP_AMCC5920,
  29. PCI_CHIP_QUANCOM,
  30. PCI_CHIP_QUICKLOGIC5030,
  31. };
  32. typedef struct
  33. {
  34. nec7210_private_t nec7210_priv;
  35. struct pci_dev *pci_device;
  36. // base address for plx9052 pci chip
  37. unsigned long plx_iobase;
  38. // base address for amcc5920 pci chip
  39. unsigned long amcc_iobase;
  40. unsigned int irq;
  41. enum ines_pci_chip pci_chip_type;
  42. volatile uint8_t extend_mode_bits;
  43. } ines_private_t;
  44. // interfaces
  45. extern gpib_interface_t ines_pci_interface;
  46. extern gpib_interface_t ines_pci_accel_interface;
  47. extern gpib_interface_t ines_pcmcia_interface;
  48. extern gpib_interface_t ines_pcmcia_accel_interface;
  49. extern gpib_interface_t ines_pcmcia_unaccel_interface;
  50. // interface functions
  51. int ines_read(gpib_board_t *board, uint8_t *buffer, size_t length, int *end, size_t *bytes_read);
  52. int ines_write(gpib_board_t *board, uint8_t *buffer, size_t length, int send_eoi, size_t *bytes_written);
  53. int ines_accel_read(gpib_board_t *board, uint8_t *buffer, size_t length, int *end, size_t *bytes_read);
  54. int ines_accel_write(gpib_board_t *board, uint8_t *buffer, size_t length, int send_eoi, size_t *bytes_written);
  55. ssize_t ines_command(gpib_board_t *board, uint8_t *buffer, size_t length);
  56. int ines_take_control(gpib_board_t *board, int synchronous);
  57. int ines_go_to_standby(gpib_board_t *board);
  58. void ines_request_system_control( gpib_board_t *board, int request_control );
  59. void ines_interface_clear(gpib_board_t *board, int assert);
  60. void ines_remote_enable(gpib_board_t *board, int enable);
  61. int ines_enable_eos(gpib_board_t *board, uint8_t eos_byte, int compare_8_bits);
  62. void ines_disable_eos(gpib_board_t *board);
  63. unsigned int ines_update_status( gpib_board_t *board, unsigned int clear_mask );
  64. void ines_primary_address(gpib_board_t *board, unsigned int address);
  65. void ines_secondary_address(gpib_board_t *board, unsigned int address, int enable);
  66. int ines_parallel_poll(gpib_board_t *board, uint8_t *result);
  67. void ines_parallel_poll_configure( gpib_board_t *board, uint8_t config );
  68. void ines_parallel_poll_response( gpib_board_t *board, int ist );
  69. void ines_serial_poll_response(gpib_board_t *board, uint8_t status);
  70. uint8_t ines_serial_poll_status( gpib_board_t *board );
  71. int ines_line_status( const gpib_board_t *board );
  72. unsigned int ines_t1_delay( gpib_board_t *board, unsigned int nano_sec );
  73. void ines_return_to_local( gpib_board_t *board );
  74. // interrupt service routines
  75. irqreturn_t ines_pci_interrupt(int irq, void *arg PT_REGS_ARG);
  76. irqreturn_t ines_interrupt(gpib_board_t *board);
  77. // utility functions
  78. void ines_free_private(gpib_board_t *board);
  79. int ines_generic_attach(gpib_board_t *board);
  80. void ines_online( ines_private_t *priv, const gpib_board_t *board, int use_accel );
  81. void ines_set_xfer_counter( ines_private_t *priv, unsigned int count );
  82. /* inb/outb wrappers */
  83. static inline unsigned int ines_inb( ines_private_t *priv, unsigned int register_number )
  84. {
  85. return inb((unsigned long)(priv->nec7210_priv.iobase) + register_number * priv->nec7210_priv.offset );
  86. }
  87. static inline void ines_outb( ines_private_t *priv, unsigned int value, unsigned int register_number )
  88. {
  89. outb( value, (unsigned long)(priv->nec7210_priv.iobase) + register_number * priv->nec7210_priv.offset );
  90. }
  91. // pcmcia init/cleanup
  92. int ines_pcmcia_init_module(void);
  93. void ines_pcmcia_cleanup_module(void);
  94. enum ines_regs
  95. {
  96. // read
  97. FIFO_STATUS = 0x8,
  98. ISR3 = 0x9,
  99. ISR4 = 0xa,
  100. IN_FIFO_COUNT = 0x10,
  101. OUT_FIFO_COUNT = 0x11,
  102. EXTEND_STATUS = 0xf,
  103. // write
  104. XDMA_CONTROL = 0x8,
  105. IMR3 = ISR3,
  106. IMR4 = ISR4,
  107. IN_FIFO_WATERMARK = IN_FIFO_COUNT,
  108. OUT_FIFO_WATERMARK = OUT_FIFO_COUNT,
  109. EXTEND_MODE = 0xf,
  110. // read-write
  111. XFER_COUNT_LOWER = 0xb,
  112. XFER_COUNT_UPPER = 0xc,
  113. BUS_CONTROL_MONITOR = 0x13,
  114. };
  115. enum isr3_imr3_bits
  116. {
  117. HW_TIMEOUT_BIT = 0x1,
  118. XFER_COUNT_BIT = 0x2,
  119. CMD_RECEIVED_BIT = 0x4,
  120. TCT_RECEIVED_BIT = 0x8,
  121. IFC_ACTIVE_BIT = 0x10,
  122. ATN_ACTIVE_BIT = 0x20,
  123. FIFO_ERROR_BIT = 0x40,
  124. };
  125. enum isr4_imr4_bits
  126. {
  127. IN_FIFO_WATERMARK_BIT = 0x1,
  128. OUT_FIFO_WATERMARK_BIT = 0x2,
  129. IN_FIFO_FULL_BIT = 0x4,
  130. OUT_FIFO_EMPTY_BIT = 0x8,
  131. IN_FIFO_READY_BIT = 0x10,
  132. OUT_FIFO_READY_BIT = 0x20,
  133. IN_FIFO_EXIT_WATERMARK_BIT = 0x40,
  134. OUT_FIFO_EXIT_WATERMARK_BIT = 0x80,
  135. };
  136. enum extend_mode_bits
  137. {
  138. TR3_TRIG_ENABLE_BIT = 0x1, // enable generation of trigger pulse T/R3 pin
  139. MAV_ENABLE_BIT = 0x2, // clear message available status bit when chip writes byte with EOI true
  140. EOS1_ENABLE_BIT = 0x4, // enable eos register 1
  141. EOS2_ENABLE_BIT = 0x8, // enable eos register 2
  142. EOIDIS_BIT = 0x10, // disable EOI interrupt when doing rfd holdoff on end?
  143. XFER_COUNTER_ENABLE_BIT = 0x20,
  144. XFER_COUNTER_OUTPUT_BIT = 0x40, // use counter for output, clear for input
  145. LAST_BYTE_HANDLING_BIT = 0x80, // when xfer counter hits 0, assert EOI on write or RFD holdoff on read
  146. };
  147. enum extend_status_bits
  148. {
  149. OUTPUT_MESSAGE_IN_PROGRESS_BIT = 0x1,
  150. SCSEL_BIT = 0x2, // statue of SCSEL pin
  151. LISTEN_DISABLED = 0x4,
  152. IN_FIFO_EMPTY_BIT = 0x8,
  153. OUT_FIFO_FULL_BIT = 0x10,
  154. };
  155. // ines adds fifo enable bits to address mode register
  156. enum ines_admr_bits
  157. {
  158. IN_FIFO_ENABLE_BIT = 0x8,
  159. OUT_FIFO_ENABLE_BIT = 0x4,
  160. };
  161. enum xdma_control_bits
  162. {
  163. DMA_OUTPUT_BIT = 0x1, // use dma for output, clear for input
  164. ENABLE_SYNC_DMA_BIT = 0x2,
  165. DMA_ACCESS_EVERY_CYCLE = 0x4, // dma accesses fifo every cycle, clear for every other cycle
  166. DMA_16BIT = 0x8, // clear for 8 bit transfers
  167. };
  168. enum bus_control_monitor_bits
  169. {
  170. BCM_DAV_BIT = 0x1,
  171. BCM_NRFD_BIT = 0x2,
  172. BCM_NDAC_BIT = 0x4,
  173. BCM_IFC_BIT = 0x8,
  174. BCM_ATN_BIT = 0x10,
  175. BCM_SRQ_BIT = 0x20,
  176. BCM_REN_BIT = 0x40,
  177. BCM_EOI_BIT = 0x80,
  178. };
  179. enum ines_aux_reg_bits
  180. {
  181. INES_AUXD = 0x40,
  182. };
  183. enum ines_aux_cmds
  184. {
  185. INES_RFD_HLD_IMMEDIATE = 0x4,
  186. INES_AUX_CLR_OUT_FIFO = 0x5,
  187. INES_AUX_CLR_IN_FIFO = 0x6,
  188. INES_AUX_XMODE = 0xa,
  189. };
  190. enum ines_auxd_bits
  191. {
  192. INES_FOLLOWING_T1_MASK = 0x3,
  193. INES_FOLLOWING_T1_500ns = 0x0,
  194. INES_FOLLOWING_T1_350ns = 0x1,
  195. INES_FOLLOWING_T1_250ns = 0x2,
  196. INES_INITIAL_TI_MASK = 0xc,
  197. INES_INITIAL_T1_2000ns = 0x0,
  198. INES_INITIAL_T1_1100ns = 0x4,
  199. INES_INITIAL_T1_700ns = 0x8,
  200. INES_T6_2us = 0x0,
  201. INES_T6_50us = 0x10,
  202. };
  203. static const int ines_isa_iosize = 0x20;
  204. static const int ines_pcmcia_iosize = 0x20;
  205. #endif // _INES_GPIB_H