(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@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

i.e.

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 argument.

Oliver