The README file from the original package from Micronas appears below. Only
the part about the firmware redistribution in section 0 is relevant, all
other sections are completely obsolete.

---------------------------------------------------------------------------
                     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_DEVICEFS      - USB device filesystem
        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.
