Deleted Added
full compact
1,3c1,19
< /* $FreeBSD: head/sys/dev/bktr/bktr_core.c 51658 1999-09-25 18:24:47Z phk $ */
< /* BT848 Driver for Brooktree's Bt848, Bt848A, Bt849A, Bt878, Bt879 based cards.
< The Brooktree BT848 Driver driver is based upon Mark Tinguely and
---
> /* $FreeBSD: head/sys/dev/bktr/bktr_core.c 51694 1999-09-26 22:06:20Z roger $ */
>
> /*
> * This is part of the Driver for Video Capture Cards (Frame grabbers)
> * and TV Tuner cards using the Brooktree Bt848, Bt848A, Bt849A, Bt878, Bt879
> * chipset.
> * Copyright Roger Hardiman and Amancio Hasty.
> *
> * bktr_core : This deals with the Bt848/849/878/879 PCI Frame Grabber,
> * Handles all the open, close, ioctl and read userland calls.
> * Sets the Bt848 registers and generates RISC pograms.
> * Controls the i2c bus and GPIO interface.
> * Contains the interface to the kernel.
> * (eg probe/attach and open/close/ioctl)
> *
> */
>
> /*
> The Brooktree BT848 Driver driver is based upon Mark Tinguely and
6,10c22
< the BT848. For starters, the BT848 is a one chipset solution and
< it incorporates a RISC engine to control the DMA transfers --
< that is it the actual dma process is control by a program which
< resides in the hosts memory also the register definitions between
< the Philips chipsets and the Bt848 are very different.
---
> the BT848.
15,17d26
< Enjoy,
< Amancio
<
22c31
< * Copyright (c) 1997 Amancio Hasty
---
> * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman
35c44,45
< * This product includes software developed by Amancio Hasty
---
> * This product includes software developed by Amancio Hasty and
> * Roger Hardiman
87,90d96
< /* Change History:
< Note: These version numbers represent the authors own numbering.
< They are unrelated to Revision Control numbering of FreeBSD or any other system.
< 1.0 1/24/97 First Alpha release
92,472d97
< 1.1 2/20/97 Added video ioctl so we can do PCI To PCI
< data transfers. This is for capturing data
< directly to a vga frame buffer which has
< a linear frame buffer. Minor code clean-up.
<
< 1.3 2/23/97 Fixed system lock-up reported by
< Randall Hopper <rhh@ct.picker.com>. This
< problem seems somehow to be exhibited only
< in his system. I changed the setting of
< INT_MASK for CAP_CONTINUOUS to be exactly
< the same as CAP_SINGLE apparently setting
< bit 23 cleared the system lock up.
< version 1.1 of the driver has been reported
< to work with STB's WinTv, Hauppage's Wincast/Tv
< and last but not least with the Intel Smart
< Video Recorder.
<
< 1.4 3/9/97 fsmp@freefall.org
< Merged code to support tuners on STB and WinCast
< cards.
< Modifications to the contrast and chroma ioctls.
< Textual cleanup.
<
< 1.5 3/15/97 fsmp@freefall.org
< new bt848 specific versions of hue/bright/
< contrast/satu/satv.
< Amancio's patch to fix "screen freeze" problem.
<
< 1.6 3/19/97 fsmp@freefall.org
< new table-driven frequency lookup.
< removed disable_intr()/enable_intr() calls from i2c.
< misc. cleanup.
<
< 1.7 3/19/97 fsmp@freefall.org
< added audio support submitted by:
< Michael Petry <petry@netwolf.NetMasters.com>
<
< 1.8 3/20/97 fsmp@freefall.org
< extended audio support.
< card auto-detection.
< major cleanup, order of routines, declarations, etc.
<
< 1.9 3/22/97 fsmp@freefall.org
< merged in Amancio's minor unit for tuner control
< mods.
< misc. cleanup, especially in the _intr routine.
< made AUDIO_SUPPORT mainline code.
<
< 1.10 3/23/97 fsmp@freefall.org
< added polled hardware i2c routines,
< removed all existing software i2c routines.
< created software i2cProbe() routine.
< Randall Hopper's fixes of BT848_GHUE & BT848_GBRIG.
< eeprom support.
<
< 1.11 3/24/97 fsmp@freefall.org
< Louis Mamakos's new bt848 struct.
<
< 1.12 3/25/97 fsmp@freefall.org
< japanese freq table from Naohiro Shichijo.
< new table structs for tuner lookups.
< major scrub for "magic numbers".
<
< 1.13 3/28/97 fsmp@freefall.org
< 1st PAL support.
< MAGIC_[1-4] demarcates magic #s needing PAL work.
< AFC code submitted by Richard Tobin
< <richard@cogsci.ed.ac.uk>.
<
< 1.14 3/29/97 richard@cogsci.ed.ac.uk
< PAL support: magic numbers moved into
< format_params structure.
< Revised AFC interface.
< fixed DMA_PROG_ALLOC size misdefinition.
<
< 1.15 4/18/97 John-Mark Gurney <gurney_j@resnet.uoregon.edu>
< Added [SR]RGBMASKs ioctl for byte swapping.
<
< 1.16 4/20/97 Randall Hopper <rhh@ct.picker.com>
< Generalized RGBMASK ioctls for general pixel
< format setting [SG]ACTPIXFMT, and added query API
< to return driver-supported pix fmts GSUPPIXFMT.
<
< 1.17 4/21/97 hasty@rah.star-gate.com
< Clipping support added.
<
< 1.18 4/23/97 Clean up after failed CAP_SINGLEs where bt
< interrupt isn't delivered, and fixed fixing
< CAP_SINGLEs that for ODD_ONLY fields.
< 1.19 9/8/97 improved yuv support , cleaned up weurope
< channel table, incorporated cleanup work from
< Luigi, fixed pci interface bug due to a
< change in the pci interface which disables
< interrupts from a PCI device by default,
< Added Luigi's, ioctl's BT848_SLNOTCH,
< BT848_GLNOTCH (set luma notch and get luma not)
< 1.20 10/5/97 Keith Sklower <sklower@CS.Berkeley.EDU> submitted
< a patch to fix compilation of the BSDI's PCI
< interface.
< Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
< Submitted a patch for Japanese cable channels
< Joao Carlos Mendes Luis jonny@gta.ufrj.br
< Submitted general ioctl to set video broadcast
< formats (PAL, NTSC, etc..) previously we depended
< on the Bt848 auto video detect feature.
< 1.21 10/24/97 Randall Hopper <rhh@ct.picker.com>
< Fix temporal decimation, disable it when
< doing CAP_SINGLEs, and in dual-field capture, don't
< capture fields for different frames
< 1.22 11/08/97 Randall Hopper <rhh@ct.picker.com>
< Fixes for packed 24bpp - FIFO alignment
< 1.23 11/17/97 Amancio <hasty@star-gate.com>
< Added yuv support mpeg encoding
< 1.24 12/27/97 Jonathan Hanna <pangolin@rogers.wave.ca>
< Patch to support Philips FR1236MK2 tuner
< 1.25 02/02/98 Takeshi Ohashi
< <ohashi@atohasi.mickey.ai.kyutech.ac.jp> submitted
< code to support bktr_read .
< Flemming Jacobsen <fj@schizo.dk.tfs.com>
< submitted code to support radio available with in
< some bt848 based cards;additionally, wrote code to
< correctly recognized his bt848 card.
< Roger Hardiman <roger@cs.strath.ac.uk> submitted
< various fixes to smooth out the microcode and made
< all modes consistent.
< 1.26 Moved Luigi's I2CWR ioctl from the video_ioctl
< section to the tuner_ioctl section
< Changed Major device from 79 to 92 and reserved
< our Major device number -- hasty@star-gate.com
< 1.27 Last batch of patches for radio support from
< Flemming Jacobsen <fj@trw.nl>.
< Added B849 PCI ID submitted by:
< Tomi Vainio <tomppa@fidata.fi>
< 1.28 Frank Nobis <fn@Radio-do.de> added tuner support
< for the German Phillips PAL tuner and
< additional channels for german cable tv.
< 1.29 Roger Hardiman <roger@cs.strath.ac.uk>
< Revised autodetection code to correctly handle both
< old and new VideoLogic Captivator PCI cards.
< Added tsleep of 2 seconds to initialistion code
< for PAL users.Corrected clock selection code on
< format change.
< 1.30 Bring back Frank Nobis <fn@Radio-do.de>'s opt_bktr.h
<
< 1.31 Randall Hopper <rhh@ct.picker.com>
< submitted ioctl to clear the video buffer
< prior to starting video capture
< Amancio : clean up yuv12 so that it does not
< affect rgb capture. Basically, fxtv after
< capturing in yuv12 mode , switching to rgb
< would cause the video capture to be too bright.
< 1.32 disable inverse gamma function for rgb and yuv
< capture. fixed meteor brightness ioctl it now
< converts the brightness value from unsigned to
< signed.
< 1.33 added sysctl: hw.bt848.tuner, hw.bt848.reverse_mute,
< hw.bt848.card
< card takes a value from 0 to bt848_max_card
< tuner takes a value from 0 to bt848_max_tuner
< reverse_mute : 0 no effect, 1 reverse tuner
< mute function some tuners are wired reversed :(
< 1.34 reverse mute function for ims turbo card
<
< 1.35 Roger Hardiman <roger@cs.strath.ac.uk>
< options BROOKTREE_SYSTEM_DEFAULT=BROOKTREE_PAL
< in the kernel config file makes the driver's
< video_open() function select PAL rather than NTSC.
< This fixed all the hangs on my Dual Crystal card
< when using a PAL video signal. As a result, you
< can loose the tsleep (of 2 seconds - now 0.25!!)
< which I previously added. (Unless someone else
< wanted the 0.25 second tsleep).
<
< 1.36 added bt848.format sysctl variable.
< 1 denotes NTSC , 0 denotes PAL
<
< 1.37 added support for Bt878 and improved Hauppauge's
< bt848 tuner recognition
< 1.38 Further improvements on Hauppauge's rely on
< eeprom[9] to determine the tuner type 8)
<
< AVerMedia card type added <sos@freebsd.org>
<
< 1.39 08/05/98 Roger Hardiman <roger@cs.strath.ac.uk>
< Updated Hauppauge detection code for Tuner ID 0x0a
< for newer NTSC WinCastTV 404 with Bt878 chipset.
< Tidied up PAL default in video_open()
<
< 1.49 10 August 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Added Capture Area ioctl - BT848[SG]CAPAREA.
< Normally the full 640x480 (768x576 PAL) image
< is grabbed. This ioctl allows a smaller area
< from anywhere within the video image to be
< grabbed, eg a 400x300 image from (50,10).
< See restrictions in BT848SCAPAREA.
<
< 1.50 31 August 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Renamed BT848[SG]CAPAREA to BT848_[SG]CAPAREA.
< Added PR kern/7177 for SECAM Video Highway Xtreme
< with single crystal PLL configuration
< submitted by Vsevolod Lobko <seva@alex-ua.com>.
< In kernel configuration file add
< options OVERRIDE_CARD=2
< options OVERRIDE_TUNER=11
< options BKTR_USE_PLL
<
< 1.51 31 August 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Fixed bug in Miro Tuner detection. Missing Goto.
< Removed Hauppauge EEPROM 0x10 detection as I think
< 0x10 should be a PAL tuner, not NTSC.
< Reinstated some Tuner Guesswork code from 1.27
<
< 1.52 3 Sep 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Submitted patch by Vsevolod Lobko <seva@alex-ua.com>
< to correct SECAM B-Delay and add XUSSR channel set.
<
< 1.53 9 Sep 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Changed METEORSINPUT for Hauppauge cards with bt878.
< Submitted by Fred Templin <templin@erg.sri.com>
< Also fixed video_open defines and 878 support.
<
< 1.54 18 Sep 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Changed tuner code to autodetect tuner i2c address.
< Addresses were incorrectly hardcoded.
<
< 1.55 21 Sep 1998 Roger Hardiman <roger@cs.strath.ac.uk>
< Hauppauge Tech Support confirmed all Hauppauge 878
< PAL/SECAM boards will use PLL mode.
< Added to card probe. Thanks to Ken and Fred.
<
< 1.56 21 Jan 1999 Roger Hardiman <roger@cs.strath.ac.uk>
< Added detection of Hauppauge IR remote control.
< and MSP34xx Audio chip. Fixed i2c read error.
< Hauppauge supplied details of new Tuner Types.
< Danny Braniss <danny@cs.huji.ac.il> submitted Bt878
< AverMedia detection with PCI subsystem vendor id.
<
< 1.57 26 Jan 1999 Roger Hardiman <roger@cs.strath.ac.uk>
< Support for MSP3410D / MSP3415D Stereo/Mono audio
< using the audio format Auto Detection Mode.
< Nicolas Souchu <nsouch@freebsd.org> ported the
< msp_read/write/reset functions to smbus/iicbus.
< METEOR_INPUT_DEV2 now selects a composite camera on
< the SVIDEO port for Johan Larsson<gozer@ludd.luth.se>
< For true SVIDEO, use METEOR_INPUT_DEV_SVIDEO
<
< 1.58 8 Feb 1999 Roger Hardiman <roger@cs.strath.ac.uk>
< Added check to bktr_mmap from OpenBSD driver.
< Improved MSP34xx reset for bt848 Hauppauge boards.
< Added detection for Bt848a.
< Vsevolod Lobko<seva@sevasoft.alex-ua.com> added
< more XUSSR channels.
<
< 1.59 9 Feb 1999 Added ioctl REMOTE_GETKEY for Hauppauge Infra-Red
< Remote Control. Submitted by Roger Hardiman.
< Added ioctl TVTUNER_GETCHANSET and
< BT848_GPIO_SET_EN,BT848_GPIO_SET_DATA (and GETs)
< Submitted by Vsevolod Lobko <seva@alex-ua.com>
<
< 1.60 23 Feb 1999 Roger Hardiman <roger@freebsd.org>
< Corrected Mute on Hauppauge Radio cards.
< Autodetect MMAC Osprey by looking for "MMAC" in the EEPROM.
< Added for Jan Schmidt <mmedia@rz.uni-greifswald.de>
< Added ALPS Tuner Type from Hiroki Mori <mori@infocity.co.jp>
<
< 1.61 29 Apr 1999 Roger Hardiman <roger@freebsd.org>
< Fix row=0/columns=0 bug. From Randal Hopper<aa8vb@ipass.net>
< Add option to block the reset of the MSP34xx audio chip by
< adding options BKTR_NO_MSP_RESET to the kernel config file.
< This is usefull if you run another operating system
< first to initialise the audio chip, then do a soft reboot.
< Added for Yuri Gindin <yuri@xpert.com>
<
< 1.62 29 Apr 1999 Added new cards: NEC PK-UG-X017 and I/O DATA GV-BCTV2/PCI
< Added new tuner: ALPS_TSBH1 (plus FM Radio for ALPS_TSCH5)
< Added support for BCTV audio mux.
< All submitted by Hiroki Mori <mori@infocity.co.jp>
<
< 1.63 29 Apr 1999 Roger Hardiman <roger@freebsd.org>
< Added initial code for VBI capture based on work by
< Hiroki Mori <mori@infocity.co.jp> and reworked by myself.
< This allows software decoding of teletext, intercast and
< subtitles via /dev/vbi.
<
< 1.64 7 May 1999 Roger Hardiman <roger@freebsd.org>
< Support LifeView FlyVideo 98 cards. Use EEPROM for card
< autodetection. Use bttv's audio mux values.
< Thanks to Paul Reece <paul@fastlane.net.au>,
< Ivan Brawley <brawley@internode.com.au> and
< Gilad Rom <rom_glsa@ein-hashofet.co.il>
< Automatically locate the EEPROM i2c address and read the
< subsystem_vendor_id from EEPROM and not the PCI registers.
< Add NSMBUS checks around smbus/iicbus i2c bus code
< making it easier to compile the driver under 2.2.x.
< Add GPIO mask for the audio mux to each card type.
< Add CARD_ZOLTRIX and CARD_KISS from mailing list searches.
<
< 1.65 18 May 1999 Roger Hardiman <roger@freebsd.org>
< Change Intel GPIO mask to stop turning the Intel Camera off
< Fixed tuner selection on Hauppauge card with tuner 0x0a
< Replaced none tuner with no tuner for Theo de Raadt.
< Ivan Brawley <brawley@internode.com.au> added
< the Australian channel frequencies.
<
< 1.66 19 May 1999 Ivan Brawley <brawley@internode.com.au> added better
< Australian channel frequencies.
<
< 1.67 23 May 1999 Roger Hardiman <roger@freebsd.org>
< Added rgb_vbi_prog() to capture VBI data and video at the
< same time. To capture VBI data, /dev/vbi must be opened
< before starting video capture.
<
< 1.68 25 May 1999 Roger Hardiman <roger@freebsd.org>
< Due to differences in PCI bus implementations from various
< motherboard chipset manufactuers, the Bt878/Bt879 has 3
< PCI bus compatibility modes. These are
< NORMAL PCI 2.1 for proper PCI 2.1 compatible chipsets.
< INTEL 430 FX for the Intel 430 FX chipset.
< SIS VIA CHIPSET for certain SiS and VIA chipsets.
< Older Intel and non-Intel chipsets may also benefit from
< either 430_FX or SIS/VIA mode.
<
< NORMAL PCI mode is enabled by default.
< For INTEL 430 FX mode, add this to your kenel config:
< options "BKTR_430_FX_MODE"
< For SiS / VIA mode, add this to your kernel config:
< options "BKTR_SIS_VIA_MODE"
<
< Using quotes in these options is not needed in FreeBSD 4.x.
<
< Note. Newer VIA chipsets should be fully PCI 2.1 compatible
< and should work fine in the Default mode.
<
< Also rename 849 to 849A, the correct name for the chip.
<
< 1.69 12 June 1999 Roger Hardiman <roger@freebsd.org>
< Updates for FreeBSD 4.x device driver interface.
< BSDI code removed. Will be restored later.
<
< 1.70 12 July 1999 Roger Hardiman <roger@freebsd.org>
< Reorganise OS device dependant parts (based on a port to
< linux by Brad Parker).
< Make the driver compile on FreeBSD 2.2.x systems again.
< Change number of VBI lines from 16 to 12 for NTSC formats.
< Changes to probeCard() for better eeprom identification.
< Added STB Bt878 card identification.
< Add Hauppauge model identification to probeCard().
< Added TDA9850 initialisation code taken from Linux bttv.
< Juha.Nurmela@quicknet.inet.fi found/fixed bug in VBI_SLEEP.
< Matt Brown <matt@dqc.org> added MSP3430G DBX initialisation.
<
< 1.71 30 Aug 1999 Roger Hardiman <roger@freebsd.org>
< Small cleanup of OS dependant code. Remove NPCI usage.
< Fix bug in AVerMedia detection.
< Update VBI support for the AleVT Teletext package. Parts
< from Juha Nurmela's driver <Juha.Nurmela@quicknet.inet.fi>
< Add support for Hauppauge 627 and Temic 4006 submitted
< by Maurice Castro <maurice@atum.castro.aus.net>
< Tom Jansen <tom@unhooked.net> added BSDi support again.
<
< 1.72 31 Aug 1999 Juha Nurmela <Juha.Nurmela@quicknet.inet.fi>
< Clear cap_ctl register when restarting the RISC program.
< This fixes the freezes experienced when changing changes.
<
< 1.73 10 Sep 1999 Roger Hardiman <roger@freebsd.org>
< Add Hauppauge tuner #6 for Brian Somers <brian@freebsd.org>
< Add card type for Aimslabs Video Highway Xtreme for
< Ladislav Kostal <kostal@pefstud.uniag.sk>
< Added select() code (for VBI) for the 2.2.x driver
< tested by Steve Richards <steve@richsoft.demon.co.uk>
<
< 1.74 17 Sep 1999 Roger Hardiman <roger@freebsd.org>
< Fix bug where FM radio stations were offset after using FXTV
< AVerMedia tuner type autodetection added for cards with
< a configuration EEPROM (currently their Bt878 range)
< Thanks to Frank at AVerMedia for providing the information.
< Tested by David La Croix <dlacroix@cowpie.acm.vt.edu>
< Tidy up some tuner code and Hauppauge detection code.
< New NetBSD code from Bernd Ernesti<bernd@arresum.inka.de>
< */
<
494d118
< #include <sys/uio.h>
497,498d120
< #include <sys/mman.h>
< #include <sys/select.h>
511,532d132
< /* __FreeBSD_version is not defined on 2.2.x systems */
< #ifndef __FreeBSD_version
< #define __FreeBSD_version 228000
< #endif
<
< #if (__FreeBSD_version >= 300000)
< #include <sys/poll.h>
< #endif
<
< /* Read NSMBUS on FreeBSD 3.1 or later */
< #if (__FreeBSD_version >= 310000)
< #include "smbus.h"
< #else
< #define NSMBUS 0
< #endif
<
< #if (__FreeBSD_version < 400000)
< #ifdef DEVFS
< #include <sys/devfsext.h>
< #endif /* DEVFS */
< #endif
<
537,542d136
< #if (__FreeBSD_version >=400000)
< #include <machine/bus.h> /* used by newbus */
< #include <sys/rman.h> /* used by newbus */
< #include <machine/resource.h> /* used by newbus */
< #endif
<
545d138
< #include <pci/pcireg.h>
549a143,147
> #include <dev/bktr/bktr_tuner.h>
> #include <dev/bktr/bktr_card.h>
> #include <dev/bktr/bktr_audio.h>
> #include <dev/bktr/bktr_core.h>
> #include <dev/bktr/bktr_os.h>
559,563d156
< #include <sys/sysctl.h>
< static int bt848_card = -1;
< static int bt848_tuner = -1;
< static int bt848_reverse_mute = -1;
< static int bt848_format = -1;
565,574d157
< SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW, 0, "Bt848 Driver mgmt");
< SYSCTL_INT(_hw_bt848, OID_AUTO, card, CTLFLAG_RW, &bt848_card, -1, "");
< SYSCTL_INT(_hw_bt848, OID_AUTO, tuner, CTLFLAG_RW, &bt848_tuner, -1, "");
< SYSCTL_INT(_hw_bt848, OID_AUTO, reverse_mute, CTLFLAG_RW, &bt848_reverse_mute, -1, "");
< SYSCTL_INT(_hw_bt848, OID_AUTO, format, CTLFLAG_RW, &bt848_format, -1, "");
<
< #if (__FreeBSD_version >= 300000)
< typedef u_long ioctl_cmd_t;
< #endif
<
576d158
< typedef int ioctl_cmd_t;
578d159
< #define PCIR_REVID PCI_CLASS_REG
647,654d227
< /*
< * Defines for userland processes blocked in this driver
< * For /dev/bktr[n] use memory address of bktr structure
< * For /dev/vbi[n] use memory address of bktr structure + 1
< * this is ok as the bktr structure is > 1 byte
< */
< #define BKTR_SLEEP ((caddr_t)bktr )
< #define VBI_SLEEP ((caddr_t)bktr + 1)
657,663d229
< * This is for start-up convenience only, NOT mandatory.
< */
< #if !defined( DEFAULT_CHNLSET )
< #define DEFAULT_CHNLSET CHNLSET_WEUROPE
< #endif
<
< /*
758,760d323
< /* experimental code for Automatic Frequency Control */
< #define TUNER_AFC
< #define TEST_TUNER_AFC_NOT
762,850d324
< #if defined( TUNER_AFC )
< #define AFC_DELAY 10000 /* 10 millisend delay */
< #define AFC_BITS 0x07
< #define AFC_FREQ_MINUS_125 0x00
< #define AFC_FREQ_MINUS_62 0x01
< #define AFC_FREQ_CENTERED 0x02
< #define AFC_FREQ_PLUS_62 0x03
< #define AFC_FREQ_PLUS_125 0x04
< #define AFC_MAX_STEP (5 * FREQFACTOR) /* no more than 5 MHz */
< #endif /* TUNER_AFC */
<
< /*
< * i2c things:
< */
<
< #define TSA552x_CB_MSB (0x80)
< #define TSA552x_CB_CP (1<<6)
< #define TSA552x_CB_T2 (1<<5)
< #define TSA552x_CB_T1 (1<<4)
< #define TSA552x_CB_T0 (1<<3)
< #define TSA552x_CB_RSA (1<<2)
< #define TSA552x_CB_RSB (1<<1)
< #define TSA552x_CB_OS (1<<0)
< #define TSA552x_RADIO (TSA552x_CB_MSB | \
< TSA552x_CB_T0)
<
< /* Add RADIO_OFFSET to the "frequency" to indicate that we want to tune */
< /* the radio (if present) not the TV tuner. */
< /* 20000 is equivalent to 20000MHz/16 = 1.25GHz - this area is unused. */
< #define RADIO_OFFSET 20000
<
< /* address(s) of the Hauppauge Infra-Red Remote Control adapter */
< #define HAUP_REMOTE_INT_WADDR 0x30
< #define HAUP_REMOTE_INT_RADDR 0x31
<
< #define HAUP_REMOTE_EXT_WADDR 0x34
< #define HAUP_REMOTE_EXT_RADDR 0x35
<
< /* address of BTSC/SAP decoder chip */
< #define TDA9850_WADDR 0xb6
< #define TDA9850_RADDR 0xb7
<
< /* address of MSP3400C chip */
< #define MSP3400C_WADDR 0x80
< #define MSP3400C_RADDR 0x81
<
<
< /* EEProm (128 * 8) on an STB card */
< #define X24C01_WADDR 0xae
< #define X24C01_RADDR 0xaf
<
<
< /* EEProm (256 * 8) on a Hauppauge card */
< /* and on most BT878s cards to store the sub-system vendor id */
< #define PFC8582_WADDR 0xa0
< #define PFC8582_RADDR 0xa1
<
<
< /* registers in the TDA9850 BTSC/dbx chip */
< #define CON1ADDR 0x04
< #define CON2ADDR 0x05
< #define CON3ADDR 0x06
< #define CON4ADDR 0x07
< #define ALI1ADDR 0x08
< #define ALI2ADDR 0x09
< #define ALI3ADDR 0x0a
<
<
< /* raise the charge pump voltage for fast tuning */
< #define TSA552x_FCONTROL (TSA552x_CB_MSB | \
< TSA552x_CB_CP | \
< TSA552x_CB_T0 | \
< TSA552x_CB_RSA | \
< TSA552x_CB_RSB)
<
< /* lower the charge pump voltage for better residual oscillator FM */
< #define TSA552x_SCONTROL (TSA552x_CB_MSB | \
< TSA552x_CB_T0 | \
< TSA552x_CB_RSA | \
< TSA552x_CB_RSB)
<
< /* The control value for the ALPS TSCH5 Tuner */
< #define TSCH5_FCONTROL 0x82
< #define TSCH5_RADIO 0x86
<
< /* The control value for the ALPS TSBH1 Tuner */
< #define TSBH1_FCONTROL 0xce
<
<
861,870d334
< /*
< * the data for each type of tuner
< *
< * if probeCard() fails to detect the proper tuner on boot you can
< * override it by setting the following define to the tuner present:
< *
< #define OVERRIDE_TUNER <tuner type>
< *
< * where <tuner type> is one of the following tuner defines.
< */
872,887d335
< /* indexes into tuners[] */
< #define NO_TUNER 0
< #define TEMIC_NTSC 1
< #define TEMIC_PAL 2
< #define TEMIC_SECAM 3
< #define PHILIPS_NTSC 4
< #define PHILIPS_PAL 5
< #define PHILIPS_SECAM 6
< #define TEMIC_PALI 7
< #define PHILIPS_PALI 8
< #define PHILIPS_FR1236_NTSC 9 /* These have FM Radio support */
< #define PHILIPS_FR1216_PAL 10 /* These have FM Radio support */
< #define PHILIPS_FR1236_SECAM 11 /* These have FM Radio support */
< #define ALPS_TSCH5 12
< #define ALPS_TSBH1 13
< #define Bt848_MAX_TUNER 14
889,1263d336
< /* If we do not know the tuner type, make a guess based on the
< video format
< */
< #if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL
< #define DEFAULT_TUNER PHILIPS_PALI
< #else
< #define DEFAULT_TUNER PHILIPS_NTSC
< #endif
<
< /* XXX FIXME: this list is incomplete */
<
< /* input types */
< #define TTYPE_XXX 0
< #define TTYPE_NTSC 1
< #define TTYPE_NTSC_J 2
< #define TTYPE_PAL 3
< #define TTYPE_PAL_M 4
< #define TTYPE_PAL_N 5
< #define TTYPE_SECAM 6
<
< /**
< struct TUNER {
< char* name;
< u_char type;
< u_char pllControl;
< u_char bandLimits[ 2 ];
< u_char bandAddrs[ 3 ];
< };
< */
< static const struct TUNER tuners[] = {
< /* XXX FIXME: fill in the band-switch crosspoints */
< /* NO_TUNER */
< { "<no>", /* the 'name' */
< TTYPE_XXX, /* input type */
< { 0x00, /* control byte for Tuner PLL */
< 0x00,
< 0x00,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x00, 0x00, 0x00,0x00} }, /* the band-switch values */
<
< /* TEMIC_NTSC */
< { "Temic NTSC", /* the 'name' */
< TTYPE_NTSC, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x02, 0x04, 0x01, 0x00 } }, /* the band-switch values */
<
< /* TEMIC_PAL */
< { "Temic PAL", /* the 'name' */
< TTYPE_PAL, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x02, 0x04, 0x01, 0x00 } }, /* the band-switch values */
<
< /* TEMIC_SECAM */
< { "Temic SECAM", /* the 'name' */
< TTYPE_SECAM, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x02, 0x04, 0x01,0x00 } }, /* the band-switch values */
<
< /* PHILIPS_NTSC */
< { "Philips NTSC", /* the 'name' */
< TTYPE_NTSC, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30, 0x00 } }, /* the band-switch values */
<
< /* PHILIPS_PAL */
< { "Philips PAL", /* the 'name' */
< TTYPE_PAL, /* input type */
< { TSA552x_FCONTROL, /* control byte for Tuner PLL */
< TSA552x_FCONTROL,
< TSA552x_FCONTROL,
< TSA552x_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30, 0xa4 } }, /* the band-switch values */
<
< /* PHILIPS_SECAM */
< { "Philips SECAM", /* the 'name' */
< TTYPE_SECAM, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< TSA552x_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30,0xa4 } }, /* the band-switch values */
<
< /* TEMIC_PAL I */
< { "Temic PAL I", /* the 'name' */
< TTYPE_PAL, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x02, 0x04, 0x01,0x00 } }, /* the band-switch values */
<
< /* PHILIPS_PALI */
< { "Philips PAL I", /* the 'name' */
< TTYPE_PAL, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30,0x00 } }, /* the band-switch values */
<
< /* PHILIPS_FR1236_NTSC */
< { "Philips FR1236 NTSC FM", /* the 'name' */
< TTYPE_NTSC, /* input type */
< { TSA552x_SCONTROL, /* control byte for Tuner PLL */
< TSA552x_SCONTROL,
< TSA552x_SCONTROL,
< TSA552x_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30, 0xa4 } }, /* the band-switch values */
<
< /* PHILIPS_FR1216_PAL */
< { "Philips FR1216 PAL FM" , /* the 'name' */
< TTYPE_PAL, /* input type */
< { TSA552x_FCONTROL, /* control byte for Tuner PLL */
< TSA552x_FCONTROL,
< TSA552x_FCONTROL,
< TSA552x_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30, 0xa4 } }, /* the band-switch values */
<
< /* PHILIPS_FR1236_SECAM */
< { "Philips FR1236 SECAM FM", /* the 'name' */
< TTYPE_SECAM, /* input type */
< { TSA552x_FCONTROL, /* control byte for Tuner PLL */
< TSA552x_FCONTROL,
< TSA552x_FCONTROL,
< TSA552x_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0xa0, 0x90, 0x30, 0xa4 } }, /* the band-switch values */
<
< /* ALPS TSCH5 NTSC */
< { "ALPS TSCH5 NTSC FM", /* the 'name' */
< TTYPE_NTSC, /* input type */
< { TSCH5_FCONTROL, /* control byte for Tuner PLL */
< TSCH5_FCONTROL,
< TSCH5_FCONTROL,
< TSCH5_RADIO },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x14, 0x12, 0x11, 0x04 } }, /* the band-switch values */
<
< /* ALPS TSBH1 NTSC */
< { "ALPS TSBH1 NTSC", /* the 'name' */
< TTYPE_NTSC, /* input type */
< { TSBH1_FCONTROL, /* control byte for Tuner PLL */
< TSBH1_FCONTROL,
< TSBH1_FCONTROL,
< 0x00 },
< { 0x00, 0x00 }, /* band-switch crosspoints */
< { 0x01, 0x02, 0x08, 0x00 } } /* the band-switch values */
< };
<
< /******************************************************************************
< * card probe
< */
<
<
< /*
< * the recognized cards, used as indexes of several tables.
< *
< * if probeCard() fails to detect the proper card on boot you can
< * override it by setting the following define to the card you are using:
< *
< #define OVERRIDE_CARD <card type>
< *
< * where <card type> is one of the following card defines.
< */
< #define CARD_UNKNOWN 0
< #define CARD_MIRO 1
< #define CARD_HAUPPAUGE 2
< #define CARD_STB 3
< #define CARD_INTEL 4
< #define CARD_IMS_TURBO 5
< #define CARD_AVER_MEDIA 6
< #define CARD_OSPREY 7
< #define CARD_NEC_PK 8
< #define CARD_IO_GV 9
< #define CARD_FLYVIDEO 10
< #define CARD_ZOLTRIX 11
< #define CARD_KISS 12
< #define CARD_VIDEO_HIGHWAY_XTREME 13
< #define Bt848_MAX_CARD 14
<
< /*
< * the data for each type of card
< *
< * Note:
< * these entried MUST be kept in the order defined by the CARD_XXX defines!
< */
< static const struct CARDTYPE cards[] = {
<
< { CARD_UNKNOWN, /* the card id */
< "Unknown", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx unknown */
< 0,
< 0, /* EEProm unknown */
< 0, /* EEProm unknown */
< { 0, 0, 0, 0, 0 },
< 0 }, /* GPIO mask */
<
< { CARD_MIRO, /* the card id */
< "Miro TV", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx unknown */
< 0,
< 0, /* EEProm unknown */
< 0, /* size unknown */
< { 0x02, 0x01, 0x00, 0x0a, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_HAUPPAUGE, /* the card id */
< "Hauppauge WinCast/TV", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< PFC8582_WADDR, /* EEProm type */
< (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */
< { 0x00, 0x02, 0x01, 0x04, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_STB, /* the card id */
< "STB TV/PCI", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< X24C01_WADDR, /* EEProm type */
< (u_char)(128 / EEPROMBLOCKSIZE), /* 128 bytes */
< { 0x00, 0x01, 0x02, 0x02, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_INTEL, /* the card id */
< "Intel Smart Video III/VideoLogic Captivator PCI", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0,
< 0,
< 0,
< 0,
< { 0, 0, 0, 0, 0 }, /* audio MUX values */
< 0x00 }, /* GPIO mask */
<
< { CARD_IMS_TURBO, /* the card id */
< "IMS TV Turbo", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< PFC8582_WADDR, /* EEProm type */
< (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */
< { 0x01, 0x02, 0x01, 0x00, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_AVER_MEDIA, /* the card id */
< "AVer Media TV/FM", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x0c, 0x00, 0x0b, 0x0b, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_OSPREY, /* the card id */
< "MMAC Osprey", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< PFC8582_WADDR, /* EEProm type */
< (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */
< { 0x00, 0x00, 0x00, 0x00, 0 }, /* audio MUX values */
< 0 }, /* GPIO mask */
<
< { CARD_NEC_PK, /* the card id */
< "NEC PK-UG-X017", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x01, 0x02, 0x01, 0x00, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_IO_GV, /* the card id */
< "I/O DATA GV-BCTV2/PCI", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x00, 0x00, 0x00, 0x00, 1 }, /* Has special MUX handler */
< 0x0f }, /* GPIO mask */
<
< { CARD_FLYVIDEO, /* the card id */
< "FlyVideo", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0, /* msp34xx is optional */
< 0xac, /* EEProm type */
< (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */
< { 0x000, 0x800, 0x400, 0x8dff00, 1 },/* audio MUX values */
< 0x8dff00 }, /* GPIO mask */
<
< { CARD_ZOLTRIX, /* the card id */
< "Zoltrix", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0, /* msp34xx is optional */
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x04, 0x01, 0x00, 0x0a, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_KISS, /* the card id */
< "KISS TV/FM PCI", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0, /* msp34xx is optional */
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x0c, 0x00, 0x0b, 0x0b, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< { CARD_VIDEO_HIGHWAY_XTREME, /* the card id */
< "Video Highway Xtreme", /* the 'name' */
< NULL, /* the tuner */
< 0, /* the tuner i2c address */
< 0, /* dbx is optional */
< 0,
< 0, /* EEProm type */
< 0, /* EEProm size */
< { 0x00, 0x02, 0x01, 0x04, 1 }, /* audio MUX values */
< 0x0f }, /* GPIO mask */
<
< };
<
< struct bt848_card_sig bt848_card_signature[1]= {
< /* IMS TURBO TV : card 5 */
< { 5,9, {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 02, 00, 00, 00}}
<
<
< };
<
<
1287,1292d359
< /*
< * misc. support routines.
< */
< static int signCard( bktr_ptr_t bktr, int offset,
< int count, u_char* sig );
< static void probeCard( bktr_ptr_t bktr, int verbose, int unit);
1294,1309d360
< static void common_bktr_attach( bktr_ptr_t bktr, int unit,
< u_long pci_id, u_int rev );
<
< /**************************************************/
< /* *** Memory Allocation is still OS specific *** */
< /**************************************************/
< #if (defined(__FreeBSD__) || defined(__bsdi__))
< static vm_offset_t get_bktr_mem( int unit, unsigned size );
< #endif
<
< #if (defined(__NetBSD__) || defined(__OpenBSD__))
< static vm_offset_t get_bktr_mem(bktr_ptr_t, bus_dmamap_t *, unsigned size);
< static void free_bktr_mem(bktr_ptr_t, bus_dmamap_t, vm_offset_t);
< #endif
<
<
1338,1346d388
< /*
< * video & video capture specific routines.
< */
< static int video_open( bktr_ptr_t bktr );
< static int video_close( bktr_ptr_t bktr );
< static int video_read( bktr_ptr_t bktr, int unit, dev_t dev, struct uio *uio );
< static int video_ioctl( bktr_ptr_t bktr, int unit,
< int cmd, caddr_t arg, struct proc* pr );
<
1351,1358d392
< /*
< * tuner specific functions.
< */
< static int tuner_open( bktr_ptr_t bktr );
< static int tuner_close( bktr_ptr_t bktr );
< static int tuner_ioctl( bktr_ptr_t bktr, int unit,
< int cmd, caddr_t arg, struct proc* pr );
< static int tuner_getchnlset( struct bktr_chnlset *chnlset );
1360,1365d393
< static int tv_channel( bktr_ptr_t bktr, int channel );
< static int tv_freq( bktr_ptr_t bktr, int frequency );
< #if defined( TUNER_AFC )
< static int do_afc( bktr_ptr_t bktr, int addr, int frequency );
< #endif /* TUNER_AFC */
<
1367,1390d394
< * vbi specific functions.
< */
< static int vbi_open( bktr_ptr_t bktr );
< static int vbi_close( bktr_ptr_t bktr );
< static int vbi_read( bktr_ptr_t bktr, struct uio *uio, int ioflag );
<
< /*
< * audio specific functions.
< */
< static int set_audio( bktr_ptr_t bktr, int mode );
< static void temp_mute( bktr_ptr_t bktr, int flag );
<
< static void init_BTSC( bktr_ptr_t bktr );
< static int set_BTSC( bktr_ptr_t bktr, int control );
<
< static void msp_autodetect( bktr_ptr_t bktr );
< static void msp_read_id( bktr_ptr_t bktr, int unit );
< static void msp_reset( bktr_ptr_t bktr );
< static unsigned int msp_read(bktr_ptr_t bktr, unsigned char dev,
< unsigned int addr);
< static void msp_write( bktr_ptr_t bktr, unsigned char dev,
< unsigned int addr, unsigned int data);
<
< /*
1403,1412d406
< /*
< * i2c primitives
< */
< static int i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 );
< static int i2cRead( bktr_ptr_t bktr, int addr );
< static int writeEEProm( bktr_ptr_t bktr, int offset, int count,
< u_char* data );
< static int readEEProm( bktr_ptr_t bktr, int offset, int count,
< u_char* data );
<
1423,1428d416
< /*
< * CARD_GV_BCTV specific functions.
< */
< static void set_bctv_audio( bktr_ptr_t bktr );
< static void bctv_gpio_write( bktr_ptr_t bktr, int port, int val );
< /*static int bctv_gpio_read( bktr_ptr_t bktr, int port );*/ /* Not used */
1434c422
< static void
---
> void
1534c522
< bktr->tuner.radio_mode = 0;
---
> bktr->tuner.radio_mode = 0;
1543,1545c531,532
< /* If there is an MSP Audio device, reset it and display the model */
< if (bktr->card.msp3400c)msp_reset(bktr);
< if (bktr->card.msp3400c)msp_read_id(bktr, unit);
---
> /* Initialise any MSP34xx or TDA98xx audio chips */
> init_audio_devices( bktr );
1570c557,558
< seq_dest = (unsigned int *)((unsigned char *)bktr->vbibuffer + bktr->vbiinsert
---
> seq_dest = (unsigned int *)((unsigned char *)bktr->vbibuffer
> + bktr->vbiinsert
1596c584
< static int
---
> int
1870c858,859
< static int
---
> extern int bt848_format; /* used to set the default format, PAL or NTSC */
> int
1980c969
< static int
---
> int
2004c993
< static int
---
> int
2018c1007
< bktr->tuner.radio_mode = 0;
---
> bktr->tuner.radio_mode = 0;
2026,2032c1015,1016
< /* enable stereo if appropriate on TDA audio chip */
< if ( bktr->card.dbx )
< init_BTSC( bktr );
<
< /* reset the MSP34xx stereo audio chip */
< if ( bktr->card.msp3400c )
< msp_reset( bktr );
---
> /* Initialise any audio chips, eg MSP34xx or TDA98xx */
> init_audio_devices( bktr );
2043c1027
< static int
---
> int
2073c1057
< static int
---
> int
2087c1071
< static int
---
> int
2099c1083
< static int
---
> int
2156c1140
< static int
---
> int
2203c1187
< return( status );
---
> return( status );
2212c1196
< static int
---
> int
2816c1800
< static int
---
> int
2855,2856c1839,1840
< temp_mute( bktr, FALSE );
< if ( temp < 0 )
---
> if ( temp < 0 ) {
> temp_mute( bktr, FALSE );
2857a1842
> }
2863a1849,1850
>
> temp_mute( bktr, FALSE );
2882c1869
< temp = i2cRead( bktr, bktr->card.tuner_pllAddr + 1 );
---
> temp = get_tuner_status( bktr );
2888c1875
< temp = tv_freq( bktr, (int)*(unsigned long *)arg );
---
> temp = tv_freq( bktr, (int)*(unsigned long *)arg, TV_FREQUENCY);
2890c1877,1878
< if ( temp < 0 )
---
> if ( temp < 0 ) {
> temp_mute( bktr, FALSE );
2891a1880
> }
2897a1887,1888
>
> temp_mute( bktr, FALSE );
3136c2127
< *(unsigned long *)arg = (bktr->tuner.frequency+407)*5;
---
> *(unsigned long *)arg = bktr->tuner.frequency;
3144,3150c2135
< /* The radio in my stereo and the linear regression function
< ** in my HP48 have reached the conclusion that in order to
< ** set the radio tuner of the FM1216 to f MHz, the value to
< ** enter into the Tuner PLL is: f*20-407
< ** If anyone has the exact values from the spec. sheet
< ** please forward them -- fj@login.dknet.dk
< */
---
> temp=(int)*(unsigned long *)arg;
3152,3158d2136
< if(bktr->bt848_tuner == ALPS_TSCH5) {
< temp=((int)*(unsigned long *)arg + 4125) * 32;
< temp=temp/100 + (temp%100 >= 50 ? 1 : 0) +RADIO_OFFSET;
< } else {
< temp=(int)*(unsigned long *)arg/5-407 +RADIO_OFFSET;
< }
<
3166c2144
< if(temp<1343+RADIO_OFFSET || temp>1753+RADIO_OFFSET) {
---
> if(temp<8750 || temp>10800) {
3172c2150
< temp = tv_freq( bktr, temp );
---
> temp = tv_freq( bktr, temp, FM_RADIO_FREQUENCY );
3182c2160,2161
< /* Luigi's I2CWR ioctl */
---
>
> /* Luigi's I2CWR ioctl */
3612c2591
< volatile u_long *dma_prog; /* DMA prog is an array of
---
> volatile u_long *dma_prog; /* DMA prog is an array of
4713c3692
< static int
---
> int
4739c3718
< static int
---
> int
4765c3744
< static void
---
> void
4775c3754
< iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
---
> iicbus_start(IICBUS(bktr), bktr->msp_addr, 0 /* no timeout? */);
4789c3768
< static unsigned int
---
> unsigned int
4802c3781
< iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
---
> iicbus_start(IICBUS(bktr), bktr->msp_addr, 0 /* no timeout? */);
4808c3787
< iicbus_repeated_start(IICBUS(bktr), MSP3400C_RADDR, 0 /* no timeout? */);
---
> iicbus_repeated_start(IICBUS(bktr), bktr->msp_addr +1, 0 /* no timeout? */);
4821c3800
< static void
---
> void
4827c3806
< iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
---
> iicbus_start(IICBUS(bktr), bktr->msp_addr, 0 /* no timeout? */);
4834c3813
< iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
---
> iicbus_start(IICBUS(bktr), bktr->msp_addr, 0 /* no timeout? */);
4859c3838
< static int
---
> int
4905c3884
< static int
---
> int
5044,5045c4023,4024
< static void msp_write( bktr_ptr_t bktr, unsigned char dev, unsigned int addr, unsigned int data){
< unsigned int msp_w_addr = MSP3400C_WADDR;
---
> void msp_write( bktr_ptr_t bktr, unsigned char dev, unsigned int addr, unsigned int data){
> unsigned int msp_w_addr = bktr->msp_addr;
5063c4042
< static unsigned int msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int addr){
---
> unsigned int msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int addr){
5071c4050
< i2c_write_byte(bktr,MSP3400C_WADDR);
---
> i2c_write_byte(bktr,bktr->msp_addr);
5077c4056
< i2c_write_byte(bktr,MSP3400C_RADDR);
---
> i2c_write_byte(bktr,bktr->msp_addr+1);
5089c4068
< static void msp_reset( bktr_ptr_t bktr ) {
---
> void msp_reset( bktr_ptr_t bktr ) {
5094c4073
< i2c_write_byte(bktr, MSP3400C_WADDR);
---
> i2c_write_byte(bktr, bktr->msp_addr);
5102c4081
< i2c_write_byte(bktr, MSP3400C_WADDR);
---
> i2c_write_byte(bktr, bktr->msp_addr);
5200,5243d4178
< /*
< *
< */
< static int
< writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data )
< {
< return( -1 );
< }
<
<
< /*
< *
< */
< static int
< readEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data )
< {
< int x;
< int addr;
< int max;
< int byte;
<
< /* get the address of the EEProm */
< addr = (int)(bktr->card.eepromAddr & 0xff);
< if ( addr == 0 )
< return( -1 );
<
< max = (int)(bktr->card.eepromSize * EEPROMBLOCKSIZE);
< if ( (offset + count) > max )
< return( -1 );
<
< /* set the start address */
< if ( i2cWrite( bktr, addr, offset, -1 ) == -1 )
< return( -1 );
<
< /* the read cycle */
< for ( x = 0; x < count; ++x ) {
< if ( (byte = i2cRead( bktr, (addr | 1) )) == -1 )
< return( -1 );
< data[ x ] = byte;
< }
<
< return( 0 );
< }
<
5246,7504d4180
< /*
< * get a signature of the card
< * read all 128 possible i2c read addresses from 0x01 thru 0xff
< * build a bit array with a 1 bit for each i2c device that responds
< *
< * XXX FIXME: use offset & count args
< */
< static int
< signCard( bktr_ptr_t bktr, int offset, int count, u_char* sig )
< {
< int x;
<
< for ( x = 0; x < 16; ++x )
< sig[ x ] = 0;
<
< for ( x = 0; x < count; ++x ) {
< if ( i2cRead( bktr, (2 * x) + 1 ) != ABSENT ) {
< sig[ x / 8 ] |= (1 << (x % 8) );
< }
< }
<
< return( 0 );
< }
<
< /*
< * any_i2c_devices.
< * Some BT848/BT848A cards have no tuner and no additional i2c devices
< * eg stereo decoder. These are used for video conferencing or capture from
< * a video camera. (VideoLogic Captivator PCI, Intel SmartCapture card).
< *
< * Determine if there are any i2c devices present. There are none present if
< * a) reading from all 128 devices returns ABSENT (-1) for each one
< * (eg VideoLogic Captivator PCI with BT848)
< * b) reading from all 128 devices returns 0 for each one
< * (eg VideoLogic Captivator PCI rev. 2F with BT848A)
< */
< static int check_for_i2c_devices( bktr_ptr_t bktr ){
< int x, temp_read;
< int i2c_all_0 = 1;
< int i2c_all_absent = 1;
< for ( x = 0; x < 128; ++x ) {
< temp_read = i2cRead( bktr, (2 * x) + 1 );
< if (temp_read != 0) i2c_all_0 = 0;
< if (temp_read != ABSENT) i2c_all_absent = 0;
< }
<
< if ((i2c_all_0) || (i2c_all_absent)) return 0;
< else return 1;
< }
<
< /*
< * Temic/Philips datasheets say tuners can be at i2c addresses 0xc0, 0xc2,
< * 0xc4 or 0xc6, settable by links on the tuner
< * Determine the actual address used on the TV card by probing read addresses
< */
< static int locate_tuner_address( bktr_ptr_t bktr) {
< if (i2cRead( bktr, 0xc1) != ABSENT) return 0xc0;
< if (i2cRead( bktr, 0xc3) != ABSENT) return 0xc2;
< if (i2cRead( bktr, 0xc5) != ABSENT) return 0xc4;
< if (i2cRead( bktr, 0xc7) != ABSENT) return 0xc6;
< return -1; /* no tuner found */
< }
<
< /*
< * Search for a configuration EEPROM on the i2c bus by looking at i2c addresses
< * where EEPROMs are usually found.
< */
< static int locate_eeprom_address( bktr_ptr_t bktr) {
< if (i2cRead( bktr, 0xa0) != ABSENT) return 0xa0;
< if (i2cRead( bktr, 0xac) != ABSENT) return 0xac;
< if (i2cRead( bktr, 0xae) != ABSENT) return 0xae;
< return -1; /* no eeprom found */
< }
<
< /*
< * determine the card brand/model
< * OVERRIDE_CARD, OVERRIDE_TUNER, OVERRIDE_DBX and OVERRIDE_MSP
< * can be used to select a specific device, regardless of the
< * autodetection and i2c device checks.
< *
< * The scheme used for probing cards has one major drawback:
< * on bt848/849 based cards, it is impossible to work out which type
< * of tuner is actually fitted, or if there is extra hardware on board
< * connected to GPIO pins (eg radio chips or MSP34xx reset logic)
< * The driver cannot tell if the Tuner is PAL,NTSC, Temic or Philips.
< *
< * All Hauppauge cards have a configuration eeprom which tells us the
< * tuner type and other features of the their cards.
< * Also, Bt878 based cards (certainly Hauppauge and AverMedia) should support
< * sub-system vendor id, identifying the make and model of the card.
< *
< * The current probe code works as follows
< * 1) Check if it is a BT878. If so, read the sub-system vendor id.
< * Select the required tuner and other onboard features.
< * 2) If it is a BT848, 848A or 849A, continue on:
< * 3) Some cards have no I2C devices. Check if the i2c bus is empty
< * and if so, our detection job is nearly over.
< * 4) Check I2C address 0xa0. If present this will be a Hauppauge card
< * or an Osprey card. The Hauppauge EEPROM can determine on board tuner
< * type and other features.
< * 4) Check I2C address 0xa8. If present this is a STB card.
< * Still have to guess on the tuner type.
< * 5) Otherwise we are in the dark. Miro cards have the tuner type
< * hard-coded on the GPIO pins, but we do not actually know if we have
< * a Miro card.
< * Some older makes of card put Philips tuners and Temic tuners at
< * different I2C addresses, so an i2c bus probe can help, but it is
< * really just a guess.
< *
< * 6) After determining the Tuner Type, we probe the i2c bus for other
< * devices at known locations, eg IR-Remote Control, MSP34xx and TDA
< * stereo chips.
< */
<
< #define VENDOR_AVER_MEDIA 0x1461
< #define VENDOR_HAUPPAUGE 0x0070
< #define VENDOR_FLYVIDEO 0x1851
< #define VENDOR_STB 0x10B4
<
< static void
< probeCard( bktr_ptr_t bktr, int verbose, int unit )
< {
< int card, i,j, card_found;
< int status;
< bt848_ptr_t bt848;
< u_char probe_signature[128], *probe_temp;
< int any_i2c_devices;
< u_char eeprom[256];
< int tuner_i2c_address = -1;
< int eeprom_i2c_address = -1;
<
< bt848 = bktr->base;
<
< /* Select all GPIO bits as inputs */
< bt848->gpio_out_en = 0;
< if (bootverbose)
< printf("bktr: GPIO is 0x%08x\n", bt848->gpio_data);
<
< #ifdef HAUPPAUGE_MSP_RESET
< /* Reset the MSP34xx audio chip. This resolves bootup card
< * detection problems with old Bt848 based Hauppauge cards with
< * MSP34xx stereo audio chips. This must be user enabled because
< * at this point the probe function does not know the card type. */
< bt848->gpio_out_en = bt848->gpio_out_en | (1<<5);
< bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
< DELAY(2500); /* wait 2.5ms */
< bt848->gpio_data = bt848->gpio_data & ~(1<<5); /* write '0' */
< DELAY(2500); /* wait 2.5ms */
< bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
< DELAY(2500); /* wait 2.5ms */
< #endif
<
< /* Check for the presence of i2c devices */
< any_i2c_devices = check_for_i2c_devices( bktr );
<
<
< /* Check for a user specified override on the card selection */
< #if defined( OVERRIDE_CARD )
< bktr->card = cards[ (card = OVERRIDE_CARD) ];
< goto checkEEPROM;
< #endif
< if (bktr->bt848_card != -1 ) {
< bktr->card = cards[ (card = bktr->bt848_card) ];
< goto checkEEPROM;
< }
<
<
< /* No override, so try and determine the make of the card */
<
< /* On BT878/879 cards, read the sub-system vendor id */
< /* This identifies the manufacturer of the card and the model */
< /* In theory this can be read from PCI registers but this does not */
< /* appear to work on the FlyVideo 98. Hauppauge also warned that */
< /* the PCI registers are sometimes not loaded correctly. */
< /* Therefore, I will read the sub-system vendor ID from the EEPROM */
< /* (just like the Bt878 does during power up initialisation) */
<
< if (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) {
<
< /* Try and locate the EEPROM */
< eeprom_i2c_address = locate_eeprom_address( bktr );
< if (eeprom_i2c_address != -1) {
<
< unsigned int subsystem_vendor_id; /* vendors PCI-SIG ID */
< unsigned int subsystem_id; /* board model number */
< unsigned int byte_252, byte_253, byte_254, byte_255;
<
< bktr->card = cards[ (card = CARD_UNKNOWN) ];
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
<
< readEEProm(bktr, 0, 256, (u_char *) &eeprom );
< byte_252 = (unsigned int)eeprom[252];
< byte_253 = (unsigned int)eeprom[253];
< byte_254 = (unsigned int)eeprom[254];
< byte_255 = (unsigned int)eeprom[255];
<
< subsystem_id = (byte_252 << 8) | byte_253;
< subsystem_vendor_id = (byte_254 << 8) | byte_255;
<
< if ( bootverbose )
< printf("subsytem 0x%04x 0x%04x\n",subsystem_vendor_id,
< subsystem_id);
<
< if (subsystem_vendor_id == VENDOR_AVER_MEDIA) {
< bktr->card = cards[ (card = CARD_AVER_MEDIA) ];
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< if (subsystem_vendor_id == VENDOR_HAUPPAUGE) {
< bktr->card = cards[ (card = CARD_HAUPPAUGE) ];
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< if (subsystem_vendor_id == VENDOR_FLYVIDEO) {
< bktr->card = cards[ (card = CARD_FLYVIDEO) ];
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< if (subsystem_vendor_id == VENDOR_STB) {
< bktr->card = cards[ (card = CARD_STB) ];
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< /* Vendor is unknown. We will use the standard probe code */
< /* which may not give best results */
< printf("Warning - card vendor 0x%04x (model 0x%04x) unknown. This may cause poor performance\n",subsystem_vendor_id,subsystem_id);
< }
< else
< {
< printf("Warning - card has no configuration EEPROM. Cannot determine card make. This may cause poor performance\n");
< }
< } /* end of bt878/bt879 card detection code */
<
< /* If we get to this point, we must have a Bt848/848A/849A card */
< /* or a Bt878/879 with an unknown subsystem vendor id */
< /* Try and determine the make of card by clever i2c probing */
<
< /* Check for i2c devices. If none, move on */
< if (!any_i2c_devices) {
< bktr->card = cards[ (card = CARD_INTEL) ];
< bktr->card.eepromAddr = 0;
< bktr->card.eepromSize = 0;
< goto checkTuner;
< }
<
<
< /* Look for Hauppauge, STB and Osprey cards by the presence */
< /* of an EEPROM */
< /* Note: Bt878 based cards also use EEPROMs so we can only do this */
< /* test on BT848/848A and 849A based cards. */
< if ((bktr->id==BROOKTREE_848) ||
< (bktr->id==BROOKTREE_848A) ||
< (bktr->id==BROOKTREE_849A)) {
<
< /* At i2c address 0xa0, look for Hauppauge and Osprey cards */
< if ( (status = i2cRead( bktr, PFC8582_RADDR )) != ABSENT ) {
<
< /* Read the eeprom contents */
< bktr->card = cards[ (card = CARD_UNKNOWN) ];
< bktr->card.eepromAddr = PFC8582_WADDR;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< readEEProm(bktr, 0, 128, (u_char *) &eeprom );
<
< /* For Hauppauge, check the EEPROM begins with 0x84 */
< if (eeprom[0] == 0x84) {
< bktr->card = cards[ (card = CARD_HAUPPAUGE) ];
< bktr->card.eepromAddr = PFC8582_WADDR;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< /* For Osprey, check the EEPROM begins with "MMAC" */
< if ( (eeprom[0] == 'M') &&(eeprom[1] == 'M')
< &&(eeprom[2] == 'A') &&(eeprom[3] == 'C')) {
< bktr->card = cards[ (card = CARD_OSPREY) ];
< bktr->card.eepromAddr = PFC8582_WADDR;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
< printf("Warning: Unknown card type. EEPROM data not recognised\n");
< printf("%x %x %x %x\n",eeprom[0],eeprom[1],eeprom[2],eeprom[3]);
< }
<
< /* look for an STB card */
< if ( (status = i2cRead( bktr, X24C01_RADDR )) != ABSENT ) {
< bktr->card = cards[ (card = CARD_STB) ];
< bktr->card.eepromAddr = X24C01_WADDR;
< bktr->card.eepromSize = (u_char)(128 / EEPROMBLOCKSIZE);
< goto checkTuner;
< }
<
< }
<
< signCard( bktr, 1, 128, (u_char *) &probe_signature );
<
< if (bootverbose) {
< printf("card signature \n");
< for (j = 0; j < Bt848_MAX_SIGN; j++) {
< printf(" %02x ", probe_signature[j]);
< }
< printf("\n\n");
< }
< for (i = 0;
< i < (sizeof bt848_card_signature)/ sizeof (struct bt848_card_sig);
< i++ ) {
<
< card_found = 1;
< probe_temp = (u_char *) &bt848_card_signature[i].signature;
<
< for (j = 0; j < Bt848_MAX_SIGN; j++) {
< if ((probe_temp[j] & 0xf) != (probe_signature[j] & 0xf)) {
< card_found = 0;
< break;
< }
<
< }
< if (card_found) {
< bktr->card = cards[ card = bt848_card_signature[i].card];
< bktr->card.tuner = &tuners[ bt848_card_signature[i].tuner];
< eeprom_i2c_address = locate_eeprom_address( bktr );
< if (eeprom_i2c_address != -1) {
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< } else {
< bktr->card.eepromAddr = 0;
< bktr->card.eepromSize = 0;
< }
< goto checkDBX;
< }
< }
<
< /* We do not know the card type. Default to Miro */
< bktr->card = cards[ (card = CARD_MIRO) ];
<
<
< checkEEPROM:
< /* look for a configuration eeprom */
< eeprom_i2c_address = locate_eeprom_address( bktr );
< if (eeprom_i2c_address != -1) {
< bktr->card.eepromAddr = eeprom_i2c_address;
< bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
< } else {
< bktr->card.eepromAddr = 0;
< bktr->card.eepromSize = 0;
< }
<
<
< checkTuner:
<
< /* look for a tuner */
< tuner_i2c_address = locate_tuner_address( bktr );
< if ( tuner_i2c_address == -1 ) {
< bktr->card.tuner = &tuners[ NO_TUNER ];
< goto checkDBX;
< }
<
< #if defined( OVERRIDE_TUNER )
< bktr->card.tuner = &tuners[ OVERRIDE_TUNER ];
< goto checkDBX;
< #endif
< if (bktr->bt848_tuner != -1 ) {
< bktr->card.tuner = &tuners[ bktr->bt848_tuner & 0xff ];
< goto checkDBX;
< }
<
< /* Check for i2c devices */
< if (!any_i2c_devices) {
< bktr->card.tuner = &tuners[ NO_TUNER ];
< goto checkDBX;
< }
<
< /* differentiate type of tuner */
<
< switch (card) {
< case CARD_MIRO:
< switch (((bt848->gpio_data >> 10)-1)&7) {
< case 0: bktr->card.tuner = &tuners[ TEMIC_PAL ]; break;
< case 1: bktr->card.tuner = &tuners[ PHILIPS_PAL ]; break;
< case 2: bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; break;
< case 3: bktr->card.tuner = &tuners[ PHILIPS_SECAM ]; break;
< case 4: bktr->card.tuner = &tuners[ NO_TUNER ]; break;
< case 5: bktr->card.tuner = &tuners[ PHILIPS_PALI ]; break;
< case 6: bktr->card.tuner = &tuners[ TEMIC_NTSC ]; break;
< case 7: bktr->card.tuner = &tuners[ TEMIC_PALI ]; break;
< }
< goto checkDBX;
< break;
<
< case CARD_HAUPPAUGE:
< /* Hauppauge kindly supplied the following Tuner Table */
< /* FIXME: I think the tuners the driver selects for types */
< /* 0x08 and 0x15 may be incorrect but no one has complained. */
< /*
< ID Tuner Model Format We select Format
< 0 NONE
< 1 EXTERNAL
< 2 OTHER
< 3 Philips FI1216 BG
< 4 Philips FI1216MF BGLL'
< 5 Philips FI1236 MN PHILIPS_NTSC
< 6 Philips FI1246 I PHILIPS_PALI
< 7 Philips FI1256 DK
< 8 Philips FI1216 MK2 BG PHILIPS_PALI
< 9 Philips FI1216MF MK2 BGLL'
< a Philips FI1236 MK2 MN PHILIPS_NTSC
< b Philips FI1246 MK2 I PHILIPS_PALI
< c Philips FI1256 MK2 DK
< d Temic 4032FY5 NTSC TEMIC_NTSC
< e Temic 4002FH5 BG TEMIC_PAL
< f Temic 4062FY5 I TEMIC_PALI
< 10 Philips FR1216 MK2 BG
< 11 Philips FR1216MF MK2 BGLL'
< 12 Philips FR1236 MK2 MN PHILIPS_FR1236_NTSC
< 13 Philips FR1246 MK2 I
< 14 Philips FR1256 MK2 DK
< 15 Philips FM1216 BG PHILIPS_FR1216_PAL
< 16 Philips FM1216MF BGLL'
< 17 Philips FM1236 MN PHILIPS_FR1236_NTSC
< 18 Philips FM1246 I
< 19 Philips FM1256 DK
< 1a Temic 4036FY5 MN - FI1236 MK2 clone
< 1b Samsung TCPN9082D MN
< 1c Samsung TCPM9092P Pal BG/I/DK
< 1d Temic 4006FH5 BG PHILIPS_PALI clone
< 1e Samsung TCPN9085D MN/Radio
< 1f Samsung TCPB9085P Pal BG/I/DK / Radio
< 20 Samsung TCPL9091P Pal BG & Secam L/L'
< 21 Temic 4039FY5 NTSC Radio
<
< */
<
< if (bktr->card.eepromAddr != 0) {
< u_char tuner_code;
< u_int model;
< u_int revision;
<
< readEEProm(bktr, 0, 128, (u_char *) &eeprom );
<
<
< /* Determine the model number from the eeprom */
< model = (eeprom[12] << 8 | eeprom[11]);
< revision = (eeprom[15] << 16 | eeprom[14] << 8 | eeprom[13]);
< if (verbose)
< printf("bktr%d: Hauppauge Model %d %c%c%c%c\n",
< unit,
< model,
< ((revision >> 18) & 0x3f) + 32,
< ((revision >> 12) & 0x3f) + 32,
< ((revision >> 6) & 0x3f) + 32,
< ((revision >> 0) & 0x3f) + 32 );
<
< /* Determine the tuner type from the eeprom */
< tuner_code = eeprom[9];
< switch (tuner_code) {
<
< case 0x5:
< case 0x0a:
< case 0x1a:
< bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
< goto checkDBX;
<
< case 0x12:
< case 0x17:
< bktr->card.tuner = &tuners[ PHILIPS_FR1236_NTSC ];
< goto checkDBX;
<
< case 0x6:
< case 0x8:
< case 0xb:
< case 0x1d:
< bktr->card.tuner = &tuners[ PHILIPS_PALI ];
< goto checkDBX;
<
< case 0xd:
< bktr->card.tuner = &tuners[ TEMIC_NTSC ];
< goto checkDBX;
<
< case 0xe:
< bktr->card.tuner = &tuners[ TEMIC_PAL];
< goto checkDBX;
<
< case 0xf:
< bktr->card.tuner = &tuners[ TEMIC_PALI ];
< goto checkDBX;
<
< case 0x15:
< bktr->card.tuner = &tuners[ PHILIPS_FR1216_PAL];
< goto checkDBX;
<
< default :
< printf("Warning - Unknown Hauppauge Tuner 0x%x\n",tuner_code);
< }
< }
< break;
<
< case CARD_AVER_MEDIA:
< /* AVerMedia kindly supplied some details of their EEPROM contents
< * which allow us to auto select the Tuner Type.
< * Only the newer AVerMedia cards actually have an EEPROM.
< */
< if (bktr->card.eepromAddr != 0) {
<
< u_char tuner_make; /* Eg Philips, Temic */
< u_char tuner_tv_fm; /* TV or TV with FM Radio */
< u_char tuner_format; /* Eg NTSC, PAL, SECAM */
< int tuner;
<
< int tuner_0_table[] = {
< PHILIPS_NTSC, PHILIPS_PAL,
< PHILIPS_PAL, PHILIPS_PAL,
< PHILIPS_PAL, PHILIPS_PAL,
< PHILIPS_SECAM, PHILIPS_SECAM,
< PHILIPS_SECAM, PHILIPS_PAL};
<
< int tuner_0_fm_table[] = {
< PHILIPS_FR1236_NTSC, PHILIPS_FR1216_PAL,
< PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL,
< PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL,
< PHILIPS_FR1236_SECAM, PHILIPS_FR1236_SECAM,
< PHILIPS_FR1236_SECAM, PHILIPS_FR1216_PAL};
<
< int tuner_1_table[] = {
< TEMIC_NTSC, TEMIC_PAL, TEMIC_PAL,
< TEMIC_PAL, TEMIC_PAL, TEMIC_PAL,
< TEMIC_SECAM, TEMIC_SECAM, TEMIC_SECAM,
< TEMIC_PAL};
<
<
< /* Extract information from the EEPROM data */
< readEEProm(bktr, 0, 128, (u_char *) &eeprom );
< tuner_make = (eeprom[0x41] & 0x7);
< tuner_tv_fm = (eeprom[0x41] & 0x18) >> 3;
< tuner_format = (eeprom[0x42] & 0xf0) >> 4;
<
< /* Treat tuner makes 0 (Philips) and 2 (LG) the same */
< if ( ((tuner_make == 0) || (tuner_make == 2))
< && (tuner_format <= 9) && (tuner_tv_fm == 0) ) {
< tuner = tuner_0_table[tuner_format];
< bktr->card.tuner = &tuners[ tuner ];
< goto checkDBX;
< }
<
< if ( ((tuner_make == 0) || (tuner_make == 2))
< && (tuner_format <= 9) && (tuner_tv_fm == 1) ) {
< tuner = tuner_0_fm_table[tuner_format];
< bktr->card.tuner = &tuners[ tuner ];
< goto checkDBX;
< }
<
< if ( (tuner_make == 1) && (tuner_format <= 9) ) {
< tuner = tuner_1_table[tuner_format];
< bktr->card.tuner = &tuners[ tuner ];
< goto checkDBX;
< }
<
< printf("Warning - Unknown AVerMedia Tuner Make %d Format %d\n",
< tuner_make, tuner_format);
< }
< break;
<
< } /* end switch(card) */
<
< /* At this point, a goto checkDBX has not occured */
< /* We have not been able to select a Tuner */
< /* Some cards make use of the tuner address to */
< /* identify the make/model of tuner */
<
< /* At address 0xc0/0xc1 we often find a TEMIC NTSC */
< if ( i2cRead( bktr, 0xc1 ) != ABSENT ) {
< bktr->card.tuner = &tuners[ TEMIC_NTSC ];
< goto checkDBX;
< }
<
< /* At address 0xc6/0xc7 we often find a PHILIPS NTSC Tuner */
< if ( i2cRead( bktr, 0xc7 ) != ABSENT ) {
< bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
< goto checkDBX;
< }
<
< /* Address 0xc2/0xc3 is default (or common address) for several */
< /* tuners and we cannot tell which is which. */
< /* And for all other tuner i2c addresses, select the default */
< bktr->card.tuner = &tuners[ DEFAULT_TUNER ];
<
<
< checkDBX:
< #if defined( OVERRIDE_DBX )
< bktr->card.dbx = OVERRIDE_DBX;
< goto checkMSP;
< #endif
< /* Check for i2c devices */
< if (!any_i2c_devices) {
< goto checkMSP;
< }
<
< /* probe for BTSC (dbx) chip */
< if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT )
< bktr->card.dbx = 1;
<
< checkMSP:
< /* If this is a Hauppauge Bt878 card, we need to enable the
< * MSP 34xx audio chip.
< * If this is a Hauppauge Bt848 card, reset the MSP device.
< * The MSP reset line is wired to GPIO pin 5. On Bt878 cards a pulldown
< * resistor holds the device in reset until we set GPIO pin 5.
< */
<
< /* Optionally skip the MSP reset. This is handy if you initialise the
< * MSP audio in another operating system (eg Windows) first and then
< * do a soft reboot.
< */
<
< #ifndef BKTR_NO_MSP_RESET
< if (card == CARD_HAUPPAUGE) {
< bt848->gpio_out_en = bt848->gpio_out_en | (1<<5);
< bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
< DELAY(2500); /* wait 2.5ms */
< bt848->gpio_data = bt848->gpio_data & ~(1<<5); /* write '0' */
< DELAY(2500); /* wait 2.5ms */
< bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
< DELAY(2500); /* wait 2.5ms */
< }
< #endif
<
< #if defined( OVERRIDE_MSP )
< bktr->card.msp3400c = OVERRIDE_MSP;
< goto checkMSPEnd;
< #endif
<
< /* Check for i2c devices */
< if (!any_i2c_devices) {
< goto checkMSPEnd;
< }
<
< if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT )
< bktr->card.msp3400c = 1;
<
< checkMSPEnd:
<
< /* Start of Check Remote */
< /* Check for the Hauppauge IR Remote Control */
< /* If there is an external unit, the internal will be ignored */
<
< bktr->remote_control = 0; /* initial value */
<
< if (any_i2c_devices) {
< if (i2cRead( bktr, HAUP_REMOTE_EXT_RADDR ) != ABSENT )
< {
< bktr->remote_control = 1;
< bktr->remote_control_addr = HAUP_REMOTE_EXT_RADDR;
< }
< else if (i2cRead( bktr, HAUP_REMOTE_INT_RADDR ) != ABSENT )
< {
< bktr->remote_control = 1;
< bktr->remote_control_addr = HAUP_REMOTE_INT_RADDR;
< }
<
< }
< /* If a remote control is found, poll it 5 times to turn off the LED */
< if (bktr->remote_control) {
< int i;
< for (i=0; i<5; i++)
< i2cRead( bktr, bktr->remote_control_addr );
< }
< /* End of Check Remote */
<
< #if defined( BKTR_USE_PLL )
< bktr->xtal_pll_mode = BT848_USE_PLL;
< goto checkPLLEnd;
< #endif
< /* Default is to use XTALS and not PLL mode */
< bktr->xtal_pll_mode = BT848_USE_XTALS;
<
< /* Enable PLL mode for PAL/SECAM users on Hauppauge 878 cards */
< if ((card == CARD_HAUPPAUGE) &&
< (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) )
< bktr->xtal_pll_mode = BT848_USE_PLL;
<
<
< /* Enable PLL mode for OSPREY users */
< if (card == CARD_OSPREY)
< bktr->xtal_pll_mode = BT848_USE_PLL;
<
< /* Enable PLL mode for PAL/SECAM users on FlyVideo 878 cards */
< if ((card == CARD_FLYVIDEO) &&
< (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) )
< bktr->xtal_pll_mode = BT848_USE_PLL;
<
< /* Enable PLL mode for Video Highway Xtreme users */
< if (card == CARD_VIDEO_HIGHWAY_XTREME)
< bktr->xtal_pll_mode = BT848_USE_PLL;
<
< #if defined( BKTR_USE_PLL )
< checkPLLEnd:
< #endif
<
<
< bktr->card.tuner_pllAddr = tuner_i2c_address;
<
< if ( verbose ) {
< printf( "%s", bktr->card.name );
< if ( bktr->card.tuner )
< printf( ", %s tuner", bktr->card.tuner->name );
< if ( bktr->card.dbx )
< printf( ", dbx stereo" );
< if ( bktr->card.msp3400c )
< printf( ", msp3400c stereo" );
< if ( bktr->remote_control )
< printf( ", remote control" );
< printf( ".\n" );
< }
< }
< #undef ABSENT
<
<
< /******************************************************************************
< * tuner specific routines:
< */
<
<
< /* scaling factor for frequencies expressed as ints */
< #define FREQFACTOR 16
<
< /*
< * Format:
< * entry 0: MAX legal channel
< * entry 1: IF frequency
< * expressed as fi{mHz} * 16,
< * eg 45.75mHz == 45.75 * 16 = 732
< * entry 2: [place holder/future]
< * entry 3: base of channel record 0
< * entry 3 + (x*3): base of channel record 'x'
< * entry LAST: NULL channel entry marking end of records
< *
< * Record:
< * int 0: base channel
< * int 1: frequency of base channel,
< * expressed as fb{mHz} * 16,
< * int 2: offset frequency between channels,
< * expressed as fo{mHz} * 16,
< */
<
< /*
< * North American Broadcast Channels:
< *
< * 2: 55.25 mHz - 4: 67.25 mHz
< * 5: 77.25 mHz - 6: 83.25 mHz
< * 7: 175.25 mHz - 13: 211.25 mHz
< * 14: 471.25 mHz - 83: 885.25 mHz
< *
< * IF freq: 45.75 mHz
< */
< #define OFFSET 6.00
< static int nabcst[] = {
< 83, (int)( 45.75 * FREQFACTOR), 0,
< 14, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 7, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 5, (int)( 77.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 2, (int)( 55.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef OFFSET
<
< /*
< * North American Cable Channels, IRC:
< *
< * 2: 55.25 mHz - 4: 67.25 mHz
< * 5: 77.25 mHz - 6: 83.25 mHz
< * 7: 175.25 mHz - 13: 211.25 mHz
< * 14: 121.25 mHz - 22: 169.25 mHz
< * 23: 217.25 mHz - 94: 643.25 mHz
< * 95: 91.25 mHz - 99: 115.25 mHz
< *
< * IF freq: 45.75 mHz
< */
< #define OFFSET 6.00
< static int irccable[] = {
< 99, (int)( 45.75 * FREQFACTOR), 0,
< 95, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 23, (int)(217.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 14, (int)(121.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 7, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 5, (int)( 77.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 2, (int)( 55.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef OFFSET
<
< /*
< * North American Cable Channels, HRC:
< *
< * 2: 54 mHz - 4: 66 mHz
< * 5: 78 mHz - 6: 84 mHz
< * 7: 174 mHz - 13: 210 mHz
< * 14: 120 mHz - 22: 168 mHz
< * 23: 216 mHz - 94: 642 mHz
< * 95: 90 mHz - 99: 114 mHz
< *
< * IF freq: 45.75 mHz
< */
< #define OFFSET 6.00
< static int hrccable[] = {
< 99, (int)( 45.75 * FREQFACTOR), 0,
< 95, (int)( 90.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 23, (int)(216.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 14, (int)(120.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 7, (int)(174.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 5, (int)( 78.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 2, (int)( 54.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef OFFSET
<
< /*
< * Western European broadcast channels:
< *
< * (there are others that appear to vary between countries - rmt)
< *
< * here's the table Philips provides:
< * caution, some of the offsets don't compute...
< *
< * 1 4525 700 N21
< *
< * 2 4825 700 E2
< * 3 5525 700 E3
< * 4 6225 700 E4
< *
< * 5 17525 700 E5
< * 6 18225 700 E6
< * 7 18925 700 E7
< * 8 19625 700 E8
< * 9 20325 700 E9
< * 10 21025 700 E10
< * 11 21725 700 E11
< * 12 22425 700 E12
< *
< * 13 5375 700 ITA
< * 14 6225 700 ITB
< *
< * 15 8225 700 ITC
< *
< * 16 17525 700 ITD
< * 17 18325 700 ITE
< *
< * 18 19225 700 ITF
< * 19 20125 700 ITG
< * 20 21025 700 ITH
< *
< * 21 47125 800 E21
< * 22 47925 800 E22
< * 23 48725 800 E23
< * 24 49525 800 E24
< * 25 50325 800 E25
< * 26 51125 800 E26
< * 27 51925 800 E27
< * 28 52725 800 E28
< * 29 53525 800 E29
< * 30 54325 800 E30
< * 31 55125 800 E31
< * 32 55925 800 E32
< * 33 56725 800 E33
< * 34 57525 800 E34
< * 35 58325 800 E35
< * 36 59125 800 E36
< * 37 59925 800 E37
< * 38 60725 800 E38
< * 39 61525 800 E39
< * 40 62325 800 E40
< * 41 63125 800 E41
< * 42 63925 800 E42
< * 43 64725 800 E43
< * 44 65525 800 E44
< * 45 66325 800 E45
< * 46 67125 800 E46
< * 47 67925 800 E47
< * 48 68725 800 E48
< * 49 69525 800 E49
< * 50 70325 800 E50
< * 51 71125 800 E51
< * 52 71925 800 E52
< * 53 72725 800 E53
< * 54 73525 800 E54
< * 55 74325 800 E55
< * 56 75125 800 E56
< * 57 75925 800 E57
< * 58 76725 800 E58
< * 59 77525 800 E59
< * 60 78325 800 E60
< * 61 79125 800 E61
< * 62 79925 800 E62
< * 63 80725 800 E63
< * 64 81525 800 E64
< * 65 82325 800 E65
< * 66 83125 800 E66
< * 67 83925 800 E67
< * 68 84725 800 E68
< * 69 85525 800 E69
< *
< * 70 4575 800 IA
< * 71 5375 800 IB
< * 72 6175 800 IC
< *
< * 74 6925 700 S01
< * 75 7625 700 S02
< * 76 8325 700 S03
< *
< * 80 10525 700 S1
< * 81 11225 700 S2
< * 82 11925 700 S3
< * 83 12625 700 S4
< * 84 13325 700 S5
< * 85 14025 700 S6
< * 86 14725 700 S7
< * 87 15425 700 S8
< * 88 16125 700 S9
< * 89 16825 700 S10
< * 90 23125 700 S11
< * 91 23825 700 S12
< * 92 24525 700 S13
< * 93 25225 700 S14
< * 94 25925 700 S15
< * 95 26625 700 S16
< * 96 27325 700 S17
< * 97 28025 700 S18
< * 98 28725 700 S19
< * 99 29425 700 S20
< *
< *
< * Channels S21 - S41 are taken from
< * http://gemma.apple.com:80/dev/technotes/tn/tn1012.html
< *
< * 100 30325 800 S21
< * 101 31125 800 S22
< * 102 31925 800 S23
< * 103 32725 800 S24
< * 104 33525 800 S25
< * 105 34325 800 S26
< * 106 35125 800 S27
< * 107 35925 800 S28
< * 108 36725 800 S29
< * 109 37525 800 S30
< * 110 38325 800 S31
< * 111 39125 800 S32
< * 112 39925 800 S33
< * 113 40725 800 S34
< * 114 41525 800 S35
< * 115 42325 800 S36
< * 116 43125 800 S37
< * 117 43925 800 S38
< * 118 44725 800 S39
< * 119 45525 800 S40
< * 120 46325 800 S41
< *
< * 121 3890 000 IFFREQ
< *
< */
< static int weurope[] = {
< 121, (int)( 38.90 * FREQFACTOR), 0,
< 100, (int)(303.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 90, (int)(231.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
< 80, (int)(105.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
< 74, (int)( 69.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
< 21, (int)(471.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 17, (int)(183.25 * FREQFACTOR), (int)(9.00 * FREQFACTOR),
< 16, (int)(175.25 * FREQFACTOR), (int)(9.00 * FREQFACTOR),
< 15, (int)(82.25 * FREQFACTOR), (int)(8.50 * FREQFACTOR),
< 13, (int)(53.75 * FREQFACTOR), (int)(8.50 * FREQFACTOR),
< 5, (int)(175.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
< 2, (int)(48.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
< 0
< };
<
< /*
< * Japanese Broadcast Channels:
< *
< * 1: 91.25MHz - 3: 103.25MHz
< * 4: 171.25MHz - 7: 189.25MHz
< * 8: 193.25MHz - 12: 217.25MHz (VHF)
< * 13: 471.25MHz - 62: 765.25MHz (UHF)
< *
< * IF freq: 45.75 mHz
< * OR
< * IF freq: 58.75 mHz
< */
< #define OFFSET 6.00
< #define IF_FREQ 45.75
< static int jpnbcst[] = {
< 62, (int)(IF_FREQ * FREQFACTOR), 0,
< 13, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 8, (int)(193.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 4, (int)(171.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 1, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef IF_FREQ
< #undef OFFSET
<
< /*
< * Japanese Cable Channels:
< *
< * 1: 91.25MHz - 3: 103.25MHz
< * 4: 171.25MHz - 7: 189.25MHz
< * 8: 193.25MHz - 12: 217.25MHz
< * 13: 109.25MHz - 21: 157.25MHz
< * 22: 165.25MHz
< * 23: 223.25MHz - 63: 463.25MHz
< *
< * IF freq: 45.75 mHz
< */
< #define OFFSET 6.00
< #define IF_FREQ 45.75
< static int jpncable[] = {
< 63, (int)(IF_FREQ * FREQFACTOR), 0,
< 23, (int)(223.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 22, (int)(165.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 13, (int)(109.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 8, (int)(193.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 4, (int)(171.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 1, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef IF_FREQ
< #undef OFFSET
<
< /*
< * xUSSR Broadcast Channels:
< *
< * 1: 49.75MHz - 2: 59.25MHz
< * 3: 77.25MHz - 5: 93.25MHz
< * 6: 175.25MHz - 12: 223.25MHz
< * 13-20 - not exist
< * 21: 471.25MHz - 34: 575.25MHz
< * 35: 583.25MHz - 69: 855.25MHz
< *
< * Cable channels
< *
< * 70: 111.25MHz - 77: 167.25MHz
< * 78: 231.25MHz -107: 463.25MHz
< *
< * IF freq: 38.90 MHz
< */
< #define IF_FREQ 38.90
< static int xussr[] = {
< 107, (int)(IF_FREQ * FREQFACTOR), 0,
< 78, (int)(231.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 70, (int)(111.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 35, (int)(583.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 21, (int)(471.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 6, (int)(175.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 3, (int)( 77.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
< 1, (int)( 49.75 * FREQFACTOR), (int)(9.50 * FREQFACTOR),
< 0
< };
< #undef IF_FREQ
<
< /*
< * Australian broadcast channels
< */
< #define OFFSET 7.00
< static int australia[] = {
< 83, (int)( 45.00 * FREQFACTOR), 0,
< 28, (int)(520.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 14, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 11, (int)(214.50 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 10, (int)(201.50 * FREQFACTOR), (int)( 13.00 * FREQFACTOR),
< 7, (int)(174.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 3, (int)( 85.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 2, (int)( 56.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
< 0
< };
< #undef OFFSET
<
< static struct {
< int *ptr;
< char name[BT848_MAX_CHNLSET_NAME_LEN];
< } freqTable[] = {
< {NULL, ""},
< {nabcst, "nabcst"},
< {irccable, "cableirc"},
< {hrccable, "cablehrc"},
< {weurope, "weurope"},
< {jpnbcst, "jpnbcst"},
< {jpncable, "jpncable"},
< {xussr, "xussr"},
< {australia, "australia"},
<
< };
<
< #define TBL_CHNL freqTable[ bktr->tuner.chnlset ].ptr[ x ]
< #define TBL_BASE_FREQ freqTable[ bktr->tuner.chnlset ].ptr[ x + 1 ]
< #define TBL_OFFSET freqTable[ bktr->tuner.chnlset ].ptr[ x + 2 ]
< static int
< frequency_lookup( bktr_ptr_t bktr, int channel )
< {
< int x;
<
< /* check for "> MAX channel" */
< x = 0;
< if ( channel > TBL_CHNL )
< return( -1 );
<
< /* search the table for data */
< for ( x = 3; TBL_CHNL; x += 3 ) {
< if ( channel >= TBL_CHNL ) {
< return( TBL_BASE_FREQ +
< ((channel - TBL_CHNL) * TBL_OFFSET) );
< }
< }
<
< /* not found, must be below the MIN channel */
< return( -1 );
< }
< #undef TBL_OFFSET
< #undef TBL_BASE_FREQ
< #undef TBL_CHNL
<
<
< #define TBL_IF freqTable[ bktr->tuner.chnlset ].ptr[ 1 ]
< /*
< * set the frequency of the tuner
< */
< static int
< tv_freq( bktr_ptr_t bktr, int frequency )
< {
< const struct TUNER* tuner;
< u_char addr;
< u_char control;
< u_char band;
< int N;
<
< tuner = bktr->card.tuner;
< if ( tuner == NULL )
< return( -1 );
<
< /*
< * select the band based on frequency
< * XXX FIXME: get the cross-over points from the tuner struct
< */
< if ( frequency < (160 * FREQFACTOR) )
< N = 0;
< else if ( frequency < (454 * FREQFACTOR) )
< N = 1;
< else
< N = 2;
<
< if(frequency > RADIO_OFFSET) {
< N=3;
< frequency -= RADIO_OFFSET;
< }
<
< /* set the address of the PLL */
< addr = bktr->card.tuner_pllAddr;
< control = tuner->pllControl[ N ];
< band = tuner->bandAddrs[ N ];
< if(!(band && control)) /* Don't try to set un- */
< return(-1); /* supported modes. */
<
< if(N==3)
< band |= bktr->tuner.radio_mode;
<
< /*
< * N = 16 * { fRF(pc) + fIF(pc) }
< * where:
< * pc is picture carrier, fRF & fIF are in mHz
< *
< * frequency was passed in as mHz * 16
< */
< #if defined( TEST_TUNER_AFC )
< if ( bktr->tuner.afc )
< frequency -= 4;
< #endif
<
< if(bktr->bt848_tuner == ALPS_TSCH5 && N == 3) /* for FM frequency */
< N = frequency;
< else
< N = frequency + TBL_IF;
<
< if ( frequency > bktr->tuner.frequency ) {
< i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
< i2cWrite( bktr, addr, control, band );
< }
< else {
< i2cWrite( bktr, addr, control, band );
< i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
< }
<
< #if defined( TUNER_AFC )
< if ( bktr->tuner.afc == TRUE ) {
< if ( (N = do_afc( bktr, addr, N )) < 0 ) {
< /* AFC failed, restore requested frequency */
< N = frequency + TBL_IF;
< i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
< }
< else
< frequency = N - TBL_IF;
< }
< #endif /* TUNER_AFC */
<
< /* update frequency */
< bktr->tuner.frequency = frequency;
<
< return( 0 );
< }
<
< #if defined( TUNER_AFC )
< /*
< *
< */
< static int
< do_afc( bktr_ptr_t bktr, int addr, int frequency )
< {
< int step;
< int status;
< int origFrequency;
<
< origFrequency = frequency;
<
< /* wait for first setting to take effect */
< tsleep( BKTR_SLEEP, PZERO, "tuning", hz/8 );
<
< if ( (status = i2cRead( bktr, addr + 1 )) < 0 )
< return( -1 );
<
< #if defined( TEST_TUNER_AFC )
< printf( "\nOriginal freq: %d, status: 0x%02x\n", frequency, status );
< #endif
< for ( step = 0; step < AFC_MAX_STEP; ++step ) {
< if ( (status = i2cRead( bktr, addr + 1 )) < 0 )
< goto fubar;
< if ( !(status & 0x40) ) {
< #if defined( TEST_TUNER_AFC )
< printf( "no lock!\n" );
< #endif
< goto fubar;
< }
<
< switch( status & AFC_BITS ) {
< case AFC_FREQ_CENTERED:
< #if defined( TEST_TUNER_AFC )
< printf( "Centered, freq: %d, status: 0x%02x\n", frequency, status );
< #endif
< return( frequency );
<
< case AFC_FREQ_MINUS_125:
< case AFC_FREQ_MINUS_62:
< #if defined( TEST_TUNER_AFC )
< printf( "Low, freq: %d, status: 0x%02x\n", frequency, status );
< #endif
< --frequency;
< break;
<
< case AFC_FREQ_PLUS_62:
< case AFC_FREQ_PLUS_125:
< #if defined( TEST_TUNER_AFC )
< printf( "Hi, freq: %d, status: 0x%02x\n", frequency, status );
< #endif
< ++frequency;
< break;
< }
<
< i2cWrite( bktr, addr,
< (frequency>>8) & 0x7f, frequency & 0xff );
< DELAY( AFC_DELAY );
< }
<
< fubar:
< i2cWrite( bktr, addr,
< (origFrequency>>8) & 0x7f, origFrequency & 0xff );
<
< return( -1 );
< }
< #endif /* TUNER_AFC */
< #undef TBL_IF
<
<
< /*
< * set the channel of the tuner
< */
< static int
< tv_channel( bktr_ptr_t bktr, int channel )
< {
< int frequency;
<
< /* calculate the frequency according to tuner type */
< if ( (frequency = frequency_lookup( bktr, channel )) < 0 )
< return( -1 );
<
< /* set the new frequency */
< if ( tv_freq( bktr, frequency ) < 0 )
< return( -1 );
<
< /* OK to update records */
< return( (bktr->tuner.channel = channel) );
< }
<
< /*
< * get channelset name
< */
< static int
< tuner_getchnlset(struct bktr_chnlset *chnlset)
< {
< if (( chnlset->index < CHNLSET_MIN ) ||
< ( chnlset->index > CHNLSET_MAX ))
< return( EINVAL );
<
< memcpy(&chnlset->name, &freqTable[chnlset->index].name,
< BT848_MAX_CHNLSET_NAME_LEN);
<
< chnlset->max_channel=freqTable[chnlset->index].ptr[0];
< return( 0 );
< }
< /******************************************************************************
< * audio specific routines:
< */
<
<
< /*
< *
< */
< #define AUDIOMUX_DISCOVER_NOT
< static int
< set_audio( bktr_ptr_t bktr, int cmd )
< {
< bt848_ptr_t bt848;
< u_long temp;
< volatile u_char idx;
<
< #if defined( AUDIOMUX_DISCOVER )
< if ( cmd >= 200 )
< cmd -= 200;
< else
< #endif /* AUDIOMUX_DISCOVER */
<
< /* check for existance of audio MUXes */
< if ( !bktr->card.audiomuxs[ 4 ] )
< return( -1 );
<
< switch (cmd) {
< case AUDIO_TUNER:
< #ifdef BKTR_REVERSEMUTE
< bktr->audio_mux_select = 3;
< #else
< bktr->audio_mux_select = 0;
< #endif
<
< if (bktr->reverse_mute )
< bktr->audio_mux_select = 0;
< else
< bktr->audio_mux_select = 3;
<
< break;
< case AUDIO_EXTERN:
< bktr->audio_mux_select = 1;
< break;
< case AUDIO_INTERN:
< bktr->audio_mux_select = 2;
< break;
< case AUDIO_MUTE:
< bktr->audio_mute_state = TRUE; /* set mute */
< break;
< case AUDIO_UNMUTE:
< bktr->audio_mute_state = FALSE; /* clear mute */
< break;
< default:
< printf("bktr: audio cmd error %02x\n", cmd);
< return( -1 );
< }
<
<
< /* Most cards have a simple audio multiplexer to select the
< * audio source. The I/O_GV card has a more advanced multiplexer
< * and requires special handling.
< */
< if ( bktr->bt848_card == CARD_IO_GV ) {
< set_bctv_audio( bktr );
< return( 0 );
< }
<
< /* Proceed with the simpler audio multiplexer code for the majority
< * of Bt848 cards.
< */
<
< bt848 = bktr->base;
<
< /*
< * Leave the upper bits of the GPIO port alone in case they control
< * something like the dbx or teletext chips. This doesn't guarantee
< * success, but follows the rule of least astonishment.
< */
<
< if ( bktr->audio_mute_state == TRUE ) {
< #ifdef BKTR_REVERSEMUTE
< idx = 0;
< #else
< idx = 3;
< #endif
<
< if (bktr->reverse_mute )
< idx = 3;
< else
< idx = 0;
<
< }
< else
< idx = bktr->audio_mux_select;
<
< temp = bt848->gpio_data & ~bktr->card.gpio_mux_bits;
< bt848->gpio_data =
< #if defined( AUDIOMUX_DISCOVER )
< bt848->gpio_data = temp | (cmd & 0xff);
< printf("cmd: %d audio mux %x temp %x \n", cmd,bktr->card.audiomuxs[ idx ], temp );
< #else
< temp | bktr->card.audiomuxs[ idx ];
< #endif /* AUDIOMUX_DISCOVER */
<
< return( 0 );
< }
<
<
< /*
< *
< */
< static void
< temp_mute( bktr_ptr_t bktr, int flag )
< {
< static int muteState = FALSE;
<
< if ( flag == TRUE ) {
< muteState = bktr->audio_mute_state;
< set_audio( bktr, AUDIO_MUTE ); /* prevent 'click' */
< }
< else {
< tsleep( BKTR_SLEEP, PZERO, "tuning", hz/8 );
< if ( muteState == FALSE )
< set_audio( bktr, AUDIO_UNMUTE );
< }
< }
<
<
< /*
< * initialise the dbx chip
< * taken from the Linux bttv driver TDA9850 initialisation code
< */
< static void
< init_BTSC( bktr_ptr_t bktr )
< {
< i2cWrite(bktr, TDA9850_WADDR, CON1ADDR, 0x08); /* noise threshold st */
< i2cWrite(bktr, TDA9850_WADDR, CON2ADDR, 0x08); /* noise threshold sap */
< i2cWrite(bktr, TDA9850_WADDR, CON3ADDR, 0x40); /* stereo mode */
< i2cWrite(bktr, TDA9850_WADDR, CON4ADDR, 0x07); /* 0 dB input gain? */
< i2cWrite(bktr, TDA9850_WADDR, ALI1ADDR, 0x10); /* wideband alignment? */
< i2cWrite(bktr, TDA9850_WADDR, ALI2ADDR, 0x10); /* spectral alignment? */
< i2cWrite(bktr, TDA9850_WADDR, ALI3ADDR, 0x03);
< }
<
< /*
< * setup the dbx chip
< * XXX FIXME: alot of work to be done here, this merely unmutes it.
< */
< static int
< set_BTSC( bktr_ptr_t bktr, int control )
< {
< return( i2cWrite( bktr, TDA9850_WADDR, CON3ADDR, control ) );
< }
<
< /*
< * CARD_GV_BCTV specific functions.
< */
<
< #define BCTV_AUDIO_MAIN 0x10 /* main audio program */
< #define BCTV_AUDIO_SUB 0x20 /* sub audio program */
< #define BCTV_AUDIO_BOTH 0x30 /* main(L) + sub(R) program */
<
< #define BCTV_GPIO_REG0 1
< #define BCTV_GPIO_REG1 3
<
< #define BCTV_GR0_AUDIO_MODE 3
< #define BCTV_GR0_AUDIO_MAIN 0 /* main program */
< #define BCTV_GR0_AUDIO_SUB 3 /* sub program */
< #define BCTV_GR0_AUDIO_BOTH 1 /* main(L) + sub(R) */
< #define BCTV_GR0_AUDIO_MUTE 4 /* audio mute */
< #define BCTV_GR0_AUDIO_MONO 8 /* force mono */
<
< static void
< set_bctv_audio( bktr_ptr_t bktr )
< {
< int data;
<
< switch (bktr->audio_mux_select) {
< case 1: /* external */
< case 2: /* internal */
< bctv_gpio_write(bktr, BCTV_GPIO_REG1, 0);
< break;
< default: /* tuner */
< bctv_gpio_write(bktr, BCTV_GPIO_REG1, 1);
< break;
< }
< /* switch (bktr->audio_sap_select) { */
< switch (BCTV_AUDIO_BOTH) {
< case BCTV_AUDIO_SUB:
< data = BCTV_GR0_AUDIO_SUB;
< break;
< case BCTV_AUDIO_BOTH:
< data = BCTV_GR0_AUDIO_BOTH;
< break;
< case BCTV_AUDIO_MAIN:
< default:
< data = BCTV_GR0_AUDIO_MAIN;
< break;
< }
< if (bktr->audio_mute_state == TRUE)
< data |= BCTV_GR0_AUDIO_MUTE;
<
< bctv_gpio_write(bktr, BCTV_GPIO_REG0, data);
<
< return;
< }
<
< /* gpio_data bit assignment */
< #define BCTV_GPIO_ADDR_MASK 0x000300
< #define BCTV_GPIO_WE 0x000400
< #define BCTV_GPIO_OE 0x000800
< #define BCTV_GPIO_VAL_MASK 0x00f000
<
< #define BCTV_GPIO_PORT_MASK 3
< #define BCTV_GPIO_ADDR_SHIFT 8
< #define BCTV_GPIO_VAL_SHIFT 12
<
< /* gpio_out_en value for read/write */
< #define BCTV_GPIO_OUT_RMASK 0x000f00
< #define BCTV_GPIO_OUT_WMASK 0x00ff00
<
< #define BCTV_BITS 100
<
< static void
< bctv_gpio_write( bktr_ptr_t bktr, int port, int val )
< {
< bt848_ptr_t bt848 = bktr->base;
< u_long data, outbits;
<
< port &= BCTV_GPIO_PORT_MASK;
< switch (port) {
< case 1:
< case 3:
< data = ((val << BCTV_GPIO_VAL_SHIFT) & BCTV_GPIO_VAL_MASK) |
< ((port << BCTV_GPIO_ADDR_SHIFT) & BCTV_GPIO_ADDR_MASK) |
< BCTV_GPIO_WE | BCTV_GPIO_OE;
< outbits = BCTV_GPIO_OUT_WMASK;
< break;
< default:
< return;
< }
< bt848->gpio_out_en = 0;
< bt848->gpio_data = data;
< bt848->gpio_out_en = outbits;
< DELAY(BCTV_BITS);
< bt848->gpio_data = data & ~BCTV_GPIO_WE;
< DELAY(BCTV_BITS);
< bt848->gpio_data = data;
< DELAY(BCTV_BITS);
< bt848->gpio_data = ~0;
< bt848->gpio_out_en = 0;
< }
<
< /* Not yet used
< static int
< bctv_gpio_read( bktr_ptr_t bktr, int port )
< {
< bt848_ptr_t bt848 = bktr->base;
< u_long data, outbits, ret;
<
< port &= BCTV_GPIO_PORT_MASK;
< switch (port) {
< case 1:
< case 3:
< data = ((port << BCTV_GPIO_ADDR_SHIFT) & BCTV_GPIO_ADDR_MASK) |
< BCTV_GPIO_WE | BCTV_GPIO_OE;
< outbits = BCTV_GPIO_OUT_RMASK;
< break;
< default:
< return( -1 );
< }
< bt848->gpio_out_en = 0;
< bt848->gpio_data = data;
< bt848->gpio_out_en = outbits;
< DELAY(BCTV_BITS);
< bt848->gpio_data = data & ~BCTV_GPIO_OE;
< DELAY(BCTV_BITS);
< ret = bt848->gpio_data;
< DELAY(BCTV_BITS);
< bt848->gpio_data = data;
< DELAY(BCTV_BITS);
< bt848->gpio_data = ~0;
< bt848->gpio_out_en = 0;
< return( (ret & BCTV_GPIO_VAL_MASK) >> BCTV_GPIO_VAL_SHIFT );
< }
< */
<
< /*
< * setup the MSP34xx Stereo Audio Chip
< * This uses the Auto Configuration Option on MSP3410D and MSP3415D chips
< * and DBX mode selection for MSP3430G chips.
< * For MSP3400C support, the full programming sequence is required and is
< * not yet supported.
< */
<
< /* Read the MSP version string */
< static void msp_read_id( bktr_ptr_t bktr, int unit ){
< int rev1=0, rev2=0;
< rev1 = msp_read(bktr, 0x12, 0x001e);
< rev2 = msp_read(bktr, 0x12, 0x001f);
<
< sprintf(bktr->msp_version_string, "34%02d%c-%c%d",
< (rev2>>8)&0xff, (rev1&0xff)+'@', ((rev1>>8)&0xff)+'@', rev2&0x1f);
<
< printf("bktr%d: Detected a MSP%s\n",unit,bktr->msp_version_string);
< }
<
<
< /* Configure the MSP chip to Auto-detect the audio format */
< static void msp_autodetect( bktr_ptr_t bktr ) {
<
< if (strncmp("3430G", bktr->msp_version_string, 5) == 0){
<
< /* For MSP3430G - countries with mono and DBX stereo */
< msp_write(bktr, 0x10, 0x0030,0x2003);/* Enable Auto format detection */
< msp_write(bktr, 0x10, 0x0020,0x0020);/* Standard Select Reg. = BTSC-Stereo*/
< msp_write(bktr, 0x12, 0x000E,0x2403);/* darned if I know */
< msp_write(bktr, 0x12, 0x0008,0x0320);/* Source select = (St or A) */
< /* & Ch. Matrix = St */
< msp_write(bktr, 0x12, 0x0000,0x7300);/* Set volume to 0db gain */
<
< } else {
<
< /* For MSP3410 / 3415 - countries with mono, FM stereo and NICAM */
< msp_write(bktr, 0x12, 0x0000,0x7300);/* Set volume to 0db gain */
< msp_write(bktr, 0x10, 0x0020,0x0001);/* Enable Auto format detection */
< msp_write(bktr, 0x10, 0x0021,0x0001);/* Auto selection of NICAM/MONO mode */
< }
<
< /* uncomment the following line to enable the MSP34xx 1Khz Tone Generator */
< /* turn your speaker volume down low before trying this */
< /* msp_write(bktr, 0x12, 0x0014, 0x7f40); */
< }
<
<
<
< /*
< *
< * Operating System Dependant Parts
< * This section contains OS Dependant code like
< * probe and attach and the cdev open/close/read/mmap interface
< *
< */
<
< /****************************/
< /* *** FreeBSD 4.x code *** */
< /****************************/
< #if (__FreeBSD_version >= 400000)
<
< static int bktr_probe( device_t dev );
< static int bktr_attach( device_t dev );
< static int bktr_detach( device_t dev );
< static int bktr_shutdown( device_t dev );
< static void bktr_intr(void *arg) { common_bktr_intr(arg); }
<
< static device_method_t bktr_methods[] = {
< /* Device interface */
< DEVMETHOD(device_probe, bktr_probe),
< DEVMETHOD(device_attach, bktr_attach),
< DEVMETHOD(device_detach, bktr_detach),
< DEVMETHOD(device_shutdown, bktr_shutdown),
<
< { 0, 0 }
< };
<
< static driver_t bktr_driver = {
< "bktr",
< bktr_methods,
< sizeof(struct bktr_softc),
< };
<
< static devclass_t bktr_devclass;
<
< static d_open_t bktr_open;
< static d_close_t bktr_close;
< static d_read_t bktr_read;
< static d_write_t bktr_write;
< static d_ioctl_t bktr_ioctl;
< static d_mmap_t bktr_mmap;
< static d_poll_t bktr_poll;
<
< #define CDEV_MAJOR 92
< static struct cdevsw bktr_cdevsw = {
< /* open */ bktr_open,
< /* close */ bktr_close,
< /* read */ bktr_read,
< /* write */ bktr_write,
< /* ioctl */ bktr_ioctl,
< /* poll */ bktr_poll,
< /* mmap */ bktr_mmap,
< /* strategy */ nostrategy,
< /* name */ "bktr",
< /* maj */ CDEV_MAJOR,
< /* dump */ nodump,
< /* psize */ nopsize,
< /* flags */ 0,
< /* bmaj */ -1
< };
<
< DEV_DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, bktr_cdevsw, 0, 0);
<
<
< /*
< * the boot time probe routine.
< */
< static int
< bktr_probe( device_t dev )
< {
< unsigned int type = pci_get_devid(dev);
< unsigned int rev = pci_get_revid(dev);
< static int once;
<
< if (!once++)
< cdevsw_add(&bktr_cdevsw);
<
< switch (type) {
< case BROOKTREE_848_PCI_ID:
< if (rev == 0x12) device_set_desc(dev, "BrookTree 848A");
< else device_set_desc(dev, "BrookTree 848");
< return 0;
< case BROOKTREE_849_PCI_ID:
< device_set_desc(dev, "BrookTree 849A");
< return 0;
< case BROOKTREE_878_PCI_ID:
< device_set_desc(dev, "BrookTree 878");
< return 0;
< case BROOKTREE_879_PCI_ID:
< device_set_desc(dev, "BrookTree 879");
< return 0;
< };
<
< return ENXIO;
< }
<
<
< /*
< * the attach routine.
< */
< static int
< bktr_attach( device_t dev )
< {
< bt848_ptr_t bt848;
< u_long latency;
< u_long fun;
< u_long val;
< unsigned int rev;
< unsigned int unit;
< int error = 0;
< int rid;
< #ifdef BROOKTREE_IRQ
< u_long old_irq, new_irq;
< #endif
<
< struct bktr_softc *bktr = device_get_softc(dev);
<
< unit = device_get_unit(dev);
<
< /*
< * Enable bus mastering and Memory Mapped device
< */
< val = pci_read_config(dev, PCIR_COMMAND, 4);
< val |= (PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
< pci_write_config(dev, PCIR_COMMAND, val, 4);
<
< /*
< * Map control/status registers.
< */
< rid = PCI_MAP_REG_START;
< bktr->res_mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
< 0, ~0, 1, RF_ACTIVE);
<
< if (!bktr->res_mem) {
< device_printf(dev, "could not map memory\n");
< error = ENXIO;
< goto fail;
< }
< bktr->base = rman_get_virtual(bktr->res_mem); /* XXX use bus_space */
<
< /*
< * Disable the brooktree device
< */
< bt848 = bktr->base;
< bt848->int_mask = ALL_INTS_DISABLED;
< bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
<
<
< #ifdef BROOKTREE_IRQ /* from the configuration file */
< old_irq = pci_conf_read(tag, PCI_INTERRUPT_REG);
< pci_conf_write(tag, PCI_INTERRUPT_REG, BROOKTREE_IRQ);
< new_irq = pci_conf_read(tag, PCI_INTERRUPT_REG);
< printf("bktr%d: attach: irq changed from %d to %d\n",
< unit, (old_irq & 0xff), (new_irq & 0xff));
< #endif
<
< /*
< * Allocate our interrupt.
< */
< rid = 0;
< bktr->res_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
< RF_SHAREABLE | RF_ACTIVE);
< if (bktr->res_irq == NULL) {
< device_printf(dev, "could not map interrupt\n");
< error = ENXIO;
< goto fail;
< }
<
< error = bus_setup_intr(dev, bktr->res_irq, INTR_TYPE_NET,
< bktr_intr, bktr, &bktr->res_ih);
< if (error) {
< device_printf(dev, "could not setup irq\n");
< goto fail;
<
< }
<
<
< /* Update the Device Control Register */
< /* on Bt878 and Bt879 cards */
< fun = pci_read_config( dev, 0x40, 2);
< fun = fun | 1; /* Enable writes to the sub-system vendor ID */
<
< #if defined( BKTR_430_FX_MODE )
< if (bootverbose) printf("Using 430 FX chipset compatibilty mode\n");
< fun = fun | 2; /* Enable Intel 430 FX compatibility mode */
< #endif
<
< #if defined( BKTR_SIS_VIA_MODE )
< if (bootverbose) printf("Using SiS/VIA chipset compatibilty mode\n");
< fun = fun | 4; /* Enable SiS/VIA compatibility mode (usefull for
< OPTi chipset motherboards too */
< #endif
< pci_write_config(dev, 0x40, fun, 2);
<
<
< /* XXX call bt848_i2c dependent attach() routine */
< #if (NSMBUS > 0)
< if (bt848_i2c_attach(unit, bktr->base, &bktr->i2c_sc))
< printf("bktr%d: i2c_attach: can't attach\n", unit);
< #endif
<
<
< /*
< * PCI latency timer. 32 is a good value for 4 bus mastering slots, if
< * you have more than four, then 16 would probably be a better value.
< */
< #ifndef BROOKTREE_DEF_LATENCY_VALUE
< #define BROOKTREE_DEF_LATENCY_VALUE 10
< #endif
< latency = pci_read_config(dev, PCI_LATENCY_TIMER, 4);
< latency = (latency >> 8) & 0xff;
< if ( bootverbose ) {
< if (latency)
< printf("brooktree%d: PCI bus latency is", unit);
< else
< printf("brooktree%d: PCI bus latency was 0 changing to",
< unit);
< }
< if ( !latency ) {
< latency = BROOKTREE_DEF_LATENCY_VALUE;
< pci_write_config(dev, PCI_LATENCY_TIMER, latency<<8, 4);
< }
< if ( bootverbose ) {
< printf(" %d.\n", (int) latency);
< }
<
< /* read the pci device id and revision id */
< fun = pci_get_devid(dev);
< rev = pci_get_revid(dev);
<
< /* call the common attach code */
< common_bktr_attach( bktr, unit, fun, rev );
<
< make_dev(&bktr_cdevsw, unit, 0, 0, 0444, "bktr%d", unit);
< make_dev(&bktr_cdevsw, unit+16, 0, 0, 0444, "tuner%d", unit);
< make_dev(&bktr_cdevsw, unit+32, 0, 0, 0444, "vbi%d", unit);
<
< return 0;
<
< fail:
< return error;
<
< }
<
< /*
< * the detach routine.
< */
< static int
< bktr_detach( device_t dev )
< {
< struct bktr_softc *bktr = device_get_softc(dev);
< bt848_ptr_t bt848;
<
< /* Disable the brooktree device */
< bt848 = bktr->base;
< bt848->int_mask = ALL_INTS_DISABLED;
< bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
<
< /* FIXME - Free memory for RISC programs, grab buffer, vbi buffers */
<
< /*
< * Deallocate resources.
< */
< bus_teardown_intr(dev, bktr->res_irq, bktr->res_ih);
< bus_release_resource(dev, SYS_RES_IRQ, 0, bktr->res_irq);
< bus_release_resource(dev, SYS_RES_MEMORY, PCI_MAP_REG_START, bktr->res_mem);
<
< return 0;
< }
<
< /*
< * the shutdown routine.
< */
< static int
< bktr_shutdown( device_t dev )
< {
< struct bktr_softc *bktr = device_get_softc(dev);
< bt848_ptr_t bt848;
<
< /* Disable the brooktree device */
< bt848 = bktr->base;
< bt848->int_mask = ALL_INTS_DISABLED;
< bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
<
< return 0;
< }
<
<
< /*
< * Special Memory Allocation
< */
< static vm_offset_t
< get_bktr_mem( int unit, unsigned size )
< {
< vm_offset_t addr = 0;
<
< addr = vm_page_alloc_contig(size, 0, 0xffffffff, 1<<24);
< if (addr == 0)
< addr = vm_page_alloc_contig(size, 0, 0xffffffff, PAGE_SIZE);
< if (addr == 0) {
< printf("bktr%d: Unable to allocate %d bytes of memory.\n",
< unit, size);
< }
<
< return( addr );
< }
<
<
< /*---------------------------------------------------------
< **
< ** BrookTree 848 character device driver routines
< **
< **---------------------------------------------------------
< */
<
< #define VIDEO_DEV 0x00
< #define TUNER_DEV 0x01
< #define VBI_DEV 0x02
<
< #define UNIT(x) ((x) & 0x0f)
< #define FUNCTION(x) (x >> 4)
<
< /*
< *
< */
< int
< bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
< {
< bktr_ptr_t bktr;
< int unit;
< int result;
<
< unit = UNIT( minor(dev) );
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */
< return( ENXIO );
<
< /* Record that the device is now busy */
< device_busy(devclass_get_device(bktr_devclass, unit));
<
<
< if (bt848_card != -1) {
< if ((bt848_card >> 8 == unit ) &&
< ( (bt848_card & 0xff) < Bt848_MAX_CARD )) {
< if ( bktr->bt848_card != (bt848_card & 0xff) ) {
< bktr->bt848_card = (bt848_card & 0xff);
< probeCard(bktr, FALSE, unit);
< }
< }
< }
<
< if (bt848_tuner != -1) {
< if ((bt848_tuner >> 8 == unit ) &&
< ( (bt848_tuner & 0xff) < Bt848_MAX_TUNER )) {
< if ( bktr->bt848_tuner != (bt848_tuner & 0xff) ) {
< bktr->bt848_tuner = (bt848_tuner & 0xff);
< probeCard(bktr, FALSE, unit);
< }
< }
< }
<
< if (bt848_reverse_mute != -1) {
< if (((bt848_reverse_mute >> 8) == unit ) &&
< ((bt848_reverse_mute & 0xff) < Bt848_MAX_TUNER) ) {
< bktr->reverse_mute = bt848_reverse_mute & 0xff;
< bt848_reverse_mute = -1;
< }
< }
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< result = video_open( bktr );
< break;
< case TUNER_DEV:
< result = tuner_open( bktr );
< break;
< case VBI_DEV:
< result = vbi_open( bktr );
< break;
< default:
< result = ENXIO;
< break;
< }
<
< /* If there was an error opening the device, undo the busy status */
< if (result != 0)
< device_unbusy(devclass_get_device(bktr_devclass, unit));
< return( result );
< }
<
<
< /*
< *
< */
< int
< bktr_close( dev_t dev, int flags, int fmt, struct proc *p )
< {
< bktr_ptr_t bktr;
< int unit;
< int result;
<
< unit = UNIT( minor(dev) );
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< result = video_close( bktr );
< break;
< case TUNER_DEV:
< result = tuner_close( bktr );
< break;
< case VBI_DEV:
< result = vbi_close( bktr );
< break;
< default:
< return (ENXIO);
< break;
< }
<
< device_unbusy(devclass_get_device(bktr_devclass, unit));
< return( result );
< }
<
<
< /*
< *
< */
< int
< bktr_read( dev_t dev, struct uio *uio, int ioflag )
< {
< bktr_ptr_t bktr;
< int unit;
<
< unit = UNIT(minor(dev));
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_read( bktr, unit, dev, uio ) );
< case VBI_DEV:
< return( vbi_read( bktr, uio, ioflag ) );
< }
< return( ENXIO );
< }
<
<
< /*
< *
< */
< int
< bktr_write( dev_t dev, struct uio *uio, int ioflag )
< {
< return( EINVAL ); /* XXX or ENXIO ? */
< }
<
<
< /*
< *
< */
< int
< bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct proc* pr )
< {
< bktr_ptr_t bktr;
< int unit;
<
< unit = UNIT(minor(dev));
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */
< return( ENOMEM );
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_ioctl( bktr, unit, cmd, arg, pr ) );
< case TUNER_DEV:
< return( tuner_ioctl( bktr, unit, cmd, arg, pr ) );
< }
<
< return( ENXIO );
< }
<
<
< /*
< *
< */
< int
< bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
< {
< int unit;
< bktr_ptr_t bktr;
<
< unit = UNIT(minor(dev));
<
< if (FUNCTION(minor(dev)) > 0) /* only allow mmap on /dev/bktr[n] */
< return( -1 );
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< if (nprot & PROT_EXEC)
< return( -1 );
<
< if (offset < 0)
< return( -1 );
<
< if (offset >= bktr->alloc_pages * PAGE_SIZE)
< return( -1 );
<
< return( i386_btop(vtophys(bktr->bigbuf) + offset) );
< }
<
< int bktr_poll( dev_t dev, int events, struct proc *p)
< {
< int unit;
< bktr_ptr_t bktr;
< int revents = 0;
<
< unit = UNIT(minor(dev));
<
< /* Get the device data */
< bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
< if (bktr == NULL) {
< /* the device is no longer valid/functioning */
< return (ENXIO);
< }
<
< disable_intr();
<
< if (events & (POLLIN | POLLRDNORM)) {
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VBI_DEV:
< if(bktr->vbisize == 0)
< selrecord(p, &bktr->vbi_select);
< else
< revents |= events & (POLLIN | POLLRDNORM);
< break;
< }
< }
<
< enable_intr();
<
< return (revents);
< }
<
< #endif /* FreeBSD 4.x specific kernel interface routines */
<
<
< /**********************************/
< /* *** FreeBSD 2.2.x and 3.x *** */
< /**********************************/
<
< #if ((__FreeBSD__ == 2) || (__FreeBSD__ == 3))
< #endif /* FreeBSD 2.2.x and 3.x specific kernel interface routines */
<
<
< /*****************/
< /* *** BSDI *** */
< /*****************/
<
< #if defined(__bsdi__)
< #endif /* __bsdi__ BSDI specific kernel interface routines */
<
<
< /*****************************/
< /* *** OpenBSD / NetBSD *** */
< /*****************************/
< #if defined(__NetBSD__) || defined(__OpenBSD__)
< #endif /* __NetBSD__ || __OpenBSD__ */
<
<
<
7507,7517d4182
<
< /* Local Variables: */
< /* mode: C */
< /* c-indent-level: 8 */
< /* c-brace-offset: -8 */
< /* c-argdecl-indent: 8 */
< /* c-label-offset: -8 */
< /* c-continued-statement-offset: 8 */
< /* c-tab-always-indent: nil */
< /* tab-width: 8 */
< /* End: */