From ef64d358a25e69e440305e1216824921536d5587 Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Fri, 16 Apr 2021 15:05:22 +0300 Subject: Initial rusb version that actually compiles! --- src/lib.rs | 101 +++++++++++++++++++++++++++---------------------------------- 1 file changed, 45 insertions(+), 56 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 7d10e13..d32299a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,82 +1,71 @@ -extern crate libusb; +extern crate rusb; mod devices; mod usb; use devices::*; -use usb::Usb; +use usb::RtlSdrDeviceHandle; const INTERFACE_ID: u8 = 0; const KNOWN_DEVICES: [(u16, u16, &str); 2] = [ (0x0bda, 0x2832, "Generic RTL2832U"), - (0x0bda, 0x2838, "Generic RTL2832U OEM") + (0x0bda, 0x2838, "Generic RTL2832U OEM"), ]; -pub struct RtlSdr<'a> { - ctx: &'a libusb::Context, - iface_id: u8 +pub struct RtlSdr { + // ctx: rusb::Context, + // device: UsbDevice, + iface_id: u8, } -impl<'a> RtlSdr<'a> { - - pub fn new(ctx: &'a libusb::Context) -> RtlSdr<'a> { +impl RtlSdr { + pub fn new() -> RtlSdr { RtlSdr { - ctx, - iface_id: INTERFACE_ID + // ctx: rusb::Context::new().unwrap(), + iface_id: INTERFACE_ID, } } pub fn open(&mut self) { - for dev in self.ctx.devices().unwrap().iter() { + for dev in rusb::devices().unwrap().iter() { let desc = dev.device_descriptor().unwrap(); let vid = desc.vendor_id(); let pid = desc.product_id(); for kd in KNOWN_DEVICES.iter() { if kd.0 == vid && kd.1 == pid { - let mut handle = dev.open().unwrap(); - - let has_kernel_driver = match handle.kernel_driver_active(self.iface_id) { - Ok(true) => { - handle.detach_kernel_driver(self.iface_id).ok(); - true - }, - _ => false - }; - - let _iface = handle.claim_interface(self.iface_id).unwrap(); - - { - let usb = Usb::new(&handle); - - usb.test_write(); - // reset device if write didn't succeed - - usb.init_baseband(); - usb.set_i2c_repeater( true); - - let d = r820t::R820T::new(&usb); - let _found = match usb.i2c_read_reg(d.device.i2c_addr, d.device.check_addr) { - Ok(reg) => { - if reg == d.device.check_val { - println!("Found {} tuner\n", d.device.name); - true - } - else { - false - } - }, - Err(_) => false - }; - - d.init(); - - usb.deinit_baseband(); - } + let usb_handle = dev.open().unwrap(); + let mut handle = RtlSdrDeviceHandle::new(usb_handle, self.iface_id); + let kernel_driver_attached = handle.detach_kernel_driver(); + + let _iface = handle.claim_interface(); + + handle.test_write(); + // reset device if write didn't succeed + + handle.init_baseband(); + handle.set_i2c_repeater(true); + + let d = r820t::R820T::new(handle); + // let _found = match handle.i2c_read_reg(d.device.i2c_addr, d.device.check_addr) { + // Ok(reg) => { + // if reg == d.device.check_val { + // println!("Found {} tuner\n", d.device.name); + // true + // } else { + // false + // } + // } + // Err(_) => false, + // }; + + d.init(); + + // handle.deinit_baseband(); - if has_kernel_driver { - handle.attach_kernel_driver(self.iface_id).ok(); + if kernel_driver_attached { + // handle.attach_kernel_driver(); } } } @@ -90,8 +79,8 @@ mod tests { #[test] fn test_init() { - let ctx = libusb::Context::new().unwrap(); - let mut rtlsdr = RtlSdr::new(&ctx); - rtlsdr.open(); + let mut rtlsdr = RtlSdr::new(); + let x = rtlsdr.open(); + assert_eq!(x, 1); } } -- cgit v1.3.1