summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2021-04-23 14:44:23 +0300
committerYuval Adam <_@yuv.al>2021-04-23 14:44:23 +0300
commita3ec09ac29b26ebd1cc1235f7ecdcd6a3d74cd60 (patch)
treef8030c65c6cfe9e059dcb0ee0eaf7e0134c4ed61 /src
parent6419d9db8b7e5eb29ccc92ac58a7288c91b74bad (diff)
Start implementing lots of R82xx logic
Diffstat (limited to 'src')
-rw-r--r--src/tuners/fc0013.rs2
-rw-r--r--src/tuners/mod.rs2
-rw-r--r--src/tuners/r820t.rs123
3 files changed, 115 insertions, 12 deletions
diff --git a/src/tuners/fc0013.rs b/src/tuners/fc0013.rs
index 5b5e1f2..d486f87 100644
--- a/src/tuners/fc0013.rs
+++ b/src/tuners/fc0013.rs
@@ -41,7 +41,7 @@ impl Tuner for FC0013 {
unimplemented!()
}
- fn set_bw(&self, _bw: u32, _handle: &RtlSdrDeviceHandle) {
+ fn set_bandwidth(&self, _bw: u32, _handle: &RtlSdrDeviceHandle) {
unimplemented!()
}
diff --git a/src/tuners/mod.rs b/src/tuners/mod.rs
index 626fc9e..9a7c9ce 100644
--- a/src/tuners/mod.rs
+++ b/src/tuners/mod.rs
@@ -18,7 +18,7 @@ pub trait Tuner {
fn init(&self, handle: &RtlSdrDeviceHandle);
fn exit(&self);
fn set_freq(&self, freq: u32);
- fn set_bw(&self, bw: u32, handle: &RtlSdrDeviceHandle);
+ fn set_bandwidth(&self, bw: u16, rate: u32, handle: &RtlSdrDeviceHandle);
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
index b8064ac..c083a05 100644
--- a/src/tuners/r820t.rs
+++ b/src/tuners/r820t.rs
@@ -1,27 +1,125 @@
use super::{Tuner, TunerInfo};
use usb::RtlSdrDeviceHandle;
-const R82XX_IF_FREQ: u32 = 3570000;
+pub const TUNER_ID: &str = "r820t";
+pub const TUNER_NAME: &str = "Rafael Micro R820T";
+
+const I2C_ADDR: u8 = 0x34;
+const CHECK_ADDR: u8 = 0x00;
+const CHECK_VAL: u8 = 0x69;
+const IF_FREQ: u32 = 3570000;
+const REG_SHADOW_START: u8 = 5;
+const NUM_REGS: usize = 30;
+const NUM_IMR: usize = 5;
+const IMR_TRIAL: u8 = 9;
+
+enum Chip {
+ R820T,
+ R620D,
+ R828D,
+ R828,
+ R828S,
+ R820C,
+}
+
+enum TunerType {
+ Radio,
+ AnalogTv,
+ DigitalTv,
+}
+
+enum XtalCapValue {
+ XtalLowCap30P,
+ XtalLowCap20P,
+ XtalLowCap10P,
+ XtalLowCap0P,
+ XtalHighCap0P,
+}
pub struct R820T {
pub device: TunerInfo,
- // pub handle: &'a RtlSdrDeviceHandle,
+ regs: [u8; NUM_REGS],
+ buf: [u8; NUM_REGS + 1],
+ xtal_cal_sel: XtalCapValue,
+ pll: u16, // kHz
+ int_freq: u32,
+ fil_cal_code: u8,
+ input: u8,
+ has_lock: i16, // bool?
+ init_done: i16, // bool?
+ delsys: u32,
+ tuner_type: TunerType,
+ bw: u32, // MHz
}
-pub const TUNER_ID: &str = "r820t";
+pub struct FreqRange {
+ freq: u32,
+ open_d: u8,
+ rf_mux_ploy: u8,
+ tf_c: u8,
+ xtal_cap20p: u8,
+ xtal_cap10p: u8,
+ xtal_cap0p: u8,
+}
+
+pub struct Config {
+ i2c_addr: u8,
+ xtal: u32,
+ chip: Chip,
+ max_i2c_msg_len: u16,
+ use_predetect: i16, // bool?
+}
pub const TUNER_INFO: TunerInfo = TunerInfo {
id: TUNER_ID,
- name: "Rafael Micro R820T",
- i2c_addr: 0x34,
- check_addr: 0x00,
- check_val: 0x69,
+ name: TUNER_NAME,
+ i2c_addr: I2C_ADDR,
+ check_addr: CHECK_ADDR,
+ check_val: CHECK_VAL,
// gains: vec![
// 0, 9, 14, 27, 37, 77, 87, 125, 144, 157, 166, 197, 207, 229, 254, 280, 297, 328, 338, 364,
// 372, 386, 402, 421, 434, 439, 445, 480, 496,
// ],
};
+// starts from REG_SHADOW_START
+const INITIAL_REGS: [u8; NUM_REGS] = vec![
+ 0x83, 0x32, 0x75, 0xc0, 0x40, 0xd6, 0x6c, 0xf5, 0x63, 0x75, 0x68, 0x6c, 0x83, 0x80, 0x00, 0x0f,
+ 0x00, 0xc0, 0x30, 0x48, 0xcc, 0x60, 0x00, 0x54, 0xae, 0x4a, 0xc0,
+];
+
+const FREQ_RANGES: [(u32, u8, u8, u8, u8, u8, u8); 21] = [
+ (000, 0x08, 0x02, 0xdf, 0x02, 0x01, 0x00),
+ (050, 0x08, 0x02, 0xbe, 0x02, 0x01, 0x00),
+ (055, 0x08, 0x02, 0x8b, 0x02, 0x01, 0x00),
+ (060, 0x08, 0x02, 0x7b, 0x02, 0x01, 0x00),
+ (065, 0x08, 0x02, 0x69, 0x02, 0x01, 0x00),
+ (070, 0x08, 0x02, 0x58, 0x02, 0x01, 0x00),
+ (075, 0x00, 0x02, 0x44, 0x02, 0x01, 0x00),
+ (080, 0x00, 0x02, 0x44, 0x02, 0x01, 0x00),
+ (090, 0x00, 0x02, 0x34, 0x01, 0x01, 0x00),
+ (100, 0x00, 0x02, 0x34, 0x01, 0x01, 0x00),
+ (110, 0x00, 0x02, 0x24, 0x01, 0x01, 0x00),
+ (120, 0x00, 0x02, 0x24, 0x01, 0x01, 0x00),
+ (140, 0x00, 0x02, 0x14, 0x01, 0x01, 0x00),
+ (180, 0x00, 0x02, 0x13, 0x00, 0x00, 0x00),
+ (220, 0x00, 0x02, 0x13, 0x00, 0x00, 0x00),
+ (250, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00),
+ (280, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00),
+ (310, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00),
+ (450, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00),
+ (588, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00),
+ (650, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00),
+];
+
+const XTAL_CAPS: [(u8, XtalCapValue); 5] = [
+ (0x0b, XtalCapValue::XtalLowCap30P),
+ (0x02, XtalCapValue::XtalLowCap20P),
+ (0x01, XtalCapValue::XtalLowCap10P),
+ (0x00, XtalCapValue::XtalLowCap0P),
+ (0x10, XtalCapValue::XtalHighCap0P),
+];
+
impl R820T {
pub fn new(handle: &RtlSdrDeviceHandle) -> R820T {
let tuner = R820T { device: TUNER_INFO };
@@ -46,7 +144,7 @@ impl Tuner for R820T {
// the R82XX use 3.57 MHz IF for the DVB-T 6 MHz mode, and
// 4.57 MHz for the 8 MHz mode
- handle.set_if_freq(R82XX_IF_FREQ);
+ handle.set_if_freq(IF_FREQ);
// enable spectrum inversion
handle.demod_write_reg(1, 0x15, 0x01, 1);
@@ -58,8 +156,13 @@ impl Tuner for R820T {
unimplemented!()
}
- fn set_bw(&self, _bw: u32, _handle: &RtlSdrDeviceHandle) {
- unimplemented!()
+ fn set_bandwidth(&self, bw: u16, rate: u32, handle: &RtlSdrDeviceHandle) {
+ let mut rc: u16;
+ let mut real_bw: u16 = 0;
+ let mut reg_0a: u8;
+ let mut reg_0b: u8;
+
+ if bw > 7000000 {}
}
fn set_gain(&self, _gain: u32) {