use linux_rust_bindings::usb::usbdevfs_bulktransfer;
use crate::ioctl::ioctl;
use crate::platform::{
Fd, USBDEVFS_BULK, USBDEVFS_CLAIM_INTERFACE, USBDEVFS_RELEASE_INTERFACE, USBDEVFS_RESET,
};
use crate::{Error, Result};
pub fn bulk_transfer(fd: Fd, endpoint: u32, data: &mut [u8], timeout: u32) -> Result<usize> {
let mut bulk = usbdevfs_bulktransfer {
ep: endpoint,
len: data.len().try_into().map_err(|_e| {
Error::no_code("`bulk_transfer` failed, too much data, max is u32::MAX")
})?,
timeout,
data: data.as_mut_ptr().cast(),
};
unsafe {
ioctl(
fd,
USBDEVFS_BULK as usize,
core::ptr::addr_of_mut!(bulk) as usize,
)
}
}
pub fn claim_interface(fd: Fd, interface_number: u32) -> Result<()> {
unsafe {
ioctl(
fd,
USBDEVFS_CLAIM_INTERFACE as usize,
core::ptr::addr_of!(interface_number) as usize,
)?;
}
Ok(())
}
pub fn reset_usb_device(fd: Fd) -> Result<()> {
unsafe {
ioctl(fd, USBDEVFS_RESET as usize, 0)?;
}
Ok(())
}
pub fn release_interface(fd: Fd, interface_number: u32) -> Result<()> {
unsafe {
ioctl(
fd,
USBDEVFS_RELEASE_INTERFACE as usize,
interface_number as usize,
)?;
}
Ok(())
}