summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2013-01-27 14:47:45 +0200
committerYuval Adam <yuv.adm@gmail.com>2013-01-27 14:47:45 +0200
commit4b7fc270818d2124e6c66a7f4a33ca6993080d19 (patch)
tree99db84c18919a5ffb1420a49453c133e11a84995
parentbf70f3f7771728fa6dd1bacc46b84beffabcd67d (diff)
parent3cbf1392612a0c6f02ec178f8e78568138f12b0a (diff)
Merge branch 'master' of git://git.osmocom.org/rtl-sdr
-rw-r--r--include/tuner_e4k.h1
-rw-r--r--src/librtlsdr.c41
-rw-r--r--src/tuner_e4k.c13
-rw-r--r--src/tuner_r820t.c2
4 files changed, 42 insertions, 15 deletions
diff --git a/include/tuner_e4k.h b/include/tuner_e4k.h
index 6db6b2a..3d28114 100644
--- a/include/tuner_e4k.h
+++ b/include/tuner_e4k.h
@@ -199,6 +199,7 @@ struct e4k_state {
};
int e4k_init(struct e4k_state *e4k);
+int e4k_standby(struct e4k_state *e4k, int enable);
int e4k_if_gain_set(struct e4k_state *e4k, uint8_t stage, int8_t value);
int e4k_mixer_gain_set(struct e4k_state *e4k, int8_t value);
int e4k_commonmode_set(struct e4k_state *e4k, int8_t value);
diff --git a/src/librtlsdr.c b/src/librtlsdr.c
index 95dc22e..4224163 100644
--- a/src/librtlsdr.c
+++ b/src/librtlsdr.c
@@ -89,6 +89,7 @@ struct rtlsdr_dev {
int corr; /* ppm */
int gain; /* tenth dB */
struct e4k_state e4k_s;
+ int dev_lost;
};
void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
@@ -101,7 +102,10 @@ int e4000_init(void *dev) {
devt->e4k_s.rtl_dev = dev;
return e4k_init(&devt->e4k_s);
}
-int e4000_exit(void *dev) { return 0; }
+int e4000_exit(void *dev) {
+ rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
+ return e4k_standby(&devt->e4k_s, 1);
+}
int e4000_set_freq(void *dev, uint32_t freq) {
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
return e4k_tune_freq(&devt->e4k_s, freq);
@@ -177,7 +181,7 @@ int r820t_init(void *dev) {
r820t_SetStandardMode(dev, DVB_T_6M);
return r;
}
-int r820t_exit(void *dev) { return 0; }
+int r820t_exit(void *dev) { return r820t_SetStandby(dev, 0); }
int r820t_set_freq(void *dev, uint32_t freq) { return r820t_SetRfFreqHz(dev, freq); }
int r820t_set_bw(void *dev, int bw) { return 0; }
int r820t_set_gain(void *dev, int gain) { return R828_SetRfGain(dev, gain); }
@@ -360,7 +364,8 @@ uint8_t rtlsdr_i2c_read_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg)
/* TODO clean this up again */
int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val)
{
- return rtlsdr_i2c_write_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg, val);}
+ return rtlsdr_i2c_write_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg, val);
+}
uint8_t e4k_reg_read(struct e4k_state *e4k, uint8_t reg)
{
@@ -1305,6 +1310,8 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
libusb_init(&dev->ctx);
+ dev->dev_lost = 1;
+
cnt = libusb_get_device_list(dev->ctx, &list);
for (i = 0; i < cnt; i++) {
@@ -1354,6 +1361,7 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
}
rtlsdr_init_baseband(dev);
+ dev->dev_lost = 0;
/* Probe tuners */
rtlsdr_set_i2c_repeater(dev, 1);
@@ -1448,16 +1456,18 @@ int rtlsdr_close(rtlsdr_dev_t *dev)
if (!dev)
return -1;
- /* block until all async operations have been completed (if any) */
- while (RTLSDR_INACTIVE != dev->async_status) {
+ if(!dev->dev_lost) {
+ /* block until all async operations have been completed (if any) */
+ while (RTLSDR_INACTIVE != dev->async_status) {
#ifdef _WIN32
- Sleep(1);
+ Sleep(1);
#else
- usleep(1000);
+ usleep(1000);
#endif
- }
+ }
- rtlsdr_deinit_baseband(dev);
+ rtlsdr_deinit_baseband(dev);
+ }
libusb_release_interface(dev->devh, 0);
libusb_close(dev->devh);
@@ -1497,10 +1507,11 @@ static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *xfer)
dev->cb(xfer->buffer, xfer->actual_length, dev->cb_ctx);
libusb_submit_transfer(xfer); /* resubmit transfer */
- } else if (LIBUSB_TRANSFER_CANCELLED == xfer->status) {
- /* nothing to do */
- } else {
- /*fprintf(stderr, "transfer status: %d\n", xfer->status);*/
+ } else if (LIBUSB_TRANSFER_CANCELLED != xfer->status &&
+ LIBUSB_TRANSFER_COMPLETED != xfer->status) {
+ dev->dev_lost = 1;
+ rtlsdr_cancel_async(dev);
+ fprintf(stderr, "cb transfer status: %d, canceling...\n", xfer->status);
}
}
@@ -1636,8 +1647,10 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx,
}
}
- if (RTLSDR_INACTIVE == next_status)
+ if (dev->dev_lost || RTLSDR_INACTIVE == next_status) {
+ libusb_handle_events_timeout(dev->ctx, &tv);
break;
+ }
}
}
diff --git a/src/tuner_e4k.c b/src/tuner_e4k.c
index 0232f88..47fe4fe 100644
--- a/src/tuner_e4k.c
+++ b/src/tuner_e4k.c
@@ -881,6 +881,19 @@ int e4k_dc_offset_gen_table(struct e4k_state *e4k)
}
/***********************************************************************
+ * Standby */
+
+/*! \brief Enable/disable standby mode
+ */
+int e4k_standby(struct e4k_state *e4k, int enable)
+{
+ e4k_reg_set_mask(e4k, E4K_REG_MASTER1, E4K_MASTER1_NORM_STBY,
+ enable ? 0 : E4K_MASTER1_NORM_STBY);
+
+ return 0;
+}
+
+/***********************************************************************
* Initialization */
static int magic_init(struct e4k_state *e4k)
diff --git a/src/tuner_r820t.c b/src/tuner_r820t.c
index fd3188d..5f241df 100644
--- a/src/tuner_r820t.c
+++ b/src/tuner_r820t.c
@@ -2896,7 +2896,7 @@ R828_ErrCode R828_Standby(void *pTuner, R828_LoopThrough_Type R828_LoopSwitch)
return RT_Fail;
R828_I2C.RegAddr = 0x0F;
- R828_I2C.Data = 0x78;
+ R828_I2C.Data = 0x68; /* was 0x78, which turns off CLK_Out */
if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
return RT_Fail;