| //! This crate provides a safe wrapper around the native `libusb` library. |
| |
| pub use libusb1_sys as ffi; |
| pub use libusb1_sys::constants; |
| |
| #[cfg(unix)] |
| pub use crate::options::disable_device_discovery; |
| pub use crate::{ |
| config_descriptor::{ConfigDescriptor, Interfaces}, |
| context::{Context, GlobalContext, LogCallbackMode, LogLevel, UsbContext}, |
| device::Device, |
| device_descriptor::DeviceDescriptor, |
| device_handle::DeviceHandle, |
| device_list::{DeviceList, Devices}, |
| endpoint_descriptor::EndpointDescriptor, |
| error::{Error, Result}, |
| fields::{ |
| request_type, Direction, Recipient, RequestType, Speed, SyncType, TransferType, UsageType, |
| Version, |
| }, |
| hotplug::{Hotplug, HotplugBuilder, Registration}, |
| interface_descriptor::{ |
| EndpointDescriptors, Interface, InterfaceDescriptor, InterfaceDescriptors, |
| }, |
| language::{Language, PrimaryLanguage, SubLanguage}, |
| options::UsbOption, |
| version::{version, LibraryVersion}, |
| }; |
| |
| #[cfg(test)] |
| #[macro_use] |
| mod test_helpers; |
| |
| #[macro_use] |
| mod error; |
| mod version; |
| |
| mod context; |
| mod device; |
| mod device_handle; |
| mod device_list; |
| |
| mod config_descriptor; |
| mod device_descriptor; |
| mod endpoint_descriptor; |
| mod fields; |
| mod hotplug; |
| mod interface_descriptor; |
| mod language; |
| mod options; |
| |
| /// Tests whether the running `libusb` library supports capability API. |
| pub fn has_capability() -> bool { |
| GlobalContext::default().as_raw(); |
| unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_CAPABILITY) != 0 } |
| } |
| |
| /// Tests whether the running `libusb` library supports hotplug. |
| pub fn has_hotplug() -> bool { |
| GlobalContext::default().as_raw(); |
| unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_HOTPLUG) != 0 } |
| } |
| |
| /// Tests whether the running `libusb` library has HID access. |
| pub fn has_hid_access() -> bool { |
| GlobalContext::default().as_raw(); |
| unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_HID_ACCESS) != 0 } |
| } |
| |
| /// Tests whether the running `libusb` library supports detaching the kernel driver. |
| pub fn supports_detach_kernel_driver() -> bool { |
| GlobalContext::default().as_raw(); |
| unsafe { |
| libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER) != 0 |
| } |
| } |
| |
| /// Returns a list of the current USB devices. Using global context |
| pub fn devices() -> crate::Result<DeviceList<GlobalContext>> { |
| GlobalContext::default().devices() |
| } |
| |
| /// Sets the log level of a `libusb` global context. |
| pub fn set_log_level(level: LogLevel) { |
| unsafe { |
| libusb1_sys::libusb_set_debug(GlobalContext::default().as_raw(), level.as_c_int()); |
| } |
| } |
| |
| /// Convenience function to open a device by its vendor ID and product ID. |
| /// Using global context |
| /// |
| /// This function is provided as a convenience for building prototypes without having to |
| /// iterate a [`DeviceList`](struct.DeviceList.html). It is not meant for production |
| /// applications. |
| /// |
| /// Returns a device handle for the first device found matching `vendor_id` and `product_id`. |
| /// On error, or if the device could not be found, it returns `None`. |
| pub fn open_device_with_vid_pid( |
| vendor_id: u16, |
| product_id: u16, |
| ) -> Option<DeviceHandle<GlobalContext>> { |
| let handle = unsafe { |
| libusb1_sys::libusb_open_device_with_vid_pid( |
| GlobalContext::default().as_raw(), |
| vendor_id, |
| product_id, |
| ) |
| }; |
| |
| if handle.is_null() { |
| None |
| } else { |
| Some(unsafe { |
| DeviceHandle::from_libusb( |
| GlobalContext::default(), |
| std::ptr::NonNull::new_unchecked(handle), |
| ) |
| }) |
| } |
| } |