From 284fd4df00d12814decf9a80c39c8eb93a0d1dce Mon Sep 17 00:00:00 2001 From: Kyle Keen Date: Sat, 25 Jan 2014 12:41:13 -0500 Subject: [PATCH] driver: tejeez's no-mod direct sampling --- include/tuner_r82xx.h | 1 + src/librtlsdr.c | 32 +++++++++++++++++++++++++++++--- src/tuner_r82xx.c | 41 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/include/tuner_r82xx.h b/include/tuner_r82xx.h index fd81e1d..60f110b 100644 --- a/include/tuner_r82xx.h +++ b/include/tuner_r82xx.h @@ -115,5 +115,6 @@ int r82xx_standby(struct r82xx_priv *priv); int r82xx_init(struct r82xx_priv *priv); int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq); int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain); +int r82xx_set_nomod(struct r82xx_priv *priv); #endif diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 9a3ebcd..135c061 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -1138,13 +1138,36 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on) if (!dev) return -1; - if (on) { + /* set up normal direct sampling */ + if (on == 1 || on == 2) { if (dev->tuner && dev->tuner->exit) { rtlsdr_set_i2c_repeater(dev, 1); r = dev->tuner->exit(dev); rtlsdr_set_i2c_repeater(dev, 0); } + } + /* set up no-mod direct sampling */ + if (on == 3 && dev->tuner) { + if (dev->tuner_type == RTLSDR_TUNER_E4000) { + fprintf(stderr, "Tuning E4000 to 3708 MHz\n"); + rtlsdr_set_i2c_repeater(dev, 1); + dev->tuner->init(dev); + dev->tuner->set_freq(dev, 3708000000u); + e4000_set_bw(dev, 15000000); + rtlsdr_set_i2c_repeater(dev, 0); + } + if (dev->tuner_type == RTLSDR_TUNER_R820T) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + rtlsdr_set_i2c_repeater(dev, 1); + dev->tuner->init(dev); + r82xx_set_nomod(&devt->r82xx_p); + rtlsdr_set_i2c_repeater(dev, 0); + } + } + + /* common to all direct modes */ + if (on) { /* disable Zero-IF mode */ r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1); @@ -1155,11 +1178,14 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on) r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1); /* swap I and Q ADC, this allows to select between two inputs */ - r |= rtlsdr_demod_write_reg(dev, 0, 0x06, (on > 1) ? 0x90 : 0x80, 1); + r |= rtlsdr_demod_write_reg(dev, 0, 0x06, (on == 2) ? 0x90 : 0x80, 1); fprintf(stderr, "Enabled direct sampling mode, input %i\n", on); dev->direct_sampling = on; - } else { + } + + /* disable direct sampling */ + if (!on) { if (dev->tuner && dev->tuner->init) { rtlsdr_set_i2c_repeater(dev, 1); r |= dev->tuner->init(dev); diff --git a/src/tuner_r82xx.c b/src/tuner_r82xx.c index e03e034..50e740d 100644 --- a/src/tuner_r82xx.c +++ b/src/tuner_r82xx.c @@ -783,7 +783,20 @@ static int r82xx_set_tv_standard(struct r82xx_priv *priv, flt_ext_widest = 0x00; /* r15[7]: flt_ext_wide off */ polyfil_cur = 0x60; /* r25[6:5]:min */ } else { - if (bw <= 6) { + if (bw < 6) { + /* narrowest bandwidth? */ + if_khz = 3570; + filt_cal_lo = 56000; /* 52000->56000 */ + filt_gain = 0x10; /* +3db, 6mhz on */ + img_r = 0x00; /* image negative */ + filt_q = 0x10; /* r10[4]:low q(1'b1) */ + hp_cor = 0x6a; /* 1.7m disable, +2cap, 1.25mhz */ + ext_enable = 0x60; /* r30[6]=1 ext enable; r30[5]:1 ext at lna max-1 */ + loop_through = 0x00; /* r5[7], lt on */ + lt_att = 0x00; /* r31[7], lt att enable */ + flt_ext_widest = 0x00; /* r15[7]: flt_ext_wide off */ + polyfil_cur = 0x60; /* r25[6:5]:min */ + } else if (bw == 6) { if_khz = 3570; filt_cal_lo = 56000; /* 52000->56000 */ filt_gain = 0x10; /* +3db, 6mhz on */ @@ -1105,6 +1118,32 @@ err: return rc; } +int r82xx_set_nomod(struct r82xx_priv *priv) +{ + int rc = -1; + + fprintf(stderr, "Using R820T no-mod direct sampling mode\n"); + + rc = r82xx_set_tv_standard(priv, 8, TUNER_DIGITAL_TV, 0); + if (rc < 0) + goto err; + + /* experimentally determined magic numbers + * needs more experimenting with all the registers */ + rc = r82xx_set_mux(priv, 300000000); + if (rc < 0) + goto err; + + r82xx_set_pll(priv, 25000000); + +err: + if (rc < 0) + fprintf(stderr, "%s: failed=%d\n", __FUNCTION__, rc); + return rc; +} + + + /* * r82xx standby logic */