sig
  type size_t = int
  and usb_device_descriptor = {
    bLength : int;
    bDescriptorType : int;
    bcdUSB : int;
    bDeviceClass : int;
    bDeviceSubClass : int;
    bDeviceProtocol : int;
    bMaxPacketSize0 : int;
    idVendor : int;
    idProduct : int;
    bcdDevice : int;
    iManufacturer : int;
    iProduct : int;
    iSerialNumber : int;
    bNumConfigurations : int;
  }
  and usb_endpoint_descriptor = {
    bLength : int;
    bDescriptorType : int;
    bEndpointAddress : int;
    bmAttributes : int;
    wMaxPacketSize : int;
    bInterval : int;
    bRefresh : int;
    bSynchAddress : int;
    extra : char array;
  }
  and usb_interface_descriptor = {
    bLength : int;
    bDescriptorType : int;
    bInterfaceNumber : int;
    bAlternateSetting : int;
    bInterfaceClass : int;
    bInterfaceSubClass : int;
    bInterfaceProtocol : int;
    iInterface : int;
    endpoint : Usb.usb_endpoint_descriptor array;
    extra : char array;
  }
  and usb_interface = {
    altsetting : Usb.usb_interface_descriptor;
    num_altsetting : int;
  }
  and usb_config_descriptor = {
    bLength : int;
    bDescriptorType : int;
    wTotalLength : int;
    bNumInterfaces : int;
    bConfigurationValue : int;
    iConfiguration : int;
    bmAttributes : int;
    maxPower : int;
    interf : Usb.usb_interface;
    extra : char array;
  }
  and usb_bus
  and usb_dev_handle
  and usb_device
  external is_null : 'Com.opaque -> bool = "is_null"
  external usb_bus_prev : Usb.usb_bus Com.opaque -> Usb.usb_bus Com.opaque
    = "camlidl_usb_usb_bus_prev"
  external usb_bus_next : Usb.usb_bus Com.opaque -> Usb.usb_bus Com.opaque
    = "camlidl_usb_usb_bus_next"
  external usb_bus_dirname : Usb.usb_bus Com.opaque -> string
    = "camlidl_usb_usb_bus_dirname"
  external usb_bus_devices :
    Usb.usb_bus Com.opaque -> Usb.usb_device Com.opaque
    = "camlidl_usb_usb_bus_devices"
  external usb_device_prev :
    Usb.usb_device Com.opaque -> Usb.usb_device Com.opaque
    = "camlidl_usb_usb_device_prev"
  external usb_device_next :
    Usb.usb_device Com.opaque -> Usb.usb_device Com.opaque
    = "camlidl_usb_usb_device_next"
  external usb_device_filename : Usb.usb_device Com.opaque -> string
    = "camlidl_usb_usb_device_filename"
  external usb_device_bus :
    Usb.usb_device Com.opaque -> Usb.usb_bus Com.opaque
    = "camlidl_usb_usb_device_bus"
  external usb_device_descriptor :
    Usb.usb_device Com.opaque -> Usb.usb_device_descriptor
    = "camlidl_usb_usb_device_descriptor"
  external usb_device_config :
    Usb.usb_device Com.opaque -> Usb.usb_config_descriptor
    = "camlidl_usb_usb_device_config"
  external usb_init : unit -> unit = "camlidl_usb_usb_init"
  external usb_find_busses : unit -> int = "camlidl_usb_usb_find_busses"
  external usb_find_devices : unit -> int = "camlidl_usb_usb_find_devices"
  external usb_get_busses : unit -> Usb.usb_bus Com.opaque
    = "camlidl_usb_usb_get_busses"
  external usb_open :
    Usb.usb_device Com.opaque ->
    Usb.usb_dev_handle Com.opaque * Usb.usb_device Com.opaque
    = "camlidl_usb_usb_open"
  external usb_close :
    Usb.usb_dev_handle Com.opaque -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_close"
  external usb_claim_interface :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_claim_interface"
  external usb_reset :
    Usb.usb_dev_handle Com.opaque -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_reset"
  external usb_set_configuration :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_set_configuration"
  external usb_set_altinterface :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_set_altinterface"
  external usb_resetep :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque = "camlidl_usb_usb_resetep"
  external usb_clear_halt :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque = "camlidl_usb_usb_clear_halt"
  external usb_release_interface :
    Usb.usb_dev_handle Com.opaque ->
    int -> int * Usb.usb_dev_handle Com.opaque
    = "camlidl_usb_usb_release_interface"
  external usb_control_msg :
    Usb.usb_dev_handle Com.opaque ->
    int -> int -> int -> int -> int -> int -> int * int array
    = "camlidl_usb_usb_control_msg_bytecode" "camlidl_usb_usb_control_msg"
  external usb_get_string :
    Usb.usb_dev_handle Com.opaque -> int -> int -> Usb.size_t -> int * string
    = "camlidl_usb_usb_get_string"
  external usb_get_string_simple :
    Usb.usb_dev_handle Com.opaque -> int -> Usb.size_t -> int * string
    = "camlidl_usb_usb_get_string_simple"
  external usb_bulk_write :
    Usb.usb_dev_handle Com.opaque -> int -> int array -> int -> int
    = "camlidl_usb_usb_bulk_write"
  external usb_bulk_read :
    Usb.usb_dev_handle Com.opaque -> int -> int -> int -> int * int array
    = "camlidl_usb_usb_bulk_read"
end