From 883086c7a059c3391b4573f63e1a54d1f58e949e Mon Sep 17 00:00:00 2001 From: Kyle Keen Date: Mon, 11 Aug 2014 15:54:48 -0400 Subject: [PATCH] lib: retry i2c on failure --- src/librtlsdr.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 1a2573e..a3b5359 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -1950,16 +1950,32 @@ uint32_t rtlsdr_get_tuner_clock(void *dev) int rtlsdr_i2c_write_fn(void *dev, uint8_t addr, uint8_t *buf, int len) { - if (dev) - return rtlsdr_i2c_write(((rtlsdr_dev_t *)dev), addr, buf, len); - + int r; + int retries = 2; + if (!dev) + return -1; + do { + r = rtlsdr_i2c_write(((rtlsdr_dev_t *)dev), addr, buf, len); + if (r >= 0) + return r; + rtlsdr_set_i2c_repeater(dev, 2); + retries--; + } while (retries > 0); return -1; } int rtlsdr_i2c_read_fn(void *dev, uint8_t addr, uint8_t *buf, int len) { - if (dev) - return rtlsdr_i2c_read(((rtlsdr_dev_t *)dev), addr, buf, len); - + int r; + int retries = 2; + if (!dev) + return -1; + do { + r = rtlsdr_i2c_read(((rtlsdr_dev_t *)dev), addr, buf, len); + if (r >= 0) + return r; + rtlsdr_set_i2c_repeater(dev, 2); + retries--; + } while (retries > 0); return -1; }