[PATCH] Revert "lib: fix direction bit in GPIO code"

Oliver Jowett oliver.jowett at gmail.com
Tue Nov 7 20:38:42 UTC 2017

(Caveat: I don't have a FC0012 and I'm mostly guessing at the meaning of
the GPIO registers here..)

On 7 November 2017 at 18:38, David Kozub <zub at linux.fjfi.cvut.cz> wrote:

> I added some traces and I see the values after plugging in the tuner, just
> after the call rtlsdr_set_i2c_repeater(dev, 1) in rtlsdr_open, are:
> GPD = 0x06
> GPOE = 0x19
> GPO = 0x18
> so in my understanding initially:
> * GPIOs 1 and 2 are set to INPUT
> * GPIOs 0, 3 and 4 are set to OUTPUT
> * output GPIOs 3 and 4 are set to 1, GPIO 0 is set to 0

I read those values as:

GPD ("direction"): pins 1,2 inputs, others outputs
GPO ("output"): outputs 3,4 high, others low
GPOE ("output enable"): output drivers for pins 0,3,4 enabled


pin 0: driven low
pin 1, pin 2: inputs
pin 3: driven high
pin 4: driven high
pin 5, pin 6, pin 7: high impedance

> With the code before the GPIO fix (ba64a745) the call
> rtlsdr_set_gpio_output(dev, 5) read GPD and set its value to GPO while
> dropping the 5-th bit from the GPD value. So it assigs the value 6 to GPO.
> This sets all output GPIOs to 0: GPIOs 3 and 4 are dropped to 0. Then it
> sets GPOE to the previous value of GPOE plus the 5th bit, so it sets GPIO 5
> to output and its output value is 0 because of the previous write.

So now we have:

pin 0: driven low
pin 1, pin 2: inputs
pin 3: driven low
pin 4: driven low
pin 5: driven low
pin 6, pin 7: high impedance

I don't know where does the value 5 come from. Is it possible some other
> dongles have the tuner at GPIO 5? Or is it really supposed to be GPIO 4 and
> it worked with 5 by accident - by pulling GPIO 4 to 0 accidentally?

> A friend of mine looked at the PCB of the dongle I'm using and he found
> out that GPIO 4 seems to be connected - via a transistor - to the TC0012.
> GPIO 5 didn't seem to be connected - at least not in an obvious way - to
> the tuner. I have to say this was just a quick look, so we could have
> missed things.
> Also, as there's a transistor in between... could it be that GPIO 4 is not
> really tuner reset, but tuner power? But this would be rather philosophical
> point. Either way, from my tests, GPIO 4 has to be set to 0 for the tuner
> to be reachable.

"Working by accident" seems fairly plausible given that you didn't have any
luck regardless of what you did with GPIO 5. It seems like it has to be
either GPIO 3 or 4, and if your PCB works with 4 then that's a strong

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/osmocom-sdr/attachments/20171107/70e0eda4/attachment.html>

More information about the osmocom-sdr mailing list