This is a driver for the WIS GO7007SB multi-format video encoder.

Pete Eberlein <pete@sensoray.com>

The driver was originally released under the GPL and is currently hosted at:
http://nikosapi.org/wiki/index.php/WIS_Go7007_Linux_driver
The go7007 firmware can be acquired from the package on the site above.

I've modified the driver to support the following Video4Linux2 MPEG
controls, with acceptable values:

V4L2_CID_MPEG_STREAM_TYPE	V4L2_MPEG_STREAM_TYPE_MPEG2_DVD
				V4L2_MPEG_STREAM_TYPE_MPEG_ELEM
V4L2_CID_MPEG_VIDEO_ENCODING	V4L2_MPEG_VIDEO_ENCODING_MPEG_1
				V4L2_MPEG_VIDEO_ENCODING_MPEG_2
				V4L2_MPEG_VIDEO_ENCODING_MPEG_4
V4L2_CID_MPEG_VIDEO_ASPECT	V4L2_MPEG_VIDEO_ASPECT_1x1
				V4L2_MPEG_VIDEO_ASPECT_4x3
				V4L2_MPEG_VIDEO_ASPECT_16x9
V4L2_CID_MPEG_VIDEO_GOP_SIZE	integer
V4L2_CID_MPEG_VIDEO_BITRATE	64000 .. 10000000

These should be used instead of the non-standard GO7007 ioctls described
below.


The README files from the orignal package appear below:

---------------------------------------------------------------------------
		     WIS GO7007SB Public Linux Driver
---------------------------------------------------------------------------


*** Please see the file RELEASE-NOTES for important last-minute updates ***


  0. OVERVIEW AND LICENSING/DISCLAIMER


This driver kit contains Linux drivers for the WIS GO7007SB multi-format
video encoder.  Only kernel version 2.6.x is supported.  The video stream
is available through the Video4Linux2 API and the audio stream is available
through the ALSA API (or the OSS emulation layer of the ALSA system).

The files in kernel/ and hotplug/ are licensed under the GNU General Public
License Version 2 from the Free Software Foundation.  A copy of the license
is included in the file COPYING.

The example applications in apps/ and C header files in include/ are
licensed under a permissive license included in the source files which
allows copying, modification and redistribution for any purpose without
attribution.

The firmware files included in the firmware/ directory may be freely
redistributed only in conjunction with this document; but modification,
tampering and reverse engineering are prohibited.

MICRONAS USA, INC., MAKES NO WARRANTIES TO ANY PERSON OR ENTITY WITH
RESPECT TO THE SOFTWARE OR ANY DERIVATIVES THEREOF OR ANY SERVICES OR
LICENSES AND DISCLAIMS ALL IMPLIED WARRANTIES, INCLUDING WITHOUT LIMITATION
WARRANTIES OF MERCHANTABILITY, SUPPORT, AND FITNESS FOR A PARTICULAR
PURPOSE AND NON-INFRINGEMENT.


  1. SYSTEM REQUIREMENTS


This driver requires Linux kernel 2.6.  Kernel 2.4 is not supported.  Using
kernel 2.6.10 or later is recommended, as earlier kernels are known to have
unstable USB 2.0 support.

A fully built kernel source tree must be available.  Typically this will be
linked from "/lib/modules/<KERNEL VERSION>/build" for convenience.  If this
link does not exist, an extra parameter will need to be passed to the
`make` command.

All vendor-built kernels should already be configured properly.  However,
for custom-built kernels, the following options need to be enabled in the
kernel as built-in or modules:

	CONFIG_HOTPLUG           - Support for hot-pluggable devices
	CONFIG_MODULES           - Enable loadable module support
	CONFIG_KMOD              - Automatic kernel module loading
	CONFIG_FW_LOADER         - Hotplug firmware loading support
	CONFIG_I2C               - I2C support
	CONFIG_VIDEO_DEV         - Video For Linux
	CONFIG_SOUND             - Sound card support
	CONFIG_SND               - Advanced Linux Sound Architecture
	CONFIG_USB               - Support for Host-side USB
	CONFIG_USB_EHCI_HCD      - EHCI HCD (USB 2.0) support

Additionally, to use the example application, the following options need to
be enabled in the ALSA section:

	CONFIG_SND_MIXER_OSS     - OSS Mixer API
	CONFIG_SND_PCM_OSS       - OSS PCM (digital audio) API

The hotplug scripts, along with the fxload utility, must also be installed.
These scripts can be obtained from <http://linux-hotplug.sourceforge.net/>.
Hotplugging is used for loading firmware into the Cypruss EZ-USB chip using
fxload and for loading firmware into the driver using the firmware agent.


  2. COMPILING AND INSTALLING THE DRIVER


Most users should be able to compile the driver by simply running:

	$ make

