File: LibusbJava.java

package info (click to toggle)
libusb-java 0.8%2Bztex20090101-7
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, stretch
  • size: 416 kB
  • ctags: 810
  • sloc: java: 1,102; ansic: 605; makefile: 98; sh: 29
file content (397 lines) | stat: -rw-r--r-- 12,756 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
/* 
 * Java libusb wrapper
 * Copyright (c) 2005-2006 Andreas Schlaepfer <spandi at users.sourceforge.net>
 *
 * http://libusbjava.sourceforge.net
 * This library is covered by the LGPL, read LGPL.txt for details.
 */
package ch.ntb.usb;

/**
 * This class represents the Java Native Interface to the shared library which
 * is (with some exceptions) a one-to-one representation of the libusb API.<br>
 * <br>
 * <h1>Project Description</h1>
 * Java libusb is a Java wrapper for the libusb and libusb-win32 USB library.
 * 
 * <a href="http://libusb.sourceforge.net/">libusb</a> aim is to create a
 * library for use by user level applications to access USB devices regardless
 * of OS.<br>
 * <a href="http://libusb-win32.sourceforge.net/">Libusb-win32</a> is a port of
 * the USB library <a href="http://libusb.sourceforge.net/">libusb</a> to the
 * Windows operating systems. The library allows user space applications to
 * access any USB device on Windows in a generic way without writing any line of
 * kernel driver code.<br>
 * <br>
 * The API description of this class has been copied from the <a
 * href="http://libusb.sourceforge.net/documentation.html">libusb documentation</a>
 * and adapted where neccessary.<br>
 * 
 */
public class LibusbJava {

	/**
	 * System error codes.<br>
	 * This list is not complete! For more error codes see the file 'errorno.h'
	 * on your system.
	 */
	public static int ERROR_SUCCESS, ERROR_BAD_FILE_DESCRIPTOR,
			ERROR_NO_SUCH_DEVICE_OR_ADDRESS, ERROR_BUSY,
			ERROR_INVALID_PARAMETER, ERROR_TIMEDOUT, ERROR_IO_ERROR,
			ERROR_NOT_ENOUGH_MEMORY;;

	/**
	 * Sets the debugging level of libusb.<br>
	 * 
	 * The range is from 0 to 255, where 0 disables debug output and 255 enables
	 * all output. On application start, debugging is disabled (0).
	 * 
	 * @param level
	 *            0 to 255
	 */
	public static native void usb_set_debug(int level);

	// Core
	/**
	 * Just like the name implies, <code>usb_init</code> sets up some internal
	 * structures. <code>usb_init</code> must be called before any other
	 * libusb functions.
	 */
	public static native void usb_init();

	/**
	 * <code>usb_find_busses</code> will find all of the busses on the system.
	 * 
	 * @return the number of changes since previous call to this function (total
	 *         of new busses and busses removed).
	 */
	public static native int usb_find_busses();

	/**
	 * <code>usb_find_devices</code> will find all of the devices on each bus.
	 * This should be called after <code>usb_find_busses</code>.
	 * 
	 * @return the number of changes since the previous call to this function
	 *         (total of new device and devices removed).
	 */
	public static native int usb_find_devices();

	/**
	 * <code>usb_get_busses</code> returns a tree of descriptor objects.<br>
	 * The tree represents the bus structure with devices, configurations,
	 * interfaces and endpoints. Note that this is only a copy. To refresh the
	 * information, <code>usb_get_busses()</code> must be called again.<br>
	 * The name of the objects contained in the tree is starting with
	 * <code>Usb_</code>.
	 * 
	 * @return the structure of all busses and devices. <code>Note:</code> The
	 *         java objects are copies of the C structs.
	 */
	public static native Usb_Bus usb_get_busses();

	// Device Operations
	/**
	 * <code>usb_open</code> is to be used to open up a device for use.
	 * <code>usb_open</code> must be called before attempting to perform any
	 * operations to the device.
	 * 
	 * @param dev
	 *            The device to open.
	 * @return a handle used in future communication with the device. 0 if an
	 *         error has occurred.
	 */
	public static native long usb_open(Usb_Device dev);

