summaryrefslogtreecommitdiff
path: root/src/tuners
diff options
context:
space:
mode:
Diffstat (limited to 'src/tuners')
-rw-r--r--src/tuners/fc0013.rs56
-rw-r--r--src/tuners/mod.rs20
-rw-r--r--src/tuners/r820t.rs73
3 files changed, 149 insertions, 0 deletions
diff --git a/src/tuners/fc0013.rs b/src/tuners/fc0013.rs
new file mode 100644
index 0000000..9eb03f4
--- /dev/null
+++ b/src/tuners/fc0013.rs
@@ -0,0 +1,56 @@
+use super::{Tuner, TunerInfo};
+use usb::RtlSdrDeviceHandle;
+
+pub struct FC0013<'a> {
+ pub device: TunerInfo,
+ pub handle: &'a RtlSdrDeviceHandle,
+}
+
+pub const TUNER_ID: &str = "fc0013";
+
+pub const TUNER_INFO: TunerInfo = TunerInfo {
+ id: TUNER_ID,
+ name: "Fitipower FC0013",
+ i2c_addr: 0xc6,
+ check_addr: 0x00,
+ check_val: 0xa3,
+};
+
+impl<'a> FC0013<'a> {
+ pub fn new(handle: &'a RtlSdrDeviceHandle) -> FC0013<'a> {
+ FC0013 {
+ device: TUNER_INFO,
+ handle: handle,
+ }
+ }
+}
+
+impl<'a> Tuner for FC0013<'a> {
+ fn init(&self) {
+ println!("Init {}", self.device.name);
+ }
+
+ fn exit(&self) {
+ unimplemented!()
+ }
+
+ fn set_freq(&self, _freq: u32) {
+ unimplemented!()
+ }
+
+ fn set_bw(&self, _bw: u32) {
+ unimplemented!()
+ }
+
+ fn set_gain(&self, _gain: u32) {
+ unimplemented!()
+ }
+
+ fn set_if_gain(&self, _if_gain: u32) {
+ unimplemented!()
+ }
+
+ fn set_gain_mode(&self, _mode: bool) {
+ unimplemented!()
+ }
+}
diff --git a/src/tuners/mod.rs b/src/tuners/mod.rs
new file mode 100644
index 0000000..cbd7edf
--- /dev/null
+++ b/src/tuners/mod.rs
@@ -0,0 +1,20 @@
+pub mod fc0013;
+pub mod r820t;
+
+pub struct TunerInfo {
+ pub id: &'static str,
+ pub name: &'static str,
+ pub i2c_addr: u8,
+ pub check_addr: u8,
+ pub check_val: u8,
+}
+
+pub trait Tuner {
+ fn init(&self);
+ fn exit(&self);
+ fn set_freq(&self, freq: u32);
+ fn set_bw(&self, bw: u32);
+ fn set_gain(&self, gain: u32);
+ fn set_if_gain(&self, if_gain: u32);
+ fn set_gain_mode(&self, mode: bool);
+}
diff --git a/src/tuners/r820t.rs b/src/tuners/r820t.rs
new file mode 100644
index 0000000..2638917
--- /dev/null
+++ b/src/tuners/r820t.rs
@@ -0,0 +1,73 @@
+use super::{Tuner, TunerInfo};
+use usb::RtlSdrDeviceHandle;
+
+const R82XX_IF_FREQ: u32 = 3570000;
+
+pub struct R820T<'a> {
+ pub device: TunerInfo,
+ pub handle: &'a RtlSdrDeviceHandle,
+}
+
+pub const TUNER_ID: &str = "r820t";
+
+pub const TUNER_INFO: TunerInfo = TunerInfo {
+ id: TUNER_ID,
+ name: "Rafael Micro R820T",
+ i2c_addr: 0x34,
+ check_addr: 0x00,
+ check_val: 0x69,
+};
+
+impl<'a> R820T<'a> {
+ pub fn new(handle: &'a RtlSdrDeviceHandle) -> R820T<'a> {
+ R820T {
+ device: TUNER_INFO,
+ handle: handle,
+ }
+ }
+}
+
+impl<'a> Drop for R820T<'a> {
+ fn drop(&mut self) {
+ self.exit();
+ }
+}
+
+impl<'a> Tuner for R820T<'a> {
+ fn init(&self) {
+ // disable Zero-IF mode
+ self.handle.demod_write_reg(1, 0xb1, 0x1a, 1);
+
+ // only enable In-phase ADC input
+ self.handle.demod_write_reg(0, 0x08, 0x4d, 1);
+
+ // the R82XX use 3.57 MHz IF for the DVB-T 6 MHz mode, and
+ // 4.57 MHz for the 8 MHz mode
+ self.handle.set_if_freq(R82XX_IF_FREQ);
+
+ // enable spectrum inversion
+ self.handle.demod_write_reg(1, 0x15, 0x01, 1);
+ }
+
+ fn exit(&self) {}
+
+ fn set_freq(&self, _freq: u32) {
+ unimplemented!()
+ }
+
+ fn set_bw(&self, _bw: u32) {
+ unimplemented!()
+ }
+
+ fn set_gain(&self, _gain: u32) {
+ unimplemented!()
+ }
+
+ fn set_if_gain(&self, _if_gain: u32) {
+ unimplemented!()
+ }
+
+ fn set_gain_mode(&self, _mode: bool) {
+ unimplemented!()
+ }
+}