Blame view

Documentation/video4linux/README.pvrusb2 9.59 KB
d855497ed   Mike Isely   V4L/DVB (4228a): ...
1
2
3
4
5
6
7
8
9
10
  
  $Id$
  Mike Isely <isely@pobox.com>
  
  			    pvrusb2 driver
  
  Background:
  
    This driver is intended for the "Hauppauge WinTV PVR USB 2.0", which
    is a USB 2.0 hosted TV Tuner.  This driver is a work in progress.
be2a608bd   John Anthony Kazos Jr   documentation: co...
11
    Its history started with the reverse-engineering effort by Björn
d855497ed   Mike Isely   V4L/DVB (4228a): ...
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    Danielsson <pvrusb2@dax.nu> whose web page can be found here:
  
      http://pvrusb2.dax.nu/
  
    From there Aurelien Alleaume <slts@free.fr> began an effort to
    create a video4linux compatible driver.  I began with Aurelien's
    last known snapshot and evolved the driver to the state it is in
    here.
  
    More information on this driver can be found at:
  
      http://www.isely.net/pvrusb2.html
  
  
    This driver has a strong separation of layers.  They are very
    roughly:
  
    1a. Low level wire-protocol implementation with the device.
  
    1b. I2C adaptor implementation and corresponding I2C client drivers
        implemented elsewhere in V4L.
  
    1c. High level hardware driver implementation which coordinates all
        activities that ensure correct operation of the device.
  
    2.  A "context" layer which manages instancing of driver, setup,
        tear-down, arbitration, and interaction with high level
        interfaces appropriately as devices are hotplugged in the
        system.
  
    3.  High level interfaces which glue the driver to various published
        Linux APIs (V4L, sysfs, maybe DVB in the future).
  
    The most important shearing layer is between the top 2 layers.  A
    lot of work went into the driver to ensure that any kind of
    conceivable API can be laid on top of the core driver.  (Yes, the
    driver internally leverages V4L to do its work but that really has
    nothing to do with the API published by the driver to the outside
    world.)  The architecture allows for different APIs to
    simultaneously access the driver.  I have a strong sense of fairness
    about APIs and also feel that it is a good design principle to keep
    implementation and interface isolated from each other.  Thus while
    right now the V4L high level interface is the most complete, the
    sysfs high level interface will work equally well for similar
    functions, and there's no reason I see right now why it shouldn't be
    possible to produce a DVB high level interface that can sit right
    alongside V4L.
  
    NOTE: Complete documentation on the pvrusb2 driver is contained in
    the html files within the doc directory; these are exactly the same
    as what is on the web site at the time.  Browse those files
    (especially the FAQ) before asking questions.
  
  
  Building
  
    To build these modules essentially amounts to just running "Make",
    but you need the kernel source tree nearby and you will likely also
    want to set a few controlling environment variables first in order
    to link things up with that source tree.  Please see the Makefile
    here for comments that explain how to do that.
  
  
  Source file list / functional overview:
  
    (Note: The term "module" used below generally refers to loosely
    defined functional units within the pvrusb2 driver and bears no
    relation to the Linux kernel's concept of a loadable module.)
  
    pvrusb2-audio.[ch] - This is glue logic that resides between this
      driver and the msp3400.ko I2C client driver (which is found
      elsewhere in V4L).
  
    pvrusb2-context.[ch] - This module implements the context for an
      instance of the driver.  Everything else eventually ties back to
      or is otherwise instanced within the data structures implemented
      here.  Hotplugging is ultimately coordinated here.  All high level
      interfaces tie into the driver through this module.  This module
      helps arbitrate each interface's access to the actual driver core,
      and is designed to allow concurrent access through multiple
      instances of multiple interfaces (thus you can for example change
      the tuner's frequency through sysfs while simultaneously streaming
      video through V4L out to an instance of mplayer).
  
    pvrusb2-debug.h - This header defines a printk() wrapper and a mask
      of debugging bit definitions for the various kinds of debug
      messages that can be enabled within the driver.
  
    pvrusb2-debugifc.[ch] - This module implements a crude command line
      oriented debug interface into the driver.  Aside from being part
      of the process for implementing manual firmware extraction (see
      the pvrusb2 web site mentioned earlier), probably I'm the only one
      who has ever used this.  It is mainly a debugging aid.
  
    pvrusb2-eeprom.[ch] - This is glue logic that resides between this
      driver the tveeprom.ko module, which is itself implemented
      elsewhere in V4L.
  
    pvrusb2-encoder.[ch] - This module implements all protocol needed to
      interact with the Conexant mpeg2 encoder chip within the pvrusb2
      device.  It is a crude echo of corresponding logic in ivtv,
      however the design goals (strict isolation) and physical layer
      (proxy through USB instead of PCI) are enough different that this
      implementation had to be completely different.
  
    pvrusb2-hdw-internal.h - This header defines the core data structure
      in the driver used to track ALL internal state related to control
      of the hardware.  Nobody outside of the core hardware-handling
      modules should have any business using this header.  All external
      access to the driver should be through one of the high level
      interfaces (e.g. V4L, sysfs, etc), and in fact even those high
      level interfaces are restricted to the API defined in
      pvrusb2-hdw.h and NOT this header.
  
    pvrusb2-hdw.h - This header defines the full internal API for
      controlling the hardware.  High level interfaces (e.g. V4L, sysfs)
      will work through here.
  
    pvrusb2-hdw.c - This module implements all the various bits of logic
      that handle overall control of a specific pvrusb2 device.
      (Policy, instantiation, and arbitration of pvrusb2 devices fall
      within the jurisdiction of pvrusb-context not here).
  
    pvrusb2-i2c-chips-*.c - These modules implement the glue logic to
      tie together and configure various I2C modules as they attach to
      the I2C bus.  There are two versions of this file.  The "v4l2"
      version is intended to be used in-tree alongside V4L, where we
      implement just the logic that makes sense for a pure V4L
      environment.  The "all" version is intended for use outside of
      V4L, where we might encounter other possibly "challenging" modules
      from ivtv or older kernel snapshots (or even the support modules
      in the standalone snapshot).
  
    pvrusb2-i2c-cmd-v4l1.[ch] - This module implements generic V4L1
      compatible commands to the I2C modules.  It is here where state
      changes inside the pvrusb2 driver are translated into V4L1
      commands that are in turn send to the various I2C modules.
  
    pvrusb2-i2c-cmd-v4l2.[ch] - This module implements generic V4L2
      compatible commands to the I2C modules.  It is here where state
      changes inside the pvrusb2 driver are translated into V4L2
      commands that are in turn send to the various I2C modules.
  
    pvrusb2-i2c-core.[ch] - This module provides an implementation of a
      kernel-friendly I2C adaptor driver, through which other external
      I2C client drivers (e.g. msp3400, tuner, lirc) may connect and
670e9f34e   Paolo Ornati   Documentation: re...
158
      operate corresponding chips within the pvrusb2 device.  It is
d855497ed   Mike Isely   V4L/DVB (4228a): ...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
      through here that other V4L modules can reach into this driver to
      operate specific pieces (and those modules are in turn driven by
      glue logic which is coordinated by pvrusb2-hdw, doled out by
      pvrusb2-context, and then ultimately made available to users
      through one of the high level interfaces).
  
    pvrusb2-io.[ch] - This module implements a very low level ring of
      transfer buffers, required in order to stream data from the
      device.  This module is *very* low level.  It only operates the
      buffers and makes no attempt to define any policy or mechanism for
      how such buffers might be used.
  
    pvrusb2-ioread.[ch] - This module layers on top of pvrusb2-io.[ch]
      to provide a streaming API usable by a read() system call style of
      I/O.  Right now this is the only layer on top of pvrusb2-io.[ch],
      however the underlying architecture here was intended to allow for
25985edce   Lucas De Marchi   Fix common misspe...
175
      other styles of I/O to be implemented with additional modules, like
d855497ed   Mike Isely   V4L/DVB (4228a): ...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
      mmap()'ed buffers or something even more exotic.
  
    pvrusb2-main.c - This is the top level of the driver.  Module level
      and USB core entry points are here.  This is our "main".
  
    pvrusb2-sysfs.[ch] - This is the high level interface which ties the
      pvrusb2 driver into sysfs.  Through this interface you can do
      everything with the driver except actually stream data.
  
    pvrusb2-tuner.[ch] - This is glue logic that resides between this
      driver and the tuner.ko I2C client driver (which is found
      elsewhere in V4L).
  
    pvrusb2-util.h - This header defines some common macros used
      throughout the driver.  These macros are not really specific to
      the driver, but they had to go somewhere.
  
    pvrusb2-v4l2.[ch] - This is the high level interface which ties the
      pvrusb2 driver into video4linux.  It is through here that V4L
      applications can open and operate the driver in the usual V4L
      ways.  Note that **ALL** V4L functionality is published only
      through here and nowhere else.
  
    pvrusb2-video-*.[ch] - This is glue logic that resides between this
      driver and the saa711x.ko I2C client driver (which is found
      elsewhere in V4L).  Note that saa711x.ko used to be known as
      saa7115.ko in ivtv.  There are two versions of this; one is
      selected depending on the particular saa711[5x].ko that is found.
  
    pvrusb2.h - This header contains compile time tunable parameters
      (and at the moment the driver has very little that needs to be
      tuned).
  
  
    -Mike Isely
    isely@pobox.com