agilent_82357a.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /***************************************************************************
  3. * copyright : (C) 2004 by Frank Mori Hess *
  4. ***************************************************************************/
  5. #include <linux/kernel.h>
  6. #include <linux/mutex.h>
  7. #include <linux/completion.h>
  8. #include <linux/usb.h>
  9. #include <linux/timer.h>
  10. #include <linux/compiler_attributes.h>
  11. #include "gpibP.h"
  12. #include "tms9914.h"
  13. enum usb_vendor_ids {
  14. USB_VENDOR_ID_AGILENT = 0x0957
  15. };
  16. enum usb_device_ids {
  17. USB_DEVICE_ID_AGILENT_82357A = 0x0107,
  18. USB_DEVICE_ID_AGILENT_82357A_PREINIT = 0x0007, // device id before firmware is loaded
  19. USB_DEVICE_ID_AGILENT_82357B = 0x0718, // device id before firmware is loaded
  20. USB_DEVICE_ID_AGILENT_82357B_PREINIT = 0x0518, // device id before firmware is loaded
  21. };
  22. enum endpoint_addresses {
  23. AGILENT_82357_CONTROL_ENDPOINT = 0x0,
  24. AGILENT_82357_BULK_IN_ENDPOINT = 0x2,
  25. AGILENT_82357A_BULK_OUT_ENDPOINT = 0x4,
  26. AGILENT_82357A_INTERRUPT_IN_ENDPOINT = 0x6,
  27. AGILENT_82357B_BULK_OUT_ENDPOINT = 0x6,
  28. AGILENT_82357B_INTERRUPT_IN_ENDPOINT = 0x8,
  29. };
  30. enum bulk_commands {
  31. DATA_PIPE_CMD_WRITE = 0x1,
  32. DATA_PIPE_CMD_READ = 0x3,
  33. DATA_PIPE_CMD_WR_REGS = 0x4,
  34. DATA_PIPE_CMD_RD_REGS = 0x5
  35. };
  36. enum agilent_82357a_read_flags {
  37. ARF_END_ON_EOI = 0x1,
  38. ARF_NO_ADDRESS = 0x2,
  39. ARF_END_ON_EOS_CHAR = 0x4,
  40. ARF_SPOLL = 0x8
  41. };
  42. enum agilent_82357a_trailing_read_flags {
  43. ATRF_EOI = 0x1,
  44. ATRF_ATN = 0x2,
  45. ATRF_IFC = 0x4,
  46. ATRF_EOS = 0x8,
  47. ATRF_ABORT = 0x10,
  48. ATRF_COUNT = 0x20,
  49. ATRF_DEAD_BUS = 0x40,
  50. ATRF_UNADDRESSED = 0x80
  51. };
  52. enum agilent_82357a_write_flags {
  53. AWF_SEND_EOI = 0x1,
  54. AWF_NO_FAST_TALKER_FIRST_BYTE = 0x2,
  55. AWF_NO_FAST_TALKER = 0x4,
  56. AWF_NO_ADDRESS = 0x8,
  57. AWF_ATN = 0x10,
  58. AWF_SEPARATE_HEADER = 0x80
  59. };
  60. enum agilent_82357a_interrupt_flag_bit_numbers {
  61. AIF_SRQ_BN = 0,
  62. AIF_WRITE_COMPLETE_BN = 1,
  63. AIF_READ_COMPLETE_BN = 2,
  64. };
  65. enum agilent_82357_error_codes {
  66. UGP_SUCCESS = 0,
  67. UGP_ERR_INVALID_CMD = 1,
  68. UGP_ERR_INVALID_PARAM = 2,
  69. UGP_ERR_INVALID_REG = 3,
  70. UGP_ERR_GPIB_READ = 4,
  71. UGP_ERR_GPIB_WRITE = 5,
  72. UGP_ERR_FLUSHING = 6,
  73. UGP_ERR_FLUSHING_ALREADY = 7,
  74. UGP_ERR_UNSUPPORTED = 8,
  75. UGP_ERR_OTHER = 9
  76. };
  77. enum agilent_82357_control_values {
  78. XFER_ABORT = 0xa0,
  79. XFER_STATUS = 0xb0,
  80. };
  81. enum xfer_status_bits {
  82. XS_COMPLETED = 0x1,
  83. XS_READ = 0x2,
  84. };
  85. enum xfer_status_completion_bits {
  86. XSC_EOI = 0x1,
  87. XSC_ATN = 0x2,
  88. XSC_IFC = 0x4,
  89. XSC_EOS = 0x8,
  90. XSC_ABORT = 0x10,
  91. XSC_COUNT = 0x20,
  92. XSC_DEAD_BUS = 0x40,
  93. XSC_BUS_NOT_ADDRESSED = 0x80
  94. };
  95. enum xfer_abort_type {
  96. XA_FLUSH = 0x1
  97. };
  98. #define STATUS_DATA_LEN 8
  99. #define INTERRUPT_BUF_LEN 8
  100. struct agilent_82357a_urb_ctx {
  101. struct completion complete;
  102. unsigned timed_out : 1;
  103. };
  104. // struct which defines local data for each 82357 device
  105. struct agilent_82357a_priv {
  106. struct usb_interface *bus_interface;
  107. unsigned short eos_char;
  108. unsigned short eos_mode;
  109. unsigned short hw_control_bits;
  110. unsigned long interrupt_flags;
  111. struct urb *bulk_urb;
  112. struct urb *interrupt_urb;
  113. u8 *interrupt_buffer;
  114. struct mutex bulk_transfer_lock; // bulk transfer lock
  115. struct mutex bulk_alloc_lock; // bulk transfer allocation lock
  116. struct mutex interrupt_alloc_lock; // interrupt allocation lock
  117. struct mutex control_alloc_lock; // control message allocation lock
  118. struct timer_list bulk_timer;
  119. struct agilent_82357a_urb_ctx context;
  120. unsigned int bulk_out_endpoint;
  121. unsigned int interrupt_in_endpoint;
  122. unsigned is_cic : 1;
  123. unsigned ren_state : 1;
  124. };
  125. struct agilent_82357a_register_pairlet {
  126. short address;
  127. unsigned short value;
  128. };
  129. enum firmware_registers {
  130. HW_CONTROL = 0xa,
  131. LED_CONTROL = 0xb,
  132. RESET_TO_POWERUP = 0xc,
  133. PROTOCOL_CONTROL = 0xd,
  134. FAST_TALKER_T1 = 0xe
  135. };
  136. enum hardware_control_bits {
  137. NOT_TI_RESET = 0x1,
  138. SYSTEM_CONTROLLER = 0x2,
  139. NOT_PARALLEL_POLL = 0x4,
  140. OSCILLATOR_5V_ON = 0x8,
  141. OUTPUT_5V_ON = 0x20,
  142. CPLD_3V_ON = 0x80,
  143. };
  144. enum led_control_bits {
  145. FIRMWARE_LED_CONTROL = 0x1,
  146. FAIL_LED_ON = 0x20,
  147. READY_LED_ON = 0x40,
  148. ACCESS_LED_ON = 0x80
  149. };
  150. enum reset_to_powerup_bits {
  151. RESET_SPACEBALL = 0x1, // wait 2 millisec after sending
  152. };
  153. enum protocol_control_bits {
  154. WRITE_COMPLETE_INTERRUPT_EN = 0x1,
  155. };
  156. static const int agilent_82357a_control_request = 0x4;