diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 559be47..fa19243 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -13,7 +13,7 @@ Add missing SPEED_SUPER_PLUS constant. - Wrap new libusb functions: setOption. + Wrap new libusb functions: setOption, devMemAlloc, devMemFree. Updated to libusb 1.0.22. diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java index b231695..762a99d 100644 --- a/src/main/java/org/usb4java/LibUsb.java +++ b/src/main/java/org/usb4java/LibUsb.java @@ -1082,7 +1082,7 @@ public final class LibUsb */ public static native void close(final DeviceHandle handle); -/** + /** * Get the underlying device for a handle. * * Please note that the reference count of the returned device is not @@ -1319,6 +1319,45 @@ public final class LibUsb public static native int freeStreams(final DeviceHandle handle, final byte[] endpoints); + + /** + * Attempts to allocate a block of persistent DMA memory suitable for transfers against the given device. + * + * If successful, will return a block of memory that is suitable for use as "buffer" in {@link Transfer} + * against this device. Using this memory instead of regular memory means that the host controller can use DMA + * directly into the buffer to increase performance, and also that transfers can no longer fail due to kernel + * memory fragmentation. + * + * Note that this means you should not modify this memory (or even data on the same cache lines) when a transfer + * is in progress, although it is legal to have several transfers going on within the same memory block. + * + * Will return NULL on failure. Many systems do not support such zerocopy and will always return NULL. Memory + * allocated with this function must be freed with {@link #devMemFree()}. Specifically, this means that the flag + * {@link #TRANSFER_FREE_BUFFER} cannot be used to free memory allocated with this function. + * + * Since version 1.0.21, LIBUSB_API_VERSION >= 0x01000105 + * + * @param handle + * A device handle. + * @param length + * Size of desired data buffer. + * @return The newly allocated memory, or NULL on failure. + */ + public static native ByteBuffer devMemAlloc(final DeviceHandle handle, final int length); + + /** + * Free device memory allocated with {@link #devMemAlloc()}. + * + * @param handle + * A device handle. + * @param buffer + * The previously allocated memory. + * @param size + * The size of the previously allocated memory. + * @return {@link #SUCCESS}, or a LIBUSB_ERROR code on failure. + */ + public static native int devMemFree(final DeviceHandle handle, final ByteBuffer buffer, final int length); + /** * Determine if a kernel driver is active on an interface. *