Revision as of 20:10, 9 September 2005

Contents

What are GPIO pins?

GPIO means General Purpose I/O. Video decoder chips like the SAA713x or the BT8x8 have a number of I/O pins that are not used by the video decoder itself. They have no special purpose, each manufacturer can do with them whatever he wants.

That makes it hard to answer questions like "What I'll have to fill into these gpio fields when adding a new card", because there simply is no general answer to that question, it completely depends on the board design. Some hopefully useful hints:

First ignore them completely. Especially with non-bt878 cards (saa7134, cx88 drivers) they might not be used at all or at least not needed for the basic functionality of the board.

Failing that check out whenever there are already entries for other cards from the same vendor and try these settings. Vendors usually don't redesign everything from scratch for a new card, so chances are good that a identical or very simliar configuation works fine.

What the gpio pins are used for:

Sometimes, 2 or 3 of them are used to control an audio multiplexer. That is especially true for bt878-based cards, because that chip hasn't a audio mux built-in.

IR receiver chips are also often connected via GPIO. Thats not the only way though. i2c is common as well, and the cx2388x has built-in support for IR signal sampling.

Sometimes it is possible to reset external chips via gpio. For example bt878-designs with a msp34xx audio processor usually have the msp34xx reset line linked to one of the gpio pins.

Sometimes external chips can be enabled/disabled via GPIO. saa7134-based cardbus devices often have the tuner chip disabled, it's impossible to see the device on the i2c bus without waking it up by programming the correct GPIO pin. Probably done to power-down the tuner when unused for a longer battery life. For example, the Terratec Cinergy 400TV mobile uses GPIO 18 to switch the tuner on (0) or off (1).

That list likely isn't complete, but should give an
idea what GPIO pins are used for. They might also
be completely unused.

It's also noteworthy that some of the GPIO lines can be used to trigger interrupts, i.e. the video chip can raise an IRQ on the PCI bus on GPIO state changes.

Unused Pins are usually programmed as inputs.

These GPIOs can not be read/written from user space. There is no IOCTL for them. They can only be used from within the kernel driver.

GPIOs of SAA713x

The SAA713x has 27 of these pins. Each of them can be programmed to be an input or an output.
Unused inputs are usually programmed as inputs.
Because of weak internal pull-down resistors in the SAA713x, open inputs are read as zeroes. If a bit is read as "1" after loading the saa7134 module, this means the manufacturer soldered a pull-up resistor to that pin. As they have no resistors to waste, this usually means, they do something with that pin...

So, if you're looking for a GPIO output, and you have a bit that is set to "1" after reset, this pin is a good candidate. Hack the driver to pull this bit low, and see if it does what you want.

If all your GPIO bits are "0" after reset -- bad luck. If there are outputs, they have to be active high. Try to set them high, one by one or groupwise, until you find what you are looking for.

Warning: If that pin is really used as an input, it is probably connected to an other chip's output. If you come and configure it as an output, you have two outputs connected together. Though it is unlikely, this might damage your card. You've been warned.

GPIOs of CX2388x

(To be written)

GPIO for remotes

Sometimes remote is handled via GPIO. It's working with the following schema:

There is data bits and signal bits. Signal bits shows that key pressed
or released, data bits should key code. Signal bit can be two types -
first type is 1 when key is released and 0 when key is pressed. Second
is 0 when key is released and 1 when key is pressed.

The mask_keycode should contain only _data_ bits.
The mask_keyup should contain signal bits of first type.
The mask_keydown should contain signal bits of second type.