diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 2286c3a..ffb54a6 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -679,7 +679,7 @@ int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains) { const int e4k_gains[] = { -10, 15, 40, 65, 90, 115, 140, 165, 190, 215, 240, 290, 340, 420, 430, 450, 470, 490 }; - const int fc0012_gains[] = { 0 /* no gain values */ }; + const int fc0012_gains[] = { -99, -40, 71, 179, 192 }; const int fc0013_gains[] = { -63, 71, 191, 197 }; const int fc2580_gains[] = { 0 /* no gain values */ }; diff --git a/src/tuner_fc0012.c b/src/tuner_fc0012.c index c1ad73c..91ac882 100644 --- a/src/tuner_fc0012.c +++ b/src/tuner_fc0012.c @@ -307,6 +307,33 @@ exit: int fc0012_set_gain(void *dev, int gain) { - /* TODO add gain regulation */ - return 0; + int ret; + uint8_t tmp = 0; + + ret = fc0012_readreg(dev, 0x13, &tmp); + + /* mask bits off */ + tmp &= 0xe0; + + switch (gain) { + case -99: /* -9.9 dB */ + tmp |= 0x02; + break; + case -40: /* -4 dB */ + break; + case 71: + tmp |= 0x08; /* 7.1 dB */ + break; + case 179: + tmp |= 0x17; /* 17.9 dB */ + break; + case 192: + default: + tmp |= 0x10; /* 19.2 dB */ + break; + } + + ret = fc0012_writereg(dev, 0x13, tmp); + + return ret; }