in the top-level directory of the driver kit.  First the kernel modules
will be built, followed by the example applications.

If the build system is unable to locate the kernel source tree for the
currently-running kernel, or if the module should be built for a kernel
other than the currently-running kernel, an additional parameter will need
to be passed to make to specify the appropriate kernel source directory:

	$ make KERNELSRC=/usr/src/linux-2.6.10-custom3

Once the compile completes, the driver and firmware files should be
installed by running:

	$ make install

The kernel modules will be placed in "/lib/modules/<KERNEL VERSION>/extra"
and the firmware files will be placed in the appropriate hotplug firmware
directory, usually /lib/firmware.  In addition, USB maps and scripts will
be placed in /etc/hotplug/usb to enable fxload to initialize the EZ-USB
control chip when the device is connected.


  3. PAL/SECAM TUNER CONFIGURATION (TV402U-EU only)


The PAL model of the Plextor ConvertX TV402U may require additional
configuration to correctly select the appropriate TV frequency band and
audio subchannel.

Users with a device other than the Plextor ConvertX TV402U-EU should skip
this section.

The wide variety of PAL TV systems used in Europe requires that additional
information about the local TV standards be passed to the driver in order
to properly tune TV channels.  The two necessary parameters are (a) the PAL
TV band, and (b) the audio subchannel format in use.

In many cases, the appropriate TV band selection is passed to the driver
from applications.  However, in some cases, the application only specifies
that the driver should use PAL but not the specific information about the
appropriate TV band.  To work around this issue, the correct TV band may be
specified in the "force_band" parameter to the wis-sony-tuner module:

     TV band           force_band
     -------           ----------
     PAL B/G                B
     PAL I                  I
     PAL D/K                D
     SECAM L                L

If the "force_band" parameter is specified, the driver will ignore any TV
band specified by applications and will always use the band provided in the
module parameter.

The other parameter that can be specified is the audio subchannel format.
There are several stereo audio carrier systems in use, including NICAM and
three varieties of A2.  To receive audio broadcast on one of these stereo
carriers, the "force_mpx_mode" parameter must be specified to the
wis-sony-tuner module.

     TV band           Audio subcarrier       force_mpx_mode
     -------           ----------------       --------------
     PAL B/G            Mono (default)               1
     PAL B/G                  A2                     2
     PAL B/G                 NICAM                   3
     PAL I              Mono (default)               4
     PAL I                   NICAM                   5
     PAL D/K            Mono (default)               6
     PAL D/K                 A2 (1)                  7
     PAL D/K                 A2 (2)                  8
     PAL D/K                 A2 (3)                  9
     PAL D/K                 NICAM                  10
     SECAM L            Mono (default)              11
     SECAM L                 NICAM                  12

If the "force_mpx_mode" parameter is not specified, the correct mono-only
mode will be chosen based on the TV band.  However, the tuner will not
receive stereo audio or bilingual broadcasts correctly.

To pass the "force_band" or "force_mpx_mode" parameters to the
wis-sony-tuner module, the following line must be added to the modprobe
configuration file, which varies from one Linux distribution to another.

     options wis-sony-tuner force_band=B force_mpx_mode=2

The above example would force the tuner to the PAL B/G TV band and receive
stereo audio broadcasts on the A2 carrier.

To verify that the configuration has been placed in the correct location,
execute:

	$ modprobe -c | grep wis-sony-tuner

If the configuration line appears, then modprobe will pass the parameters
correctly the next time the wis-sony-tuner module is loaded into the
kernel.


  4. TESTING THE DRIVER


Because few Linux applications are able to correctly capture from
Video4Linux2 devices with only compressed formats supported, the new driver
should be tested with the "gorecord" application in the apps/ directory.

First connect a video source to the device, such as a DVD player or VCR.
This will be captured to a file for testing the driver.  If an input source
is unavailable, a test file can still be captured, but the video will be
black and the audio will be silent.

This application will auto-detect the V4L2 and ALSA/OSS device names of the
hardware and will record video and audio to an AVI file for a specified
number of seconds.  For example:

	$ apps/gorecord -duration 60 capture.avi

If this application does not successfully record an AVI file, the error
messages produced by gorecord and recorded in the system log (usually in
/var/log/messages) should provide information to help resolve the problem.

Supplying no parameters to gorecord will cause it to probe the available
devices and exit.  Use the -help flag for usage information.


  5. USING THE DRIVER


