[pvrusb2] New driver snapshot: pvrusb2-mci-20090315
Mike Isely
isely at isely.net
Mon Mar 16 00:10:01 CDT 2009
On Mon, 16 Mar 2009, Xavier Gnata wrote:
> Hi Mike,
>
> Would you say that this new intermediate layer is a good thing?
Yes.
> What is the purpose of this?
In terminology used elsewhere in v4l-dvb, the pvrusb2 driver is a
"bridge" driver. This means that it effectively bridges together other
drivers (e.g. tuner, video digitizer, sound processing, audio switching,
etc) in the v4l-dvb core in order to implement unified control of the
device. In the pvrusb2 driver online documentation, those other drivers
are referred to as "chip-level drivers".
When I first took on this driver in early 2005, this bridge concept did
not exist within the driver. Rather, the original author had simply
copied in the code for each "chip level driver" straight into the
pvrusb2 driver and directly integrated code to operate each piece.
This had all manner of problems - the first of which is that it's all
forked code which would be a pain to maintain going forward. Plus it
did not exploit the principles behind the architecture of V4L. And it
made it difficult to integrate support for newer hardware that itself
might require different such drivers to be used.
As I worked through the pvrusb2 driver in that first year, I ended up
eventually writing a whole framework that managed the pvrusb2 driver's
run-time association, control, and feedback from those modules. Every
V4L driver effectively has had to solve this issue; the level of
difficulty varies with the hardware in question. For something like the
pvrusb2 driver which supports a number of different device variants with
different hardware requirements, the problem is a bit harder. This is
because the knowledge of what modules to attach and how to control each
module depends on the detected hardware. This means that the driver
really needs to keep tracking data on each attached module. The driver
has to adapt at run-time depending on which modules it is dealing with.
The i2c infrastructure (not a V4L specific thing) in the Linux kernel
helps in this regard but there are still specific modules that one ends
up keeping specific track of in the bridge driver's code (i.e. pvrusb2).
The framework I wrote was general in nature and it did all this. But it
was highly specific to the pvrusb2 driver itself and deliberately
avoided assumptions about the run-time environment, to a fault. At the
time, I wasn't sure what else I was going to encounter so I designed it
very conservatively - maximum flexibility. For example, with the
framework I had in place, you could actually "modprobe -r tuner" then
later "modprobe tuner" to bring it back into the fold and the pvrusb2
driver would notice its (re)appearance and immediately "bring it up to
speed" with the rest of the state of the bridge driver. This is really
not a common use-case for end users (but it is handy when debugging
those modules). Anyway the bulk of that framework appeared in December
2005 and it's been in use within the pvrusb2 driver ever since. There
have been changes / tweaks over time, but the over-arching concept has
remained unchanged and the framework has worked well.
Recently a new framework has appeared in the v4l-dvb core. It defines a
concept of "V4L sub-devices", and builds upon other changes /
enhancements that have since been built into the kernel's i2c
infrastructure. The net effect of this new framework is that now
there's a common V4L way to manage all these associations and to do the
management in a way to removes a lot of house-keeping in the bridge
driver. Essentially it functions as a replacement for what I did
initially in the pvrusb2 driver back in 2005. It doesn't do some stuff
that I did - but that's OK because over time it's become clear that such
things aren't needed. What it does do, it implements in a fairly simple
straight-forward manner. The changes I've described here in the pvrusb2
driver basically remove the old chip-level driver module framework and
in its place is simply code that uses the new V4L sub-device framework.
Now, up until now I didn't "have to" make these changes. However there
is a plan afoot that removes support for the "old way" of doing things
within v4l-dvb. What I implemented back in Dec 2005 relies on certain
features of the Linux kernel i2c framework and that's all deprecated
now. The desire is to remove that old functionality starting with the
2.6.30 kernel. So the pvrusb2 driver has to move forward here, and thus
you see these changes. The sub-device framework (minus one little
feature but I'm not worried about that bit) is available in 2.6.29 so I
configured the standalone build to switch to the new framework any time
it is built against 2.6.29 or later (or if built against a v4l-dvb
snapshot). Making these changes now - even before 2.6.29 is released -
means that a significant pile of changesets will be immediately ready
for inclusion once the 2.6.30 merge window opens. This (hopefully)
avoids considerable hair-pulling and angst on my part when trying to
quickly finish it all later under the gun of the merge window :-)
If you are curious to learn about sub-devices in the V4L context,
there's a writeup available in the kernel documentation tree. It should
be present starting at least with 2.6.29 (honestly I haven't checked),
but it's also in the v4l-dvb repository, as
linux/Documentation/video4linux/v4l2-framework.txt
> Does it really avoid a lot a code duplication?
Yes.
This moves what effectively was a roll-your-own solution for every
driver into the v4l-dvb core logic. The sub-device framework is an
attempt to make common what was previously duplicated everywhere.
For the moment, the pvrusb2 standalone driver contains BOTH
implementations - the old stuff from Dec 2005 and the new code to use
the sub-device API. They are ifdef'ed appropriately. (It's actually
possible under certain conditions to run both frameworks at once, which
is something I did to help incrementally debug the new stuff.) The old
code will probably be there - though not compiled for new kernels - for
quite a while. Right now the pvrusb2 driver is still compilable all the
way back to 2.6.12.3 (yes I'm sure - I just went through that exercise
earlier today). If / when I ever physically remove the old controlling
framework from the driver, then driver viability will break for any
kernel version older than 2.6.29. Obviously we don't want that to
happen so for now it stays.
The pvrusb2 driver as it exists in v4l-dvb will only have the new
sub-device implementation physically present. The current v4l-dvb
repository doesn't have the changes yet, but I've already prepared the
changesets and will submit them for inclusion once another minor change
has first been pulled in (a new API for disassociating a device cleanly
after a hotplug removal - I have a hack in place to work around it for
the moment but the real solution needs to be put into place).
Of course, the VAST lion's share of the changes in this driver snapshot
all have to do with this framework change. And NONE of it will even be
compiled unless you build against 2.6.29 or later. So in reality it's a
giant NOP right now. (But I have beat on the changes considerably over
the past few weeks and it all works great.)
No, I haven't forgotten about raw mode support. That's going to be a
big change, probably the biggest change coming since I did the control
state machine rework back in the fall of 2007. So it's going to be a
while yet before I have something there.
>
> Anyhow thanks for this release :)
You're welcome.
-Mike
--
Mike Isely
isely @ pobox (dot) com
PGP: 03 54 43 4D 75 E5 CC 92 71 16 01 E2 B5 F5 C1 E8
More information about the pvrusb2
mailing list