	/**
	 * <code>usb_close</code> closes a device opened with
	 * <code>usb_open</code>.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_close(long dev_handle);

	/**
	 * Sets the active configuration of a device
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param configuration
	 *            The value as specified in the descriptor field
	 *            bConfigurationValue.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_set_configuration(long dev_handle,
			int configuration);

	/**
	 * Sets the active alternate setting of the current interface
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param alternate
	 *            The value as specified in the descriptor field
	 *            bAlternateSetting.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_set_altinterface(long dev_handle, int alternate);

	/**
	 * Clears any halt status on an endpoint.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 *            The value specified in the descriptor field bEndpointAddress.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_clear_halt(long dev_handle, int ep);

	/**
	 * Resets a device by sending a RESET down the port it is connected to.<br>
	 * <br>
	 * <b>Causes re-enumeration:</b> After calling <code>usb_reset</code>,
	 * the device will need to re-enumerate and thusly, requires you to find the
	 * new device and open a new handle. The handle used to call
	 * <code>usb_reset</code> will no longer work.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_reset(long dev_handle);

	/**
	 * Claim an interface of a device.<br>
	 * <br>
	 * <b>Must be called!:</b> <code>usb_claim_interface</code> must be
	 * called before you perform any operations related to this interface (like
	 * <code>usb_set_altinterface, usb_bulk_write</code>, etc).
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param interface_
	 *            The value as specified in the descriptor field
	 *            bInterfaceNumber.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_claim_interface(long dev_handle, int interface_);

	/**
	 * Releases a previously claimed interface
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param interface_
	 *            The value as specified in the descriptor field
	 *            bInterfaceNumber.
	 * @return 0 on success or < 0 on error.
	 */
	public static native int usb_release_interface(long dev_handle,
			int interface_);

	// Control Transfers
	/**
	 * Performs a control request to the default control pipe on a device. The
	 * parameters mirror the types of the same name in the USB specification.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param requesttype
	 * @param request
	 * @param value
	 * @param index
	 * @param bytes
	 * @param size
	 * @param timeout
	 * @return the number of bytes written/read or < 0 on error.
	 */
	public static native int usb_control_msg(long dev_handle, int requesttype,
			int request, int value, int index, byte[] bytes, int size,
			int timeout);

	/**
	 * Retrieves the string descriptor specified by index and langid from a
	 * device.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param index
	 * @param langid
	 * @return the descriptor String or null
	 */
	public static native String usb_get_string(long dev_handle, int index,
			int langid);

	/**
	 * <code>usb_get_string_simple</code> is a wrapper around
	 * <code>usb_get_string</code> that retrieves the string description
	 * specified by index in the first language for the descriptor.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param index
	 * @return the descriptor String or null
	 */
	public static native String usb_get_string_simple(long dev_handle, int index);

	/**
	 * Retrieves a descriptor from the device identified by the type and index
	 * of the descriptor from the default control pipe.<br>
	 * <br>
	 * See {@link #usb_get_descriptor_by_endpoint(long, int, byte, byte, int)}
	 * for a function that allows the control endpoint to be specified.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param type
	 * @param index
	 * @param size
	 *            number of charactes which will be retrieved (the length of the
	 *            resulting String)
	 * @return the descriptor String or null
	 */
	public static native String usb_get_descriptor(long dev_handle, byte type,
			byte index, int size);

	/**
	 * Retrieves a descriptor from the device identified by the type and index
	 * of the descriptor from the control pipe identified by ep.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 * @param type
	 * @param index
	 * @param size
	 *            number of charactes which will be retrieved (the length of the
	 *            resulting String)
	 * @return the descriptor String or null
	 */
	public static native String usb_get_descriptor_by_endpoint(long dev_handle,
			int ep, byte type, byte index, int size);

