diff options
| author | Yuval Adam <_@yuv.al> | 2021-04-16 23:56:40 +0300 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2021-04-17 10:33:57 +0300 |
| commit | c430b4b2f5467a0b86d2312f742e5b4ece4f4bad (patch) | |
| tree | fab4ed16477ee94a3527f131bfe9c521345427de /src/usb.rs | |
| parent | cc3a300afcba8fffaee5feb5f56792cfd697bf28 (diff) | |
Cleanup deinit and document lifecyclev0.2
Diffstat (limited to 'src/usb.rs')
| -rw-r--r-- | src/usb.rs | 33 |
1 files changed, 24 insertions, 9 deletions
@@ -36,27 +36,37 @@ const CTRL_TIMEOUT: Duration = Duration::from_millis(300); pub struct RtlSdrDeviceHandle { handle: DeviceHandle<GlobalContext>, 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<GlobalContext>, 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(); + } +} |
