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.
The very first thing you should do is find out how your device identifies itself:
For PCI/PCIe devices - use the command:
$ /sbin/lspci -vnn
For USB based devices - use the command:
$ /sbin/lsusb -v
The output generated from the above should provide you with the identify of the main bridge chip as well as the important piece of information known as the device's subsystem ID.
Next, you should try to identify the other component ICs/chips that your device uses. In regards to TV tuner devices, often the tuner chip and demodulator(s) are hidden within a metallic box connected directly to the antenna input. In such cases, this tuner module will usually have an identifying model name/type printed upon it's face, though it is also just as common for this to be obscured underneath a sticker that the device manufacturer has laid over top. With care, you can usually peel back the manufacturer's device sticker to discover the tuner module's own part identifier label or stamp.
Note: You can find a lot of useful device related information:
- here in the wiki
- in the bttv-gallery
- and by having a look at MS-Windows drivers (in particular, the .inf files), as they often contain a lot of particulars about a device's hardware components
Case 1: Development steps for when your device uses components for which drivers already exist
Extending support for your device 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 Git and search for a device that is similar to 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 device. 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.
For TV tuner devices: 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
For some guidance on programming for these aspects, see:
- the programming section of the GPIO pins article and
- the Remote controllers article. Note: before writing the patch please double-check that there are no such keys in V4L-DVB source code already.
Test your code
If the device works - that's cool! Congratulations! You are now ready to send a patch to the 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 information is incomplete or lacking).
- For general references on how to develop a Linux kernel driver module, take a look at the 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).
A NDA isn't necessarily a barrier to writing a GPL'd driver; it just depends on what it says. While there are some movements at the Open Source community for open datasheets, unfortunately several vendors still prefer to keep the Intelectual Property (IP) of their documents protected, under the terms of an NDA.
If you are required to sign an NDA, 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 other words, 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. It is wise to ask to a lawyer to analyze the NDA clauses or to use [Linux Foundation NDA program] to be sure if the terms you're signing will allow you to release an open source 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., (see the New Device Copy & Paste Template as a guide for an article's format).