Development: How to add support for a device
This article is meant to serve as an introduction to the task of developing driver support for a device.
- 1 Getting Started
- 2 Case 1: Development steps for when your device uses components for which drivers already exist
- 3 Case 2: Development steps for when your device uses components for which drivers do not currently exist
- 4 Don't forget to send info to the Wiki !
The very first thing you should do is find out how your device identifies itself:
For PCI or PCIe devices Use the lspci and lspci -vn commands.
For USB based devices Use the lsusb and lsusb -v
The above should provide you with the identify of main bridge chip as well as the important piece of infomation known as the device's subsystem ID.
Next, you should try to identify the component ICs/chips that your device uses. There can be tuner chips, demodulators, or both, hidden in the metallic box connected directly to the antenna input. Often the tuner type is printed under a sticker.
You can find a lot of cards on http://bttv-gallery.de - a very useful resource for cards identification.
Another useful place to look is MS-Windows drivers. They often contain a lot of information about cards' hardware.
Case 1: Development steps for when your device uses components for which drivers already exist
Extending support for your card under such circumstances can range from being a trivial matter to one which requires some patience and discovery through the process of trial & error.
First off, download the latest V4L-DVB source code from Mercurial and search for a device as similar as your own - something like your device may already be supported but with another name. In such a case, you can copy a similar entry and fill in the values for the new card. For example:
- for a bttv chip you add to bttv-cards.c and bttv.h,
- for cx88 chip - cx88-cards.c and cx88.h,
- for saa713x chip saa7134-cards.c and saa7134.h
... and so forth.
Finding the correct tuner
In more than 90% of all cases something like.. first test one to your norm specific type with older Philips API, then test LG API and if there are still missing channels in UHF test MK3 API types will succeed. To find the exact takeover and radio config might be further steps, but most likely this can be/is covered by one of the existing types already.
At least it will usually take only three tuners to reach this point and if you find all three API types don't work, then ...
To check for the tda9887 on MK3 and mt32xx types can be done at once or as a next step. Since also the Philips silicon tuners should be well detected now, we can identify such like the yet unsupported XCeive types quite well. They seem to fail safely upon the initialization sequence with tuner=54 if I got Carsten right. So the really difficult/new ones should show up quickly enough and we can try to prepare a list of typical addresses for new devices like channel decoders, second eeproms, most likely hidden analog demodulators and such.
That the multi and hybrid types can have other issues too, like antenna input/filter/demodulator RF-amplifier switching and the like is above simple analog tuner programming and not yet fully investigated for all new types, but it seems there is some very good progress too.
The takeover suggestions in most datasheets on switch between VHF and UHF aren't related closely to technical specifications and precise measurements. They simply take it from _known_ channels currently in use and select those which are closest from both sides! Most obvious for NTSC-M tuners. If one is missing in the gap, to go right into the middle seems to be still reasonable for me as a next step in such cases, but to finally make the decision on what is empirically reported to work best is legal in lack of further documentation.
Guessing the .gpio values and masks for input
A guide about how to add a remote can be found in the section Remote_controllers. Before writing the patch please double-check if there are no such keys in v4l sources already.
Test your code
If the card works - that's cool! Congradulations! You are now ready to send a patch to video4linux mailing list.
Case 2: Development steps for when your device uses components for which drivers do not currently exist
Unfortunately, development of a new chipset driver is generally not an easy task. For starters, you're going to have to be capable and/or ambitious enough to produce the code or, at the very least, inspire an existing developer to do such (and there is by no means any guarantee that anyone will be interested...even if you cry and beg and/or throw bags of money). Either way, you should first search and/or inquire on the mailing list as to whether or not someone is already undertaking such development.
If you're going to work on a driver for a chip you should try to find documentation for it online. In the end, you may require getting information directly from the manufacturer (in the case where no information can be found in the "wild" or those where publicly available infomation is incomplete or lacking).
- For general references on how to develop a Linux kernel driver module, take a look at Index of Documentation for People Interested in Writing and/or Understanding the Linux Kernel.
- USB based devices; Also see:
A Word on Non-Disclosure Agreements
Companies frequently allow developers to see detailed chip specifications or even Linux source code under a Non-disclosure agreement (NDA). For instance, during the development of the em28xx driver, Markus Rechberger signed a NDA for chip information from EMPIA Technologies, and in 2006 Philips offered source code supporting their new saa7162 encoder reference board under an NDA.
A NDA isn't necessarily a barrier to writing a GPL'd driver; it just depends on what it says. If you receive such a document, read it carefully. If the NDA merely stops you from disclosing the specifications, you should be fine. This does not prevent you from writing and distributing a driver under a free software license. Also note that, in some cases, signing a NDA may even go so far as restricting you from even mentioning to others that you've signed a NDA -- in otherwords, you can't talk about or even mention the development of the new driver until the terms of the NDA lift. Also make sure to check that you're allowed to be the copyright holder of your driver. If not, they might redistribute your code under another license, and thus close the code.
Chip and board manufacturers have an incentive to be helpful to free software developers, as the drivers will help move their product. And as long as the NDA gives you the necessary freedom to publish your code, the information supplied can be extremely helpful in writing the driver.
After you've finished the driver(s) for the previously unsupported components
Its time to return to the steps outlined in "Case 1", where you link together the necessary pieces in the drivers that will bring about support for your device (i.e. adding all the glue code).
Don't forget to send info to the Wiki !
- upload non-proprietary picture(s) of the device (i.e. those that you took, and not ones taken from the vendor's website without express permission to do so!) Note: Please use a descriptive filename, as opposed to "image1.jpg" or the generic/cryptic filename that your digital camera gave to it when it was created.
- create a device article outlining what type of device it is, features, support information (drivers, firmware, remote), identification, kernel output messages etc etc (as a guide or template for an article's format, see here).
In addition, if your card is missing on bttv-gallery, you may wish to consider also sending the following info to Gunther Mayer <gunther.mayer () gmx ! net>.
Your contribution will help to improve open source support! Because there are many cards and variations by different vendors, the developers need _your_ help to get it all supported.
- picture of the card, the card backside (high resolution pics if feasible)
- lspci -vn
- picture of remote control (if applicable) and of original package
- list of chips
- list of input connectors
- printings on PCB, printings on stickers on the card
- lspci -v and lspci -vn
- "dmesg" when loading the modules
- if feasible "eeprom" output (from bttv tools)
- if feasible "*.INF" files from the Windows Driver CD
- exact tuner type (possibly this is hidden under the vendor sticker)
- exact model name and model number from package
- in which country do you live/ in which country this card was bought
- which application(s) did you use to test your setup ?
- If some parts of your card seem to work, describe exactly what you did and what you see/hear now.
Even parts of this info will be very helpful!