summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2021-04-17 11:39:57 +0300
committerYuval Adam <_@yuv.al>2021-04-17 11:39:57 +0300
commit4314ac519efce972760ecf302e290d0c38f31b65 (patch)
tree4fac5f56ea52fc1e90e1393e4f2462963c7bc836 /src
parent6199b1482e21f578cd64e5977a7a83a61d542cb5 (diff)
Fix tuner probing logic
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs49
-rw-r--r--src/tuners/fc0013.rs4
-rw-r--r--src/tuners/mod.rs1
-rw-r--r--src/tuners/r820t.rs4
4 files changed, 43 insertions, 15 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 9528f91..f1f7268 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -5,7 +5,7 @@ extern crate rusb;
mod tuners;
mod usb;
-use log::{error, info, trace};
+use log::{error, info, trace, warn};
use tuners::*;
use usb::RtlSdrDeviceHandle;
@@ -44,7 +44,7 @@ impl RtlSdr {
for kd in KNOWN_DEVICES.iter() {
if kd.0 == vid && kd.1 == pid {
- info!("Found {} {{{:04x}:{:04x}}}", kd.2, vid, pid);
+ info!("Found device {} {{{:04x}:{:04x}}}", kd.2, vid, pid);
let usb_handle = dev.open().unwrap();
let mut handle = RtlSdrDeviceHandle::new(usb_handle, self.iface_id);
// let kernel_driver_attached = handle.detach_kernel_driver();
@@ -58,40 +58,59 @@ impl RtlSdr {
handle.set_i2c_repeater(true);
{
- let tuner: Box<dyn Tuner> = match self.search_tuner(&handle) {
- Some(tuner) => match tuner {
- r820t::TUNER_ID => Box::new(r820t::R820T::new(&handle)),
- fc0013::TUNER_ID => Box::new(fc0013::FC0013::new(&handle)),
- _ => {
- error!("Could not find any valid tuner, aborting.");
- return;
- }
- },
+ let tuner_id = match self.search_tuner(&handle) {
+ Some(tid) => {
+ info!("Got tuner ID {}", tid);
+ tid
+ }
None => {
+ error!("Could not find a value tuner, aborting.");
+ return;
+ }
+ };
+
+ let tuner: Box<dyn Tuner> = match tuner_id {
+ r820t::TUNER_ID => Box::new(r820t::R820T::new(&handle)),
+ fc0013::TUNER_ID => Box::new(fc0013::FC0013::new(&handle)),
+ _ => {
error!("Could not find any valid tuner, aborting.");
return;
}
};
+ info!("Found tuner {}", tuner.display());
+
tuner.init();
}
}
}
}
- error!("Could not find any RTL-SDR device, aborting.")
}
/// Probe all known tuners at their I2C addresses
/// and search for expected return values
fn search_tuner(&mut self, handle: &RtlSdrDeviceHandle) -> Option<&str> {
for tuner_info in KNOWN_TUNERS.iter() {
- match handle.i2c_read_reg(tuner_info.i2c_addr, tuner_info.check_addr) {
+ let regval = handle.i2c_read_reg(tuner_info.i2c_addr, tuner_info.check_addr);
+ trace!(
+ "Probing I2C address {:#02x} checking address {:#02x}",
+ tuner_info.i2c_addr,
+ tuner_info.check_addr,
+ );
+ match regval {
Ok(val) => {
+ trace!(
+ "Expecting value {:#02x}, got value {:#02x}",
+ tuner_info.check_val,
+ val
+ );
if val == tuner_info.check_val {
- return Some(tuner_info.name);
+ return Some(tuner_info.id);
}
}
- Err(_) => {}
+ Err(_) => {
+ warn!("Reading failed, continuing");
+ }
};
}
None
diff --git a/src/tuners/fc0013.rs b/src/tuners/fc0013.rs
index 9eb03f4..9534b7d 100644
--- a/src/tuners/fc0013.rs
+++ b/src/tuners/fc0013.rs
@@ -53,4 +53,8 @@ impl<'a> Tuner for FC0013<'a> {
fn set_gain_mode(&self, _mode: bool) {
unimplemented!()
}
+
+ fn display(&self) -> &str {
+ self.device.name
+ }
}
diff --git a/src/tuners/mod.rs b/src/tuners/mod.rs
index cbd7edf..0739fad 100644
--- a/src/tuners/mod.rs
+++ b/src/tuners/mod.rs
@@ -17,4 +17,5 @@ pub trait Tuner {
fn set_gain(&self, gain: u32);
fn set_if_gain(&self, if_gain: u32);
fn set_gain_mode(&self, mode: bool);
+ fn display(&self) -> &str;
}
diff --git a/src/tuners/r820t.rs b/src/tuners/r820t.rs
index 2638917..74ac740 100644
--- a/src/tuners/r820t.rs
+++ b/src/tuners/r820t.rs
@@ -70,4 +70,8 @@ impl<'a> Tuner for R820T<'a> {
fn set_gain_mode(&self, _mode: bool) {
unimplemented!()
}
+
+ fn display(&self) -> &str {
+ self.device.name
+ }
}