Add new API function libusb_get_device_speed()
authorHans de Goede <hdegoede@redhat.com>
Thu, 17 Feb 2011 12:17:55 +0000 (13:17 +0100)
committerPeter Stuge <peter@stuge.se>
Thu, 15 Sep 2011 13:16:04 +0000 (15:16 +0200)
Reworked version of my earlier patch, largely modelled after (if not
copy and pasted from) Trygve Laugstøl's <trygvis@inamo.no> similar
commit 5a6541e0d80fb1f21e2b960bc2337a612f9d74fb in
git://git.libusb.org/libusb-trygvis.git
http://git.libusb.org/libusb-trygvis.git
http://git.libusb.org/?p=libusb-trygvis.git;a=commitdiff;h=5a6541e0d

This patch does not add any OS specific code. The supporting code in
each backend follows in separate patches. References #45.

Signed-off-By: Hans de Goede <hdegoede@redhat.com>
libusb/core.c
libusb/libusb-1.0.def
libusb/libusb.h
libusb/libusbi.h

index 1dedb17..072d050 100644 (file)
@@ -523,6 +523,7 @@ struct libusb_device *usbi_alloc_device(struct libusb_context *ctx,
        dev->ctx = ctx;
        dev->refcnt = 1;
        dev->session_data = session_id;
+       dev->speed = LIBUSB_SPEED_UNKNOWN;
        memset(&dev->os_priv, 0, priv_size);
 
        usbi_mutex_lock(&ctx->usb_devs_lock);
@@ -680,6 +681,17 @@ uint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev)
        return dev->device_address;
 }
 
+/** \ingroup dev
+ * Get the negotiated connection speed for a device.
+ * \param dev a device
+ * \returns a \ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that
+ * the OS doesn't know or doesn't support returning the negotiated speed.
+ */
+int API_EXPORTED libusb_get_device_speed(libusb_device *dev)
+{
+       return dev->speed;
+}
+
 static const struct libusb_endpoint_descriptor *find_endpoint(
        struct libusb_config_descriptor *config, unsigned char endpoint)
 {
index b7c9404..9cdbc5f 100644 (file)
@@ -48,6 +48,8 @@ EXPORTS
   libusb_get_device_descriptor@8 = libusb_get_device_descriptor
   libusb_get_device_list
   libusb_get_device_list@8 = libusb_get_device_list
+  libusb_get_device_speed
+  libusb_get_device_speed@4 = libusb_get_device_speed
   libusb_get_max_iso_packet_size
   libusb_get_max_iso_packet_size@8 = libusb_get_max_iso_packet_size
   libusb_get_max_packet_size
index 45e20ec..619a65a 100644 (file)
@@ -684,6 +684,26 @@ typedef struct libusb_device libusb_device;
  */
 typedef struct libusb_device_handle libusb_device_handle;
 
+/** \ingroup dev
+ * Speed codes. Indicates the speed at which the device is operating.
+ */
+enum libusb_speed {
+    /** The OS doesn't report or know the device speed. */
+    LIBUSB_SPEED_UNKNOWN = 0,
+
+    /** The device is operating at low speed (1.5MBit/s). */
+    LIBUSB_SPEED_LOW = 1,
+
+    /** The device is operating at full speed (12MBit/s). */
+    LIBUSB_SPEED_FULL = 2,
+
+    /** The device is operating at high speed (480MBit/s). */
+    LIBUSB_SPEED_HIGH = 3,
+
+    /** The device is operating at super speed (5000MBit/s). */
+    LIBUSB_SPEED_SUPER = 4,
+};
+
 /** \ingroup misc
  * Error codes. Most libusb functions return 0 on success or one of these
  * codes on failure.
@@ -890,6 +910,7 @@ void LIBUSB_CALL libusb_free_config_descriptor(
        struct libusb_config_descriptor *config);
 uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev);
 uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev);
+int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev);
 int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev,
        unsigned char endpoint);
 int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev,
index 1ea7f26..564ee3e 100644 (file)
@@ -276,6 +276,7 @@ struct libusb_device {
        uint8_t bus_number;
        uint8_t device_address;
        uint8_t num_configurations;
+       enum libusb_speed speed;
 
        struct list_head list;
        unsigned long session_data;