The V4L2 device implemented by the driver provides a standard compressed
format API, within the following criteria:

  * Applications that only support the original Video4Linux1 API will not
    be able to communicate with this driver at all.

  * No raw video modes are supported, so applications like xawtv that
    expect only uncompressed video will not function.

  * Supported compression formats are: Motion-JPEG, MPEG1, MPEG2 and MPEG4.

  * MPEG video formats are delivered as Video Elementary Streams only.
    Program Stream (PS), Transport Stream (TS) and Packetized Elementary
    Stream (PES) formats are not supported.

  * Video parameters such as format and input port may not be changed while
    the encoder is active.

  * The audio capture device only functions when the video encoder is
    actively capturing video.  Attempts to read from the audio device when
    the encoder is inactive will result in an I/O error.

  * The native format of the audio device is 48Khz 2-channel 16-bit
    little-endian PCM, delivered through the ALSA system.  No audio
    compression is implemented in the hardware.  ALSA may convert to other
    uncompressed formats on the fly.

The include/ directory contains a C header file describing non-standard
features of the GO7007SB encoder, which are described below:


  GO7007IOC_S_COMP_PARAMS, GO7007IOC_G_COMP_PARAMS

    These ioctls are used to negotiate general compression parameters.

    To query the current parameters, call the GO7007IOC_G_COMP_PARAMS ioctl
    with a pointer to a struct go7007_comp_params.  If the driver is not
    set to MPEG format, the EINVAL error code will be returned.

    To change the current parameters, initialize all fields of a struct
    go7007_comp_params and call the GO7007_IOC_S_COMP_PARAMS ioctl with a
    pointer to this structure.  The driver will return the current
    parameters with any necessary changes to conform to the limitations of
    the hardware or current compression mode.  Any or all fields can be set
    to zero to request a reasonable default value.  If the driver is not
    set to MPEG format, the EINVAL error code will be returned.  When I/O
    is in progress, the EBUSY error code will be returned.

    Fields in struct go7007_comp_params:

	__u32                        The maximum number of frames in each
	  gop_size                   Group Of Pictures; i.e. the maximum
				     number of frames minus one between
				     each key frame.

	__u32                        The maximum number of sequential
	  max_b_frames               bidirectionally-predicted frames.
				     (B-frames are not yet supported.)

	enum go7007_aspect_ratio     The aspect ratio to be encoded in the
	  aspect_ratio               meta-data of the compressed format.

				     Choices are:
					GO7007_ASPECT_RATIO_1_1
					GO7007_ASPECT_RATIO_4_3_NTSC
					GO7007_ASPECT_RATIO_4_3_PAL
					GO7007_ASPECT_RATIO_16_9_NTSC
					GO7007_ASPECT_RATIO_16_9_PAL

	__u32                        Bit-wise OR of control flags (below)
	  flags

    Flags in struct go7007_comp_params:

	GO7007_COMP_CLOSED_GOP       Only produce self-contained GOPs, used
				     to produce streams appropriate for
				     random seeking.

	GO7007_COMP_OMIT_SEQ_HEADER  Omit the stream sequence header.


  GO7007IOC_S_MPEG_PARAMS, GO7007IOC_G_MPEG_PARAMS

    These ioctls are used to negotiate MPEG-specific stream parameters when
    the pixelformat has been set to V4L2_PIX_FMT_MPEG.

    To query the current parameters, call the GO7007IOC_G_MPEG_PARAMS ioctl
    with a pointer to a struct go7007_mpeg_params.  If the driver is not
    set to MPEG format, the EINVAL error code will be returned.

    To change the current parameters, initialize all fields of a struct
    go7007_mpeg_params and call the GO7007_IOC_S_MPEG_PARAMS ioctl with a
    pointer to this structure.  The driver will return the current
    parameters with any necessary changes to conform to the limitations of
    the hardware or selected MPEG mode.  Any or all fields can be set to
    zero to request a reasonable default value.  If the driver is not set
    to MPEG format, the EINVAL error code will be returned.  When I/O is in
    progress, the EBUSY error code will be returned.

    Fields in struct go7007_mpeg_params:

	enum go7007_mpeg_video_standard
	  mpeg_video_standard        The MPEG video standard in which to
				     compress the video.

				     Choices are:
					GO7007_MPEG_VIDEO_MPEG1
					GO7007_MPEG_VIDEO_MPEG2
					GO7007_MPEG_VIDEO_MPEG4

	__u32                        Bit-wise OR of control flags (below)
	  flags

	__u32                        The profile and level indication to be
	  pali                       stored in the sequence header.  This
				     is only used as an indicator to the
				     decoder, and does not affect the MPEG
				     features used in the video stream.
				     Not valid for MPEG1.

				     Choices for MPEG2 are:
					GO7007_MPEG2_PROFILE_MAIN_MAIN

				     Choices for MPEG4 are:
					GO7007_MPEG4_PROFILE_S_L0
					GO7007_MPEG4_PROFILE_S_L1
					GO7007_MPEG4_PROFILE_S_L2
					GO7007_MPEG4_PROFILE_S_L3
					GO7007_MPEG4_PROFILE_ARTS_L1
					GO7007_MPEG4_PROFILE_ARTS_L2
					GO7007_MPEG4_PROFILE_ARTS_L3
					GO7007_MPEG4_PROFILE_ARTS_L4
					GO7007_MPEG4_PROFILE_AS_L0
					GO7007_MPEG4_PROFILE_AS_L1
					GO7007_MPEG4_PROFILE_AS_L2
					GO7007_MPEG4_PROFILE_AS_L3
					GO7007_MPEG4_PROFILE_AS_L4
					GO7007_MPEG4_PROFILE_AS_L5

    Flags in struct go7007_mpeg_params:

	GO7007_MPEG_FORCE_DVD_MODE   Force all compression parameters and
				     bitrate control settings to comply
				     with DVD MPEG2 stream requirements.
				     This overrides most compression and
				     bitrate settings!

	GO7007_MPEG_OMIT_GOP_HEADER  Omit the GOP header.

	GO7007_MPEG_REPEAT_SEQHEADER Repeat the MPEG sequence header at
				     the start of each GOP.


  GO7007IOC_S_BITRATE, GO7007IOC_G_BITRATE

    These ioctls are used to set and query the target bitrate value for the
    compressed video stream.  The bitrate may be selected by storing the
    target bits per second in an int and calling GO7007IOC_S_BITRATE with a
    pointer to the int.  The bitrate may be queried by calling
    GO7007IOC_G_BITRATE with a pointer to an int where the current bitrate
    will be stored.

    Note that this is the primary means of controlling the video quality
    for all compression modes, including V4L2_PIX_FMT_MJPEG.  The
    VIDIOC_S_JPEGCOMP ioctl is not supported.