	// Bulk Transfers
	/**
	 * Performs a bulk write request to the endpoint specified by ep.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 * @param bytes
	 * @param size
	 * @param timeout
	 * @return the number of bytes written on success or < 0 on error.
	 */
	public static native int usb_bulk_write(long dev_handle, int ep,
			byte[] bytes, int size, int timeout);

	/**
	 * Performs a bulk read request to the endpoint specified by ep.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 * @param bytes
	 * @param size
	 * @param timeout
	 * @return the number of bytes read on success or < 0 on error.
	 */
	public static native int usb_bulk_read(long dev_handle, int ep,
			byte[] bytes, int size, int timeout);

	// Interrupt Transfers
	/**
	 * Performs an interrupt write request to the endpoint specified by ep.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 * @param bytes
	 * @param size
	 * @param timeout
	 * @return the number of bytes written on success or < 0 on error.
	 */
	public static native int usb_interrupt_write(long dev_handle, int ep,
			byte[] bytes, int size, int timeout);

	/**
	 * Performs a interrupt read request to the endpoint specified by ep.
	 * 
	 * @param dev_handle
	 *            The handle to the device.
	 * @param ep
	 * @param bytes
	 * @param size
	 * @param timeout
	 * @return the number of bytes read on success or < 0 on error.
	 */
	public static native int usb_interrupt_read(long dev_handle, int ep,
			byte[] bytes, int size, int timeout);

	/**
	 * Returns the error string after an error occured.
	 * 
	 * @return the last error sring.
	 */
	public static native String usb_strerror();

	/** **************************************************************** */

	/**
	 * Maps the Java error code to the system error code.<br>
	 * <br>
	 * Note that not all error codes are be mapped by this method. For more
	 * error codes see the file 'errno.h' on your system.<br>
	 * <br>
	 * 1: EBADF: Bad file descriptor.<br>
	 * 2: ENXIO: No such device or address.<br>
	 * 3: EBUSY: Device or resource busy.<br>
	 * 4: EINVAL: Invalid argument.<br>
	 * 5: ETIMEDOUT: Connection timed out.<br>
	 * 6: EIO: I/O error.<br>
	 * 7: ENOMEM: Not enough memory.<br>
	 * 
	 * 
	 * @return the system error code or 100000 if no mapping has been found.
	 */
	private static native int usb_error_no(int value);

	static {
//		System.out.println("os.name: " + System.getProperty("os.name"));
//		System.out.println("os.arch: " + System.getProperty("os.arch"));
		String os = System.getProperty("os.name");
		if (os.contains("Windows")) {
		    if ( System.getProperty("os.arch").equalsIgnoreCase("amd64") ) {
	    		LibLoader.load( "libusbJava64" );
	    	    }
	    	    else {
	    		LibLoader.load( "libusbJava32" ); 
	    	    }
	    	}
		else if ( System.getProperty("os.arch").equalsIgnoreCase("amd64") ) {
	    		LibLoader.load( "usbJava64" );
//	    		System.err.println("loaded libusbJava64");
		}
		else {
		    try {
	    		LibLoader.load( "usbJavaSh" );
//	    		System.err.println("loaded libusbJavaSh");
	    	    }
	    	    catch ( UnsatisfiedLinkError e ) {
	    		LibLoader.load( "usbJavaSt" );
//	    		System.err.println("loaded libusbJavaSt");
	    	    }
		}
		// define the error codes
		ERROR_SUCCESS = 0;
		ERROR_BAD_FILE_DESCRIPTOR = -usb_error_no(1);
		ERROR_NO_SUCH_DEVICE_OR_ADDRESS = -usb_error_no(2);
		ERROR_BUSY = -usb_error_no(3);
		ERROR_INVALID_PARAMETER = -usb_error_no(4);
		ERROR_TIMEDOUT = -usb_error_no(5);
		ERROR_IO_ERROR = -usb_error_no(6);
		ERROR_NOT_ENOUGH_MEMORY = -usb_error_no(7);
	}
}