FILE
ni_usb_gpib.h
File preview with syntax highlighting.
linux-6.19.14/drivers/gpib/ni_usb/ni_usb_gpib.h
1/* SPDX-License-Identifier: GPL-2.0 */ 2 3/*************************************************************************** 4 * copyright : (C) 2004 by Frank Mori Hess 5 ***************************************************************************/ 6 7#ifndef _NI_USB_GPIB_H 8#define _NI_USB_GPIB_H 9 10#include <linux/mutex.h> 11#include <linux/semaphore.h> 12#include <linux/usb.h> 13#include <linux/timer.h> 14#include "gpibP.h" 15 16enum { 17 USB_VENDOR_ID_NI = 0x3923 18}; 19 20enum { 21 USB_DEVICE_ID_NI_USB_B = 0x702a, 22 USB_DEVICE_ID_NI_USB_B_PREINIT = 0x702b, // device id before firmware is loaded 23 USB_DEVICE_ID_NI_USB_HS = 0x709b, 24 USB_DEVICE_ID_NI_USB_HS_PLUS = 0x7618, 25 USB_DEVICE_ID_KUSB_488A = 0x725c, 26 USB_DEVICE_ID_MC_USB_488 = 0x725d 27}; 28 29enum ni_usb_device { 30 NIUSB_SUBDEV_TNT4882 = 1, 31 NIUSB_SUBDEV_UNKNOWN2 = 2, 32 NIUSB_SUBDEV_UNKNOWN3 = 3, 33}; 34 35enum endpoint_addresses { 36 NIUSB_B_BULK_OUT_ENDPOINT = 0x2, 37 NIUSB_B_BULK_IN_ENDPOINT = 0x2, 38 NIUSB_B_BULK_IN_ALT_ENDPOINT = 0x6, 39 NIUSB_B_INTERRUPT_IN_ENDPOINT = 0x4, 40}; 41 42enum hs_enpoint_addresses { 43 NIUSB_HS_BULK_OUT_ENDPOINT = 0x2, 44 NIUSB_HS_BULK_OUT_ALT_ENDPOINT = 0x6, 45 NIUSB_HS_BULK_IN_ENDPOINT = 0x4, 46 NIUSB_HS_BULK_IN_ALT_ENDPOINT = 0x8, 47 NIUSB_HS_INTERRUPT_IN_ENDPOINT = 0x1, 48}; 49 50enum hs_plus_endpoint_addresses { 51 NIUSB_HS_PLUS_BULK_OUT_ENDPOINT = 0x1, 52 NIUSB_HS_PLUS_BULK_OUT_ALT_ENDPOINT = 0x4, 53 NIUSB_HS_PLUS_BULK_IN_ENDPOINT = 0x2, 54 NIUSB_HS_PLUS_BULK_IN_ALT_ENDPOINT = 0x5, 55 NIUSB_HS_PLUS_INTERRUPT_IN_ENDPOINT = 0x3, 56}; 57 58struct ni_usb_urb_ctx { 59 struct completion complete; 60 unsigned timed_out : 1; 61}; 62 63// struct which defines private_data for ni_usb devices 64struct ni_usb_priv { 65 struct usb_interface *bus_interface; 66 int bulk_out_endpoint; 67 int bulk_in_endpoint; 68 int interrupt_in_endpoint; 69 u8 eos_char; 70 unsigned short eos_mode; 71 unsigned int monitored_ibsta_bits; 72 struct urb *bulk_urb; 73 struct urb *interrupt_urb; 74 u8 interrupt_buffer[0x11]; 75 struct mutex addressed_transfer_lock; // protect transfer lock 76 struct mutex bulk_transfer_lock; // protect bulk message sends 77 struct mutex control_transfer_lock; // protect control messages 78 struct mutex interrupt_transfer_lock; // protect interrupt messages 79 struct timer_list bulk_timer; 80 struct ni_usb_urb_ctx context; 81 int product_id; 82 unsigned short ren_state; 83}; 84 85struct ni_usb_status_block { 86 short id; 87 unsigned short ibsta; 88 short error_code; 89 unsigned short count; 90}; 91 92struct ni_usb_register { 93 enum ni_usb_device device; 94 short address; 95 unsigned short value; 96}; 97 98enum ni_usb_bulk_ids { 99 NIUSB_IBCAC_ID = 0x1, 100 NIUSB_UNKNOWN3_ID = 0x3, // device level function id? 101 NIUSB_TERM_ID = 0x4, 102 NIUSB_IBGTS_ID = 0x6, 103 NIUSB_IBRPP_ID = 0x7, 104 NIUSB_REG_READ_ID = 0x8, 105 NIUSB_REG_WRITE_ID = 0x9, 106 NIUSB_IBSIC_ID = 0xf, 107 NIUSB_REGISTER_READ_DATA_START_ID = 0x34, 108 NIUSB_REGISTER_READ_DATA_END_ID = 0x35, 109 NIUSB_IBRD_DATA_ID = 0x36, 110 NIUSB_IBRD_EXTENDED_DATA_ID = 0x37, 111 NIUSB_IBRD_STATUS_ID = 0x38 112}; 113 114enum ni_usb_error_codes { 115 NIUSB_NO_ERROR = 0, 116 /* 117 * NIUSB_ABORTED_ERROR occurs when I/O is interrupted early by 118 * doing a NI_USB_STOP_REQUEST on the control endpoint. 119 */ 120 NIUSB_ABORTED_ERROR = 1, 121 /* 122 * NIUSB_READ_ATN_ERROR occurs when you do a board read while 123 * ATN is set 124 */ 125 NIUSB_ATN_STATE_ERROR = 2, 126 /* 127 * NIUSB_ADDRESSING_ERROR occurs when you do a board 128 * read/write as CIC but are not in LACS/TACS 129 */ 130 NIUSB_ADDRESSING_ERROR = 3, 131 /* 132 * NIUSB_EOSMODE_ERROR occurs on reads if any eos mode or char 133 * bits are set when REOS is not set. 134 * Have also seen error 4 if you try to send more than 16 135 * command bytes at once on a usb-b. 136 */ 137 NIUSB_EOSMODE_ERROR = 4, 138 /* 139 * NIUSB_NO_BUS_ERROR occurs when you try to write a command 140 * byte but there are no devices connected to the gpib bus 141 */ 142 NIUSB_NO_BUS_ERROR = 5, 143 /* 144 * NIUSB_NO_LISTENER_ERROR occurs when you do a board write as 145 * CIC with no listener 146 */ 147 NIUSB_NO_LISTENER_ERROR = 8, 148 /* get NIUSB_TIMEOUT_ERROR on board read/write timeout */ 149 NIUSB_TIMEOUT_ERROR = 10, 150}; 151 152enum ni_usb_control_requests { 153 NI_USB_STOP_REQUEST = 0x20, 154 NI_USB_WAIT_REQUEST = 0x21, 155 NI_USB_POLL_READY_REQUEST = 0x40, 156 NI_USB_SERIAL_NUMBER_REQUEST = 0x41, 157 NI_USB_HS_PLUS_0x48_REQUEST = 0x48, 158 NI_USB_HS_PLUS_LED_REQUEST = 0x4b, 159 NI_USB_HS_PLUS_0xf8_REQUEST = 0xf8 160}; 161 162static const unsigned int ni_usb_ibsta_monitor_mask = 163 SRQI | LOK | REM | CIC | ATN | TACS | LACS | DTAS | DCAS; 164 165static inline int nec7210_to_tnt4882_offset(int offset) 166{ 167 return 2 * offset; 168}; 169 170static inline int ni_usb_bulk_termination(u8 *buffer) 171{ 172 int i = 0; 173 174 buffer[i++] = NIUSB_TERM_ID; 175 buffer[i++] = 0x0; 176 buffer[i++] = 0x0; 177 buffer[i++] = 0x0; 178 return i; 179} 180 181enum ni_usb_unknown3_register { 182 SERIAL_NUMBER_4_REG = 0x8, 183 SERIAL_NUMBER_3_REG = 0x9, 184 SERIAL_NUMBER_2_REG = 0xa, 185 SERIAL_NUMBER_1_REG = 0xb, 186}; 187 188static inline int ni_usb_bulk_register_write_header(u8 *buffer, int num_writes) 189{ 190 int i = 0; 191 192 buffer[i++] = NIUSB_REG_WRITE_ID; 193 buffer[i++] = num_writes; 194 buffer[i++] = 0x0; 195 return i; 196} 197 198static inline int ni_usb_bulk_register_write(u8 *buffer, struct ni_usb_register reg) 199{ 200 int i = 0; 201 202 buffer[i++] = reg.device; 203 buffer[i++] = reg.address; 204 buffer[i++] = reg.value; 205 return i; 206} 207 208static inline int ni_usb_bulk_register_read_header(u8 *buffer, int num_reads) 209{ 210 int i = 0; 211 212 buffer[i++] = NIUSB_REG_READ_ID; 213 buffer[i++] = num_reads; 214 return i; 215} 216 217static inline int ni_usb_bulk_register_read(u8 *buffer, int device, int address) 218{ 219 int i = 0; 220 221 buffer[i++] = device; 222 buffer[i++] = address; 223 return i; 224} 225 226#endif // _NI_USB_GPIB_H
~/
Read-only file preview.