From c430b4b2f5467a0b86d2312f742e5b4ece4f4bad Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Fri, 16 Apr 2021 23:56:40 +0300 Subject: Cleanup deinit and document lifecycle --- src/usb.rs | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/usb.rs') diff --git a/src/usb.rs b/src/usb.rs index 92f99d1..0a0003f 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -36,27 +36,37 @@ const CTRL_TIMEOUT: Duration = Duration::from_millis(300); pub struct RtlSdrDeviceHandle { handle: DeviceHandle, iface_id: u8, + kernel_driver_active: bool, } +/// A wrapper around libusb's DeviceHandle that implements +/// various rtl-sdr specific methods impl RtlSdrDeviceHandle { - /// A wrapper around libusb's DeviceHandle that implements - /// various rtl-sdr specific methods pub fn new(handle: DeviceHandle, iface_id: u8) -> RtlSdrDeviceHandle { - RtlSdrDeviceHandle { handle, iface_id } + let mut handle = RtlSdrDeviceHandle { + handle, + iface_id, + kernel_driver_active: false, + }; + handle.detach_kernel_driver(); + handle } - pub fn detach_kernel_driver(&mut self) -> bool { - match self.handle.kernel_driver_active(self.iface_id) { + pub fn detach_kernel_driver(&mut self) { + let active = match self.handle.kernel_driver_active(self.iface_id) { Ok(true) => { self.handle.detach_kernel_driver(self.iface_id).ok(); true } _ => false, - } + }; + self.kernel_driver_active = active; } pub fn attach_kernel_driver(&mut self) { - self.handle.attach_kernel_driver(self.iface_id).ok(); + if self.kernel_driver_active { + self.handle.attach_kernel_driver(self.iface_id).ok(); + } } pub fn claim_interface(&mut self) { @@ -237,9 +247,14 @@ impl RtlSdrDeviceHandle { } pub fn deinit_baseband(&self) { - // deinit tuner? - // power off demod and ADCs self.write_reg(BLOCK_SYSB, ADDR_SYS_DEMOD_CTL, 0x20, 1); } } + +impl Drop for RtlSdrDeviceHandle { + fn drop(&mut self) { + self.deinit_baseband(); + self.attach_kernel_driver(); + } +} -- cgit v1.3.1