----------------------------------------------------------------------------
		   Installing the WIS PCI Voyager Driver
---------------------------------------------------------------------------

The WIS PCI Voyager driver requires several patches to the Linux 2.6.11.x
kernel source tree before compiling the driver.  These patches update the
in-kernel SAA7134 driver to the newest development version and patch bugs
in the TDA8290/TDA8275 tuner driver.

The following patches must be downloaded from Gerd Knorr's website and
applied in the order listed:

	http://dl.bytesex.org/patches/2.6.11-2/i2c-tuner
	http://dl.bytesex.org/patches/2.6.11-2/i2c-tuner2
	http://dl.bytesex.org/patches/2.6.11-2/v4l2-api-mpeg
	http://dl.bytesex.org/patches/2.6.11-2/saa7134-update

The following patches are included with this SDK and can be applied in any
order:

	patches/2.6.11/saa7134-voyager.diff
	patches/2.6.11/tda8275-newaddr.diff
	patches/2.6.11/tda8290-ntsc.diff

Check to make sure the CONFIG_VIDEO_SAA7134 option is enabled in the kernel
configuration, and build and install the kernel.

After rebooting into the new kernel, the GO7007 driver can be compiled and
installed:

	$ make SAA7134_BUILD=y
	$ make install
	$ modprobe saa7134-go7007

There will be two V4L video devices associated with the PCI Voyager.  The
first device (most likely /dev/video0) provides access to the raw video
capture mode of the SAA7133 device and is used to configure the source
video parameters and tune the TV tuner.  This device can be used with xawtv
or other V4L(2) video software as a standard uncompressed device.

The second device (most likely /dev/video1) provides access to the
compression functions of the GO7007.  It can be tested using the gorecord
application in the apps/ directory of this SDK:

	$ apps/gorecord -vdevice /dev/video1 -noaudio test.avi

Currently the frame resolution is fixed at 720x480 (NTSC) or 720x576 (PAL),
and the video standard must be specified to both the raw and the compressed
video devices (xawtv and gorecord, for example).


--------------------------------------------------------------------------
RELEASE NOTES FOR WIS GO7007SB LINUX DRIVER
---------------------------------------------------------------------------

Last updated: 5 November 2005

 - Release 0.9.7 includes new support for using udev to run fxload.  The
   install script should automatically detect whether the old hotplug
   scripts or the new udev rules should be used.  To force the use of
   hotplug, run "make install USE_UDEV=n".  To force the use of udev, run
   "make install USE_UDEV=y".

 - Motion detection is supported but undocumented.  Try the `modet` app
   for a demonstration of how to use the facility.

 - Using USB2.0 devices such as the TV402U with USB1.1 HCDs or hubs can
   cause buffer overruns and frame drops, even at low framerates, due to
   inconsistency in the bitrate control mechanism.

 - On devices with an SAA7115, including the Plextor ConvertX, video height
   values of 96, 128, 160, 192, 256, 320, and 384 do not work in NTSC mode.
   All valid heights up to 512 work correctly in PAL mode.

 - The WIS Star Trek and PCI Voyager boards have no support yet for audio
   or the TV tuner.
