diff --git a/UPDATING b/UPDATING index 63e26cf81b44..def0d85b5250 100644 --- a/UPDATING +++ b/UPDATING @@ -26,6 +26,9 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW: disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20200301: + Removed brooktree driver (bktr.4) from the tree. + 20200229: The WITH_GPL_DTC option has been removed. The BSD-licenced device tree compiler in usr.bin/dtc is used on all architectures which use dtc, and diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 91ca0346b050..71ae02a695f2 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -79,7 +79,6 @@ MAN= aac.4 \ bhnd_pmu.4 \ bhndb.4 \ bhndb_pci.4 \ - bktr.4 \ blackhole.4 \ bnxt.4 \ bpf.4 \ @@ -601,7 +600,6 @@ MLINKS+=axe.4 if_axe.4 MLINKS+=bce.4 if_bce.4 MLINKS+=bfe.4 if_bfe.4 MLINKS+=bge.4 if_bge.4 -MLINKS+=bktr.4 brooktree.4 MLINKS+=bnxt.4 if_bnxt.4 MLINKS+=bridge.4 if_bridge.4 MLINKS+=bwi.4 if_bwi.4 diff --git a/share/man/man4/bktr.4 b/share/man/man4/bktr.4 deleted file mode 100644 index cc4b343cb181..000000000000 --- a/share/man/man4/bktr.4 +++ /dev/null @@ -1,264 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd February 25, 2020 -.Dt BKTR 4 -.Os -.Sh NAME -.Nm bktr -.Nd Brooktree Bt848/849/878/879 and Pinnacle PCTV video capture driver -.Sh SYNOPSIS -.Cd device bktr -.Pp -.Cd device iicbus -.Cd device iicbb -.Cd device smbus -.Sh DEPRECATION NOTICE -The -.Nm -driver is not present in -.Fx 13.0 -and later. -.Sh DESCRIPTION -The -.Nm bktr -driver provides support for PCI -.Em video -capture and -.Em VBI -capture on low cost, high performance boards. -The driver is based on the Matrox Meteor driver and uses the same API. -The -.Nm -driver should support most video cards based on the -.Em "Brooktree Bt848/849/878/879 Video Capture Chip" . -Also supported are most -.Em "Pinnacle PCTV" -video cards. -Furthermore, the driver supports -.Em FM Radio -if the tuner supports it. -.Pp -The driver currently supports the following features: -.Bd -unfilled -offset indent -PCI to PCI dma transfer -clipping -yuv -rgb16 -rgb24 -rgb32 -.Ed -.Pp -On the supported cards, tuners and other components are interconnected -with an I2C bus. -The Brooktree848 chips act as a master device on the bus to control them. -Therefore, -.Xr iicbus 4 , -.Xr iicbb 4 -and -.Xr smbus 4 -controller declarations are mandatory to activate -.Nm -support. -.Pp -The following kernel parameters may be used to further configure the driver: -.Pp -.Em options "BROOKTREE_ALLOC_PAGES=xxx" -specifies the number of contiguous pages to allocate when successfully -probed. -The default number of pages allocated by the kernel is 216. -This means that there are (216*4096) bytes available for use. -.Bd -unfilled -.Cd options BROOKTREE_SYSTEM_DEFAULT=BROOKTREE_PAL -.Cd options BROOKTREE_SYSTEM_DEFAULT=BROOKTREE_NTSC -.Ed -One of these options can be used to set the default video format for the driver. -This fixed random hangs and lockups with the VideoLogic Captivator PCI card. -.Pp -The following sysctls may be used to further configure the driver: -.Pp -.Em sysctl hw.bt848.card=nnnn -This can be used to override the card make which was detected at boot time. -.Ql nnnn -is set to an integer from 1 to 23 taken from the following table: -.Pp -.Bl -tag -compact -width 30n -.It MIRO -1 -.It HAUPPAUGE -2 -.It STB -3 -.It INTEL -4 -.It IMS_TURBO -5 -.It AVER_MEDIA -6 -.It OSPREY -7 -.It NEC_PK -8 -.It IO_GV -9 -.It FLYVIDEO -10 -.It ZOLTRIX -11 -.It KISS -12 -.It VIDEO_HIGHWAY_XTREME -13 -.It ASKEY_DYNALINK_MAGIC_TVIEW -14 -.It LEADTEK -15 -.It TERRATVPLUS -16 -.It IO_BCTV3 -17 -.It AOPEN_VA1000 -18 -.It PINNACLE_PCTV_RAVE -19 -.It PIXELVIEW_PLAYTV_PAK -20 -.It TERRATVALUE -21 -.It PIXELVIEW_PLAYTV_PRO_REV_4C -22 -.It Bt848_MAX -23 -.El -.Pp -.Em sysctl hw.bt848.tuner=nnnn -This can be used to override the tuner make which was detected at boot time. -.Ql nnnn -is set to an integer from 0 to 16 taken from the following table: -.Pp -.Bl -tag -compact -width 22n -.It NO_TUNER -0 -.It TEMIC_NTSC -1 -.It TEMIC_PAL -2 -.It TEMIC_SECAM -3 -.It PHILIPS_NTSC -4 -.It PHILIPS_PAL -5 -.It PHILIPS_SECAM -6 -.It TEMIC_PALI -7 -.It PHILIPS_PALI -8 -.It PHILIPS_FR1236_NTSC -9 /* These have FM Radio support */ -.It PHILIPS_FR1216_PAL -10 /* These have FM Radio support */ -.It PHILIPS_FR1236_SECAM -11 /* These have FM Radio support */ -.It ALPS_TSCH5 -12 -.It ALPS_TSBH1 -13 -.It MT2032 -14 -.It LG_TPI8PSB12P_PAL -15 -.It Bt848_MAX -16 -.El -.Sh HARDWARE -The -.Nm -driver supports video capture cards based on the -Brooktree Bt848/849/878/879 chips, as well as -Pinnacle PCTV cards, including: -.Pp -.Bl -bullet -compact -.It -AOpen VA1000 -.It -AVerMedia AVerTV Studio -.It -AVerMedia TF/FM-98 -.It -ATI TV Wonder VE -.It -Hauppauge WinCast/TV -.It -Hauppauge WinTV-Go-FM -.It -Hauppauge WinTV-pci -.It -Hauppauge WinTV-radio -.It -Intel Smart Video Recorder III -.It -KWORLD PCI TV Tuner -.It -Miro PC TV -.It -Pinnacle PCTV Pro -.It -Pinnacle PCTV Rave -.It -PixelView PlayTV PAK -.It -PixelView PlayTV Pro (rev 4C, 9D) -.It -SIGMA TV II -.It -STB TV PCI Television Tuner -.It -Super TV Tuner -.It -TerraTec TValue -.It -V-Stream XPERT TV-PVR 878 -.It -Video Highway XTreme -.It -VideoLogic Captivator PCI -.El -.Sh FILES -.Bl -tag -width /usr/share/examples/meteor -compact -.It Pa /usr/ports/multimedia/fxtv -A TV and Camera display program utilizing the bktr driver - requires that -.Em The X Window System -and -.Em The Ports Collection -also be installed. -.It Pa /usr/ports/audio/xmradio -An FM Radio Tuner for cards which have an FM Radio tuner fitted - requires that -.Em The X Window System -and -.Em The Ports Collection -also be installed. -It also requires -.Em Motif -or the -.Em lesstif -port. -.El -.Sh SEE ALSO -.Xr meteor 4 -.Sh HISTORY -The -.Nm -driver first appeared in -.Fx 2.2 . -.Sh AUTHORS -.An -nosplit -This driver is based on the work of -.An Jim Lowe Aq Mt james@miller.cs.uwm.edu , -.An Mark Tinguely Aq Mt tinguely@plains.nodak.edu , -.An Amancio Hasty Aq Mt hasty@star-gate.com , -.An Roger Hardiman Aq Mt roger@FreeBSD.org -and a bunch of other people. -Support for Pinnacle PCTV Rave cards was added by -.An Branko Lankester Aq Mt branko@euro.net . diff --git a/sys/conf/files b/sys/conf/files index b99b5838891f..6fbb76e7a056 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1335,13 +1335,6 @@ dev/bhnd/siba/siba_bhndb.c optional siba bhnd bhndb dev/bhnd/siba/siba_erom.c optional siba bhnd dev/bhnd/siba/siba_subr.c optional siba bhnd # -dev/bktr/bktr_audio.c optional bktr pci -dev/bktr/bktr_card.c optional bktr pci -dev/bktr/bktr_core.c optional bktr pci -dev/bktr/bktr_i2c.c optional bktr pci smbus -dev/bktr/bktr_os.c optional bktr pci -dev/bktr/bktr_tuner.c optional bktr pci -dev/bktr/msp34xx.c optional bktr pci dev/bnxt/bnxt_hwrm.c optional bnxt iflib pci dev/bnxt/bnxt_sysctl.c optional bnxt iflib pci dev/bnxt/bnxt_txrx.c optional bnxt iflib pci diff --git a/sys/dev/bktr/CHANGELOG.TXT b/sys/dev/bktr/CHANGELOG.TXT deleted file mode 100644 index bead697f04d0..000000000000 --- a/sys/dev/bktr/CHANGELOG.TXT +++ /dev/null @@ -1,519 +0,0 @@ -/* $FreeBSD$ */ - -/* - * 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. - * - * CHANGELOG : The Change History: - * 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 - -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 . 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 - -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 - . - -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 - Added [SR]RGBMASKs ioctl for byte swapping. - -1.16 4/20/97 Randall Hopper - 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 submitted - a patch to fix compilation of the BSDI's PCI - interface. - Hideyuki Suzuki - 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 - 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 - Fixes for packed 24bpp - FIFO alignment -1.23 11/17/97 Amancio - Added yuv support mpeg encoding -1.24 12/27/97 Jonathan Hanna - Patch to support Philips FR1236MK2 tuner -1.25 02/02/98 Takeshi Ohashi - submitted - code to support bktr_read . - Flemming Jacobsen - submitted code to support radio available with in - some bt848 based cards;additionally, wrote code to - correctly recognized his bt848 card. - Roger Hardiman 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 . - Added B849 PCI ID submitted by: - Tomi Vainio -1.28 Frank Nobis added tuner support - for the German Phillips PAL tuner and - additional channels for german cable tv. -1.29 Roger Hardiman - 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 's opt_bktr.h - -1.31 Randall Hopper - 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 - 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 lose 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 - -1.39 08/05/98 Roger Hardiman - Updated Hauppauge detection code for Tuner ID 0x0a - for newer NTSC WinCastTV 404 with Bt878 chipset. - Tidied up PAL default in video_open() - - Soren bumped version from 1.39 to 1.49 to sync - with FreeBSD CVS numbers. - -1.49 10 August 1998 Roger Hardiman - 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 - 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 . - In kernel configuration file add - options OVERRIDE_CARD=2 - options OVERRIDE_TUNER=11 - options BKTR_USE_PLL - -1.51 31 August 1998 Roger Hardiman - 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 - Submitted patch by Vsevolod Lobko - to correct SECAM B-Delay and add XUSSR channel set. - -1.53 9 Sep 1998 Roger Hardiman - Changed METEORSINPUT for Hauppauge cards with bt878. - Submitted by Fred Templin - Also fixed video_open defines and 878 support. - -1.54 18 Sep 1998 Roger Hardiman - Changed tuner code to autodetect tuner i2c address. - Addresses were incorrectly hardcoded. - -1.55 21 Sep 1998 Roger Hardiman - 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 - Added detection of Hauppauge IR remote control. - and MSP34xx Audio chip. Fixed i2c read error. - Hauppauge supplied details of new Tuner Types. - Danny Braniss submitted Bt878 - AVerMedia detection with PCI subsystem vendor id. - -1.57 26 Jan 1999 Roger Hardiman - Support for MSP3410D / MSP3415D Stereo/Mono audio - using the audio format Auto Detection Mode. - Nicolas Souchu 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 - For true SVIDEO, use METEOR_INPUT_DEV_SVIDEO - -1.58 8 Feb 1999 Roger Hardiman - Added check to bktr_mmap from OpenBSD driver. - Improved MSP34xx reset for bt848 Hauppauge boards. - Added detection for Bt848a. - Vsevolod Lobko 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 - -1.60 23 Feb 1999 Roger Hardiman - Corrected Mute on Hauppauge Radio cards. - Autodetect MMAC Osprey by looking for "MMAC" in the EEPROM. - Added for Jan Schmidt - Added ALPS Tuner Type from Hiroki Mori - -1.61 29 Apr 1999 Roger Hardiman - Fix row=0/columns=0 bug. From Randal Hopper - 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 useful if you run another operating system - first to initialise the audio chip, then do a soft reboot. - Added for Yuri Gindin - -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 - -1.63 29 Apr 1999 Roger Hardiman - Added initial code for VBI capture based on work by - Hiroki Mori and reworked by myself. - This allows software decoding of teletext, intercast and - subtitles via /dev/vbi. - -1.64 7 May 1999 Roger Hardiman - Support LifeView FlyVideo 98 cards. Use EEPROM for card - autodetection. Use bttv's audio mux values. - Thanks to Paul Reece , - Ivan Brawley and - Gilad Rom - 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 - 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 added - the Australian channel frequencies. - -1.66 19 May 1999 Ivan Brawley added better - Australian channel frequencies. - -1.67 23 May 1999 Roger Hardiman - 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 - 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 - Updates for FreeBSD 4.x device driver interface. - BSDI code removed. Will be restored later. - -1.70 12 July 1999 Roger Hardiman - Reorganise OS device dependent 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 added MSP3430G DBX initialisation. - -1.71 30 Aug 1999 Roger Hardiman - Small cleanup of OS dependent code. Remove NPCI usage. - Fix bug in AVerMedia detection. - Update VBI support for the AleVT Teletext package. Parts - from Juha Nurmela's driver - Add support for Hauppauge 627 and Temic 4006 submitted - by Maurice Castro - Tom Jansen added BSDi support again. - -1.72 31 Aug 1999 Juha Nurmela - Clear cap_ctl register when restarting the RISC program. - This fixes the freezes experienced when changing changes. - -1.73 10 Sep 1999 Roger Hardiman - Add Hauppauge tuner #6 for Brian Somers - Add card type for Aimslabs Video Highway Xtreme for - Ladislav Kostal - Added select() code (for VBI) for the 2.2.x driver - tested by Steve Richards - -1.74 17 Sep 1999 Roger Hardiman - 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 - Tidy up some tuner code and Hauppauge detection code. - New NetBSD code from Bernd Ernesti - -2.00 25 Sep 1999 Roger Hardiman - Split the driver into separate tuner, card and audio sections. - Update tuner code for FM radio to use datasheet equations. - -2.01 27 Sep 1999 Roger Hardiman - Add Dynalink Magic TView for Craig - Add Leadtek Winfast 2000 for Peter Wemm - There is no audio support on these 2 cards yet. - Tidy up a few tables with tabs and PLL selection code. - Restore Video Highway Xtreme PLL code. - -2.02 4 Oct 1999 Peter Wemm - Updated Australian Channel Set. - Added Tuner and Mute values for LeadTek Winfast 2000 card - -2.03 5 Oct 1999 Thomas Runge - Found FM radio bug mute introduced in release 2.00 - -2.04 20 Oct 1999 Roger Hardiman - Updated AVerMedia audio sources to support FM and Line In - sources properly. (Based on info supplied by AVerMedia) - Make PLL mode the default for Bt878 chips. This means PAL - Bt878 users no longer need the BKTR_USE_PLL kernel option. - Detect and auto-configure Dolby Surround Sound DPL3518A chip - on Hauppauge WinTV Theater. From Frank Nobis - -2.05 8 Nov 1999 Update tuner control codes for Philips SECAM. Submitted by - Cyrille Lefevre - Updated clipping code, ready for Xv support in XFree86 4.0, - submitted by Thomas Mueller - Thomas also has information on a LynxOS port of this driver. - Phase out the rgb_prog RISC program and use rgb_vbi_prog as - the default. Now you no longer have to open /dev/vbi - before /dev/bktr. - Roger Hardiman - -2.06 7 Dec 1999 Fix bug which made the tuner fail on cards detected as - IMS Turbo. Found by Patrick Mackeown - Put back some Hauppauge Tuner Types I deleted my mistake. - Backout the switch from rgb_prob to rgb_vbi_prog due to - problems with NTSC users. - -2.07 24 Jan 2000 Update i2c code to build on FreeBSD 3.x and 4.x machines. - Added GPIO audio values for the Askey/Dynalink TV card - taken from postings on the V4L mailing list. - Update Australian Channel Set. Submitted by - John Birrell - Add new Channel Set for France. Submitted by - Daniel Dagneaux - -2.08 6 Mar 2000 Reinstate rgb_vbi_prog as the default RISC program for - PAL video. This does not want to work for NTSC, which will - continue to use the rgb_prog RISC program. - Add support for cable channels above channel 100. - Submitted by Scott Presnell - New MSP3410/3415 setup code submitted by - Frank Nobis. This is experimental and is - enabled by setting the sysctl, hw.bt848.slow_msp_audio to 1 - before starting FXTV (or before opening /dev/bktrN) - -2.09 20 Mar 2000 Thomas Klausner submitted - patches to include the NetBSD and OpenBSD support from driver - 1.74 into the new 2.xx driver. NetBSD is tested. OpenBSD is - untested. - Also fixed coding error in bktr_audio.c spotted by Thomas. - Change xxx_ioctl functions to use ioctl_cmd_t for the cmd - parameter. Found by looking at OpenBSDs change logs. - Delete PROT_EXEC from OpenBSD (as per OpenBSD cvs logs). - -2.10 4 Apr 2000 Convert to using bus_space() to access the Bt848/878 registers - rather than using a memory mapped structure. This makes the - driver portable to other architectures, like Alpha and PPC. - This was done by Thomas Klausner and - myself Roger Hardiman - -2.11 15 Apr 2000 Made changes so the driver compiles on FreeBSD/Alpha. - Stop printing MSP autodetect. Requested by - Chris D. Faulhaber - -2.12 16 Apr 2000 Set adelay as an 8 bit value, noticed by - Thomas Klausner - Fix typo in the new interrupt code. - -2.12 20 May 2000 Merge in NetBSD changes from Thomas Klausner - following the import of driver 2.12 into NetBSD - -2.13 26 Jun 2000 Merge in more changes from Thomas Klausner - syncing this driver with the NetBSD source at 25th June. - -2.14 28 Jun 2000 Add new Hauppauge Tuner Types, supplied by Hauppauge and - required for Josef Karthauser - Change the structure of some of the #include files and - merge in more NetBSD changes. - -2.15 10 Sep 2000 Add support for bktr_mem, a module to hold onto the bktr - drives's contiguous memory buffers even when it is unloaded - and reloaded. - Simplify the use of the optional SMBUS i2c code by using a new - #define called BKTR_USE_FREEBSD_SMBUS. - Poul-Henning Kamp changed the DEVFS code. - Peter Wemm fixed an SMBUS warning. - Alexander Langer fixed some FreeBSD newbus - resource allocation problems (FreeBSD PR kern/18744). - -2.16 19 Sep 2000 Merge in NetBSD changes from Thomas Klausner - -2.17 19 Oct 2000 Alexander Langer and - Daniel O'Connor - both submitted fixes to devfs code. - Fix PHK's commit so we only include machine/clock.h in - FreeBSD 2.x, 3.x and 4.x systems - -2.18 30 Oct 2000 Roger Hardiman - Add new ioctls to allow userland programs - fuller access to the I2C bus, BT848_MSP_READ BT848_MSP_WRITE - and BT848_MSP_RESET. - Add tuner type 0x2a. Remove 0x2c which was incorrect. - Christian Gusenbauer added - support for audio on Hauppauge cards without the audio mux. - The MSP is used for audio selection. (the 44xxx models) - -[see https://svnweb.freebsd.org/base/head/sys/dev/bktr/ -for newer change logs ] diff --git a/sys/dev/bktr/bktr_audio.c b/sys/dev/bktr/bktr_audio.c deleted file mode 100644 index ca1cf431ff3e..000000000000 --- a/sys/dev/bktr/bktr_audio.c +++ /dev/null @@ -1,646 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * 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_audio : This deals with controlling the audio on TV cards, - * controlling the Audio Multiplexer (audio source selector). - * controlling any MSP34xx stereo audio decoders. - * controlling any DPL35xx dolby surroud sound audio decoders. - * initialising TDA98xx audio devices. - * - */ - -#include "opt_bktr.h" /* Include any kernel config options */ - -#include -#include -#include - -#ifdef __FreeBSD__ - -#if (__FreeBSD_version < 500000) -#include /* for DELAY */ -#include -#else -#include -#include -#include -#include -#endif - -#include -#include -#endif - -#ifdef __NetBSD__ -#include -#include /* NetBSD location of .h files */ -#include -#include -#include -#include -#include -#else -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include -#include -#endif - -/* - * Prototypes for the GV_BCTV2 specific functions. - */ -void set_bctv2_audio( bktr_ptr_t bktr ); -void bctv2_gpio_write( bktr_ptr_t bktr, int port, int val ); -/*int bctv2_gpio_read( bktr_ptr_t bktr, int port );*/ /* Not used */ - -/* - * init_audio_devices - * Reset any MSP34xx or TDA98xx audio devices. - */ -void init_audio_devices( bktr_ptr_t bktr ) { - - /* 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_dpl_reset( bktr, bktr->msp_addr ); - - /* reset the DPL35xx dolby audio chip */ - if ( bktr->card.dpl3518a ) - msp_dpl_reset( bktr, bktr->dpl_addr ); - -} - - -/* - * - */ -#define AUDIOMUX_DISCOVER_NOT -int -set_audio( bktr_ptr_t bktr, int cmd ) -{ - u_long temp; - volatile u_char idx; - -#if defined( AUDIOMUX_DISCOVER ) - if ( cmd >= 200 ) - cmd -= 200; - else -#endif /* AUDIOMUX_DISCOVER */ - - /* check for existence 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("%s: audio cmd error %02x\n", bktr_name(bktr), - 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_BCTV2 ) { - set_bctv2_audio( bktr ); - return( 0 ); - } - - /* Proceed with the simpler audio multiplexer code for the majority - * of Bt848 cards. - */ - - /* - * 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 = INL(bktr, BKTR_GPIO_DATA) & ~bktr->card.gpio_mux_bits; -#if defined( AUDIOMUX_DISCOVER ) - OUTL(bktr, BKTR_GPIO_DATA, temp | (cmd & 0xff)); - printf("%s: cmd: %d audio mux %x temp %x \n", bktr_name(bktr), - cmd, bktr->card.audiomuxs[ idx ], temp ); -#else - OUTL(bktr, BKTR_GPIO_DATA, temp | bktr->card.audiomuxs[ idx ]); -#endif /* AUDIOMUX_DISCOVER */ - - - - /* Some new Hauppauge cards do not have an audio mux */ - /* Instead we use the MSP34xx chip to select TV audio, Line-In */ - /* FM Radio and Mute */ - /* Examples of this are the Hauppauge 44xxx MSP34xx models */ - /* It is ok to drive both the mux and the MSP34xx chip. */ - /* If there is no mux, the MSP does the switching of the audio source */ - /* If there is a mux, it does the switching of the audio source */ - - if ((bktr->card.msp3400c) && (bktr->audio_mux_present == 0)) { - - if (bktr->audio_mute_state == TRUE ) { - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x0000); /* volume to MUTE */ - } else { - if(bktr->audio_mux_select == 0) { /* TV Tuner */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300); /* 0 db volume */ - if (bktr->msp_source_selected != 0) msp_autodetect(bktr); /* setup TV audio mode */ - bktr->msp_source_selected = 0; - } - if(bktr->audio_mux_select == 1) { /* Line In */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300); /* 0 db volume */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900); /* scart prescale */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220); /* SCART | STEREO */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0000); /* DSP In = SC1_IN_L/R */ - bktr->msp_source_selected = 1; - } - - if(bktr->audio_mux_select == 2) { /* FM Radio */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300); /* 0 db volume */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900); /* scart prescale */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220); /* SCART | STEREO */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0200); /* DSP In = SC2_IN_L/R */ - bktr->msp_source_selected = 2; - } - } - } - - - return( 0 ); -} - - -/* - * - */ -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 ); - } -} - -/* address of BTSC/SAP decoder chip */ -#define TDA9850_WADDR 0xb6 -#define TDA9850_RADDR 0xb7 - - -/* 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 - -/* - * initialise the dbx chip - * taken from the Linux bttv driver TDA9850 initialisation code - */ -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: a lot of work to be done here, this merely unmutes it. - */ -int -set_BTSC( bktr_ptr_t bktr, int control ) -{ - return( i2cWrite( bktr, TDA9850_WADDR, CON3ADDR, control ) ); -} - -/* - * CARD_GV_BCTV2 specific functions. - */ - -#define BCTV2_AUDIO_MAIN 0x10 /* main audio program */ -#define BCTV2_AUDIO_SUB 0x20 /* sub audio program */ -#define BCTV2_AUDIO_BOTH 0x30 /* main(L) + sub(R) program */ - -#define BCTV2_GPIO_REG0 1 -#define BCTV2_GPIO_REG1 3 - -#define BCTV2_GR0_AUDIO_MODE 3 -#define BCTV2_GR0_AUDIO_MAIN 0 /* main program */ -#define BCTV2_GR0_AUDIO_SUB 3 /* sub program */ -#define BCTV2_GR0_AUDIO_BOTH 1 /* main(L) + sub(R) */ -#define BCTV2_GR0_AUDIO_MUTE 4 /* audio mute */ -#define BCTV2_GR0_AUDIO_MONO 8 /* force mono */ - -void -set_bctv2_audio( bktr_ptr_t bktr ) -{ - int data; - - switch (bktr->audio_mux_select) { - case 1: /* external */ - case 2: /* internal */ - bctv2_gpio_write(bktr, BCTV2_GPIO_REG1, 0); - break; - default: /* tuner */ - bctv2_gpio_write(bktr, BCTV2_GPIO_REG1, 1); - break; - } -/* switch (bktr->audio_sap_select) { */ - switch (BCTV2_AUDIO_BOTH) { - case BCTV2_AUDIO_SUB: - data = BCTV2_GR0_AUDIO_SUB; - break; - case BCTV2_AUDIO_BOTH: - data = BCTV2_GR0_AUDIO_BOTH; - break; - case BCTV2_AUDIO_MAIN: - default: - data = BCTV2_GR0_AUDIO_MAIN; - break; - } - if (bktr->audio_mute_state == TRUE) - data |= BCTV2_GR0_AUDIO_MUTE; - - bctv2_gpio_write(bktr, BCTV2_GPIO_REG0, data); - - return; -} - -/* gpio_data bit assignment */ -#define BCTV2_GPIO_ADDR_MASK 0x000300 -#define BCTV2_GPIO_WE 0x000400 -#define BCTV2_GPIO_OE 0x000800 -#define BCTV2_GPIO_VAL_MASK 0x00f000 - -#define BCTV2_GPIO_PORT_MASK 3 -#define BCTV2_GPIO_ADDR_SHIFT 8 -#define BCTV2_GPIO_VAL_SHIFT 12 - -/* gpio_out_en value for read/write */ -#define BCTV2_GPIO_OUT_RMASK 0x000f00 -#define BCTV2_GPIO_OUT_WMASK 0x00ff00 - -#define BCTV2_BITS 100 - -void -bctv2_gpio_write( bktr_ptr_t bktr, int port, int val ) -{ - u_long data, outbits; - - port &= BCTV2_GPIO_PORT_MASK; - switch (port) { - case 1: - case 3: - data = ((val << BCTV2_GPIO_VAL_SHIFT) & BCTV2_GPIO_VAL_MASK) | - ((port << BCTV2_GPIO_ADDR_SHIFT) & BCTV2_GPIO_ADDR_MASK) | - BCTV2_GPIO_WE | BCTV2_GPIO_OE; - outbits = BCTV2_GPIO_OUT_WMASK; - break; - default: - return; - } - OUTL(bktr, BKTR_GPIO_OUT_EN, 0); - OUTL(bktr, BKTR_GPIO_DATA, data); - OUTL(bktr, BKTR_GPIO_OUT_EN, outbits); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, data & ~BCTV2_GPIO_WE); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, data); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, ~0); - OUTL(bktr, BKTR_GPIO_OUT_EN, 0); -} - -/* Not yet used -int -bctv2_gpio_read( bktr_ptr_t bktr, int port ) -{ - u_long data, outbits, ret; - - port &= BCTV2_GPIO_PORT_MASK; - switch (port) { - case 1: - case 3: - data = ((port << BCTV2_GPIO_ADDR_SHIFT) & BCTV2_GPIO_ADDR_MASK) | - BCTV2_GPIO_WE | BCTV2_GPIO_OE; - outbits = BCTV2_GPIO_OUT_RMASK; - break; - default: - return( -1 ); - } - OUTL(bktr, BKTR_GPIO_OUT_EN, 0); - OUTL(bktr, BKTR_GPIO_DATA, data); - OUTL(bktr, BKTR_GPIO_OUT_EN, outbits); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, data & ~BCTV2_GPIO_OE); - DELAY(BCTV2_BITS); - ret = INL(bktr, BKTR_GPIO_DATA); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, data); - DELAY(BCTV2_BITS); - OUTL(bktr, BKTR_GPIO_DATA, ~0); - OUTL(bktr, BKTR_GPIO_OUT_EN, 0); - return( (ret & BCTV2_GPIO_VAL_MASK) >> BCTV2_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 */ -void msp_read_id( bktr_ptr_t bktr ){ - int rev1=0, rev2=0; - rev1 = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x001e); - rev2 = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x001f); - - sprintf(bktr->msp_version_string, "34%02d%c-%c%d", - (rev2>>8)&0xff, (rev1&0xff)+'@', ((rev1>>8)&0xff)+'@', rev2&0x1f); - -} - - -/* Configure the MSP chip to Auto-detect the audio format. - * For the MSP3430G, we use fast autodetect mode - * For the MSP3410/3415 there are two schemes for this - * a) Fast autodetection - the chip is put into autodetect mode, and the function - * returns immediately. This works in most cases and is the Default Mode. - * b) Slow mode. The function sets the MSP3410/3415 chip, then waits for feedback from - * the chip and re-programs it if needed. - */ -void msp_autodetect( bktr_ptr_t bktr ) { - -#ifdef BKTR_NEW_MSP34XX_DRIVER - - /* Just wake up the (maybe) sleeping thread, it'll do everything for us */ - msp_wake_thread(bktr); - -#else - int auto_detect, loops; - int stereo; - - /* MSP3430G - countries with mono and DBX stereo */ - if (strncmp("3430G", bktr->msp_version_string, 5) == 0){ - - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0030,0x2003);/* Enable Auto format detection */ - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0020);/* Standard Select Reg. = BTSC-Stereo*/ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000E,0x2403);/* darned if I know */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0320);/* Source select = (St or A) */ - /* & Ch. Matrix = St */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);/* Set volume to 0db gain */ - } - - - /* MSP3415D SPECIAL CASE Use the Tuner's Mono audio output for the MSP */ - /* (for Hauppauge 44xxx card with Tuner Type 0x2a) */ - else if ( ( (strncmp("3415D", bktr->msp_version_string, 5) == 0) - &&(bktr->msp_use_mono_source == 1) - ) - || (bktr->slow_msp_audio == 2) ){ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300); /* 0 db volume */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900); /* scart prescale */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220); /* SCART | STEREO */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0100); /* DSP In = MONO IN */ - } - - - /* MSP3410/MSP3415 - countries with mono, stereo using 2 FM channels and NICAM */ - /* FAST sound scheme */ - else if (bktr->slow_msp_audio == 0) { - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);/* Set volume to 0db gain */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0000);/* Spkr Source = default(FM/AM) */ - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0001);/* Enable Auto format detection */ - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0021,0x0001);/* Auto selection of NICAM/MONO mode */ - } - - - /* MSP3410/MSP3415 - European Countries where the fast MSP3410/3415 programming fails */ - /* SLOW sound scheme */ - else if ( bktr->slow_msp_audio == 1) { - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);/* Set volume to 0db gain */ - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0001);/* Enable Auto format detection */ - - /* wait for 0.5s max for terrestrial sound autodetection */ - loops = 10; - do { - DELAY(100000); - auto_detect = msp_dpl_read(bktr, bktr->msp_addr, 0x10, 0x007e); - loops++; - } while (auto_detect > 0xff && loops < 50); - if (bootverbose)printf ("%s: Result of autodetect after %dms: %d\n", - bktr_name(bktr), loops*10, auto_detect); - - /* Now set the audio baseband processing */ - switch (auto_detect) { - case 0: /* no TV sound standard detected */ - break; - case 2: /* M Dual FM */ - break; - case 3: /* B/G Dual FM; German stereo */ - /* Read the stereo detection value from DSP reg 0x0018 */ - DELAY(20000); - stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018); - if (bootverbose)printf ("%s: Stereo reg 0x18 a: %d\n", - bktr_name(bktr), stereo); - DELAY(20000); - stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018); - if (bootverbose)printf ("%s: Stereo reg 0x18 b: %d\n", - bktr_name(bktr), stereo); - DELAY(20000); - stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018); - if (bootverbose)printf ("%s: Stereo reg 0x18 c: %d\n", - bktr_name(bktr), stereo); - if (stereo > 0x0100 && stereo < 0x8000) { /* Seems to be stereo */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0020);/* Loudspeaker set stereo*/ - /* - set spatial effect strength to 50% enlargement - set spatial effect mode b, stereo basewidth enlargement only - */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x3f28); - } else if (stereo > 0x8000) { /* bilingual mode */ - if (bootverbose) printf ("%s: Bilingual mode detected\n", - bktr_name(bktr)); - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0000);/* Loudspeaker */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x0000);/* all spatial effects off */ - } else { /* must be mono */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0030);/* Loudspeaker */ - /* - set spatial effect strength to 50% enlargement - set spatial effect mode a, stereo basewidth enlargement - and pseudo stereo effect with automatic high-pass filter - */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x3f08); - } -#if 0 - /* The reset value for Channel matrix mode is FM/AM and SOUNDA/LEFT */ - /* We would like STEREO instead val: 0x0020 */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0020);/* Loudspeaker */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0009,0x0020);/* Headphone */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000a,0x0020);/* SCART1 */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0041,0x0020);/* SCART2 */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000b,0x0020);/* I2S */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000c,0x0020);/* Quasi-Peak Detector Source */ - msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000e,0x0001); -#endif - break; - case 8: /* B/G FM NICAM */ - msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0021,0x0001);/* Auto selection of NICAM/MONO mode */ - break; - case 9: /* L_AM NICAM or D/K*/ - case 10: /* i-FM NICAM */ - break; - default: - if (bootverbose) printf ("%s: Unknown autodetection result value: %d\n", - bktr_name(bktr), auto_detect); - } - - } - - - /* uncomment the following line to enable the MSP34xx 1Khz Tone Generator */ - /* turn your speaker volume down low before trying this */ - /* msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0014, 0x7f40); */ - -#endif /* BKTR_NEW_MSP34XX_DRIVER */ -} - -/* Read the DPL version string */ -void dpl_read_id( bktr_ptr_t bktr ){ - int rev1=0, rev2=0; - rev1 = msp_dpl_read(bktr, bktr->dpl_addr, 0x12, 0x001e); - rev2 = msp_dpl_read(bktr, bktr->dpl_addr, 0x12, 0x001f); - - sprintf(bktr->dpl_version_string, "34%02d%c-%c%d", - ((rev2>>8)&0xff)-1, (rev1&0xff)+'@', ((rev1>>8)&0xff)+'@', rev2&0x1f); -} - -/* Configure the DPL chip to Auto-detect the audio format */ -void dpl_autodetect( bktr_ptr_t bktr ) { - - /* The following are empiric values tried from the DPL35xx data sheet */ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x000c,0x0320); /* quasi peak detector source dolby - lr 0x03xx; quasi peak detector matrix - stereo 0xXX20 */ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0040,0x0060); /* Surround decoder mode; - ADAPTIVE/3D-PANORAMA, that means two - speakers and no center speaker, all - channels L/R/C/S mixed to L and R */ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0041,0x0620); /* surround source matrix;I2S2/STEREO*/ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0042,0x1F00); /* surround delay 31ms max */ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0043,0x0000); /* automatic surround input balance */ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0044,0x4000); /* surround spatial effect 50% - recommended*/ - msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0045,0x5400); /* surround panorama effect 66% - recommended with PANORAMA mode - in 0x0040 set to panorama */ -} - diff --git a/sys/dev/bktr/bktr_audio.h b/sys/dev/bktr/bktr_audio.h deleted file mode 100644 index e891b0f69bcb..000000000000 --- a/sys/dev/bktr/bktr_audio.h +++ /dev/null @@ -1,91 +0,0 @@ -/* $FreeBSD$ */ -/* - * 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_audio : This deals with controlling the audio on TV cards, - * controlling the Audio Multiplexer (audio source selector). - * controlling any MSP34xx stereo audio decoders. - * controlling any DPL35xx dolby surroud sound audio decoders. - * initialising TDA98xx audio devices. - * - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Select Audio source, and allow muting - */ -int set_audio( bktr_ptr_t bktr, int mode ); -void temp_mute( bktr_ptr_t bktr, int flag ); - - -/* - * Initialise any MSP or TDA devices - */ -void init_audio_devices( bktr_ptr_t bktr ); - - -/* - * MSP34xx Audio Chip functions. - */ -void msp_autodetect( bktr_ptr_t bktr ); -void msp_read_id( bktr_ptr_t bktr ); -#ifdef BKTR_NEW_MSP34XX_DRIVER -int msp_attach(bktr_ptr_t bktr); -int msp_detach(bktr_ptr_t bktr); -void msp_wake_thread(bktr_ptr_t bktr); -void msp_halt_thread(bktr_ptr_t bktr); -#endif - - -/* - * DPL35xx Audio Chip functions. - */ -void dpl_autodetect( bktr_ptr_t bktr ); -void dpl_read_id( bktr_ptr_t bktr ); - - -/* - * TDA98xx Audio Chip functions. - */ -void init_BTSC( bktr_ptr_t bktr ); -int set_BTSC( bktr_ptr_t bktr, int control ); - - - diff --git a/sys/dev/bktr/bktr_card.c b/sys/dev/bktr/bktr_card.c deleted file mode 100644 index 0c2486d2747d..000000000000 --- a/sys/dev/bktr/bktr_card.c +++ /dev/null @@ -1,1408 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * 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_card : This deals with identifying TV cards. - * trying to find the card make and model of card. - * trying to find the type of tuner fitted. - * reading the configuration EEPROM. - * locating i2c devices. - */ - -#include "opt_bktr.h" /* Include any kernel config options */ - -#include -#include - -#ifdef __FreeBSD__ - -#if (__FreeBSD_version < 500000) -#include /* for DELAY */ -#include -#else -#include -#include -#include -#include -#endif - -#include -#include -#endif - -#ifdef __NetBSD__ -#include /* NetBSD location for .h files */ -#include -#include -#include -#include -#include -#else -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include -#include -#endif - -/* Include the PCI Vendor definitions */ -#ifdef __NetBSD__ -#include -#include -#endif - -/* Various defines */ -#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 - -/* address of DPL3518A chip */ -#define DPL3518A_WADDR 0x84 -#define DPL3518A_RADDR 0x85 - -/* 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 - -#if defined(BKTR_SYSTEM_DEFAULT) && BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL -#define DEFAULT_TUNER PHILIPS_PALI -#else -#define DEFAULT_TUNER PHILIPS_NTSC -#endif - - - - -/* - * 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, - 0, /* EEProm unknown */ - 0, /* EEProm unknown */ - { 0, 0, 0, 0, 0 }, - 0 }, /* GPIO mask */ - - { CARD_MIRO, /* the card id */ - "Pinnacle/Miro TV", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx unknown */ - 0, - 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, - 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, - 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, 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, - 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, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x0c, 0x08, 0x04, 0x00, 1 }, /* audio MUX values */ - 0x1f }, /* GPIO mask */ - - { CARD_OSPREY, /* the card id */ - "MMAC Osprey", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 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, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x01, 0x02, 0x01, 0x00, 1 }, /* audio MUX values */ - 0x0f }, /* GPIO mask */ - - { CARD_IO_BCTV2, /* 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, - 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 */ - 0, /* dpl3518a 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, /* dpl3518a 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, /* dpl3518a 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, - 0, - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x00, 0x02, 0x01, 0x04, 1 }, /* audio MUX values */ - 0x0f }, /* GPIO mask */ - - { CARD_ASKEY_DYNALINK_MAGIC_TVIEW, /* the card id */ - "Askey/Dynalink Magic TView", /* the 'name' */ - NULL, /* the tuner */ - 0, - 0, - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x400, 0xE00, 0x400, 0xC00, 1 }, /* audio MUX values */ - 0xE00 }, /* GPIO mask */ - - { CARD_LEADTEK, /* the card id */ - "Leadtek Winfast TV 2000", /* the 'name' */ - NULL, /* the tuner */ - 0, - 0, - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - /* Tuner, Extern, Intern, Mute, Enabled */ - { 0x621000, 0x621000, 0x621000, 0xE21000, 1 }, /* audio MUX values */ - 0xfff000 }, /* GPIO mask */ - - { CARD_TERRATVPLUS, /* the card id */ - "TerraTVplus", /* the 'name' */ - NULL, /* the tuner */ - 0, - 0, - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x20000, 0x00000, 0x30000, 0x40000, 1 }, /* audio MUX values*/ - 0x70000 }, /* GPIO mask */ - - { CARD_IO_BCTV3, /* the card id */ - "I/O DATA GV-BCTV3/PCI", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - /* Tuner, Extern, Intern, Mute, Enabled */ - { 0x10000, 0, 0x10000, 0, 1 }, /* audio MUX values */ - 0x10f00 }, /* GPIO mask */ - - { CARD_AOPEN_VA1000, /* the card id */ - "AOpen VA1000", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - 0, /* EEProm unknown */ - 0, /* size unknown */ - { 0x02, 0x00, 0x00, 0x00, 1 }, /* audio MUX values */ - 0x18e0 }, /* GPIO mask */ - - { CARD_PINNACLE_PCTV_RAVE, /* the card id */ - "Pinnacle PCTV Rave", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx unknown */ - 0, - 0, - 0, /* EEProm unknown */ - 0, /* size unknown */ - { 0x02, 0x01, 0x00, 0x0a, 1 }, /* audio MUX values */ - 0x03000F }, /* GPIO mask */ - - { CARD_PIXELVIEW_PLAYTV_PAK, /* the card id */ - "PixelView PlayTV Pak", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - PFC8582_WADDR, /* EEProm type */ - (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ - { 0x20000, 0x80000, 0, 0xa8000, 1 }, /* audio MUX values */ - 0xAA0000 }, /* GPIO mask */ - - { CARD_TERRATVALUE, /* the card id */ - "TerraTec TValue", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - /* Tuner, Extern, Intern, Mute, Enabled */ - { 0x500, 0x900, 0x300, 0x900, 1 }, /* audio MUX values */ - 0xffff00 }, /* GPIO mask */ - - { CARD_PIXELVIEW_PLAYTV_PRO_REV_4C, /* the card id */ - "PixelView PlayTV Pro REV-4C ", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - 0, /* EEProm type */ - 0, /* EEProm size */ - { 0x01, 0x04, 0x01, 0x03, 1 }, /* audio MUX values */ - 0x00ffffff }, - { CARD_LEADTEK_WINFAST_2000_XP, /* the card id */ - "Leadtek Winfast 2000 XP", /* the 'name' */ - NULL, /* the tuner */ - 0, /* the tuner i2c address */ - 0, /* dbx is optional */ - 0, - 0, - 0, /* EEProm unknown */ - 0, /* size unknown */ - { 0x122000, 0x1000, 0x620000, 0x0000, 1 }, /* audio MUX values */ - 0xb33000 }, /* 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}} - - -}; - - -/* - * Write to the configuration EEPROM on the card. - * This is dangerous and will mess up your card. Therefore it is not - * implemented. - */ -int -writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data ) -{ - return( -1 ); -} - -/* - * Read the contents of the configuration EEPROM on the card. - * (This is not fitted to all makes of card. All Hauppauge cards have them - * and so do newer Bt878 based cards. - */ -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 ); -} - - -#define ABSENT (-1) - -/* - * 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 - */ -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 ); -} - - -/* - * check_for_i2c_devices. - * Some BT848 cards have no tuner and no additional i2c devices - * eg stereo decoder. These are used for video conferencing or capture from - * a video camera. (eg 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. - * On some cards, the EEPROM appears in several locations, but all in the - * range 0xa0 to 0xae. - */ -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 - * BKTR_OVERRIDE_CARD, BKTR_OVERRIDE_TUNER, BKTR_OVERRIDE_DBX and - * BKTR_OVERRIDE_MSP can be used to select a specific device, - * regardless of the autodetection and i2c device checks. - * - * The scheme used for probing cards faces these problems: - * It is impossible to work out which type of tuner is actually fitted, - * (the driver cannot tell if the Tuner is PAL or NTSC, Temic or Philips) - * It is impossible to determine what audio-mux hardware is connected. - * It is impossible to determine if there is extra hardware connected to the - * GPIO pins (eg radio chips or MSP34xx reset logic) - * - * However some makes of card (eg Hauppauge) come with a configuration eeprom - * which tells us the make of the card. Most eeproms also tell us the - * tuner type and other features of the cards. - * - * The current probe code works as follows - * A) If the card uses a Bt878/879: - * 1) Read the sub-system vendor id from the configuration EEPROM. - * Select the required tuner, audio mux arrangement and any other - * onboard features. If this fails, move to step B. - * B) If it card uses a Bt848, 848A, 849A or an unknown Bt878/879: - * 1) Look for I2C devices. If there are none fitted, it is an Intel or - * VideoLogic cards. - * 2) Look for a configuration EEPROM. - * 2a) If there is one at I2C address 0xa0 it may be - * a Hauppauge or an Osprey. Check the EEPROM contents to determine which - * one it is. For Hauppauge, select the tuner type and audio hardware. - * 2b) If there is an EEPROM at I2C address 0xa8 it will be an STB card. - * We still have to guess on the tuner type. - * - * C) If we do not know the card type from (A) or (B), guess at the tuner - * type based on the I2C address of the tuner. - * - * D) 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. - */ - - -/* - * These are the sub-system vendor ID codes stored in the - * configuration EEPROM used on Bt878/879 cards. They should match the - * number assigned to the company by the PCI Special Interest Group - */ -#ifndef __NetBSD__ -#define PCI_VENDOR_HAUPPAUGE 0x0070 -#define PCI_VENDOR_AVERMEDIA 0x1461 -#define PCI_VENDOR_STB 0x10B4 -#define PCI_VENDOR_ASKEY 0x144F -#define PCI_VENDOR_TERRATEC 0x153B -#endif -/* Following not confirmed with http://members.hyperlink.net.au/~chart, - so not added to NetBSD's pcidevs */ -#define PCI_VENDOR_LEADTEK_ALT 0x6606 -#define PCI_VENDOR_LEADTEK_ALT_2 0x6607 -#define PCI_VENDOR_LEADTEK_ALT_3 0x107d -#define PCI_VENDOR_FLYVIDEO 0x1851 -#define PCI_VENDOR_FLYVIDEO_2 0x1852 -#define PCI_VENDOR_IODATA 0x10fc -#define PCI_VENDOR_PINNACLE_ALT 0xBD11 /* They got their own ID backwards? */ -#define PCI_VENDOR_PINNACLE_NEW 0x11BD - -#define MODEL_IODATA_GV_BCTV3_PCI 0x4020 -#define MODEL_TERRATVALUE_1117 0x1117 -#define MODEL_TERRATVALUE_1118 0x1118 -#define MODEL_TERRATVALUE_1119 0x1119 -#define MODEL_TERRATVALUE_111A 0x111a -#define MODEL_TERRATVALUE_1134 0x1134 - -void -probeCard( bktr_ptr_t bktr, int verbose, int unit ) -{ - int card, i,j, card_found; - int status; - 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; - - /* Select all GPIO bits as inputs */ - OUTL(bktr, BKTR_GPIO_OUT_EN, 0); - if (bootverbose) - printf("%s: GPIO is 0x%08x\n", bktr_name(bktr), - INL(bktr, BKTR_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. */ - OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | (1<<5)); - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5)); /* write '1' */ - DELAY(2500); /* wait 2.5ms */ - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) & ~(1<<5)); /* write '0' */ - DELAY(2500); /* wait 2.5ms */ - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_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( BKTR_OVERRIDE_CARD ) - bktr->card = cards[ (card = BKTR_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("%s: subsystem 0x%04x 0x%04x\n", bktr_name(bktr), - subsystem_vendor_id, subsystem_id); - - if (subsystem_vendor_id == PCI_VENDOR_AVERMEDIA) { - 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 == PCI_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 == PCI_VENDOR_FLYVIDEO) - || (subsystem_vendor_id == PCI_VENDOR_FLYVIDEO_2) ) { - 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 == PCI_VENDOR_STB) { - bktr->card = cards[ (card = CARD_STB) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - goto checkTuner; - } - - if (subsystem_vendor_id == PCI_VENDOR_ASKEY) { - bktr->card = cards[ (card = CARD_ASKEY_DYNALINK_MAGIC_TVIEW) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - goto checkTuner; - } - - if ((subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT) - || (subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT_2) - || (subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT_3)) { - bktr->card = cards[ (card = CARD_LEADTEK) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - goto checkTuner; - } - - if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_ALT || - subsystem_vendor_id == PCI_VENDOR_PINNACLE_NEW) { - bktr->card = cards[ (card = CARD_MIRO) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - goto checkTuner; - } - - if (subsystem_vendor_id == PCI_VENDOR_IODATA && - subsystem_id == MODEL_IODATA_GV_BCTV3_PCI) { - bktr->card = cards[ (card = CARD_IO_BCTV3) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - goto checkTuner; - } - - if (subsystem_vendor_id == PCI_VENDOR_TERRATEC) { - switch (subsystem_id) { - case MODEL_TERRATVALUE_1117: - case MODEL_TERRATVALUE_1118: - case MODEL_TERRATVALUE_1119: - case MODEL_TERRATVALUE_111A: - case MODEL_TERRATVALUE_1134: - bktr->card = cards[ (card = CARD_TERRATVALUE) ]; - 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("%s: Warning - card vendor 0x%04x (model 0x%04x) unknown.\n", - bktr_name(bktr), subsystem_vendor_id, subsystem_id); - } - else - { - printf("%s: Card has no configuration EEPROM. Cannot determine card make.\n", - bktr_name(bktr)); - } - } /* 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("%s: Warning: Unknown card type. EEPROM data not recognised\n", - bktr_name(bktr)); - printf("%s: %x %x %x %x\n", bktr_name(bktr), - 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("%s: card signature: ", bktr_name(bktr)); - 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]; - 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; - } - tuner_i2c_address = locate_tuner_address( bktr ); - select_tuner( bktr, bt848_card_signature[i].tuner ); - 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: - -#if !defined( BKTR_OVERRIDE_TUNER ) - if (card == CARD_MIRO && mt2032_init(bktr) == 0 && - bktr->bt848_tuner == -1) { - bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ]; - select_tuner( bktr, TUNER_MT2032 ); - goto checkDBX; - } -#endif - - /* look for a tuner */ - tuner_i2c_address = locate_tuner_address( bktr ); - if ( tuner_i2c_address == -1 ) { - select_tuner( bktr, NO_TUNER ); - goto checkDBX; - } - -#if defined( BKTR_OVERRIDE_TUNER ) - select_tuner( bktr, BKTR_OVERRIDE_TUNER ); - goto checkDBX; -#endif - if (bktr->bt848_tuner != -1 ) { - select_tuner( bktr, bktr->bt848_tuner & 0xff ); - goto checkDBX; - } - - /* Check for i2c devices */ - if (!any_i2c_devices) { - select_tuner( bktr, NO_TUNER ); - goto checkDBX; - } - - /* differentiate type of tuner */ - - switch (card) { - case CARD_MIRO: - switch (((INL(bktr, BKTR_GPIO_DATA) >> 10)-1)&7) { - case 0: select_tuner( bktr, TEMIC_PAL ); break; - case 1: select_tuner( bktr, PHILIPS_PAL ); break; - case 2: select_tuner( bktr, PHILIPS_NTSC ); break; - case 3: select_tuner( bktr, PHILIPS_SECAM ); break; - case 4: select_tuner( bktr, NO_TUNER ); break; - case 5: select_tuner( bktr, PHILIPS_PALI ); break; - case 6: select_tuner( bktr, TEMIC_NTSC ); break; - case 7: select_tuner( bktr, 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. */ - /* Old Temic tuners had their own API, but newer Temic tuners */ - /* have the same API as Philips tuners */ - /* - ID Tuner Model Format We select Format - 0x00 NONE - 0x01 EXTERNAL - 0x02 OTHER - 0x03 Philips FI1216 BG - 0x04 Philips FI1216MF BGLL' PHILIPS_SECAM - 0x05 Philips FI1236 MN PHILIPS_NTSC - 0x06 Philips FI1246 I PHILIPS_PALI - 0x07 Philips FI1256 DK - 0x08 Philips FI1216 MK2 BG PHILIPS_PALI - 0x09 Philips FI1216MF MK2 BGLL' PHILIPS_SECAM - 0x0a Philips FI1236 MK2 MN PHILIPS_NTSC - 0x0b Philips FI1246 MK2 I PHILIPS_PALI - 0x0c Philips FI1256 MK2 DK - 0x0d Temic 4032FY5 NTSC TEMIC_NTSC - 0x0e Temic 4002FH5 BG TEMIC_PAL - 0x0f Temic 4062FY5 I TEMIC_PALI - 0x10 Philips FR1216 MK2 BG - 0x11 Philips FR1216MF MK2 BGLL' PHILIPS_FR1236_SECAM - 0x12 Philips FR1236 MK2 MN PHILIPS_FR1236_NTSC - 0x13 Philips FR1246 MK2 I - 0x14 Philips FR1256 MK2 DK - 0x15 Philips FM1216 BG PHILIPS_FR1216_PAL - 0x16 Philips FM1216MF BGLL' PHILIPS_FR1236_SECAM - 0x17 Philips FM1236 MN PHILIPS_FR1236_NTSC - 0x18 Philips FM1246 I - 0x19 Philips FM1256 DK - 0x1a Temic 4036FY5 MN (FI1236 MK2 clone) PHILIPS_NTSC - 0x1b Samsung TCPN9082D MN - 0x1c Samsung TCPM9092P Pal BG/I/DK - 0x1d Temic 4006FH5 BG PHILIPS_PALI - 0x1e Samsung TCPN9085D MN/Radio - 0x1f Samsung TCPB9085P Pal BG/I/DK / Radio - 0x20 Samsung TCPL9091P Pal BG & Secam L/L' - 0x21 Temic 4039FY5 NTSC Radio - 0x22 Philips FQ1216ME Pal BGIDK & Secam L/L' - 0x23 Temic 4066FY5 Pal I (FI1246 MK2 clone) PHILIPS_PALI - 0x24 Philips TD1536 MN/ATSCDigital - 0x25 Philips TD1536D MN/ATSCDigital DUAL INPUT - 0x26 Philips FMR1236 M/N FM(no demod) - 0x27 Philips FI1256MP B/G, D/K - 0x28 Samsung TCPQ9091P BG/I/DK, L/L' - 0x29 Temic 4006FN5 BG/I/DK - 0x2a Temic 4009FR5 BG FM PHILIPS_FR1216_PAL - 0x2b Temic 4046FM5 B/G, I, D/K, L/L' - 0x2c Temic 4009FN5 B/G, I, D/K, FM (no demod) - 0x2d Philips TD1536D_FH_44 MN/ATSCDigital DUAL INPUT - */ - - - /* Determine the model number from the eeprom */ - if (bktr->card.eepromAddr != 0) { - /* eeprom data block structure */ - unsigned char *block_1, *block_2, *block_3, *block_4; - int block_1_data_size, block_2_data_size, block_3_data_size; - int block_1_total_size, block_2_total_size, block_3_total_size; - int block_4_header_size; - - unsigned int model,revision; - unsigned char tuner_code; - unsigned char no_audio_mux; - - readEEProm(bktr, 0, 128, (u_char *) &eeprom ); - - /* LOCATE THE EEPROM DATA BLOCKS */ - block_1 = &eeprom[0]; - block_1_data_size = (block_1[2] << 8 | block_1[1]); - block_1_total_size = block_1_data_size + 3; /* Header bytes */ - - block_2 = &eeprom[block_1_total_size]; - block_2_data_size = (block_2[2] << 8 | block_2[1]); - block_2_total_size = block_2_data_size + 3; /* Header bytes */ - - block_3 = &eeprom[block_1_total_size + block_2_total_size]; - block_3_data_size = (block_3[0] &0x07); - block_3_total_size = block_3_data_size + 1; /* Header size */ - - block_4 = &eeprom[block_1_total_size +block_2_total_size +block_3_total_size]; - block_4_header_size = 1; - - model = (block_1[12] << 8 | block_1[11]); - revision = (block_1[15] << 16 | block_1[14] << 8 | block_1[13]); - - tuner_code = block_1[9]; - - no_audio_mux = ((block_3[3] >> 7) &0x01); - - if (no_audio_mux) bktr->audio_mux_present = 0; - - if (verbose) - printf("%s: Hauppauge Model %d %c%c%c%c\n", - bktr_name(bktr), - model, - ((revision >> 18) & 0x3f) + 32, - ((revision >> 12) & 0x3f) + 32, - ((revision >> 6) & 0x3f) + 32, - ((revision >> 0) & 0x3f) + 32 ); - - /* Determine the tuner type from the eeprom */ - - switch (tuner_code) { - - case 0x5: - case 0x0a: - case 0x1a: - select_tuner( bktr, PHILIPS_NTSC ); - goto checkDBX; - - case 0x4: - case 0x9: - select_tuner( bktr, PHILIPS_SECAM ); - goto checkDBX; - - case 0x11: - case 0x16: - select_tuner( bktr, PHILIPS_FR1236_SECAM ); - goto checkDBX; - - case 0x12: - case 0x17: - case 0x21: - select_tuner( bktr, PHILIPS_FR1236_NTSC ); - goto checkDBX; - - case 0x6: - case 0x8: - case 0xb: - case 0x1d: - case 0x23: - select_tuner( bktr, PHILIPS_PALI ); - goto checkDBX; - - case 0xd: - select_tuner( bktr, TEMIC_NTSC ); - goto checkDBX; - - case 0xe: - select_tuner( bktr, TEMIC_PAL ); - goto checkDBX; - - case 0xf: - select_tuner( bktr, TEMIC_PALI ); - goto checkDBX; - - case 0x15: - select_tuner( bktr, PHILIPS_FR1216_PAL ); - goto checkDBX; - - case 0x2a: - bktr->msp_use_mono_source = 1; - select_tuner( bktr, PHILIPS_FR1216_PAL ); - goto checkDBX; - - default : - printf("%s: Warning - Unknown Hauppauge Tuner 0x%x\n", - bktr_name(bktr), 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 make 0 (Philips) and make 2 (LG) the same */ - if ( ((tuner_make == 0) || (tuner_make == 2)) - && (tuner_format <= 9) && (tuner_tv_fm == 0) ) { - tuner = tuner_0_table[tuner_format]; - select_tuner( bktr, tuner ); - goto checkDBX; - } - - if ( ((tuner_make == 0) || (tuner_make == 2)) - && (tuner_format <= 9) && (tuner_tv_fm == 1) ) { - tuner = tuner_0_fm_table[tuner_format]; - select_tuner( bktr, tuner ); - goto checkDBX; - } - - if ( (tuner_make == 1) && (tuner_format <= 9) ) { - tuner = tuner_1_table[tuner_format]; - select_tuner( bktr, tuner ); - goto checkDBX; - } - - printf("%s: Warning - Unknown AVerMedia Tuner Make %d Format %d\n", - bktr_name(bktr), tuner_make, tuner_format); - } - break; - - case CARD_LEADTEK: -#if defined(BKTR_SYSTEM_DEFAULT) && BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL - select_tuner( bktr, PHILIPS_FR1216_PAL ); -#else - select_tuner( bktr, PHILIPS_FR1236_NTSC ); -#endif - goto checkDBX; - break; - - case CARD_IO_BCTV3: - select_tuner( bktr, ALPS_TSCH5 ); /* ALPS_TSCH6, in fact. */ - goto checkDBX; - break; - - case CARD_TERRATVALUE: - select_tuner( bktr, PHILIPS_PAL); /* Phlips PAL tuner */ - goto checkDBX; - break; - - } /* end switch(card) */ - - - /* At this point, a goto checkDBX has not occurred */ - /* 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 ) { - select_tuner( bktr, TEMIC_NTSC ); - goto checkDBX; - } - - /* At address 0xc6/0xc7 we often find a PHILIPS NTSC Tuner */ - if ( i2cRead( bktr, 0xc7 ) != ABSENT ) { - select_tuner( bktr, 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 */ - select_tuner( bktr, DEFAULT_TUNER ); - - -checkDBX: -#if defined( BKTR_OVERRIDE_DBX ) - bktr->card.dbx = BKTR_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) { - OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | (1<<5)); - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5)); /* write '1' */ - DELAY(2500); /* wait 2.5ms */ - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) & ~(1<<5)); /* write '0' */ - DELAY(2500); /* wait 2.5ms */ - OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5)); /* write '1' */ - DELAY(2500); /* wait 2.5ms */ - } -#endif - -#if defined( BKTR_OVERRIDE_MSP ) - bktr->card.msp3400c = BKTR_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: - - if (bktr->card.msp3400c) { - bktr->msp_addr = MSP3400C_WADDR; - msp_read_id( bktr ); - printf("%s: Detected a MSP%s at 0x%x\n", bktr_name(bktr), - bktr->msp_version_string, - bktr->msp_addr); - - } - -/* Check for Dolby Surround Sound DPL3518A sound chip */ - if ( i2cRead( bktr, DPL3518A_RADDR ) != ABSENT ) { - bktr->card.dpl3518a = 1; - } - - if (bktr->card.dpl3518a) { - bktr->dpl_addr = DPL3518A_WADDR; - dpl_read_id( bktr ); - printf("%s: Detected a DPL%s at 0x%x\n", bktr_name(bktr), - bktr->dpl_version_string, - bktr->dpl_addr); - } - -/* 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 OSPREY users */ - if (card == CARD_OSPREY) - 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; - - - /* Most (perhaps all) Bt878 cards need to be switched to PLL mode */ - /* as they only fit the NTSC crystal to their cards */ - /* Default to enabling PLL mode for all Bt878/879 cards */ - - if ((bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) ) - 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: %s", bktr_name(bktr), 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->card.dpl3518a ) - printf( ", dpl3518a dolby" ); - if ( bktr->remote_control ) - printf( ", remote control" ); - printf( ".\n" ); - } -} - -#undef ABSENT diff --git a/sys/dev/bktr/bktr_card.h b/sys/dev/bktr/bktr_card.h deleted file mode 100644 index 4229dc675605..000000000000 --- a/sys/dev/bktr/bktr_card.h +++ /dev/null @@ -1,97 +0,0 @@ -/* $FreeBSD$ */ - -/* - * 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_card : This deals with identifying TV cards. - * trying to find the card make and model of card. - * trying to find the type of tuner fitted. - * reading the configuration EEPROM. - * locating i2c devices. - * - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * If probeCard() fails to detect the correct card on boot you can - * override it by setting adding the following option to your kernel config - * options BKTR_OVERRIDE_CARD - * eg options BKTR_OVERRIDE CARD=1 - * - * or using the sysclt hw.bt848.card - * eg sysctl hw.bt848.card=1 - * - * where 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 /* Also for VideoLogic Captivator PCI */ -#define CARD_IMS_TURBO 5 -#define CARD_AVER_MEDIA 6 -#define CARD_OSPREY 7 -#define CARD_NEC_PK 8 -#define CARD_IO_BCTV2 9 -#define CARD_FLYVIDEO 10 -#define CARD_ZOLTRIX 11 -#define CARD_KISS 12 -#define CARD_VIDEO_HIGHWAY_XTREME 13 -#define CARD_ASKEY_DYNALINK_MAGIC_TVIEW 14 -#define CARD_LEADTEK 15 -#define CARD_TERRATVPLUS 16 -#define CARD_IO_BCTV3 17 -#define CARD_AOPEN_VA1000 18 -#define CARD_PINNACLE_PCTV_RAVE 19 -#define CARD_PIXELVIEW_PLAYTV_PAK 20 -#define CARD_TERRATVALUE 21 -#define CARD_PIXELVIEW_PLAYTV_PRO_REV_4C 22 -#define CARD_LEADTEK_WINFAST_2000_XP 23 -#define Bt848_MAX_CARD 24 - -#define CARD_IO_GV CARD_IO_BCTV2 - -int signCard( bktr_ptr_t bktr, int offset, int count, u_char* sig ); -void probeCard( bktr_ptr_t bktr, int verbose, int unit); - -int writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data ); -int readEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data ); - diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c deleted file mode 100644 index 1b32b893bca5..000000000000 --- a/sys/dev/bktr/bktr_core.c +++ /dev/null @@ -1,4316 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -/*- - * 1. Redistributions of source code must retain the - * Copyright (c) 1995 Mark Tinguely and Jim Lowe - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Mark Tinguely and Jim Lowe - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * 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 - Jim Lowe's driver for the Matrox Meteor PCI card . The - Philips SAA 7116 and SAA 7196 are very different chipsets than - the BT848. - - The original copyright notice by Mark and Jim is included mostly - to honor their fantastic work in the Matrox Meteor driver! - */ - -#include "opt_bktr.h" /* Include any kernel config options */ - -#if ( \ - (defined(__FreeBSD__)) \ - || (defined(__bsdi__)) \ - || (defined(__OpenBSD__)) \ - || (defined(__NetBSD__)) \ - ) - - -/*******************/ -/* *** FreeBSD *** */ -/*******************/ -#ifdef __FreeBSD__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include /* used by smbus and newbus */ - -#if (__FreeBSD_version < 500000) -#include /* for DELAY */ -#define PROC_LOCK(p) -#define PROC_UNLOCK(p) -#include -#else -#include -#endif - -#include -#include - -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include -#include -#include -#if defined(BKTR_FREEBSD_MODULE) -#include -#endif - -#if defined(BKTR_USE_FREEBSD_SMBUS) -#include -#include -#include -#include "smbus_if.h" -#include "iicbus_if.h" -#endif - -const char * -bktr_name(bktr_ptr_t bktr) -{ - return bktr->bktr_xname; -} - - -#endif /* __FreeBSD__ */ - - -/****************/ -/* *** BSDI *** */ -/****************/ -#ifdef __bsdi__ -#define PROC_LOCK(p) -#define PROC_UNLOCK(p) -#endif /* __bsdi__ */ - - -/**************************/ -/* *** OpenBSD/NetBSD *** */ -/**************************/ -#if defined(__NetBSD__) || defined(__OpenBSD__) - -#include -#include -#include -#include -#include - -#ifdef __NetBSD__ -#include -#else -#include -#include -#include -#include -#endif - -#include /* uintptr_t */ -#include -#include -#include -#include -#include -#include -#include - -static int bt848_format = -1; - -const char * -bktr_name(bktr_ptr_t bktr) -{ - return (bktr->bktr_dev.dv_xname); -} - -#define PROC_LOCK(p) -#define PROC_UNLOCK(p) - -#endif /* __NetBSD__ || __OpenBSD__ */ - - -typedef u_char bool_t; - -#define BKTRPRI (PZERO+8)|PCATCH -#define VBIPRI (PZERO-4)|PCATCH - - -/* - * memory allocated for DMA programs - */ -#define DMA_PROG_ALLOC (8 * PAGE_SIZE) - -/* When to split a dma transfer , the bt848 has timing as well as - dma transfer size limitations so that we have to split dma - transfers into two dma requests - */ -#define DMA_BT848_SPLIT 319*2 - -/* - * Allocate enough memory for: - * 768x576 RGB 16 or YUV (16 storage bits/pixel) = 884736 = 216 pages - * - * You may override this using the options "BROOKTREE_ALLOC_PAGES=value" - * in your kernel configuration file. - */ - -#ifndef BROOKTREE_ALLOC_PAGES -#define BROOKTREE_ALLOC_PAGES 217*4 -#endif -#define BROOKTREE_ALLOC (BROOKTREE_ALLOC_PAGES * PAGE_SIZE) - -/* Definitions for VBI capture. - * There are 16 VBI lines in a PAL video field (32 in a frame), - * and we take 2044 samples from each line (placed in a 2048 byte buffer - * for alignment). - * VBI lines are held in a circular buffer before being read by a - * user program from /dev/vbi. - */ - -#define MAX_VBI_LINES 16 /* Maximum for all vidoe formats */ -#define VBI_LINE_SIZE 2048 /* Store up to 2048 bytes per line */ -#define VBI_BUFFER_ITEMS 20 /* Number of frames we buffer */ -#define VBI_DATA_SIZE (VBI_LINE_SIZE * MAX_VBI_LINES * 2) -#define VBI_BUFFER_SIZE (VBI_DATA_SIZE * VBI_BUFFER_ITEMS) - - -/* Defines for fields */ -#define ODD_F 0x01 -#define EVEN_F 0x02 - - -/* - * Parameters describing size of transmitted image. - */ - -static struct format_params format_params[] = { -/* # define BT848_IFORM_F_AUTO (0x0) - don't matter. */ - { 525, 26, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_AUTO, - 12, 1600 }, -/* # define BT848_IFORM_F_NTSCM (0x1) */ - { 525, 26, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0, - 12, 1600 }, -/* # define BT848_IFORM_F_NTSCJ (0x2) */ - { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0, - 12, 1600 }, -/* # define BT848_IFORM_F_PALBDGHI (0x3) */ - { 625, 32, 576, 1135, 186, 924, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1, - 16, 2044 }, -/* # define BT848_IFORM_F_PALM (0x4) */ - { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0, - 12, 1600 }, -/* # define BT848_IFORM_F_PALN (0x5) */ - { 625, 32, 576, 1135, 186, 924, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1, - 16, 2044 }, -/* # define BT848_IFORM_F_SECAM (0x6) */ - { 625, 32, 576, 1135, 186, 924, 768, 944, 25, 0x7f, 0xa0, BT848_IFORM_X_XT1, - 16, 2044 }, -/* # define BT848_IFORM_F_RSVD (0x7) - ???? */ - { 625, 32, 576, 1135, 186, 924, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT0, - 16, 2044 }, -}; - -/* - * Table of supported Pixel Formats - */ - -static struct meteor_pixfmt_internal { - struct meteor_pixfmt public; - u_int color_fmt; -} pixfmt_table[] = { - -{ { 0, METEOR_PIXTYPE_RGB, 2, { 0x7c00, 0x03e0, 0x001f }, 0,0 }, 0x33 }, -{ { 0, METEOR_PIXTYPE_RGB, 2, { 0x7c00, 0x03e0, 0x001f }, 1,0 }, 0x33 }, - -{ { 0, METEOR_PIXTYPE_RGB, 2, { 0xf800, 0x07e0, 0x001f }, 0,0 }, 0x22 }, -{ { 0, METEOR_PIXTYPE_RGB, 2, { 0xf800, 0x07e0, 0x001f }, 1,0 }, 0x22 }, - -{ { 0, METEOR_PIXTYPE_RGB, 3, { 0xff0000,0x00ff00,0x0000ff }, 1,0 }, 0x11 }, - -{ { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 0,0 }, 0x00 }, -{ { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 0,1 }, 0x00 }, -{ { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 1,0 }, 0x00 }, -{ { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x00 }, -{ { 0, METEOR_PIXTYPE_YUV, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x88 }, -{ { 0, METEOR_PIXTYPE_YUV_PACKED, 2, { 0xff0000,0x00ff00,0x0000ff }, 0,1 }, 0x44 }, -{ { 0, METEOR_PIXTYPE_YUV_12, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x88 }, - -}; -#define PIXFMT_TABLE_SIZE nitems(pixfmt_table) - -/* - * Table of Meteor-supported Pixel Formats (for SETGEO compatibility) - */ - -/* FIXME: Also add YUV_422 and YUV_PACKED as well */ -static struct { - u_long meteor_format; - struct meteor_pixfmt public; -} meteor_pixfmt_table[] = { - { METEOR_GEO_YUV_12, - { 0, METEOR_PIXTYPE_YUV_12, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 } - }, - - /* FIXME: Should byte swap flag be on for this one; negative in drvr? */ - { METEOR_GEO_YUV_422, - { 0, METEOR_PIXTYPE_YUV, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 } - }, - { METEOR_GEO_YUV_PACKED, - { 0, METEOR_PIXTYPE_YUV_PACKED, 2, { 0xff0000,0x00ff00,0x0000ff }, 0,1 } - }, - { METEOR_GEO_RGB16, - { 0, METEOR_PIXTYPE_RGB, 2, { 0x7c00, 0x03e0, 0x001f }, 0, 0 } - }, - { METEOR_GEO_RGB24, - { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000, 0x00ff00, 0x0000ff }, 0, 0 } - }, - -}; -#define METEOR_PIXFMT_TABLE_SIZE nitems(meteor_pixfmt_table) - - -#define BSWAP (BT848_COLOR_CTL_BSWAP_ODD | BT848_COLOR_CTL_BSWAP_EVEN) -#define WSWAP (BT848_COLOR_CTL_WSWAP_ODD | BT848_COLOR_CTL_WSWAP_EVEN) - - - -/* sync detect threshold */ -#if 0 -#define SYNC_LEVEL (BT848_ADC_RESERVED | \ - BT848_ADC_CRUSH) /* threshold ~125 mV */ -#else -#define SYNC_LEVEL (BT848_ADC_RESERVED | \ - BT848_ADC_SYNC_T) /* threshold ~75 mV */ -#endif - - - - -/* debug utility for holding previous INT_STAT contents */ -#define STATUS_SUM -static u_long status_sum = 0; - -/* - * defines to make certain bit-fiddles understandable - */ -#define FIFO_ENABLED BT848_DMA_CTL_FIFO_EN -#define RISC_ENABLED BT848_DMA_CTL_RISC_EN -#define FIFO_RISC_ENABLED (BT848_DMA_CTL_FIFO_EN | BT848_DMA_CTL_RISC_EN) -#define FIFO_RISC_DISABLED 0 - -#define ALL_INTS_DISABLED 0 -#define ALL_INTS_CLEARED 0xffffffff -#define CAPTURE_OFF 0 - -#define BIT_SEVEN_HIGH (1<<7) -#define BIT_EIGHT_HIGH (1<<8) - -#define I2C_BITS (BT848_INT_RACK | BT848_INT_I2CDONE) -#define TDEC_BITS (BT848_INT_FDSR | BT848_INT_FBUS) - - - -static int oformat_meteor_to_bt( u_long format ); - -static u_int pixfmt_swap_flags( int pixfmt ); - -/* - * bt848 RISC programming routines. - */ -#ifdef BT848_DUMP -static int dump_bt848( bktr_ptr_t bktr ); -#endif - -static void yuvpack_prog( bktr_ptr_t bktr, char i_flag, int cols, - int rows, int interlace ); -static void yuv422_prog( bktr_ptr_t bktr, char i_flag, int cols, - int rows, int interlace ); -static void yuv12_prog( bktr_ptr_t bktr, char i_flag, int cols, - int rows, int interlace ); -static void rgb_prog( bktr_ptr_t bktr, char i_flag, int cols, - int rows, int interlace ); -static void rgb_vbi_prog( bktr_ptr_t bktr, char i_flag, int cols, - int rows, int interlace ); -static void build_dma_prog( bktr_ptr_t bktr, char i_flag ); - -static bool_t getline(bktr_reg_t *, int); -static bool_t notclipped(bktr_reg_t * , int , int); -static bool_t split(bktr_reg_t *, volatile uint32_t **, int, u_long, int, - volatile u_char ** , int ); - -static void start_capture( bktr_ptr_t bktr, unsigned type ); -static void set_fps( bktr_ptr_t bktr, u_short fps ); - - - -/* - * Remote Control Functions - */ -static void remote_read(bktr_ptr_t bktr, struct bktr_remote *remote); - - -/* - * ioctls common to both video & tuner. - */ -static int common_ioctl( bktr_ptr_t bktr, ioctl_cmd_t cmd, caddr_t arg ); - - -#if !defined(BKTR_USE_FREEBSD_SMBUS) -/* - * i2c primitives for low level control of i2c bus. Added for MSP34xx control - */ -static void i2c_start( bktr_ptr_t bktr); -static void i2c_stop( bktr_ptr_t bktr); -static int i2c_write_byte( bktr_ptr_t bktr, unsigned char data); -static int i2c_read_byte( bktr_ptr_t bktr, unsigned char *data, int last ); -#endif - - - -/* - * the common attach code, used by all OS versions. - */ -void -common_bktr_attach( bktr_ptr_t bktr, int unit, u_long pci_id, u_int rev ) -{ - vm_offset_t buf = 0; - int need_to_allocate_memory = 1; -#ifdef BKTR_NEW_MSP34XX_DRIVER - int err; -#endif - -/***************************************/ -/* *** OS Specific memory routines *** */ -/***************************************/ -#if defined(__NetBSD__) || defined(__OpenBSD__) - /* allocate space for dma program */ - bktr->dma_prog = get_bktr_mem(bktr, &bktr->dm_prog, - DMA_PROG_ALLOC); - bktr->odd_dma_prog = get_bktr_mem(bktr, &bktr->dm_oprog, - DMA_PROG_ALLOC); - - /* allocate space for the VBI buffer */ - bktr->vbidata = get_bktr_mem(bktr, &bktr->dm_vbidata, - VBI_DATA_SIZE); - bktr->vbibuffer = get_bktr_mem(bktr, &bktr->dm_vbibuffer, - VBI_BUFFER_SIZE); - - /* allocate space for pixel buffer */ - if ( BROOKTREE_ALLOC ) - buf = get_bktr_mem(bktr, &bktr->dm_mem, BROOKTREE_ALLOC); - else - buf = 0; -#endif - -#if defined(__FreeBSD__) || defined(__bsdi__) - -/* If this is a module, check if there is any currently saved contiguous memory */ -#if defined(BKTR_FREEBSD_MODULE) - if (bktr_has_stored_addresses(unit) == 1) { - /* recover the addresses */ - bktr->dma_prog = bktr_retrieve_address(unit, BKTR_MEM_DMA_PROG); - bktr->odd_dma_prog = bktr_retrieve_address(unit, BKTR_MEM_ODD_DMA_PROG); - bktr->vbidata = bktr_retrieve_address(unit, BKTR_MEM_VBIDATA); - bktr->vbibuffer = bktr_retrieve_address(unit, BKTR_MEM_VBIBUFFER); - buf = bktr_retrieve_address(unit, BKTR_MEM_BUF); - need_to_allocate_memory = 0; - } -#endif - - if (need_to_allocate_memory == 1) { - /* allocate space for dma program */ - bktr->dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC); - bktr->odd_dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC); - - /* allocte space for the VBI buffer */ - bktr->vbidata = get_bktr_mem(unit, VBI_DATA_SIZE); - bktr->vbibuffer = get_bktr_mem(unit, VBI_BUFFER_SIZE); - - /* allocate space for pixel buffer */ - if ( BROOKTREE_ALLOC ) - buf = get_bktr_mem(unit, BROOKTREE_ALLOC); - else - buf = 0; - } -#endif /* FreeBSD or BSDi */ - -#ifdef USE_VBIMUTEX - mtx_init(&bktr->vbimutex, "bktr vbi lock", NULL, MTX_DEF); -#endif - -/* If this is a module, save the current contiguous memory */ -#if defined(BKTR_FREEBSD_MODULE) -bktr_store_address(unit, BKTR_MEM_DMA_PROG, bktr->dma_prog); -bktr_store_address(unit, BKTR_MEM_ODD_DMA_PROG, bktr->odd_dma_prog); -bktr_store_address(unit, BKTR_MEM_VBIDATA, bktr->vbidata); -bktr_store_address(unit, BKTR_MEM_VBIBUFFER, bktr->vbibuffer); -bktr_store_address(unit, BKTR_MEM_BUF, buf); -#endif - - - if ( bootverbose ) { - printf("%s: buffer size %d, addr %p\n", - bktr_name(bktr), (int)BROOKTREE_ALLOC, - (void *)(uintptr_t)vtophys(buf)); - } - - if ( buf != 0 ) { - bktr->bigbuf = buf; - bktr->alloc_pages = BROOKTREE_ALLOC_PAGES; - bzero((caddr_t) bktr->bigbuf, BROOKTREE_ALLOC); - } else { - bktr->alloc_pages = 0; - } - - - bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE | - METEOR_DEV0 | METEOR_RGB16; - bktr->dma_prog_loaded = FALSE; - bktr->cols = 640; - bktr->rows = 480; - bktr->frames = 1; /* one frame */ - bktr->format = METEOR_GEO_RGB16; - bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); - bktr->pixfmt_compat = TRUE; - - - bktr->vbiinsert = 0; - bktr->vbistart = 0; - bktr->vbisize = 0; - bktr->vbiflags = 0; - - - /* using the pci device id and revision id */ - /* and determine the card type */ - if (BKTR_PCI_VENDOR(pci_id) == PCI_VENDOR_BROOKTREE) - { - switch (BKTR_PCI_PRODUCT(pci_id)) { - case PCI_PRODUCT_BROOKTREE_BT848: - if (rev == 0x12) - bktr->id = BROOKTREE_848A; - else - bktr->id = BROOKTREE_848; - break; - case PCI_PRODUCT_BROOKTREE_BT849: - bktr->id = BROOKTREE_849A; - break; - case PCI_PRODUCT_BROOKTREE_BT878: - bktr->id = BROOKTREE_878; - break; - case PCI_PRODUCT_BROOKTREE_BT879: - bktr->id = BROOKTREE_879; - break; - } - } - - bktr->clr_on_start = FALSE; - - /* defaults for the tuner section of the card */ - bktr->tflags = TUNER_INITALIZED; - bktr->tuner.frequency = 0; - bktr->tuner.channel = 0; - bktr->tuner.chnlset = DEFAULT_CHNLSET; - bktr->tuner.afc = 0; - bktr->tuner.radio_mode = 0; - bktr->audio_mux_select = 0; - bktr->audio_mute_state = FALSE; - bktr->bt848_card = -1; - bktr->bt848_tuner = -1; - bktr->reverse_mute = -1; - bktr->slow_msp_audio = 0; - bktr->msp_use_mono_source = 0; - bktr->msp_source_selected = -1; - bktr->audio_mux_present = 1; - -#if defined(__FreeBSD__) -#ifdef BKTR_NEW_MSP34XX_DRIVER - /* get hint on short programming of the msp34xx, so we know */ - /* if the decision what thread to start should be overwritten */ - if ( (err = resource_int_value("bktr", unit, "mspsimple", - &(bktr->mspsimple)) ) != 0 ) - bktr->mspsimple = -1; /* fall back to default */ -#endif -#endif - - probeCard( bktr, TRUE, unit ); - - /* Initialise any MSP34xx or TDA98xx audio chips */ - init_audio_devices( bktr ); - -#ifdef BKTR_NEW_MSP34XX_DRIVER - /* setup the kernel thread */ - err = msp_attach( bktr ); - if ( err != 0 ) /* error doing kernel thread stuff, disable msp3400c */ - bktr->card.msp3400c = 0; -#endif - - -} - - -/* Copy the vbi lines from 'vbidata' into the circular buffer, 'vbibuffer'. - * The circular buffer holds 'n' fixed size data blocks. - * vbisize is the number of bytes in the circular buffer - * vbiread is the point we reading data out of the circular buffer - * vbiinsert is the point we insert data into the circular buffer - */ -static void vbidecode(bktr_ptr_t bktr) { - unsigned char *dest; - unsigned int *seq_dest; - - /* Check if there is room in the buffer to insert the data. */ - if (bktr->vbisize + VBI_DATA_SIZE > VBI_BUFFER_SIZE) return; - - /* Copy the VBI data into the next free slot in the buffer. */ - /* 'dest' is the point in vbibuffer where we want to insert new data */ - dest = (unsigned char *)bktr->vbibuffer + bktr->vbiinsert; - memcpy(dest, (unsigned char*)bktr->vbidata, VBI_DATA_SIZE); - - /* Write the VBI sequence number to the end of the vbi data */ - /* This is used by the AleVT teletext program */ - seq_dest = (unsigned int *)((unsigned char *)bktr->vbibuffer - + bktr->vbiinsert - + (VBI_DATA_SIZE - sizeof(bktr->vbi_sequence_number))); - *seq_dest = bktr->vbi_sequence_number; - - /* And increase the VBI sequence number */ - /* This can wrap around */ - bktr->vbi_sequence_number++; - - - /* Increment the vbiinsert pointer */ - /* This can wrap around */ - bktr->vbiinsert += VBI_DATA_SIZE; - bktr->vbiinsert = (bktr->vbiinsert % VBI_BUFFER_SIZE); - - /* And increase the amount of vbi data in the buffer */ - bktr->vbisize = bktr->vbisize + VBI_DATA_SIZE; - -} - - -/* - * the common interrupt handler. - * Returns a 0 or 1 depending on whether the interrupt has handled. - * In the OS specific section, bktr_intr() is defined which calls this - * common interrupt handler. - */ -int -common_bktr_intr( void *arg ) -{ - bktr_ptr_t bktr; - u_long bktr_status; - u_char dstatus; - u_long field; - u_long w_field; - u_long req_field; - - bktr = (bktr_ptr_t) arg; - - /* - * check to see if any interrupts are unmasked on this device. If - * none are, then we likely got here by way of being on a PCI shared - * interrupt dispatch list. - */ - if (INL(bktr, BKTR_INT_MASK) == ALL_INTS_DISABLED) - return 0; /* bail out now, before we do something we - shouldn't */ - - if (!(bktr->flags & METEOR_OPEN)) { - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - /* return; ?? */ - } - - /* record and clear the INTerrupt status bits */ - bktr_status = INL(bktr, BKTR_INT_STAT); - OUTL(bktr, BKTR_INT_STAT, bktr_status & ~I2C_BITS); /* don't touch i2c */ - - /* record and clear the device status register */ - dstatus = INB(bktr, BKTR_DSTATUS); - OUTB(bktr, BKTR_DSTATUS, 0x00); - -#if defined( STATUS_SUM ) - /* add any new device status or INTerrupt status bits */ - status_sum |= (bktr_status & ~(BT848_INT_RSV0|BT848_INT_RSV1)); - status_sum |= ((dstatus & (BT848_DSTATUS_COF|BT848_DSTATUS_LOF)) << 6); -#endif /* STATUS_SUM */ - /* printf( "%s: STATUS %x %x %x \n", bktr_name(bktr), - dstatus, bktr_status, INL(bktr, BKTR_RISC_COUNT) ); - */ - - - /* if risc was disabled re-start process again */ - /* if there was one of the following errors re-start again */ - if ( !(bktr_status & BT848_INT_RISC_EN) || - ((bktr_status &(/* BT848_INT_FBUS | */ - /* BT848_INT_FTRGT | */ - /* BT848_INT_FDSR | */ - BT848_INT_PPERR | - BT848_INT_RIPERR | BT848_INT_PABORT | - BT848_INT_OCERR | BT848_INT_SCERR) ) != 0) - || ((INB(bktr, BKTR_TDEC) == 0) && (bktr_status & TDEC_BITS)) ) { - - u_short tdec_save = INB(bktr, BKTR_TDEC); - - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF); - - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - - /* Reset temporal decimation counter */ - OUTB(bktr, BKTR_TDEC, 0); - OUTB(bktr, BKTR_TDEC, tdec_save); - - /* Reset to no-fields captured state */ - if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) { - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - break; - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - break; - } - } - - OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog)); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol); - - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT | - BT848_INT_RISCI | - BT848_INT_VSYNC | - BT848_INT_FMTCHG); - - OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl); - return 1; - } - - /* If this is not a RISC program interrupt, return */ - if (!(bktr_status & BT848_INT_RISCI)) - return 0; - -/** - printf( "%s: intr status %x %x %x\n", bktr_name(bktr), - bktr_status, dstatus, INL(bktr, BKTR_RISC_COUNT) ); - */ - - - /* - * Disable future interrupts if a capture mode is not selected. - * This can happen when we are in the process of closing or - * changing capture modes, otherwise it shouldn't happen. - */ - if (!(bktr->flags & METEOR_CAP_MASK)) - OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF); - - - /* Determine which field generated this interrupt */ - field = ( bktr_status & BT848_INT_FIELD ) ? EVEN_F : ODD_F; - - - /* - * Process the VBI data if it is being captured. We do this once - * both Odd and Even VBI data is captured. Therefore we do this - * in the Even field interrupt handler. - */ - LOCK_VBI(bktr); - if ( (bktr->vbiflags & VBI_CAPTURE) - &&(bktr->vbiflags & VBI_OPEN) - &&(field==EVEN_F)) { - /* Put VBI data into circular buffer */ - vbidecode(bktr); - - /* If someone is blocked on reading from /dev/vbi, wake them */ - if (bktr->vbi_read_blocked) { - bktr->vbi_read_blocked = FALSE; - wakeup(VBI_SLEEP); - } - - /* If someone has a select() on /dev/vbi, inform them */ - if (SEL_WAITING(&bktr->vbi_select)) { - selwakeuppri(&bktr->vbi_select, VBIPRI); - } - - - } - UNLOCK_VBI(bktr); - - /* - * Register the completed field - * (For dual-field mode, require fields from the same frame) - */ - switch ( bktr->flags & METEOR_WANT_MASK ) { - case METEOR_WANT_ODD : w_field = ODD_F ; break; - case METEOR_WANT_EVEN : w_field = EVEN_F ; break; - default : w_field = (ODD_F|EVEN_F); break; - } - switch ( bktr->flags & METEOR_ONLY_FIELDS_MASK ) { - case METEOR_ONLY_ODD_FIELDS : req_field = ODD_F ; break; - case METEOR_ONLY_EVEN_FIELDS : req_field = EVEN_F ; break; - default : req_field = (ODD_F|EVEN_F); - break; - } - - if (( field == EVEN_F ) && ( w_field == EVEN_F )) - bktr->flags &= ~METEOR_WANT_EVEN; - else if (( field == ODD_F ) && ( req_field == ODD_F ) && - ( w_field == ODD_F )) - bktr->flags &= ~METEOR_WANT_ODD; - else if (( field == ODD_F ) && ( req_field == (ODD_F|EVEN_F) ) && - ( w_field == (ODD_F|EVEN_F) )) - bktr->flags &= ~METEOR_WANT_ODD; - else if (( field == ODD_F ) && ( req_field == (ODD_F|EVEN_F) ) && - ( w_field == ODD_F )) { - bktr->flags &= ~METEOR_WANT_ODD; - bktr->flags |= METEOR_WANT_EVEN; - } - else { - /* We're out of sync. Start over. */ - if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) { - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - break; - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - break; - } - } - return 1; - } - - /* - * If we have a complete frame. - */ - if (!(bktr->flags & METEOR_WANT_MASK)) { - bktr->frames_captured++; - /* - * post the completion time. - */ - if (bktr->flags & METEOR_WANT_TS) { - struct timeval *ts; - - if ((u_int) bktr->alloc_pages * PAGE_SIZE - <= (bktr->frame_size + sizeof(struct timeval))) { - ts =(struct timeval *)bktr->bigbuf + - bktr->frame_size; - /* doesn't work in synch mode except - * for first frame */ - /* XXX */ - microtime(ts); - } - } - - - /* - * Wake up the user in single capture mode. - */ - if (bktr->flags & METEOR_SINGLE) { - - /* stop dma */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - - /* disable risc, leave fifo running */ - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - wakeup(BKTR_SLEEP); - } - - /* - * If the user requested to be notified via signal, - * let them know the frame is complete. - */ - - if (bktr->proc != NULL) { - PROC_LOCK(bktr->proc); - kern_psignal( bktr->proc, bktr->signal); - PROC_UNLOCK(bktr->proc); - } - - /* - * Reset the want flags if in continuous or - * synchronous capture mode. - */ -/* -* XXX NOTE (Luigi): -* currently we only support 3 capture modes: odd only, even only, -* odd+even interlaced (odd field first). A fourth mode (non interlaced, -* either even OR odd) could provide 60 (50 for PAL) pictures per -* second, but it would require this routine to toggle the desired frame -* each time, and one more different DMA program for the Bt848. -* As a consequence, this fourth mode is currently unsupported. -*/ - - if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) { - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - break; - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - break; - } - } - } - - return 1; -} - - - - -/* - * - */ -extern int bt848_format; /* used to set the default format, PAL or NTSC */ -int -video_open( bktr_ptr_t bktr ) -{ - int frame_rate, video_format=0; - - if (bktr->flags & METEOR_OPEN) /* device is busy */ - return( EBUSY ); - - bktr->flags |= METEOR_OPEN; - -#ifdef BT848_DUMP - dump_bt848(bktr); -#endif - - bktr->clr_on_start = FALSE; - - OUTB(bktr, BKTR_DSTATUS, 0x00); /* clear device status reg. */ - - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - -#if defined(BKTR_SYSTEM_DEFAULT) && BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL - video_format = 0; -#else - video_format = 1; -#endif - - if (bt848_format == 0 ) - video_format = 0; - - if (bt848_format == 1 ) - video_format = 1; - - if (video_format == 1 ) { - OUTB(bktr, BKTR_IFORM, BT848_IFORM_F_NTSCM); - bktr->format_params = BT848_IFORM_F_NTSCM; - - } else { - OUTB(bktr, BKTR_IFORM, BT848_IFORM_F_PALBDGHI); - bktr->format_params = BT848_IFORM_F_PALBDGHI; - - } - - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | format_params[bktr->format_params].iform_xtsel); - - /* work around for new Hauppauge 878 cards */ - if ((bktr->card.card_id == CARD_HAUPPAUGE) && - (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) ) - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3); - else - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1); - - OUTB(bktr, BKTR_ADELAY, format_params[bktr->format_params].adelay); - OUTB(bktr, BKTR_BDELAY, format_params[bktr->format_params].bdelay); - frame_rate = format_params[bktr->format_params].frame_rate; - - /* enable PLL mode using 28Mhz crystal for PAL/SECAM users */ - if (bktr->xtal_pll_mode == BT848_USE_PLL) { - OUTB(bktr, BKTR_TGCTRL, 0); - OUTB(bktr, BKTR_PLL_F_LO, 0xf9); - OUTB(bktr, BKTR_PLL_F_HI, 0xdc); - OUTB(bktr, BKTR_PLL_F_XCI, 0x8e); - } - - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; - - bktr->max_clip_node = 0; - - OUTB(bktr, BKTR_COLOR_CTL, BT848_COLOR_CTL_GAMMA | BT848_COLOR_CTL_RGB_DED); - - OUTB(bktr, BKTR_E_HSCALE_LO, 170); - OUTB(bktr, BKTR_O_HSCALE_LO, 170); - - OUTB(bktr, BKTR_E_DELAY_LO, 0x72); - OUTB(bktr, BKTR_O_DELAY_LO, 0x72); - OUTB(bktr, BKTR_E_SCLOOP, 0); - OUTB(bktr, BKTR_O_SCLOOP, 0); - - OUTB(bktr, BKTR_VBI_PACK_SIZE, 0); - OUTB(bktr, BKTR_VBI_PACK_DEL, 0); - - bktr->fifo_errors = 0; - bktr->dma_errors = 0; - bktr->frames_captured = 0; - bktr->even_fields_captured = 0; - bktr->odd_fields_captured = 0; - bktr->proc = NULL; - set_fps(bktr, frame_rate); - bktr->video.addr = 0; - bktr->video.width = 0; - bktr->video.banksize = 0; - bktr->video.ramsize = 0; - bktr->pixfmt_compat = TRUE; - bktr->format = METEOR_GEO_RGB16; - bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); - - bktr->capture_area_enabled = FALSE; - - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT); /* if you take this out triton - based motherboards will - operate unreliably */ - return( 0 ); -} - -int -vbi_open( bktr_ptr_t bktr ) -{ - - LOCK_VBI(bktr); - - if (bktr->vbiflags & VBI_OPEN) { /* device is busy */ - UNLOCK_VBI(bktr); - return( EBUSY ); - } - - bktr->vbiflags |= VBI_OPEN; - - /* reset the VBI circular buffer pointers and clear the buffers */ - bktr->vbiinsert = 0; - bktr->vbistart = 0; - bktr->vbisize = 0; - bktr->vbi_sequence_number = 0; - bktr->vbi_read_blocked = FALSE; - - bzero((caddr_t) bktr->vbibuffer, VBI_BUFFER_SIZE); - bzero((caddr_t) bktr->vbidata, VBI_DATA_SIZE); - - UNLOCK_VBI(bktr); - - return( 0 ); -} - -/* - * - */ -int -tuner_open( bktr_ptr_t bktr ) -{ - if ( !(bktr->tflags & TUNER_INITALIZED) ) /* device not found */ - return( ENXIO ); - - if ( bktr->tflags & TUNER_OPEN ) /* already open */ - return( 0 ); - - bktr->tflags |= TUNER_OPEN; - bktr->tuner.frequency = 0; - bktr->tuner.channel = 0; - bktr->tuner.chnlset = DEFAULT_CHNLSET; - bktr->tuner.afc = 0; - bktr->tuner.radio_mode = 0; - - /* enable drivers on the GPIO port that control the MUXes */ - OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | bktr->card.gpio_mux_bits); - - /* unmute the audio stream */ - set_audio( bktr, AUDIO_UNMUTE ); - - /* Initialise any audio chips, eg MSP34xx or TDA98xx */ - init_audio_devices( bktr ); - - return( 0 ); -} - - - - -/* - * - */ -int -video_close( bktr_ptr_t bktr ) -{ - bktr->flags &= ~(METEOR_OPEN | - METEOR_SINGLE | - METEOR_CAP_MASK | - METEOR_WANT_MASK); - - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF); - - bktr->dma_prog_loaded = FALSE; - OUTB(bktr, BKTR_TDEC, 0); - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - -/** FIXME: is 0xf magic, wouldn't 0x00 work ??? */ - OUTL(bktr, BKTR_SRESET, 0xf); - OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED); - - return( 0 ); -} - - -/* - * tuner close handle, - * place holder for tuner specific operations on a close. - */ -int -tuner_close( bktr_ptr_t bktr ) -{ - bktr->tflags &= ~TUNER_OPEN; - - /* mute the audio by switching the mux */ - set_audio( bktr, AUDIO_MUTE ); - - /* disable drivers on the GPIO port that control the MUXes */ - OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) & ~bktr->card.gpio_mux_bits); - - return( 0 ); -} - -int -vbi_close( bktr_ptr_t bktr ) -{ - - LOCK_VBI(bktr); - - bktr->vbiflags &= ~VBI_OPEN; - - UNLOCK_VBI(bktr); - - return( 0 ); -} - -/* - * - */ -int -video_read(bktr_ptr_t bktr, int unit, struct cdev *dev, struct uio *uio) -{ - int status; - int count; - - - if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */ - return( ENOMEM ); - - if (bktr->flags & METEOR_CAP_MASK) - return( EIO ); /* already capturing */ - - OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl); - - - count = bktr->rows * bktr->cols * - pixfmt_table[ bktr->pixfmt ].public.Bpp; - - if ((int) uio->uio_iov->iov_len < count) - return( EINVAL ); - - bktr->flags &= ~(METEOR_CAP_MASK | METEOR_WANT_MASK); - - /* capture one frame */ - start_capture(bktr, METEOR_SINGLE); - /* wait for capture to complete */ - OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol); - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT | - BT848_INT_RISCI | - BT848_INT_VSYNC | - BT848_INT_FMTCHG); - - - status = tsleep(BKTR_SLEEP, BKTRPRI, "captur", 0); - if (!status) /* successful capture */ - status = uiomove((caddr_t)bktr->bigbuf, count, uio); - else - printf ("%s: read: tsleep error %d\n", - bktr_name(bktr), status); - - bktr->flags &= ~(METEOR_SINGLE | METEOR_WANT_MASK); - - return( status ); -} - -/* - * Read VBI data from the vbi circular buffer - * The buffer holds vbi data blocks which are the same size - * vbiinsert is the position we will insert the next item into the buffer - * vbistart is the actual position in the buffer we want to read from - * vbisize is the exact number of bytes in the buffer left to read - */ -int -vbi_read(bktr_ptr_t bktr, struct uio *uio, int ioflag) -{ - int readsize, readsize2, start; - int status; - - /* - * XXX - vbi_read() should be protected against being re-entered - * while it is unlocked for the uiomove. - */ - LOCK_VBI(bktr); - - while(bktr->vbisize == 0) { - if (ioflag & FNDELAY) { - status = EWOULDBLOCK; - goto out; - } - - bktr->vbi_read_blocked = TRUE; -#ifdef USE_VBIMUTEX - if ((status = msleep(VBI_SLEEP, &bktr->vbimutex, VBIPRI, "vbi", - 0))) { - goto out; - } -#else - if ((status = tsleep(VBI_SLEEP, VBIPRI, "vbi", 0))) { - goto out; - } -#endif - } - - /* Now we have some data to give to the user */ - - /* We cannot read more bytes than there are in - * the circular buffer - */ - readsize = (int)uio->uio_iov->iov_len; - - if (readsize > bktr->vbisize) readsize = bktr->vbisize; - - /* Check if we can read this number of bytes without having - * to wrap around the circular buffer */ - if((bktr->vbistart + readsize) >= VBI_BUFFER_SIZE) { - /* We need to wrap around */ - - readsize2 = VBI_BUFFER_SIZE - bktr->vbistart; - start = bktr->vbistart; - UNLOCK_VBI(bktr); - status = uiomove((caddr_t)bktr->vbibuffer + start, readsize2, uio); - if (status == 0) - status = uiomove((caddr_t)bktr->vbibuffer, (readsize - readsize2), uio); - } else { - UNLOCK_VBI(bktr); - /* We do not need to wrap around */ - status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize, uio); - } - - LOCK_VBI(bktr); - - /* Update the number of bytes left to read */ - bktr->vbisize -= readsize; - - /* Update vbistart */ - bktr->vbistart += readsize; - bktr->vbistart = bktr->vbistart % VBI_BUFFER_SIZE; /* wrap around if needed */ - -out: - UNLOCK_VBI(bktr); - - return( status ); - -} - - - -/* - * video ioctls - */ -int -video_ioctl( bktr_ptr_t bktr, int unit, ioctl_cmd_t cmd, caddr_t arg, struct thread* td ) -{ - volatile u_char c_temp; - unsigned int temp; - unsigned int temp_iform; - unsigned int error; - struct meteor_geomet *geo; - struct meteor_counts *counts; - struct meteor_video *video; - struct bktr_capture_area *cap_area; - vm_offset_t buf; - int i; - int sig; - char char_temp; - - switch ( cmd ) { - - case BT848SCLIP: /* set clip region */ - bktr->max_clip_node = 0; - memcpy(&bktr->clip_list, arg, sizeof(bktr->clip_list)); - - for (i = 0; i < BT848_MAX_CLIP_NODE; i++) { - if (bktr->clip_list[i].y_min == 0 && - bktr->clip_list[i].y_max == 0) - break; - } - bktr->max_clip_node = i; - - /* make sure that the list contains a valid clip secquence */ - /* the clip rectangles should be sorted by x then by y as the - second order sort key */ - - /* clip rectangle list is terminated by y_min and y_max set to 0 */ - - /* to disable clipping set y_min and y_max to 0 in the first - clip rectangle . The first clip rectangle is clip_list[0]. - */ - - - - if (bktr->max_clip_node == 0 && - (bktr->clip_list[0].y_min != 0 && - bktr->clip_list[0].y_max != 0)) { - return EINVAL; - } - - for (i = 0; i < BT848_MAX_CLIP_NODE - 1 ; i++) { - if (bktr->clip_list[i].y_min == 0 && - bktr->clip_list[i].y_max == 0) { - break; - } - if ( bktr->clip_list[i+1].y_min != 0 && - bktr->clip_list[i+1].y_max != 0 && - bktr->clip_list[i].x_min > bktr->clip_list[i+1].x_min ) { - - bktr->max_clip_node = 0; - return (EINVAL); - - } - - if (bktr->clip_list[i].x_min >= bktr->clip_list[i].x_max || - bktr->clip_list[i].y_min >= bktr->clip_list[i].y_max || - bktr->clip_list[i].x_min < 0 || - bktr->clip_list[i].x_max < 0 || - bktr->clip_list[i].y_min < 0 || - bktr->clip_list[i].y_max < 0 ) { - bktr->max_clip_node = 0; - return (EINVAL); - } - } - - bktr->dma_prog_loaded = FALSE; - - break; - - case METEORSTATUS: /* get Bt848 status */ - c_temp = INB(bktr, BKTR_DSTATUS); - temp = 0; - if (!(c_temp & 0x40)) temp |= METEOR_STATUS_HCLK; - if (!(c_temp & 0x10)) temp |= METEOR_STATUS_FIDT; - *(u_short *)arg = temp; - break; - - case BT848SFMT: /* set input format */ - temp = *(unsigned long*)arg & BT848_IFORM_FORMAT; - temp_iform = INB(bktr, BKTR_IFORM); - temp_iform &= ~BT848_IFORM_FORMAT; - temp_iform &= ~BT848_IFORM_XTSEL; - OUTB(bktr, BKTR_IFORM, (temp_iform | temp | format_params[temp].iform_xtsel)); - switch( temp ) { - case BT848_IFORM_F_AUTO: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_AUTOMODE; - break; - - case BT848_IFORM_F_NTSCM: - case BT848_IFORM_F_NTSCJ: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_NTSC; - OUTB(bktr, BKTR_ADELAY, format_params[temp].adelay); - OUTB(bktr, BKTR_BDELAY, format_params[temp].bdelay); - bktr->format_params = temp; - break; - - case BT848_IFORM_F_PALBDGHI: - case BT848_IFORM_F_PALN: - case BT848_IFORM_F_SECAM: - case BT848_IFORM_F_RSVD: - case BT848_IFORM_F_PALM: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_PAL; - OUTB(bktr, BKTR_ADELAY, format_params[temp].adelay); - OUTB(bktr, BKTR_BDELAY, format_params[temp].bdelay); - bktr->format_params = temp; - break; - - } - bktr->dma_prog_loaded = FALSE; - break; - - case METEORSFMT: /* set input format */ - temp_iform = INB(bktr, BKTR_IFORM); - temp_iform &= ~BT848_IFORM_FORMAT; - temp_iform &= ~BT848_IFORM_XTSEL; - switch(*(unsigned long *)arg & METEOR_FORM_MASK ) { - case 0: /* default */ - case METEOR_FMT_NTSC: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_NTSC; - OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_NTSCM | - format_params[BT848_IFORM_F_NTSCM].iform_xtsel); - OUTB(bktr, BKTR_ADELAY, format_params[BT848_IFORM_F_NTSCM].adelay); - OUTB(bktr, BKTR_BDELAY, format_params[BT848_IFORM_F_NTSCM].bdelay); - bktr->format_params = BT848_IFORM_F_NTSCM; - break; - - case METEOR_FMT_PAL: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_PAL; - OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_PALBDGHI | - format_params[BT848_IFORM_F_PALBDGHI].iform_xtsel); - OUTB(bktr, BKTR_ADELAY, format_params[BT848_IFORM_F_PALBDGHI].adelay); - OUTB(bktr, BKTR_BDELAY, format_params[BT848_IFORM_F_PALBDGHI].bdelay); - bktr->format_params = BT848_IFORM_F_PALBDGHI; - break; - - case METEOR_FMT_AUTOMODE: - bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) | - METEOR_AUTOMODE; - OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_AUTO | - format_params[BT848_IFORM_F_AUTO].iform_xtsel); - break; - - default: - return( EINVAL ); - } - bktr->dma_prog_loaded = FALSE; - break; - - case METEORGFMT: /* get input format */ - *(u_long *)arg = bktr->flags & METEOR_FORM_MASK; - break; - - - case BT848GFMT: /* get input format */ - *(u_long *)arg = INB(bktr, BKTR_IFORM) & BT848_IFORM_FORMAT; - break; - - case METEORSCOUNT: /* (re)set error counts */ - counts = (struct meteor_counts *) arg; - bktr->fifo_errors = counts->fifo_errors; - bktr->dma_errors = counts->dma_errors; - bktr->frames_captured = counts->frames_captured; - bktr->even_fields_captured = counts->even_fields_captured; - bktr->odd_fields_captured = counts->odd_fields_captured; - break; - - case METEORGCOUNT: /* get error counts */ - counts = (struct meteor_counts *) arg; - counts->fifo_errors = bktr->fifo_errors; - counts->dma_errors = bktr->dma_errors; - counts->frames_captured = bktr->frames_captured; - counts->even_fields_captured = bktr->even_fields_captured; - counts->odd_fields_captured = bktr->odd_fields_captured; - break; - - case METEORGVIDEO: - video = (struct meteor_video *)arg; - video->addr = bktr->video.addr; - video->width = bktr->video.width; - video->banksize = bktr->video.banksize; - video->ramsize = bktr->video.ramsize; - break; - - case METEORSVIDEO: - video = (struct meteor_video *)arg; - bktr->video.addr = video->addr; - bktr->video.width = video->width; - bktr->video.banksize = video->banksize; - bktr->video.ramsize = video->ramsize; - break; - - case METEORSFPS: - set_fps(bktr, *(u_short *)arg); - break; - - case METEORGFPS: - *(u_short *)arg = bktr->fps; - break; - - case METEORSHUE: /* set hue */ - OUTB(bktr, BKTR_HUE, (*(u_char *) arg) & 0xff); - break; - - case METEORGHUE: /* get hue */ - *(u_char *)arg = INB(bktr, BKTR_HUE); - break; - - case METEORSBRIG: /* set brightness */ - char_temp = ( *(u_char *)arg & 0xff) - 128; - OUTB(bktr, BKTR_BRIGHT, char_temp); - - break; - - case METEORGBRIG: /* get brightness */ - *(u_char *)arg = INB(bktr, BKTR_BRIGHT) + 128; - break; - - case METEORSCSAT: /* set chroma saturation */ - temp = (int)*(u_char *)arg; - - OUTB(bktr, BKTR_SAT_U_LO, (temp << 1) & 0xff); - OUTB(bktr, BKTR_SAT_V_LO, (temp << 1) & 0xff); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) - & ~(BT848_E_CONTROL_SAT_U_MSB - | BT848_E_CONTROL_SAT_V_MSB)); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) - & ~(BT848_O_CONTROL_SAT_U_MSB | - BT848_O_CONTROL_SAT_V_MSB)); - - if ( temp & BIT_SEVEN_HIGH ) { - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) - | (BT848_E_CONTROL_SAT_U_MSB - | BT848_E_CONTROL_SAT_V_MSB)); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) - | (BT848_O_CONTROL_SAT_U_MSB - | BT848_O_CONTROL_SAT_V_MSB)); - } - break; - - case METEORGCSAT: /* get chroma saturation */ - temp = (INB(bktr, BKTR_SAT_V_LO) >> 1) & 0xff; - if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB ) - temp |= BIT_SEVEN_HIGH; - *(u_char *)arg = (u_char)temp; - break; - - case METEORSCONT: /* set contrast */ - temp = (int)*(u_char *)arg & 0xff; - temp <<= 1; - OUTB(bktr, BKTR_CONTRAST_LO, temp & 0xff); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_CON_MSB); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_CON_MSB); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | - (((temp & 0x100) >> 6 ) & BT848_E_CONTROL_CON_MSB)); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | - (((temp & 0x100) >> 6 ) & BT848_O_CONTROL_CON_MSB)); - break; - - case METEORGCONT: /* get contrast */ - temp = (int)INB(bktr, BKTR_CONTRAST_LO) & 0xff; - temp |= ((int)INB(bktr, BKTR_O_CONTROL) & 0x04) << 6; - *(u_char *)arg = (u_char)((temp >> 1) & 0xff); - break; - - case BT848SCBUF: /* set Clear-Buffer-on-start flag */ - bktr->clr_on_start = (*(int *)arg != 0); - break; - - case BT848GCBUF: /* get Clear-Buffer-on-start flag */ - *(int *)arg = (int) bktr->clr_on_start; - break; - - case METEORSSIGNAL: - sig = *(int *)arg; - /* Historically, applications used METEOR_SIG_MODE_MASK - * to reset signal delivery. - */ - if (sig == METEOR_SIG_MODE_MASK) - sig = 0; - if (sig < 0 || sig > _SIG_MAXSIG) - return (EINVAL); - bktr->signal = sig; - bktr->proc = sig ? td->td_proc : NULL; - break; - - case METEORGSIGNAL: - *(int *)arg = bktr->signal; - break; - - case METEORCAPTUR: - temp = bktr->flags; - switch (*(int *) arg) { - case METEOR_CAP_SINGLE: - - if (bktr->bigbuf==0) /* no frame buffer allocated */ - return( ENOMEM ); - /* already capturing */ - if (temp & METEOR_CAP_MASK) - return( EIO ); - - - - start_capture(bktr, METEOR_SINGLE); - - /* wait for capture to complete */ - OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol); - - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT | - BT848_INT_RISCI | - BT848_INT_VSYNC | - BT848_INT_FMTCHG); - - OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl); - error = tsleep(BKTR_SLEEP, BKTRPRI, "captur", hz); - if (error && (error != ERESTART)) { - /* Here if we didn't get complete frame */ -#ifdef DIAGNOSTIC - printf( "%s: ioctl: tsleep error %d %x\n", - bktr_name(bktr), error, - INL(bktr, BKTR_RISC_COUNT)); -#endif - - /* stop dma */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - - /* disable risc, leave fifo running */ - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - } - - bktr->flags &= ~(METEOR_SINGLE|METEOR_WANT_MASK); - /* FIXME: should we set bt848->int_stat ??? */ - break; - - case METEOR_CAP_CONTINOUS: - if (bktr->bigbuf==0) /* no frame buffer allocated */ - return( ENOMEM ); - /* already capturing */ - if (temp & METEOR_CAP_MASK) - return( EIO ); - - - start_capture(bktr, METEOR_CONTIN); - - /* Clear the interrypt status register */ - OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT)); - - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol); - OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl); - - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT | - BT848_INT_RISCI | - BT848_INT_VSYNC | - BT848_INT_FMTCHG); -#ifdef BT848_DUMP - dump_bt848(bktr); -#endif - break; - - case METEOR_CAP_STOP_CONT: - if (bktr->flags & METEOR_CONTIN) { - /* turn off capture */ - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF); - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - bktr->flags &= - ~(METEOR_CONTIN | METEOR_WANT_MASK); - - } - } - break; - - case METEORSETGEO: - /* can't change parameters while capturing */ - if (bktr->flags & METEOR_CAP_MASK) - return( EBUSY ); - - - geo = (struct meteor_geomet *) arg; - - error = 0; - /* Either even or odd, if even & odd, then these a zero */ - if ((geo->oformat & METEOR_GEO_ODD_ONLY) && - (geo->oformat & METEOR_GEO_EVEN_ONLY)) { - printf( "%s: ioctl: Geometry odd or even only.\n", - bktr_name(bktr)); - return( EINVAL ); - } - - /* set/clear even/odd flags */ - if (geo->oformat & METEOR_GEO_ODD_ONLY) - bktr->flags |= METEOR_ONLY_ODD_FIELDS; - else - bktr->flags &= ~METEOR_ONLY_ODD_FIELDS; - if (geo->oformat & METEOR_GEO_EVEN_ONLY) - bktr->flags |= METEOR_ONLY_EVEN_FIELDS; - else - bktr->flags &= ~METEOR_ONLY_EVEN_FIELDS; - - if (geo->columns <= 0) { - printf( - "%s: ioctl: %d: columns must be greater than zero.\n", - bktr_name(bktr), geo->columns); - error = EINVAL; - } - else if ((geo->columns & 0x3fe) != geo->columns) { - printf( - "%s: ioctl: %d: columns too large or not even.\n", - bktr_name(bktr), geo->columns); - error = EINVAL; - } - - if (geo->rows <= 0) { - printf( - "%s: ioctl: %d: rows must be greater than zero.\n", - bktr_name(bktr), geo->rows); - error = EINVAL; - } - else if (((geo->rows & 0x7fe) != geo->rows) || - ((geo->oformat & METEOR_GEO_FIELD_MASK) && - ((geo->rows & 0x3fe) != geo->rows)) ) { - printf( - "%s: ioctl: %d: rows too large or not even.\n", - bktr_name(bktr), geo->rows); - error = EINVAL; - } - - if (geo->frames > 32) { - printf("%s: ioctl: too many frames.\n", - bktr_name(bktr)); - - error = EINVAL; - } - - if (error) - return( error ); - - bktr->dma_prog_loaded = FALSE; - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - - if ((temp=(geo->rows * geo->columns * geo->frames * 2))) { - if (geo->oformat & METEOR_GEO_RGB24) temp = temp * 2; - - /* meteor_mem structure for SYNC Capture */ - if (geo->frames > 1) temp += PAGE_SIZE; - - temp = btoc(temp); - if ((int) temp > bktr->alloc_pages - && bktr->video.addr == 0) { - -/*****************************/ -/* *** OS Dependent code *** */ -/*****************************/ -#if defined(__NetBSD__) || defined(__OpenBSD__) - bus_dmamap_t dmamap; - - buf = get_bktr_mem(bktr, &dmamap, - temp * PAGE_SIZE); - if (buf != 0) { - free_bktr_mem(bktr, bktr->dm_mem, - bktr->bigbuf); - bktr->dm_mem = dmamap; - -#else - buf = get_bktr_mem(unit, temp*PAGE_SIZE); - if (buf != 0) { - contigfree( - (void *)(uintptr_t)bktr->bigbuf, - (bktr->alloc_pages * PAGE_SIZE), - M_DEVBUF); -#endif - - bktr->bigbuf = buf; - bktr->alloc_pages = temp; - if (bootverbose) - printf("%s: ioctl: Allocating %d bytes\n", - bktr_name(bktr), (int)(temp*PAGE_SIZE)); - } - else - error = ENOMEM; - } - } - - if (error) - return error; - - bktr->rows = geo->rows; - bktr->cols = geo->columns; - bktr->frames = geo->frames; - - /* Pixel format (if in meteor pixfmt compatibility mode) */ - if ( bktr->pixfmt_compat ) { - bktr->format = METEOR_GEO_YUV_422; - switch (geo->oformat & METEOR_GEO_OUTPUT_MASK) { - case 0: /* default */ - case METEOR_GEO_RGB16: - bktr->format = METEOR_GEO_RGB16; - break; - case METEOR_GEO_RGB24: - bktr->format = METEOR_GEO_RGB24; - break; - case METEOR_GEO_YUV_422: - bktr->format = METEOR_GEO_YUV_422; - if (geo->oformat & METEOR_GEO_YUV_12) - bktr->format = METEOR_GEO_YUV_12; - break; - case METEOR_GEO_YUV_PACKED: - bktr->format = METEOR_GEO_YUV_PACKED; - break; - } - bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); - } - - if (bktr->flags & METEOR_CAP_MASK) { - - if (bktr->flags & (METEOR_CONTIN|METEOR_SYNCAP)) { - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - break; - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - break; - } - - start_capture(bktr, METEOR_CONTIN); - OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT)); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol); - OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT | - BT848_INT_VSYNC | - BT848_INT_FMTCHG); - } - } - break; - /* end of METEORSETGEO */ - - /* FIXME. The Capture Area currently has the following restrictions: - GENERAL - y_offset may need to be even in interlaced modes - RGB24 - Interlaced mode - x_size must be greater than or equal to 1.666*METEORSETGEO width (cols) - y_size must be greater than or equal to METEORSETGEO height (rows) - RGB24 - Even Only (or Odd Only) mode - x_size must be greater than or equal to 1.666*METEORSETGEO width (cols) - y_size must be greater than or equal to 2*METEORSETGEO height (rows) - YUV12 - Interlaced mode - x_size must be greater than or equal to METEORSETGEO width (cols) - y_size must be greater than or equal to METEORSETGEO height (rows) - YUV12 - Even Only (or Odd Only) mode - x_size must be greater than or equal to METEORSETGEO width (cols) - y_size must be greater than or equal to 2*METEORSETGEO height (rows) - */ - - case BT848_SCAPAREA: /* set capture area of each video frame */ - /* can't change parameters while capturing */ - if (bktr->flags & METEOR_CAP_MASK) - return( EBUSY ); - - cap_area = (struct bktr_capture_area *) arg; - bktr->capture_area_x_offset = cap_area->x_offset; - bktr->capture_area_y_offset = cap_area->y_offset; - bktr->capture_area_x_size = cap_area->x_size; - bktr->capture_area_y_size = cap_area->y_size; - bktr->capture_area_enabled = TRUE; - - bktr->dma_prog_loaded = FALSE; - break; - - case BT848_GCAPAREA: /* get capture area of each video frame */ - cap_area = (struct bktr_capture_area *) arg; - if (bktr->capture_area_enabled == FALSE) { - cap_area->x_offset = 0; - cap_area->y_offset = 0; - cap_area->x_size = format_params[ - bktr->format_params].scaled_hactive; - cap_area->y_size = format_params[ - bktr->format_params].vactive; - } else { - cap_area->x_offset = bktr->capture_area_x_offset; - cap_area->y_offset = bktr->capture_area_y_offset; - cap_area->x_size = bktr->capture_area_x_size; - cap_area->y_size = bktr->capture_area_y_size; - } - break; - - default: - return common_ioctl( bktr, cmd, arg ); - } - - return( 0 ); -} - -/* - * tuner ioctls - */ -int -tuner_ioctl( bktr_ptr_t bktr, int unit, ioctl_cmd_t cmd, caddr_t arg, struct thread* td ) -{ - int tmp_int; - int temp, temp1; - int offset; - int count; - u_char *buf; - u_long par; - u_char write; - int i2c_addr; - int i2c_port; - u_long data; - - switch ( cmd ) { - - case REMOTE_GETKEY: - /* Read the last key pressed by the Remote Control */ - if (bktr->remote_control == 0) return (EINVAL); - remote_read(bktr, (struct bktr_remote *)arg); - break; - -#if defined( TUNER_AFC ) - case TVTUNER_SETAFC: - bktr->tuner.afc = (*(int *)arg != 0); - break; - - case TVTUNER_GETAFC: - *(int *)arg = bktr->tuner.afc; - /* XXX Perhaps use another bit to indicate AFC success? */ - break; -#endif /* TUNER_AFC */ - - case TVTUNER_SETCHNL: - temp_mute( bktr, TRUE ); - temp = tv_channel( bktr, (int)*(unsigned long *)arg ); - if ( temp < 0 ) { - temp_mute( bktr, FALSE ); - return( EINVAL ); - } - *(unsigned long *)arg = temp; - - /* after every channel change, we must restart the MSP34xx */ - /* audio chip to reselect NICAM STEREO or MONO audio */ - if ( bktr->card.msp3400c ) - msp_autodetect( bktr ); - - /* after every channel change, we must restart the DPL35xx */ - if ( bktr->card.dpl3518a ) - dpl_autodetect( bktr ); - - temp_mute( bktr, FALSE ); - break; - - case TVTUNER_GETCHNL: - *(unsigned long *)arg = bktr->tuner.channel; - break; - - case TVTUNER_SETTYPE: - temp = *(unsigned long *)arg; - if ( (temp < CHNLSET_MIN) || (temp > CHNLSET_MAX) ) - return( EINVAL ); - bktr->tuner.chnlset = temp; - break; - - case TVTUNER_GETTYPE: - *(unsigned long *)arg = bktr->tuner.chnlset; - break; - - case TVTUNER_GETSTATUS: - temp = get_tuner_status( bktr ); - *(unsigned long *)arg = temp & 0xff; - break; - - case TVTUNER_SETFREQ: - temp_mute( bktr, TRUE ); - temp = tv_freq( bktr, (int)*(unsigned long *)arg, TV_FREQUENCY); - temp_mute( bktr, FALSE ); - if ( temp < 0 ) { - temp_mute( bktr, FALSE ); - return( EINVAL ); - } - *(unsigned long *)arg = temp; - - /* after every channel change, we must restart the MSP34xx */ - /* audio chip to reselect NICAM STEREO or MONO audio */ - if ( bktr->card.msp3400c ) - msp_autodetect( bktr ); - - /* after every channel change, we must restart the DPL35xx */ - if ( bktr->card.dpl3518a ) - dpl_autodetect( bktr ); - - temp_mute( bktr, FALSE ); - break; - - case TVTUNER_GETFREQ: - *(unsigned long *)arg = bktr->tuner.frequency; - break; - - case TVTUNER_GETCHNLSET: - return tuner_getchnlset((struct bktr_chnlset *)arg); - - case BT848_SAUDIO: /* set audio channel */ - if ( set_audio( bktr, *(int*)arg ) < 0 ) - return( EIO ); - break; - - /* hue is a 2's compliment number, -90' to +89.3' in 0.7' steps */ - case BT848_SHUE: /* set hue */ - OUTB(bktr, BKTR_HUE, (u_char)(*(int*)arg & 0xff)); - break; - - case BT848_GHUE: /* get hue */ - *(int*)arg = (signed char)(INB(bktr, BKTR_HUE) & 0xff); - break; - - /* brightness is a 2's compliment #, -50 to +%49.6% in 0.39% steps */ - case BT848_SBRIG: /* set brightness */ - OUTB(bktr, BKTR_BRIGHT, (u_char)(*(int *)arg & 0xff)); - break; - - case BT848_GBRIG: /* get brightness */ - *(int *)arg = (signed char)(INB(bktr, BKTR_BRIGHT) & 0xff); - break; - - /* */ - case BT848_SCSAT: /* set chroma saturation */ - tmp_int = *(int*)arg; - - temp = INB(bktr, BKTR_E_CONTROL); - temp1 = INB(bktr, BKTR_O_CONTROL); - if ( tmp_int & BIT_EIGHT_HIGH ) { - temp |= (BT848_E_CONTROL_SAT_U_MSB | - BT848_E_CONTROL_SAT_V_MSB); - temp1 |= (BT848_O_CONTROL_SAT_U_MSB | - BT848_O_CONTROL_SAT_V_MSB); - } - else { - temp &= ~(BT848_E_CONTROL_SAT_U_MSB | - BT848_E_CONTROL_SAT_V_MSB); - temp1 &= ~(BT848_O_CONTROL_SAT_U_MSB | - BT848_O_CONTROL_SAT_V_MSB); - } - - OUTB(bktr, BKTR_SAT_U_LO, (u_char)(tmp_int & 0xff)); - OUTB(bktr, BKTR_SAT_V_LO, (u_char)(tmp_int & 0xff)); - OUTB(bktr, BKTR_E_CONTROL, temp); - OUTB(bktr, BKTR_O_CONTROL, temp1); - break; - - case BT848_GCSAT: /* get chroma saturation */ - tmp_int = (int)(INB(bktr, BKTR_SAT_V_LO) & 0xff); - if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB ) - tmp_int |= BIT_EIGHT_HIGH; - *(int*)arg = tmp_int; - break; - - /* */ - case BT848_SVSAT: /* set chroma V saturation */ - tmp_int = *(int*)arg; - - temp = INB(bktr, BKTR_E_CONTROL); - temp1 = INB(bktr, BKTR_O_CONTROL); - if ( tmp_int & BIT_EIGHT_HIGH) { - temp |= BT848_E_CONTROL_SAT_V_MSB; - temp1 |= BT848_O_CONTROL_SAT_V_MSB; - } - else { - temp &= ~BT848_E_CONTROL_SAT_V_MSB; - temp1 &= ~BT848_O_CONTROL_SAT_V_MSB; - } - - OUTB(bktr, BKTR_SAT_V_LO, (u_char)(tmp_int & 0xff)); - OUTB(bktr, BKTR_E_CONTROL, temp); - OUTB(bktr, BKTR_O_CONTROL, temp1); - break; - - case BT848_GVSAT: /* get chroma V saturation */ - tmp_int = (int)INB(bktr, BKTR_SAT_V_LO) & 0xff; - if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB ) - tmp_int |= BIT_EIGHT_HIGH; - *(int*)arg = tmp_int; - break; - - /* */ - case BT848_SUSAT: /* set chroma U saturation */ - tmp_int = *(int*)arg; - - temp = INB(bktr, BKTR_E_CONTROL); - temp1 = INB(bktr, BKTR_O_CONTROL); - if ( tmp_int & BIT_EIGHT_HIGH ) { - temp |= BT848_E_CONTROL_SAT_U_MSB; - temp1 |= BT848_O_CONTROL_SAT_U_MSB; - } - else { - temp &= ~BT848_E_CONTROL_SAT_U_MSB; - temp1 &= ~BT848_O_CONTROL_SAT_U_MSB; - } - - OUTB(bktr, BKTR_SAT_U_LO, (u_char)(tmp_int & 0xff)); - OUTB(bktr, BKTR_E_CONTROL, temp); - OUTB(bktr, BKTR_O_CONTROL, temp1); - break; - - case BT848_GUSAT: /* get chroma U saturation */ - tmp_int = (int)INB(bktr, BKTR_SAT_U_LO) & 0xff; - if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_U_MSB ) - tmp_int |= BIT_EIGHT_HIGH; - *(int*)arg = tmp_int; - break; - -/* lr 970528 luma notch etc - 3 high bits of e_control/o_control */ - - case BT848_SLNOTCH: /* set luma notch */ - tmp_int = (*(int *)arg & 0x7) << 5 ; - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~0xe0); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~0xe0); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | tmp_int); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | tmp_int); - break; - - case BT848_GLNOTCH: /* get luma notch */ - *(int *)arg = (int) ( (INB(bktr, BKTR_E_CONTROL) & 0xe0) >> 5) ; - break; - - - /* */ - case BT848_SCONT: /* set contrast */ - tmp_int = *(int*)arg; - - temp = INB(bktr, BKTR_E_CONTROL); - temp1 = INB(bktr, BKTR_O_CONTROL); - if ( tmp_int & BIT_EIGHT_HIGH ) { - temp |= BT848_E_CONTROL_CON_MSB; - temp1 |= BT848_O_CONTROL_CON_MSB; - } - else { - temp &= ~BT848_E_CONTROL_CON_MSB; - temp1 &= ~BT848_O_CONTROL_CON_MSB; - } - - OUTB(bktr, BKTR_CONTRAST_LO, (u_char)(tmp_int & 0xff)); - OUTB(bktr, BKTR_E_CONTROL, temp); - OUTB(bktr, BKTR_O_CONTROL, temp1); - break; - - case BT848_GCONT: /* get contrast */ - tmp_int = (int)INB(bktr, BKTR_CONTRAST_LO) & 0xff; - if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_CON_MSB ) - tmp_int |= BIT_EIGHT_HIGH; - *(int*)arg = tmp_int; - break; - - /* FIXME: SCBARS and CCBARS require a valid int * */ - /* argument to succeed, but its not used; consider */ - /* using the arg to store the on/off state so */ - /* there's only one ioctl() needed to turn cbars on/off */ - case BT848_SCBARS: /* set colorbar output */ - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_COLOR_BARS); - break; - - case BT848_CCBARS: /* clear colorbar output */ - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) & ~(BT848_COLOR_CTL_COLOR_BARS)); - break; - - case BT848_GAUDIO: /* get audio channel */ - temp = bktr->audio_mux_select; - if ( bktr->audio_mute_state == TRUE ) - temp |= AUDIO_MUTE; - *(int*)arg = temp; - break; - - case BT848_SBTSC: /* set audio channel */ - if ( set_BTSC( bktr, *(int*)arg ) < 0 ) - return( EIO ); - break; - - case BT848_WEEPROM: /* write eeprom */ - offset = (((struct eeProm *)arg)->offset); - count = (((struct eeProm *)arg)->count); - buf = &(((struct eeProm *)arg)->bytes[ 0 ]); - if ( writeEEProm( bktr, offset, count, buf ) < 0 ) - return( EIO ); - break; - - case BT848_REEPROM: /* read eeprom */ - offset = (((struct eeProm *)arg)->offset); - count = (((struct eeProm *)arg)->count); - buf = &(((struct eeProm *)arg)->bytes[ 0 ]); - if ( readEEProm( bktr, offset, count, buf ) < 0 ) - return( EIO ); - break; - - case BT848_SIGNATURE: - offset = (((struct eeProm *)arg)->offset); - count = (((struct eeProm *)arg)->count); - buf = &(((struct eeProm *)arg)->bytes[ 0 ]); - if ( signCard( bktr, offset, count, buf ) < 0 ) - return( EIO ); - break; - - /* Ioctl's for direct gpio access */ -#ifdef BKTR_GPIO_ACCESS - case BT848_GPIO_GET_EN: - *(int*)arg = INL(bktr, BKTR_GPIO_OUT_EN); - break; - - case BT848_GPIO_SET_EN: - OUTL(bktr, BKTR_GPIO_OUT_EN, *(int*)arg); - break; - - case BT848_GPIO_GET_DATA: - *(int*)arg = INL(bktr, BKTR_GPIO_DATA); - break; - - case BT848_GPIO_SET_DATA: - OUTL(bktr, BKTR_GPIO_DATA, *(int*)arg); - break; -#endif /* BKTR_GPIO_ACCESS */ - - /* Ioctl's for running the tuner device in radio mode */ - - case RADIO_GETMODE: - *(unsigned char *)arg = bktr->tuner.radio_mode; - break; - - case RADIO_SETMODE: - bktr->tuner.radio_mode = *(unsigned char *)arg; - break; - - case RADIO_GETFREQ: - *(unsigned long *)arg = bktr->tuner.frequency; - break; - - case RADIO_SETFREQ: - /* The argument to this ioctl is NOT freq*16. It is - ** freq*100. - */ - - temp=(int)*(unsigned long *)arg; - -#ifdef BKTR_RADIO_DEBUG - printf("%s: arg=%d temp=%d\n", bktr_name(bktr), - (int)*(unsigned long *)arg, temp); -#endif - -#ifndef BKTR_RADIO_NOFREQCHECK - /* According to the spec. sheet the band: 87.5MHz-108MHz */ - /* is supported. */ - if(temp<8750 || temp>10800) { - printf("%s: Radio frequency out of range\n", bktr_name(bktr)); - return(EINVAL); - } -#endif - temp_mute( bktr, TRUE ); - temp = tv_freq( bktr, temp, FM_RADIO_FREQUENCY ); - temp_mute( bktr, FALSE ); -#ifdef BKTR_RADIO_DEBUG - if(temp) - printf("%s: tv_freq returned: %d\n", bktr_name(bktr), temp); -#endif - if ( temp < 0 ) - return( EINVAL ); - *(unsigned long *)arg = temp; - break; - - /* Luigi's I2CWR ioctl */ - case BT848_I2CWR: - par = *(u_long *)arg; - write = (par >> 24) & 0xff ; - i2c_addr = (par >> 16) & 0xff ; - i2c_port = (par >> 8) & 0xff ; - data = (par) & 0xff ; - - if (write) { - i2cWrite( bktr, i2c_addr, i2c_port, data); - } else { - data = i2cRead( bktr, i2c_addr); - } - *(u_long *)arg = (par & 0xffffff00) | ( data & 0xff ); - break; - - -#ifdef BT848_MSP_READ - /* I2C ioctls to allow userland access to the MSP chip */ - case BT848_MSP_READ: - { - struct bktr_msp_control *msp; - msp = (struct bktr_msp_control *) arg; - msp->data = msp_dpl_read(bktr, bktr->msp_addr, - msp->function, msp->address); - break; - } - - case BT848_MSP_WRITE: - { - struct bktr_msp_control *msp; - msp = (struct bktr_msp_control *) arg; - msp_dpl_write(bktr, bktr->msp_addr, msp->function, - msp->address, msp->data ); - break; - } - - case BT848_MSP_RESET: - msp_dpl_reset(bktr, bktr->msp_addr); - break; -#endif - - default: - return common_ioctl( bktr, cmd, arg ); - } - - return( 0 ); -} - - -/* - * common ioctls - */ -static int -common_ioctl( bktr_ptr_t bktr, ioctl_cmd_t cmd, caddr_t arg ) -{ - int pixfmt; - unsigned int temp; - struct meteor_pixfmt *pf_pub; - - switch (cmd) { - - case METEORSINPUT: /* set input device */ - /*Bt848 has 3 MUX Inputs. Bt848A/849A/878/879 has 4 MUX Inputs*/ - /* On the original bt848 boards, */ - /* Tuner is MUX0, RCA is MUX1, S-Video is MUX2 */ - /* On the Hauppauge bt878 boards, */ - /* Tuner is MUX0, RCA is MUX3 */ - /* Unfortunately Meteor driver codes DEV_RCA as DEV_0, so we */ - /* stick with this system in our Meteor Emulation */ - - switch(*(unsigned long *)arg & METEOR_DEV_MASK) { - - /* this is the RCA video input */ - case 0: /* default */ - case METEOR_INPUT_DEV0: - /* METEOR_INPUT_DEV_RCA: */ - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) - | METEOR_DEV0; - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) - & ~BT848_IFORM_MUXSEL); - - /* work around for new Hauppauge 878 cards */ - if ((bktr->card.card_id == CARD_HAUPPAUGE) && - (bktr->id==BROOKTREE_878 || - bktr->id==BROOKTREE_879) ) - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3); - else - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1); - - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP); - set_audio( bktr, AUDIO_EXTERN ); - break; - - /* this is the tuner input */ - case METEOR_INPUT_DEV1: - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) - | METEOR_DEV1; - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL); - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX0); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP); - set_audio( bktr, AUDIO_TUNER ); - break; - - /* this is the S-VHS input, but with a composite camera */ - case METEOR_INPUT_DEV2: - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) - | METEOR_DEV2; - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL); - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX2); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_O_CONTROL_COMP); - set_audio( bktr, AUDIO_EXTERN ); - break; - - /* this is the S-VHS input */ - case METEOR_INPUT_DEV_SVIDEO: - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) - | METEOR_DEV_SVIDEO; - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL); - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX2); - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | BT848_E_CONTROL_COMP); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | BT848_O_CONTROL_COMP); - set_audio( bktr, AUDIO_EXTERN ); - break; - - case METEOR_INPUT_DEV3: - if ((bktr->id == BROOKTREE_848A) || - (bktr->id == BROOKTREE_849A) || - (bktr->id == BROOKTREE_878) || - (bktr->id == BROOKTREE_879) ) { - bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) - | METEOR_DEV3; - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL); - - /* work around for new Hauppauge 878 cards */ - if ((bktr->card.card_id == CARD_HAUPPAUGE) && - (bktr->id==BROOKTREE_878 || - bktr->id==BROOKTREE_879) ) - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1); - else - OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3); - - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP); - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP); - set_audio( bktr, AUDIO_EXTERN ); - - break; - } - - default: - return( EINVAL ); - } - break; - - case METEORGINPUT: /* get input device */ - *(u_long *)arg = bktr->flags & METEOR_DEV_MASK; - break; - - case METEORSACTPIXFMT: - if (( *(int *)arg < 0 ) || - ( *(int *)arg >= PIXFMT_TABLE_SIZE )) - return( EINVAL ); - - bktr->pixfmt = *(int *)arg; - OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0) - | pixfmt_swap_flags( bktr->pixfmt )); - bktr->pixfmt_compat = FALSE; - break; - - case METEORGACTPIXFMT: - *(int *)arg = bktr->pixfmt; - break; - - case METEORGSUPPIXFMT : - pf_pub = (struct meteor_pixfmt *)arg; - pixfmt = pf_pub->index; - - if (( pixfmt < 0 ) || ( pixfmt >= PIXFMT_TABLE_SIZE )) - return( EINVAL ); - - memcpy( pf_pub, &pixfmt_table[ pixfmt ].public, - sizeof( *pf_pub ) ); - - /* Patch in our format index */ - pf_pub->index = pixfmt; - break; - -#if defined( STATUS_SUM ) - case BT848_GSTATUS: /* reap status */ - { - DECLARE_INTR_MASK(s); - DISABLE_INTR(s); - temp = status_sum; - status_sum = 0; - ENABLE_INTR(s); - *(u_int*)arg = temp; - break; - } -#endif /* STATUS_SUM */ - - default: - return( ENOTTY ); - } - - return( 0 ); -} - - - - -/****************************************************************************** - * bt848 RISC programming routines: - */ - - -/* - * - */ -#if defined(BT848_DEBUG) || defined(BT848_DUMP) -static int -dump_bt848( bktr_ptr_t bktr ) -{ - int r[60]={ - 4, 8, 0xc, 0x8c, 0x10, 0x90, 0x14, 0x94, - 0x18, 0x98, 0x1c, 0x9c, 0x20, 0xa0, 0x24, 0xa4, - 0x28, 0x2c, 0xac, 0x30, 0x34, 0x38, 0x3c, 0x40, - 0xc0, 0x48, 0x4c, 0xcc, 0x50, 0xd0, 0xd4, 0x60, - 0x64, 0x68, 0x6c, 0xec, 0xd8, 0xdc, 0xe0, 0xe4, - 0, 0, 0, 0 - }; - int i; - - for (i = 0; i < 40; i+=4) { - printf("%s: Reg:value : \t%x:%x \t%x:%x \t %x:%x \t %x:%x\n", - bktr_name(bktr), - r[i], INL(bktr, r[i]), - r[i+1], INL(bktr, r[i+1]), - r[i+2], INL(bktr, r[i+2]), - r[i+3], INL(bktr, r[i+3])); - } - - printf("%s: INT STAT %x \n", bktr_name(bktr), - INL(bktr, BKTR_INT_STAT)); - printf("%s: Reg INT_MASK %x \n", bktr_name(bktr), - INL(bktr, BKTR_INT_MASK)); - printf("%s: Reg GPIO_DMA_CTL %x \n", bktr_name(bktr), - INW(bktr, BKTR_GPIO_DMA_CTL)); - - return( 0 ); -} - -#endif - -/* - * build write instruction - */ -#define BKTR_FM1 0x6 /* packed data to follow */ -#define BKTR_FM3 0xe /* planar data to follow */ -#define BKTR_VRE 0x4 /* Marks the end of the even field */ -#define BKTR_VRO 0xC /* Marks the end of the odd field */ -#define BKTR_PXV 0x0 /* valid word (never used) */ -#define BKTR_EOL 0x1 /* last dword, 4 bytes */ -#define BKTR_SOL 0x2 /* first dword */ - -#define OP_WRITE (0x1 << 28) -#define OP_SKIP (0x2 << 28) -#define OP_WRITEC (0x5 << 28) -#define OP_JUMP (0x7 << 28) -#define OP_SYNC (0x8 << 28) -#define OP_WRITE123 (0x9 << 28) -#define OP_WRITES123 (0xb << 28) -#define OP_SOL (1 << 27) /* first instr for scanline */ -#define OP_EOL (1 << 26) - -#define BKTR_RESYNC (1 << 15) -#define BKTR_GEN_IRQ (1 << 24) - -/* - * The RISC status bits can be set/cleared in the RISC programs - * and tested in the Interrupt Handler - */ -#define BKTR_SET_RISC_STATUS_BIT0 (1 << 16) -#define BKTR_SET_RISC_STATUS_BIT1 (1 << 17) -#define BKTR_SET_RISC_STATUS_BIT2 (1 << 18) -#define BKTR_SET_RISC_STATUS_BIT3 (1 << 19) - -#define BKTR_CLEAR_RISC_STATUS_BIT0 (1 << 20) -#define BKTR_CLEAR_RISC_STATUS_BIT1 (1 << 21) -#define BKTR_CLEAR_RISC_STATUS_BIT2 (1 << 22) -#define BKTR_CLEAR_RISC_STATUS_BIT3 (1 << 23) - -#define BKTR_TEST_RISC_STATUS_BIT0 (1 << 28) -#define BKTR_TEST_RISC_STATUS_BIT1 (1 << 29) -#define BKTR_TEST_RISC_STATUS_BIT2 (1 << 30) -#define BKTR_TEST_RISC_STATUS_BIT3 (1U << 31) - -static bool_t notclipped (bktr_reg_t * bktr, int x, int width) { - int i; - bktr_clip_t * clip_node; - bktr->clip_start = -1; - bktr->last_y = 0; - bktr->y = 0; - bktr->y2 = width; - bktr->line_length = width; - bktr->yclip = -1; - bktr->yclip2 = -1; - bktr->current_col = 0; - - if (bktr->max_clip_node == 0 ) return TRUE; - clip_node = (bktr_clip_t *) &bktr->clip_list[0]; - - - for (i = 0; i < bktr->max_clip_node; i++ ) { - clip_node = (bktr_clip_t *) &bktr->clip_list[i]; - if (x >= clip_node->x_min && x <= clip_node->x_max ) { - bktr->clip_start = i; - return FALSE; - } - } - - return TRUE; -} - -static bool_t getline(bktr_reg_t *bktr, int x ) { - int i, j; - bktr_clip_t * clip_node ; - - if (bktr->line_length == 0 || - bktr->current_col >= bktr->line_length) return FALSE; - - bktr->y = min(bktr->last_y, bktr->line_length); - bktr->y2 = bktr->line_length; - - bktr->yclip = bktr->yclip2 = -1; - for (i = bktr->clip_start; i < bktr->max_clip_node; i++ ) { - clip_node = (bktr_clip_t *) &bktr->clip_list[i]; - if (x >= clip_node->x_min && x <= clip_node->x_max) { - if (bktr->last_y <= clip_node->y_min) { - bktr->y = min(bktr->last_y, bktr->line_length); - bktr->y2 = min(clip_node->y_min, bktr->line_length); - bktr->yclip = min(clip_node->y_min, bktr->line_length); - bktr->yclip2 = min(clip_node->y_max, bktr->line_length); - bktr->last_y = bktr->yclip2; - bktr->clip_start = i; - - for (j = i+1; j < bktr->max_clip_node; j++ ) { - clip_node = (bktr_clip_t *) &bktr->clip_list[j]; - if (x >= clip_node->x_min && x <= clip_node->x_max) { - if (bktr->last_y >= clip_node->y_min) { - bktr->yclip2 = min(clip_node->y_max, bktr->line_length); - bktr->last_y = bktr->yclip2; - bktr->clip_start = j; - } - } else break ; - } - return TRUE; - } - } - } - - if (bktr->current_col <= bktr->line_length) { - bktr->current_col = bktr->line_length; - return TRUE; - } - return FALSE; -} - -static bool_t split(bktr_reg_t * bktr, volatile uint32_t **dma_prog, int width , - u_long operation, int pixel_width, - volatile u_char ** target_buffer, int cols ) { - - u_long flag, flag2; - struct meteor_pixfmt *pf = &pixfmt_table[ bktr->pixfmt ].public; - u_int skip, start_skip; - - /* For RGB24, we need to align the component in FIFO Byte Lane 0 */ - /* to the 1st byte in the mem dword containing our start addr. */ - /* BTW, we know this pixfmt's 1st byte is Blue; thus the start addr */ - /* must be Blue. */ - start_skip = 0; - if (( pf->type == METEOR_PIXTYPE_RGB ) && ( pf->Bpp == 3 )) - switch ( ((uintptr_t) (volatile void *) *target_buffer) % 4 ) { - case 2 : start_skip = 4 ; break; - case 1 : start_skip = 8 ; break; - } - - if ((width * pixel_width) < DMA_BT848_SPLIT ) { - if ( width == cols) { - flag = OP_SOL | OP_EOL; - } else if (bktr->current_col == 0 ) { - flag = OP_SOL; - } else if (bktr->current_col == cols) { - flag = OP_EOL; - } else flag = 0; - - skip = 0; - if (( flag & OP_SOL ) && ( start_skip > 0 )) { - *(*dma_prog)++ = OP_SKIP | OP_SOL | start_skip; - flag &= ~OP_SOL; - skip = start_skip; - } - - *(*dma_prog)++ = operation | flag | (width * pixel_width - skip); - if (operation != OP_SKIP ) - *(*dma_prog)++ = (uintptr_t) (volatile void *) *target_buffer; - - *target_buffer += width * pixel_width; - bktr->current_col += width; - - } else { - - if (bktr->current_col == 0 && width == cols) { - flag = OP_SOL ; - flag2 = OP_EOL; - } else if (bktr->current_col == 0 ) { - flag = OP_SOL; - flag2 = 0; - } else if (bktr->current_col >= cols) { - flag = 0; - flag2 = OP_EOL; - } else { - flag = 0; - flag2 = 0; - } - - skip = 0; - if (( flag & OP_SOL ) && ( start_skip > 0 )) { - *(*dma_prog)++ = OP_SKIP | OP_SOL | start_skip; - flag &= ~OP_SOL; - skip = start_skip; - } - - *(*dma_prog)++ = operation | flag | - (width * pixel_width / 2 - skip); - if (operation != OP_SKIP ) - *(*dma_prog)++ = (uintptr_t) (volatile void *) *target_buffer ; - *target_buffer += (width * pixel_width / 2) ; - - if ( operation == OP_WRITE ) - operation = OP_WRITEC; - *(*dma_prog)++ = operation | flag2 | - (width * pixel_width / 2); - *target_buffer += (width * pixel_width / 2) ; - bktr->current_col += width; - - } - return TRUE; -} - - -/* - * Generate the RISC instructions to capture both VBI and video images - */ -static void -rgb_vbi_prog( bktr_ptr_t bktr, char i_flag, int cols, int rows, int interlace ) -{ - int i; - volatile uint32_t target_buffer, buffer, target,width; - volatile uint32_t pitch; - volatile uint32_t *dma_prog; /* DMA prog is an array of - 32 bit RISC instructions */ - volatile uint32_t *loop_point; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - u_int Bpp = pf_int->public.Bpp; - unsigned int vbisamples; /* VBI samples per line */ - unsigned int vbilines; /* VBI lines per field */ - unsigned int num_dwords; /* DWORDS per line */ - - vbisamples = format_params[bktr->format_params].vbi_num_samples; - vbilines = format_params[bktr->format_params].vbi_num_lines; - num_dwords = vbisamples/4; - - OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt); - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - OUTB(bktr, BKTR_VBI_PACK_SIZE, ((num_dwords)) & 0xff); - OUTB(bktr, BKTR_VBI_PACK_DEL, ((num_dwords)>> 8) & 0x01); /* no hdelay */ - /* no ext frame */ - - OUTB(bktr, BKTR_OFORM, 0x00); - - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80); - - /* disable gamma correction removal */ - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA); - - if (cols > 385 ) { - OUTB(bktr, BKTR_E_VTC, 0); - OUTB(bktr, BKTR_O_VTC, 0); - } else { - OUTB(bktr, BKTR_E_VTC, 1); - OUTB(bktr, BKTR_O_VTC, 1); - } - bktr->capcontrol = 3 << 2 | 3; - - dma_prog = (uint32_t *) bktr->dma_prog; - - /* Construct Write */ - - if (bktr->video.addr) { - target_buffer = (u_long) bktr->video.addr; - pitch = bktr->video.width; - } - else { - target_buffer = (u_long) vtophys(bktr->bigbuf); - pitch = cols*Bpp; - } - - buffer = target_buffer; - - /* Wait for the VRE sync marking the end of the Even and - * the start of the Odd field. Resync here. - */ - *dma_prog++ = OP_SYNC | BKTR_RESYNC |BKTR_VRE; - *dma_prog++ = 0; - - loop_point = dma_prog; - - /* store the VBI data */ - /* look for sync with packed data */ - *dma_prog++ = OP_SYNC | BKTR_FM1; - *dma_prog++ = 0; - for(i = 0; i < vbilines; i++) { - *dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples; - *dma_prog++ = (u_long) vtophys((caddr_t)bktr->vbidata + - (i * VBI_LINE_SIZE)); - } - - if ( (i_flag == 2/*Odd*/) || (i_flag==3) /*interlaced*/ ) { - /* store the Odd field video image */ - /* look for sync with packed data */ - *dma_prog++ = OP_SYNC | BKTR_FM1; - *dma_prog++ = 0; /* NULL WORD */ - width = cols; - for (i = 0; i < (rows/interlace); i++) { - target = target_buffer; - if ( notclipped(bktr, i, width)) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - - } else { - while(getline(bktr, i)) { - if (bktr->y != bktr->y2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } - if (bktr->yclip != bktr->yclip2 ) { - split(bktr,(volatile uint32_t **) &dma_prog, - bktr->yclip2 - bktr->yclip, - OP_SKIP, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } - } - - } - - target_buffer += interlace * pitch; - - } - - } /* end if */ - - /* Grab the Even field */ - /* Look for the VRO, end of Odd field, marker */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - - /* store the VBI data */ - /* look for sync with packed data */ - *dma_prog++ = OP_SYNC | BKTR_FM1; - *dma_prog++ = 0; - for(i = 0; i < vbilines; i++) { - *dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples; - *dma_prog++ = (u_long) vtophys((caddr_t)bktr->vbidata + - ((i+MAX_VBI_LINES) * VBI_LINE_SIZE)); - } - - /* store the video image */ - if (i_flag == 1) /*Even Only*/ - target_buffer = buffer; - if (i_flag == 3) /*interlaced*/ - target_buffer = buffer+pitch; - - - if ((i_flag == 1) /*Even Only*/ || (i_flag==3) /*interlaced*/) { - /* look for sync with packed data */ - *dma_prog++ = OP_SYNC | BKTR_FM1; - *dma_prog++ = 0; /* NULL WORD */ - width = cols; - for (i = 0; i < (rows/interlace); i++) { - target = target_buffer; - if ( notclipped(bktr, i, width)) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } else { - while(getline(bktr, i)) { - if (bktr->y != bktr->y2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, - cols); - } - if (bktr->yclip != bktr->yclip2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->yclip2 - bktr->yclip, OP_SKIP, - Bpp, (volatile u_char **)(uintptr_t) &target, cols); - } - - } - - } - - target_buffer += interlace * pitch; - - } - } - - /* Look for end of 'Even Field' */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP ; - *dma_prog++ = (u_long ) vtophys(loop_point) ; - *dma_prog++ = 0; /* NULL WORD */ - -} - - - - -static void -rgb_prog( bktr_ptr_t bktr, char i_flag, int cols, int rows, int interlace ) -{ - int i; - volatile uint32_t target_buffer, buffer, target,width; - volatile uint32_t pitch; - volatile uint32_t *dma_prog; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - u_int Bpp = pf_int->public.Bpp; - - OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt); - OUTB(bktr, BKTR_VBI_PACK_SIZE, 0); - OUTB(bktr, BKTR_VBI_PACK_DEL, 0); - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - - OUTB(bktr, BKTR_OFORM, 0x00); - - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80); - - /* disable gamma correction removal */ - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA); - - if (cols > 385 ) { - OUTB(bktr, BKTR_E_VTC, 0); - OUTB(bktr, BKTR_O_VTC, 0); - } else { - OUTB(bktr, BKTR_E_VTC, 1); - OUTB(bktr, BKTR_O_VTC, 1); - } - bktr->capcontrol = 3 << 2 | 3; - - dma_prog = (uint32_t *) bktr->dma_prog; - - /* Construct Write */ - - if (bktr->video.addr) { - target_buffer = (uint32_t) bktr->video.addr; - pitch = bktr->video.width; - } - else { - target_buffer = (uint32_t) vtophys(bktr->bigbuf); - pitch = cols*Bpp; - } - - buffer = target_buffer; - - /* contruct sync : for video packet format */ - *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1; - - /* sync, mode indicator packed data */ - *dma_prog++ = 0; /* NULL WORD */ - width = cols; - for (i = 0; i < (rows/interlace); i++) { - target = target_buffer; - if ( notclipped(bktr, i, width)) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - - } else { - while(getline(bktr, i)) { - if (bktr->y != bktr->y2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } - if (bktr->yclip != bktr->yclip2 ) { - split(bktr,(volatile uint32_t **) &dma_prog, - bktr->yclip2 - bktr->yclip, - OP_SKIP, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } - } - - } - - target_buffer += interlace * pitch; - - } - - switch (i_flag) { - case 1: - /* sync vre */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog); - return; - - case 2: - /* sync vro */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog); - return; - - case 3: - /* sync vro */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP; - *dma_prog = (uint32_t ) vtophys(bktr->odd_dma_prog); - break; - } - - if (interlace == 2) { - - target_buffer = buffer + pitch; - - dma_prog = (uint32_t *) bktr->odd_dma_prog; - - /* sync vre IRQ bit */ - *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1; - *dma_prog++ = 0; /* NULL WORD */ - width = cols; - for (i = 0; i < (rows/interlace); i++) { - target = target_buffer; - if ( notclipped(bktr, i, width)) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } else { - while(getline(bktr, i)) { - if (bktr->y != bktr->y2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->y2 - bktr->y, OP_WRITE, - Bpp, (volatile u_char **)(uintptr_t)&target, - cols); - } - if (bktr->yclip != bktr->yclip2 ) { - split(bktr, (volatile uint32_t **) &dma_prog, - bktr->yclip2 - bktr->yclip, OP_SKIP, - Bpp, (volatile u_char **)(uintptr_t)&target, cols); - } - - } - - } - - target_buffer += interlace * pitch; - - } - } - - /* sync vre IRQ bit */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP ; - *dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog) ; - *dma_prog++ = 0; /* NULL WORD */ -} - - -/* - * - */ -static void -yuvpack_prog( bktr_ptr_t bktr, char i_flag, - int cols, int rows, int interlace ) -{ - int i; - volatile unsigned int inst; - volatile unsigned int inst3; - volatile uint32_t target_buffer, buffer; - volatile uint32_t *dma_prog; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - int b; - - OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt); - - OUTB(bktr, BKTR_E_SCLOOP, INB(bktr, BKTR_E_SCLOOP) | BT848_E_SCLOOP_CAGC); /* enable chroma comb */ - OUTB(bktr, BKTR_O_SCLOOP, INB(bktr, BKTR_O_SCLOOP) | BT848_O_SCLOOP_CAGC); - - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_RGB_DED | BT848_COLOR_CTL_GAMMA); - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - - bktr->capcontrol = 3 << 2 | 3; - - dma_prog = (uint32_t *) bktr->dma_prog; - - /* Construct Write */ - - /* write , sol, eol */ - inst = OP_WRITE | OP_SOL | (cols); - /* write , sol, eol */ - inst3 = OP_WRITE | OP_EOL | (cols); - - if (bktr->video.addr) - target_buffer = (uint32_t) bktr->video.addr; - else - target_buffer = (uint32_t) vtophys(bktr->bigbuf); - - buffer = target_buffer; - - /* contruct sync : for video packet format */ - /* sync, mode indicator packed data */ - *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1; - *dma_prog++ = 0; /* NULL WORD */ - - b = cols; - - for (i = 0; i < (rows/interlace); i++) { - *dma_prog++ = inst; - *dma_prog++ = target_buffer; - *dma_prog++ = inst3; - *dma_prog++ = target_buffer + b; - target_buffer += interlace*(cols * 2); - } - - switch (i_flag) { - case 1: - /* sync vre */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 2: - /* sync vro */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 3: - /* sync vro */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP ; - *dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog); - break; - } - - if (interlace == 2) { - - target_buffer = (uint32_t) buffer + cols*2; - - dma_prog = (uint32_t *) bktr->odd_dma_prog; - - /* sync vre */ - *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1; - *dma_prog++ = 0; /* NULL WORD */ - - for (i = 0; i < (rows/interlace) ; i++) { - *dma_prog++ = inst; - *dma_prog++ = target_buffer; - *dma_prog++ = inst3; - *dma_prog++ = target_buffer + b; - target_buffer += interlace * ( cols*2); - } - } - - /* sync vro IRQ bit */ - *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP ; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - *dma_prog++ = 0; /* NULL WORD */ -} - - -/* - * - */ -static void -yuv422_prog( bktr_ptr_t bktr, char i_flag, - int cols, int rows, int interlace ){ - - int i; - volatile unsigned int inst; - volatile uint32_t target_buffer, t1, buffer; - volatile uint32_t *dma_prog; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - - OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt); - - dma_prog = (uint32_t*) bktr->dma_prog; - - bktr->capcontrol = 1 << 6 | 1 << 4 | 3; - - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - OUTB(bktr, BKTR_OFORM, 0x00); - - OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | BT848_E_CONTROL_LDEC); /* disable luma decimation */ - OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | BT848_O_CONTROL_LDEC); - - OUTB(bktr, BKTR_E_SCLOOP, INB(bktr, BKTR_E_SCLOOP) | BT848_E_SCLOOP_CAGC); /* chroma agc enable */ - OUTB(bktr, BKTR_O_SCLOOP, INB(bktr, BKTR_O_SCLOOP) | BT848_O_SCLOOP_CAGC); - - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */ - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40); - - /* disable gamma correction removal */ - OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA); - - /* Construct Write */ - inst = OP_WRITE123 | OP_SOL | OP_EOL | (cols); - if (bktr->video.addr) - target_buffer = (uint32_t) bktr->video.addr; - else - target_buffer = (uint32_t) vtophys(bktr->bigbuf); - - buffer = target_buffer; - - t1 = buffer; - - /* contruct sync : for video packet format */ - *dma_prog++ = OP_SYNC | 1 << 15 | BKTR_FM3; /*sync, mode indicator packed data*/ - *dma_prog++ = 0; /* NULL WORD */ - - for (i = 0; i < (rows/interlace ) ; i++) { - *dma_prog++ = inst; - *dma_prog++ = cols/2 | cols/2 << 16; - *dma_prog++ = target_buffer; - *dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace; - *dma_prog++ = t1 + (cols*rows) + (cols*rows/2) + i*cols/2 * interlace; - target_buffer += interlace*cols; - } - - switch (i_flag) { - case 1: - *dma_prog++ = OP_SYNC | 1 << 24 | BKTR_VRE; /*sync vre*/ - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP ; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 2: - *dma_prog++ = OP_SYNC | 1 << 24 | BKTR_VRO; /*sync vre*/ - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 3: - *dma_prog++ = OP_SYNC | 1 << 24 | 1 << 15 | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP ; - *dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog); - break; - } - - if (interlace == 2) { - - dma_prog = (uint32_t *) bktr->odd_dma_prog; - - target_buffer = (uint32_t) buffer + cols; - t1 = buffer + cols/2; - *dma_prog++ = OP_SYNC | 1 << 15 | BKTR_FM3; - *dma_prog++ = 0; /* NULL WORD */ - - for (i = 0; i < (rows/interlace ) ; i++) { - *dma_prog++ = inst; - *dma_prog++ = cols/2 | cols/2 << 16; - *dma_prog++ = target_buffer; - *dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace; - *dma_prog++ = t1 + (cols*rows) + (cols*rows/2) + i*cols/2 * interlace; - target_buffer += interlace*cols; - } - } - - *dma_prog++ = OP_SYNC | 1 << 24 | 1 << 15 | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP ; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog) ; - *dma_prog++ = 0; /* NULL WORD */ -} - - -/* - * - */ -static void -yuv12_prog( bktr_ptr_t bktr, char i_flag, - int cols, int rows, int interlace ){ - - int i; - volatile unsigned int inst; - volatile unsigned int inst1; - volatile uint32_t target_buffer, t1, buffer; - volatile uint32_t *dma_prog; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - - OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt); - - dma_prog = (uint32_t *) bktr->dma_prog; - - bktr->capcontrol = 1 << 6 | 1 << 4 | 3; - - OUTB(bktr, BKTR_ADC, SYNC_LEVEL); - OUTB(bktr, BKTR_OFORM, 0x0); - - /* Construct Write */ - inst = OP_WRITE123 | OP_SOL | OP_EOL | (cols); - inst1 = OP_WRITES123 | OP_SOL | OP_EOL | (cols); - if (bktr->video.addr) - target_buffer = (uint32_t) bktr->video.addr; - else - target_buffer = (uint32_t) vtophys(bktr->bigbuf); - - buffer = target_buffer; - t1 = buffer; - - *dma_prog++ = OP_SYNC | 1 << 15 | BKTR_FM3; /*sync, mode indicator packed data*/ - *dma_prog++ = 0; /* NULL WORD */ - - for (i = 0; i < (rows/interlace )/2 ; i++) { - *dma_prog++ = inst; - *dma_prog++ = cols/2 | (cols/2 << 16); - *dma_prog++ = target_buffer; - *dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace; - *dma_prog++ = t1 + (cols*rows) + (cols*rows/4) + i*cols/2 * interlace; - target_buffer += interlace*cols; - *dma_prog++ = inst1; - *dma_prog++ = cols/2 | (cols/2 << 16); - *dma_prog++ = target_buffer; - target_buffer += interlace*cols; - - } - - switch (i_flag) { - case 1: - *dma_prog++ = OP_SYNC | 1 << 24 | BKTR_VRE; /*sync vre*/ - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 2: - *dma_prog++ = OP_SYNC | 1 << 24 | BKTR_VRO; /*sync vro*/ - *dma_prog++ = 0; /* NULL WORD */ - - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - return; - - case 3: - *dma_prog++ = OP_SYNC | 1 << 24 | 1 << 15 | BKTR_VRO; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP ; - *dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog); - break; - } - - if (interlace == 2) { - - dma_prog = (uint32_t *) bktr->odd_dma_prog; - - target_buffer = (uint32_t) buffer + cols; - t1 = buffer + cols/2; - *dma_prog++ = OP_SYNC | 1 << 15 | BKTR_FM3; - *dma_prog++ = 0; /* NULL WORD */ - - for (i = 0; i < ((rows/interlace )/2 ) ; i++) { - *dma_prog++ = inst; - *dma_prog++ = cols/2 | (cols/2 << 16); - *dma_prog++ = target_buffer; - *dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace; - *dma_prog++ = t1 + (cols*rows) + (cols*rows/4) + i*cols/2 * interlace; - target_buffer += interlace*cols; - *dma_prog++ = inst1; - *dma_prog++ = cols/2 | (cols/2 << 16); - *dma_prog++ = target_buffer; - target_buffer += interlace*cols; - - } - - - } - - *dma_prog++ = OP_SYNC | 1 << 24 | 1 << 15 | BKTR_VRE; - *dma_prog++ = 0; /* NULL WORD */ - *dma_prog++ = OP_JUMP; - *dma_prog++ = (uint32_t) vtophys(bktr->dma_prog); - *dma_prog++ = 0; /* NULL WORD */ -} - - - -/* - * - */ -static void -build_dma_prog( bktr_ptr_t bktr, char i_flag ) -{ - int rows, cols, interlace; - int tmp_int; - unsigned int temp; - struct format_params *fp; - struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ]; - - - fp = &format_params[bktr->format_params]; - - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - - /* disable FIFO & RISC, leave other bits alone */ - OUTW(bktr, BKTR_GPIO_DMA_CTL, INW(bktr, BKTR_GPIO_DMA_CTL) & ~FIFO_RISC_ENABLED); - - /* set video parameters */ - if (bktr->capture_area_enabled) - temp = ((quad_t ) fp->htotal* (quad_t) bktr->capture_area_x_size * 4096 - / fp->scaled_htotal / bktr->cols) - 4096; - else - temp = ((quad_t ) fp->htotal* (quad_t) fp->scaled_hactive * 4096 - / fp->scaled_htotal / bktr->cols) - 4096; - - /* printf("%s: HSCALE value is %d\n", bktr_name(bktr), temp); */ - OUTB(bktr, BKTR_E_HSCALE_LO, temp & 0xff); - OUTB(bktr, BKTR_O_HSCALE_LO, temp & 0xff); - OUTB(bktr, BKTR_E_HSCALE_HI, (temp >> 8) & 0xff); - OUTB(bktr, BKTR_O_HSCALE_HI, (temp >> 8) & 0xff); - - /* horizontal active */ - temp = bktr->cols; - /* printf("%s: HACTIVE value is %d\n", bktr_name(bktr), temp); */ - OUTB(bktr, BKTR_E_HACTIVE_LO, temp & 0xff); - OUTB(bktr, BKTR_O_HACTIVE_LO, temp & 0xff); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0x3); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0x3); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 8) & 0x3)); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 8) & 0x3)); - - /* horizontal delay */ - if (bktr->capture_area_enabled) - temp = ( (fp->hdelay* fp->scaled_hactive + bktr->capture_area_x_offset* fp->scaled_htotal) - * bktr->cols) / (bktr->capture_area_x_size * fp->hactive); - else - temp = (fp->hdelay * bktr->cols) / fp->hactive; - - temp = temp & 0x3fe; - - /* printf("%s: HDELAY value is %d\n", bktr_name(bktr), temp); */ - OUTB(bktr, BKTR_E_DELAY_LO, temp & 0xff); - OUTB(bktr, BKTR_O_DELAY_LO, temp & 0xff); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0xc); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0xc); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 6) & 0xc)); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 6) & 0xc)); - - /* vertical scale */ - - if (bktr->capture_area_enabled) { - if (bktr->flags & METEOR_ONLY_ODD_FIELDS || - bktr->flags & METEOR_ONLY_EVEN_FIELDS) - tmp_int = 65536 - - (((bktr->capture_area_y_size * 256 + (bktr->rows/2)) / bktr->rows) - 512); - else { - tmp_int = 65536 - - (((bktr->capture_area_y_size * 512 + (bktr->rows / 2)) / bktr->rows) - 512); - } - } else { - if (bktr->flags & METEOR_ONLY_ODD_FIELDS || - bktr->flags & METEOR_ONLY_EVEN_FIELDS) - tmp_int = 65536 - - (((fp->vactive * 256 + (bktr->rows/2)) / bktr->rows) - 512); - else { - tmp_int = 65536 - - (((fp->vactive * 512 + (bktr->rows / 2)) / bktr->rows) - 512); - } - } - - tmp_int &= 0x1fff; - /* printf("%s: VSCALE value is %d\n", bktr_name(bktr), tmp_int); */ - OUTB(bktr, BKTR_E_VSCALE_LO, tmp_int & 0xff); - OUTB(bktr, BKTR_O_VSCALE_LO, tmp_int & 0xff); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x1f); - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x1f); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | ((tmp_int >> 8) & 0x1f)); - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | ((tmp_int >> 8) & 0x1f)); - - - /* vertical active */ - if (bktr->capture_area_enabled) - temp = bktr->capture_area_y_size; - else - temp = fp->vactive; - /* printf("%s: VACTIVE is %d\n", bktr_name(bktr), temp); */ - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0x30); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 4) & 0x30)); - OUTB(bktr, BKTR_E_VACTIVE_LO, temp & 0xff); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0x30); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 4) & 0x30)); - OUTB(bktr, BKTR_O_VACTIVE_LO, temp & 0xff); - - /* vertical delay */ - if (bktr->capture_area_enabled) - temp = fp->vdelay + (bktr->capture_area_y_offset); - else - temp = fp->vdelay; - /* printf("%s: VDELAY is %d\n", bktr_name(bktr), temp); */ - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0xC0); - OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 2) & 0xC0)); - OUTB(bktr, BKTR_E_VDELAY_LO, temp & 0xff); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0xC0); - OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 2) & 0xC0)); - OUTB(bktr, BKTR_O_VDELAY_LO, temp & 0xff); - - /* end of video params */ - - if ((bktr->xtal_pll_mode == BT848_USE_PLL) - && (fp->iform_xtsel==BT848_IFORM_X_XT1)) { - OUTB(bktr, BKTR_TGCTRL, BT848_TGCTRL_TGCKI_PLL); /* Select PLL mode */ - } else { - OUTB(bktr, BKTR_TGCTRL, BT848_TGCTRL_TGCKI_XTAL); /* Select Normal xtal 0/xtal 1 mode */ - } - - /* capture control */ - switch (i_flag) { - case 1: - bktr->bktr_cap_ctl = - (BT848_CAP_CTL_DITH_FRAME | BT848_CAP_CTL_EVEN); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x20); - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x20); - interlace = 1; - break; - case 2: - bktr->bktr_cap_ctl = - (BT848_CAP_CTL_DITH_FRAME | BT848_CAP_CTL_ODD); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x20); - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x20); - interlace = 1; - break; - default: - bktr->bktr_cap_ctl = - (BT848_CAP_CTL_DITH_FRAME | - BT848_CAP_CTL_EVEN | BT848_CAP_CTL_ODD); - OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x20); - OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x20); - interlace = 2; - break; - } - - OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog)); - - rows = bktr->rows; - cols = bktr->cols; - - bktr->vbiflags &= ~VBI_CAPTURE; /* default - no vbi capture */ - - /* RGB Grabs. If /dev/vbi is already open, or we are a PAL/SECAM */ - /* user, then use the rgb_vbi RISC program. */ - /* Otherwise, use the normal rgb RISC program */ - if (pf_int->public.type == METEOR_PIXTYPE_RGB) { - if ( (bktr->vbiflags & VBI_OPEN) - ||(bktr->format_params == BT848_IFORM_F_PALBDGHI) - ||(bktr->format_params == BT848_IFORM_F_SECAM) - ){ - bktr->bktr_cap_ctl |= - BT848_CAP_CTL_VBI_EVEN | BT848_CAP_CTL_VBI_ODD; - bktr->vbiflags |= VBI_CAPTURE; - rgb_vbi_prog(bktr, i_flag, cols, rows, interlace); - return; - } else { - rgb_prog(bktr, i_flag, cols, rows, interlace); - return; - } - } - - if ( pf_int->public.type == METEOR_PIXTYPE_YUV ) { - yuv422_prog(bktr, i_flag, cols, rows, interlace); - OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0) - | pixfmt_swap_flags( bktr->pixfmt )); - return; - } - - if ( pf_int->public.type == METEOR_PIXTYPE_YUV_PACKED ) { - yuvpack_prog(bktr, i_flag, cols, rows, interlace); - OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0) - | pixfmt_swap_flags( bktr->pixfmt )); - return; - } - - if ( pf_int->public.type == METEOR_PIXTYPE_YUV_12 ) { - yuv12_prog(bktr, i_flag, cols, rows, interlace); - OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0) - | pixfmt_swap_flags( bktr->pixfmt )); - return; - } - return; -} - - -/****************************************************************************** - * video & video capture specific routines: - */ - - -/* - * - */ -static void -start_capture( bktr_ptr_t bktr, unsigned type ) -{ - u_char i_flag; - struct format_params *fp; - - fp = &format_params[bktr->format_params]; - - /* If requested, clear out capture buf first */ - if (bktr->clr_on_start && (bktr->video.addr == 0)) { - bzero((caddr_t)bktr->bigbuf, - (size_t)bktr->rows * bktr->cols * bktr->frames * - pixfmt_table[ bktr->pixfmt ].public.Bpp); - } - - OUTB(bktr, BKTR_DSTATUS, 0); - OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT)); - - bktr->flags |= type; - bktr->flags &= ~METEOR_WANT_MASK; - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - i_flag = 1; - break; - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - i_flag = 2; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - i_flag = 3; - break; - } - - /* TDEC is only valid for continuous captures */ - if ( type == METEOR_SINGLE ) { - u_short fps_save = bktr->fps; - - set_fps(bktr, fp->frame_rate); - bktr->fps = fps_save; - } - else - set_fps(bktr, bktr->fps); - - if (bktr->dma_prog_loaded == FALSE) { - build_dma_prog(bktr, i_flag); - bktr->dma_prog_loaded = TRUE; - } - - - OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog)); - -} - - -/* - * Set the temporal decimation register to get the desired frame rate. - * We use the 'skip frame' modus always and always start dropping on an - * odd field. - */ -static void -set_fps( bktr_ptr_t bktr, u_short fps ) -{ - struct format_params *fp; - - fp = &format_params[bktr->format_params]; - - switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) { - case METEOR_ONLY_EVEN_FIELDS: - bktr->flags |= METEOR_WANT_EVEN; - break; - case METEOR_ONLY_ODD_FIELDS: - bktr->flags |= METEOR_WANT_ODD; - break; - default: - bktr->flags |= METEOR_WANT_MASK; - break; - } - - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED); - - bktr->fps = fps; - OUTB(bktr, BKTR_TDEC, 0); - - if (fps < fp->frame_rate) - OUTB(bktr, BKTR_TDEC, (fp->frame_rate - fps) & 0x3f); - else - OUTB(bktr, BKTR_TDEC, 0); - return; - -} - - - - - -/* - * Given a pixfmt index, compute the bt848 swap_flags necessary to - * achieve the specified swapping. - * Note that without bt swapping, 2Bpp and 3Bpp modes are written - * byte-swapped, and 4Bpp modes are byte and word swapped (see Table 6 - * and read R->L). - * Note also that for 3Bpp, we may additionally need to do some creative - * SKIPing to align the FIFO bytelines with the target buffer (see split()). - * This is abstracted here: e.g. no swaps = RGBA; byte & short swap = ABGR - * as one would expect. - */ - -static u_int pixfmt_swap_flags( int pixfmt ) -{ - struct meteor_pixfmt *pf = &pixfmt_table[ pixfmt ].public; - u_int swapf = 0; - - switch ( pf->Bpp ) { - case 2 : swapf = ( pf->swap_bytes ? 0 : BSWAP ); - break; - - case 3 : /* no swaps supported for 3bpp - makes no sense w/ bt848 */ - break; - - case 4 : if ( pf->swap_bytes ) - swapf = pf->swap_shorts ? 0 : WSWAP; - else - swapf = pf->swap_shorts ? BSWAP : (BSWAP | WSWAP); - break; - } - return swapf; -} - - - -/* - * Converts meteor-defined pixel formats (e.g. METEOR_GEO_RGB16) into - * our pixfmt_table indices. - */ - -static int oformat_meteor_to_bt( u_long format ) -{ - int i; - struct meteor_pixfmt *pf1, *pf2; - - /* Find format in compatibility table */ - for ( i = 0; i < METEOR_PIXFMT_TABLE_SIZE; i++ ) - if ( meteor_pixfmt_table[i].meteor_format == format ) - break; - - if ( i >= METEOR_PIXFMT_TABLE_SIZE ) - return -1; - pf1 = &meteor_pixfmt_table[i].public; - - /* Match it with an entry in master pixel format table */ - for ( i = 0; i < PIXFMT_TABLE_SIZE; i++ ) { - pf2 = &pixfmt_table[i].public; - - if (( pf1->type == pf2->type ) && - ( pf1->Bpp == pf2->Bpp ) && - !bcmp( pf1->masks, pf2->masks, sizeof( pf1->masks )) && - ( pf1->swap_bytes == pf2->swap_bytes ) && - ( pf1->swap_shorts == pf2->swap_shorts )) - break; - } - if ( i >= PIXFMT_TABLE_SIZE ) - return -1; - - return i; -} - -/****************************************************************************** - * i2c primitives: - */ - -/* */ -#define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */ -#define I2CBITTIME_878 (1 << 7) -#define I2C_READ 0x01 -#define I2C_COMMAND (I2CBITTIME | \ - BT848_DATA_CTL_I2CSCL | \ - BT848_DATA_CTL_I2CSDA) - -#define I2C_COMMAND_878 (I2CBITTIME_878 | \ - BT848_DATA_CTL_I2CSCL | \ - BT848_DATA_CTL_I2CSDA) - -/* Select between old i2c code and new iicbus / smbus code */ -#if defined(BKTR_USE_FREEBSD_SMBUS) - -/* - * The hardware interface is actually SMB commands - */ -int -i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 ) -{ - char cmd; - - if (bktr->id == BROOKTREE_848 || - bktr->id == BROOKTREE_848A || - bktr->id == BROOKTREE_849A) - cmd = I2C_COMMAND; - else - cmd = I2C_COMMAND_878; - - if (byte2 != -1) { - if (smbus_writew(bktr->i2c_sc.smbus, addr, cmd, - (short)(((byte2 & 0xff) << 8) | (byte1 & 0xff)))) - return (-1); - } else { - if (smbus_writeb(bktr->i2c_sc.smbus, addr, cmd, - (char)(byte1 & 0xff))) - return (-1); - } - - /* return OK */ - return( 0 ); -} - -int -i2cRead( bktr_ptr_t bktr, int addr ) -{ - char result; - char cmd; - - if (bktr->id == BROOKTREE_848 || - bktr->id == BROOKTREE_848A || - bktr->id == BROOKTREE_849A) - cmd = I2C_COMMAND; - else - cmd = I2C_COMMAND_878; - - if (smbus_readb(bktr->i2c_sc.smbus, addr, cmd, &result)) - return (-1); - - return ((int)((unsigned char)result)); -} - -#define IICBUS(bktr) ((bktr)->i2c_sc.iicbb) - -/* The MSP34xx and DPL35xx Audio chip require i2c bus writes of up */ -/* to 5 bytes which the bt848 automated i2c bus controller cannot handle */ -/* Therefore we need low level control of the i2c bus hardware */ - -/* Write to the MSP or DPL registers */ -void -msp_dpl_write(bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr, unsigned int data) -{ - unsigned char addr_l, addr_h, data_h, data_l ; - - addr_h = (addr >>8) & 0xff; - addr_l = addr & 0xff; - data_h = (data >>8) & 0xff; - data_l = data & 0xff; - - iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */); - - iicbus_write_byte(IICBUS(bktr), dev, 0); - iicbus_write_byte(IICBUS(bktr), addr_h, 0); - iicbus_write_byte(IICBUS(bktr), addr_l, 0); - iicbus_write_byte(IICBUS(bktr), data_h, 0); - iicbus_write_byte(IICBUS(bktr), data_l, 0); - - iicbus_stop(IICBUS(bktr)); - - return; -} - -/* Read from the MSP or DPL registers */ -unsigned int -msp_dpl_read(bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr) -{ - unsigned int data; - unsigned char addr_l, addr_h, dev_r; - int read; - u_char data_read[2]; - - addr_h = (addr >>8) & 0xff; - addr_l = addr & 0xff; - dev_r = dev+1; - - /* XXX errors ignored */ - iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */); - - iicbus_write_byte(IICBUS(bktr), dev_r, 0); - iicbus_write_byte(IICBUS(bktr), addr_h, 0); - iicbus_write_byte(IICBUS(bktr), addr_l, 0); - - iicbus_repeated_start(IICBUS(bktr), i2c_addr +1, 0 /* no timeout? */); - iicbus_read(IICBUS(bktr), data_read, 2, &read, IIC_LAST_READ, 0); - iicbus_stop(IICBUS(bktr)); - - data = (data_read[0]<<8) | data_read[1]; - - return (data); -} - -/* Reset the MSP or DPL chip */ -/* The user can block the reset (which is handy if you initialise the - * MSP and/or DPL audio in another operating system first (eg in Windows) - */ -void -msp_dpl_reset( bktr_ptr_t bktr, int i2c_addr ) -{ - -#ifndef BKTR_NO_MSP_RESET - /* put into reset mode */ - iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */); - iicbus_write_byte(IICBUS(bktr), 0x00, 0); - iicbus_write_byte(IICBUS(bktr), 0x80, 0); - iicbus_write_byte(IICBUS(bktr), 0x00, 0); - iicbus_stop(IICBUS(bktr)); - - /* put back to operational mode */ - iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */); - iicbus_write_byte(IICBUS(bktr), 0x00, 0); - iicbus_write_byte(IICBUS(bktr), 0x00, 0); - iicbus_write_byte(IICBUS(bktr), 0x00, 0); - iicbus_stop(IICBUS(bktr)); -#endif - return; -} - -static void remote_read(bktr_ptr_t bktr, struct bktr_remote *remote) { - int read; - - /* XXX errors ignored */ - iicbus_start(IICBUS(bktr), bktr->remote_control_addr, 0 /* no timeout? */); - iicbus_read(IICBUS(bktr), remote->data, 3, &read, IIC_LAST_READ, 0); - iicbus_stop(IICBUS(bktr)); - - return; -} - -#else /* defined(BKTR_USE_FREEBSD_SMBUS) */ - -/* - * Program the i2c bus directly - */ -int -i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 ) -{ - u_long x; - u_long data; - - /* clear status bits */ - OUTL(bktr, BKTR_INT_STAT, BT848_INT_RACK | BT848_INT_I2CDONE); - - /* build the command datum */ - if (bktr->id == BROOKTREE_848 || - bktr->id == BROOKTREE_848A || - bktr->id == BROOKTREE_849A) { - data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND; - } else { - data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND_878; - } - if ( byte2 != -1 ) { - data |= ((byte2 & 0xff) << 8); - data |= BT848_DATA_CTL_I2CW3B; - } - - /* write the address and data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, data); - - /* wait for completion */ - for ( x = 0x7fffffff; x; --x ) { /* safety valve */ - if ( INL(bktr, BKTR_INT_STAT) & BT848_INT_I2CDONE ) - break; - } - - /* check for ACK */ - if ( !x || !(INL(bktr, BKTR_INT_STAT) & BT848_INT_RACK) ) - return( -1 ); - - /* return OK */ - return( 0 ); -} - - -/* - * - */ -int -i2cRead( bktr_ptr_t bktr, int addr ) -{ - u_long x; - - /* clear status bits */ - OUTL(bktr, BKTR_INT_STAT, BT848_INT_RACK | BT848_INT_I2CDONE); - - /* write the READ address */ - /* The Bt878 and Bt879 differed on the treatment of i2c commands */ - - if (bktr->id == BROOKTREE_848 || - bktr->id == BROOKTREE_848A || - bktr->id == BROOKTREE_849A) { - OUTL(bktr, BKTR_I2C_DATA_CTL, ((addr & 0xff) << 24) | I2C_COMMAND); - } else { - OUTL(bktr, BKTR_I2C_DATA_CTL, ((addr & 0xff) << 24) | I2C_COMMAND_878); - } - - /* wait for completion */ - for ( x = 0x7fffffff; x; --x ) { /* safety valve */ - if ( INL(bktr, BKTR_INT_STAT) & BT848_INT_I2CDONE ) - break; - } - - /* check for ACK */ - if ( !x || !(INL(bktr, BKTR_INT_STAT) & BT848_INT_RACK) ) - return( -1 ); - - /* it was a read */ - return( (INL(bktr, BKTR_I2C_DATA_CTL) >> 8) & 0xff ); -} - -/* The MSP34xx Audio chip require i2c bus writes of up to 5 bytes which the */ -/* bt848 automated i2c bus controller cannot handle */ -/* Therefore we need low level control of the i2c bus hardware */ -/* Idea for the following functions are from elsewhere in this driver and */ -/* from the Linux BTTV i2c driver by Gerd Knorr */ - -#define BITD 40 -static void i2c_start( bktr_ptr_t bktr) { - OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD ); /* release data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* release clock */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD ); /* lower data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD ); /* lower clock */ -} - -static void i2c_stop( bktr_ptr_t bktr) { - OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD ); /* lower clock & data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD ); /* release clock */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* release data */ -} - -static int i2c_write_byte( bktr_ptr_t bktr, unsigned char data) { - int x; - int status; - - /* write out the byte */ - for ( x = 7; x >= 0; --x ) { - if ( data & (1<= 0; --x ) { - OUTL(bktr, BKTR_I2C_DATA_CTL, 3); - DELAY( BITD ); /* strobe clock */ - bit = INL(bktr, BKTR_I2C_DATA_CTL) & 1; /* read the data bit */ - if ( bit ) byte |= (1<>8) & 0xff; - addr_l = addr & 0xff; - data_h = (data >>8) & 0xff; - data_l = data & 0xff; - - i2c_start(bktr); - i2c_write_byte(bktr, msp_w_addr); - i2c_write_byte(bktr, dev); - i2c_write_byte(bktr, addr_h); - i2c_write_byte(bktr, addr_l); - i2c_write_byte(bktr, data_h); - i2c_write_byte(bktr, data_l); - i2c_stop(bktr); -} - -/* Read from the MSP or DPL registers */ -unsigned int msp_dpl_read(bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr){ - unsigned int data; - unsigned char addr_l, addr_h, data_1, data_2, dev_r ; - addr_h = (addr >>8) & 0xff; - addr_l = addr & 0xff; - dev_r = dev+1; - - i2c_start(bktr); - i2c_write_byte(bktr,i2c_addr); - i2c_write_byte(bktr,dev_r); - i2c_write_byte(bktr,addr_h); - i2c_write_byte(bktr,addr_l); - - i2c_start(bktr); - i2c_write_byte(bktr,i2c_addr+1); - i2c_read_byte(bktr,&data_1, 0); - i2c_read_byte(bktr,&data_2, 1); - i2c_stop(bktr); - data = (data_1<<8) | data_2; - return data; -} - -/* Reset the MSP or DPL chip */ -/* The user can block the reset (which is handy if you initialise the - * MSP audio in another operating system first (eg in Windows) - */ -void msp_dpl_reset( bktr_ptr_t bktr, int i2c_addr ) { - -#ifndef BKTR_NO_MSP_RESET - /* put into reset mode */ - i2c_start(bktr); - i2c_write_byte(bktr, i2c_addr); - i2c_write_byte(bktr, 0x00); - i2c_write_byte(bktr, 0x80); - i2c_write_byte(bktr, 0x00); - i2c_stop(bktr); - - /* put back to operational mode */ - i2c_start(bktr); - i2c_write_byte(bktr, i2c_addr); - i2c_write_byte(bktr, 0x00); - i2c_write_byte(bktr, 0x00); - i2c_write_byte(bktr, 0x00); - i2c_stop(bktr); -#endif - return; - -} - -static void remote_read(bktr_ptr_t bktr, struct bktr_remote *remote) { - - /* XXX errors ignored */ - i2c_start(bktr); - i2c_write_byte(bktr,bktr->remote_control_addr); - i2c_read_byte(bktr,&(remote->data[0]), 0); - i2c_read_byte(bktr,&(remote->data[1]), 0); - i2c_read_byte(bktr,&(remote->data[2]), 0); - i2c_stop(bktr); - - return; -} - -#endif /* defined(BKTR_USE_FREEBSD_SMBUS) */ - - -#if defined( I2C_SOFTWARE_PROBE ) - -/* - * we are keeping this around for any parts that we need to probe - * but that CANNOT be probed via an i2c read. - * this is necessary because the hardware i2c mechanism - * cannot be programmed for 1 byte writes. - * currently there are no known i2c parts that we need to probe - * and that cannot be safely read. - */ -static int i2cProbe( bktr_ptr_t bktr, int addr ); -#define BITD 40 -#define EXTRA_START - -/* - * probe for an I2C device at addr. - */ -static int -i2cProbe( bktr_ptr_t bktr, int addr ) -{ - int x, status; - - /* the START */ -#if defined( EXTRA_START ) - OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD ); /* release data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* release clock */ -#endif /* EXTRA_START */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD ); /* lower data */ - OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD ); /* lower clock */ - - /* write addr */ - for ( x = 7; x >= 0; --x ) { - if ( addr & (1< 1 byte - */ -#define BKTR_SLEEP ((caddr_t)bktr ) -#define VBI_SLEEP ((caddr_t)bktr + 1) - - -/* device name for printf */ -const char *bktr_name(bktr_ptr_t bktr); - -/* Prototypes for attatch and interrupt functions */ -void common_bktr_attach( bktr_ptr_t bktr, int unit, - u_long pci_id, u_int rev ); -int common_bktr_intr( void *arg ); - - -/* Prototypes for open, close, read, mmap and ioctl calls */ -int video_open( bktr_ptr_t bktr ); -int video_close( bktr_ptr_t bktr ); -int video_read( bktr_ptr_t bktr, int unit, struct cdev *dev, struct uio *uio ); -int video_ioctl( bktr_ptr_t bktr, int unit, - ioctl_cmd_t cmd, caddr_t arg, struct thread* pr ); - - -int tuner_open( bktr_ptr_t bktr ); -int tuner_close( bktr_ptr_t bktr ); -int tuner_ioctl( bktr_ptr_t bktr, int unit, - ioctl_cmd_t cmd, caddr_t arg, struct thread* pr ); - -int vbi_open( bktr_ptr_t bktr ); -int vbi_close( bktr_ptr_t bktr ); -int vbi_read( bktr_ptr_t bktr, struct uio *uio, int ioflag ); - diff --git a/sys/dev/bktr/bktr_i2c.c b/sys/dev/bktr/bktr_i2c.c deleted file mode 100644 index 0e9464822e60..000000000000 --- a/sys/dev/bktr/bktr_i2c.c +++ /dev/null @@ -1,364 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1998, 2001 Nicolas Souchu - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * I2C support for the bti2c chipset. - * - * From brooktree848.c - */ - -#include "opt_bktr.h" - -#include -#include -#include -#include -#include -#include -#include - -#if __FreeBSD_version < 500014 -#include -#else -#include -#endif - -#if (__FreeBSD_version < 500000) -#include -#include -#else -#include -#include -#endif - -#include -#include - -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include - -#include -#include - -/* Compilation is void if BKTR_USE_FREEBSD_SMBUS is not - * defined. This allows bktr owners to have smbus active for there - * motherboard and still use their bktr without smbus. - */ -#if defined(BKTR_USE_FREEBSD_SMBUS) - -#define BTI2C_DEBUG(x) if (bti2c_debug) (x) -static int bti2c_debug = 0; - -/* - * Call this to pass the address of the bktr device to the - * bti2c_i2c layer and initialize all the I2C bus architecture - */ -int bt848_i2c_attach(device_t dev) -{ - struct bktr_softc *bktr_sc = (struct bktr_softc *)device_get_softc(dev); - struct bktr_i2c_softc *sc = &bktr_sc->i2c_sc; - - sc->smbus = device_add_child(dev, "smbus", -1); - sc->iicbb = device_add_child(dev, "iicbb", -1); - - if (!sc->iicbb || !sc->smbus) - return ENXIO; - - bus_generic_attach(dev); - - return (0); -}; - -int bt848_i2c_detach(device_t dev) -{ - struct bktr_softc *bktr_sc = (struct bktr_softc *)device_get_softc(dev); - struct bktr_i2c_softc *sc = &bktr_sc->i2c_sc; - int error = 0; - - if ((error = bus_generic_detach(dev))) - goto error; - - if (sc->iicbb && (error = device_delete_child(dev, sc->iicbb))) - goto error; - - if (sc->smbus && (error = device_delete_child(dev, sc->smbus))) - goto error; - -error: - return (error); -} - -int bti2c_smb_callback(device_t dev, int index, void *data) -{ - struct bktr_softc *bktr_sc = (struct bktr_softc *)device_get_softc(dev); - struct bktr_i2c_softc *sc = &bktr_sc->i2c_sc; - int error = 0; - - /* test each time if we already have/haven't the iicbus - * to avoid deadlocks - */ - switch (index) { - case SMB_REQUEST_BUS: - /* XXX test & set */ - mtx_lock(&Giant); - if (!sc->bus_owned) { - sc->bus_owned = 1; - } else - error = EWOULDBLOCK; - mtx_unlock(&Giant); - break; - - case SMB_RELEASE_BUS: - /* XXX test & set */ - mtx_lock(&Giant); - if (sc->bus_owned) { - sc->bus_owned = 0; - } else - error = EINVAL; - mtx_unlock(&Giant); - break; - - default: - error = EINVAL; - } - - return (error); -} - -int bti2c_iic_callback(device_t dev, int index, caddr_t *data) -{ - struct bktr_softc *bktr_sc = (struct bktr_softc *)device_get_softc(dev); - struct bktr_i2c_softc *sc = &bktr_sc->i2c_sc; - int error = 0; - - /* test each time if we already have/haven't the smbus - * to avoid deadlocks - */ - switch (index) { - case IIC_REQUEST_BUS: - /* XXX test & set */ - mtx_lock(&Giant); - if (!sc->bus_owned) { - sc->bus_owned = 1; - } else - error = EWOULDBLOCK; - mtx_unlock(&Giant); - break; - - case IIC_RELEASE_BUS: - /* XXX test & set */ - mtx_lock(&Giant); - if (sc->bus_owned) { - sc->bus_owned = 0; - } else - error = EINVAL; - mtx_unlock(&Giant); - break; - - default: - error = EINVAL; - } - - return (error); -} - -int bti2c_iic_reset(device_t dev, u_char speed, u_char addr, u_char * oldaddr) -{ - mtx_lock(&Giant); - if (oldaddr) - *oldaddr = 0; /* XXX */ - mtx_unlock(&Giant); - - return (IIC_ENOADDR); -} - -void bti2c_iic_setsda(device_t dev, int val) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - int clock; - - mtx_lock(&Giant); - clock = INL(sc, BKTR_I2C_DATA_CTL) & 0x2; - - if (val) - OUTL(sc, BKTR_I2C_DATA_CTL, clock | 1); - else - OUTL(sc, BKTR_I2C_DATA_CTL, clock); - mtx_unlock(&Giant); - - return; -} - -void bti2c_iic_setscl(device_t dev, int val) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - int data; - - mtx_lock(&Giant); - data = INL(sc, BKTR_I2C_DATA_CTL) & 0x1; - - if (val) - OUTL(sc, BKTR_I2C_DATA_CTL, 0x2 | data); - else - OUTL(sc, BKTR_I2C_DATA_CTL, data); - mtx_unlock(&Giant); - - return; -} - -int -bti2c_iic_getsda(device_t dev) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - int retval; - - mtx_lock(&Giant); - retval = INL(sc,BKTR_I2C_DATA_CTL) & 0x1; - mtx_unlock(&Giant); - return (retval); -} - -int -bti2c_iic_getscl(device_t dev) -{ - return (0); -} - -static int -bti2c_write(struct bktr_softc *sc, u_long data) -{ - u_long x; - - mtx_lock(&Giant); - - /* clear status bits */ - OUTL(sc, BKTR_INT_STAT, (BT848_INT_RACK | BT848_INT_I2CDONE)); - - BTI2C_DEBUG(printf("w%lx", data)); - - /* write the address and data */ - OUTL(sc, BKTR_I2C_DATA_CTL, data); - - /* wait for completion */ - for ( x = 0x7fffffff; x; --x ) { /* safety valve */ - if ( INL(sc, BKTR_INT_STAT) & BT848_INT_I2CDONE ) - break; - } - - /* check for ACK */ - if ( !x || !( INL(sc, BKTR_INT_STAT) & BT848_INT_RACK) ) { - BTI2C_DEBUG(printf("%c%c", (!x)?'+':'-', - (!( INL(sc, BKTR_INT_STAT) & BT848_INT_RACK))?'+':'-')); - mtx_unlock(&Giant); - return (SMB_ENOACK); - } - BTI2C_DEBUG(printf("+")); - mtx_unlock(&Giant); - - /* return OK */ - return( 0 ); -} - -int -bti2c_smb_writeb(device_t dev, u_char slave, char cmd, char byte) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - u_long data; - - data = ((slave & 0xff) << 24) | ((byte & 0xff) << 16) | (u_char)cmd; - - return (bti2c_write(sc, data)); -} - -/* - * byte1 becomes low byte of word - * byte2 becomes high byte of word - */ -int -bti2c_smb_writew(device_t dev, u_char slave, char cmd, short word) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - u_long data; - char low, high; - - low = (char)(word & 0xff); - high = (char)((word & 0xff00) >> 8); - - data = ((slave & 0xff) << 24) | ((low & 0xff) << 16) | - ((high & 0xff) << 8) | BT848_DATA_CTL_I2CW3B | (u_char)cmd; - - return (bti2c_write(sc, data)); -} - -/* - * The Bt878 and Bt879 differed on the treatment of i2c commands - */ -int -bti2c_smb_readb(device_t dev, u_char slave, char cmd, char *byte) -{ - struct bktr_softc *sc = (struct bktr_softc *)device_get_softc(dev); - u_long x; - - mtx_lock(&Giant); - /* clear status bits */ - OUTL(sc,BKTR_INT_STAT, (BT848_INT_RACK | BT848_INT_I2CDONE)); - - OUTL(sc,BKTR_I2C_DATA_CTL, ((slave & 0xff) << 24) | (u_char)cmd); - - BTI2C_DEBUG(printf("r%lx/", (u_long)(((slave & 0xff) << 24) | (u_char)cmd))); - - /* wait for completion */ - for ( x = 0x7fffffff; x; --x ) { /* safety valve */ - if ( INL(sc,BKTR_INT_STAT) & BT848_INT_I2CDONE ) - break; - } - - /* check for ACK */ - if ( !x || !(INL(sc,BKTR_INT_STAT) & BT848_INT_RACK) ) { - BTI2C_DEBUG(printf("r%c%c", (!x)?'+':'-', - (!( INL(sc,BKTR_INT_STAT) & BT848_INT_RACK))?'+':'-')); - mtx_unlock(&Giant); - return (SMB_ENOACK); - } - - *byte = (char)((INL(sc,BKTR_I2C_DATA_CTL) >> 8) & 0xff); - BTI2C_DEBUG(printf("r%x+", *byte)); - mtx_unlock(&Giant); - - return (0); -} - -DRIVER_MODULE(iicbb, bktr, iicbb_driver, iicbb_devclass, 0, 0); -DRIVER_MODULE(smbus, bktr, smbus_driver, smbus_devclass, 0, 0); - -#endif /* defined(BKTR_USE_FREEBSD_SMBUS) */ diff --git a/sys/dev/bktr/bktr_i2c.h b/sys/dev/bktr/bktr_i2c.h deleted file mode 100644 index 8ea53559ff62..000000000000 --- a/sys/dev/bktr/bktr_i2c.h +++ /dev/null @@ -1,49 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1998, 2001 Nicolas Souchu - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - * - */ -#ifndef _BT848_I2C_H -#define _BT848_I2C_H - -extern int bt848_i2c_attach(device_t); -extern int bt848_i2c_detach(device_t); - -extern int bti2c_iic_callback(device_t, int, caddr_t *); -extern void bti2c_iic_setsda(device_t, int); -extern void bti2c_iic_setscl(device_t, int); -extern int bti2c_iic_getsda(device_t); -extern int bti2c_iic_getscl(device_t); -extern int bti2c_iic_reset(device_t, u_char, u_char, u_char *); - -extern int bti2c_smb_callback(device_t, int, void *); -extern int bti2c_smb_writeb(device_t dev, u_char slave, char cmd, char byte); -extern int bti2c_smb_writew(device_t dev, u_char slave, char cmd, short word); -extern int bti2c_smb_readb(device_t dev, u_char slave, char cmd, char *byte); - -#endif diff --git a/sys/dev/bktr/bktr_mem.c b/sys/dev/bktr/bktr_mem.c deleted file mode 100644 index 5009c51e75fe..000000000000 --- a/sys/dev/bktr/bktr_mem.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * 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. - * - * bktr_mem : This kernel module allows us to keep our allocated - * contiguous memory for the video buffer, DMA programs and VBI data - * while the main bktr driver is unloaded and reloaded. - * This avoids the problem of trying to allocate contiguous each - * time the bktr driver is loaded. - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 2000 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include - -struct memory_pointers { - int addresses_stored; - vm_offset_t dma_prog; - vm_offset_t odd_dma_prog; - vm_offset_t vbidata; - vm_offset_t vbibuffer; - vm_offset_t buf; -} memory_pointers; - -static struct memory_pointers memory_list[BKTR_MEM_MAX_DEVICES]; - -/*************************************************************/ - -static int -bktr_mem_modevent(module_t mod, int type, void *unused){ - - switch (type) { - case MOD_LOAD: - printf("bktr_mem: memory holder loaded\n"); - /* - * bzero((caddr_t)memory_list, sizeof(memory_list)); - * causes a panic. So use a simple for loop for now. - */ - { - int x; - unsigned char *d; - - d = (unsigned char *)memory_list; - for (x = 0; x < sizeof(memory_list); x++) - d[x] = 0; - } - return 0; - case MOD_UNLOAD: - printf("bktr_mem: memory holder cannot be unloaded\n"); - return EBUSY; - default: - return EOPNOTSUPP; - break; - } - return (0); -} - -/*************************************************************/ - -int -bktr_has_stored_addresses(int unit) -{ - - if (unit < 0 || unit >= BKTR_MEM_MAX_DEVICES) { - printf("bktr_mem: Unit number %d invalid\n", unit); - return 0; - } - - return memory_list[unit].addresses_stored; -} - -/*************************************************************/ - -void -bktr_store_address(int unit, int type, vm_offset_t addr) -{ - - if (unit < 0 || unit >= BKTR_MEM_MAX_DEVICES) { - printf("bktr_mem: Unit number %d invalid for memory type %d, address %p\n", - unit, type, (void *) addr); - return; - } - - switch (type) { - case BKTR_MEM_DMA_PROG: - memory_list[unit].dma_prog = addr; - memory_list[unit].addresses_stored = 1; - break; - case BKTR_MEM_ODD_DMA_PROG: - memory_list[unit].odd_dma_prog = addr; - memory_list[unit].addresses_stored = 1; - break; - case BKTR_MEM_VBIDATA: - memory_list[unit].vbidata = addr; - memory_list[unit].addresses_stored = 1; - break; - case BKTR_MEM_VBIBUFFER: - memory_list[unit].vbibuffer = addr; - memory_list[unit].addresses_stored = 1; - break; - case BKTR_MEM_BUF: - memory_list[unit].buf = addr; - memory_list[unit].addresses_stored = 1; - break; - default: - printf("bktr_mem: Invalid memory type %d for bktr%d, address %p\n", - type, unit, (void *)addr); - break; - } -} - -/*************************************************************/ - -vm_offset_t -bktr_retrieve_address(int unit, int type) -{ - - if (unit < 0 || unit >= BKTR_MEM_MAX_DEVICES) { - printf("bktr_mem: Unit number %d too large for memory type %d\n", - unit, type); - return (0); - } - switch (type) { - case BKTR_MEM_DMA_PROG: - return memory_list[unit].dma_prog; - case BKTR_MEM_ODD_DMA_PROG: - return memory_list[unit].odd_dma_prog; - case BKTR_MEM_VBIDATA: - return memory_list[unit].vbidata; - case BKTR_MEM_VBIBUFFER: - return memory_list[unit].vbibuffer; - case BKTR_MEM_BUF: - return memory_list[unit].buf; - default: - printf("bktr_mem: Invalid memory type %d for bktr%d", - type, unit); - return (0); - } -} - -/*************************************************************/ - -static moduledata_t bktr_mem_mod = { - "bktr_mem", - bktr_mem_modevent, - 0 -}; - -/* - * The load order is First and module type is Driver to make sure bktr_mem - * loads (and initialises) before bktr when both are loaded together. - */ -DECLARE_MODULE(bktr_mem, bktr_mem_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); -MODULE_VERSION(bktr_mem, 1); diff --git a/sys/dev/bktr/bktr_mem.h b/sys/dev/bktr/bktr_mem.h deleted file mode 100644 index 91b4b1c5afca..000000000000 --- a/sys/dev/bktr/bktr_mem.h +++ /dev/null @@ -1,65 +0,0 @@ -/* $FreeBSD$ */ - -/* - * This is prt 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. - * - * bktr_mem : This kernel module allows us to keep our allocated - * contiguous memory for the video buffer, DMA programs and VBI data - * while the main bktr driver is unloaded and reloaded. - * This avoids the problem of trying to allocate contiguous each - * time the bktr driver is loaded. - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 2000 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - -/* Support this number of devices */ -#define BKTR_MEM_MAX_DEVICES 8 - -/* Define a name for each block of memory we need to keep hold of */ -#define BKTR_MEM_DMA_PROG 1 -#define BKTR_MEM_ODD_DMA_PROG 2 -#define BKTR_MEM_VBIDATA 3 -#define BKTR_MEM_VBIBUFFER 4 -#define BKTR_MEM_BUF 5 - -/* Prototypes */ -int bktr_has_stored_addresses(int unit); -void bktr_store_address(int unit, int type, vm_offset_t addr); -vm_offset_t bktr_retrieve_address(int unit, int type); - diff --git a/sys/dev/bktr/bktr_os.c b/sys/dev/bktr/bktr_os.c deleted file mode 100644 index 12d6ac825b4b..000000000000 --- a/sys/dev/bktr/bktr_os.c +++ /dev/null @@ -1,1348 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * 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_os : This has all the Operating System dependent code, - * probe/attach and open/close/ioctl/read/mmap - * memory allocation - * PCI bus interfacing - */ - -#include "opt_bktr.h" /* include any kernel config options */ - -#define FIFO_RISC_DISABLED 0 -#define ALL_INTS_DISABLED 0 - - -/*******************/ -/* *** FreeBSD *** */ -/*******************/ -#ifdef __FreeBSD__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if __FreeBSD_version >= 500014 -#include -#else -#include -#endif - -#include -#include -#include -#include - -#include /* used by smbus and newbus */ - -#include /* used by bus space and newbus */ -#include - -#include /* used by newbus */ -#include /* used by newbus */ - -#if (__FreeBSD_version < 500000) -#include /* for DELAY */ -#include -#include -#else -#include -#include -#endif - -#include -int bt848_card = -1; -int bt848_tuner = -1; -int bt848_reverse_mute = -1; -int bt848_format = -1; -int bt848_slow_msp_audio = -1; -#ifdef BKTR_NEW_MSP34XX_DRIVER -int bt848_stereo_once = 0; /* no continuous stereo monitoring */ -int bt848_amsound = 0; /* hard-wire AM sound at 6.5 Hz (france), - the autoscan seems work well only with FM... */ -int bt848_dolby = 0; -#endif - -static SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW | CTLFLAG_MPSAFE, 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, ""); -SYSCTL_INT(_hw_bt848, OID_AUTO, slow_msp_audio, CTLFLAG_RW, &bt848_slow_msp_audio, -1, ""); -#ifdef BKTR_NEW_MSP34XX_DRIVER -SYSCTL_INT(_hw_bt848, OID_AUTO, stereo_once, CTLFLAG_RW, &bt848_stereo_once, 0, ""); -SYSCTL_INT(_hw_bt848, OID_AUTO, amsound, CTLFLAG_RW, &bt848_amsound, 0, ""); -SYSCTL_INT(_hw_bt848, OID_AUTO, dolby, CTLFLAG_RW, &bt848_dolby, 0, ""); -#endif - -#endif /* end freebsd section */ - - - -/****************/ -/* *** BSDI *** */ -/****************/ -#ifdef __bsdi__ -#endif /* __bsdi__ */ - - -/**************************/ -/* *** OpenBSD/NetBSD *** */ -/**************************/ -#if defined(__NetBSD__) || defined(__OpenBSD__) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include /* extensions to ioctl_meteor.h */ - -#ifndef __NetBSD__ -#include -#include -#include -#endif - -#include -#include -#include -#include - -#define BKTR_DEBUG -#ifdef BKTR_DEBUG -int bktr_debug = 0; -#define DPR(x) (bktr_debug ? printf x : 0) -#else -#define DPR(x) -#endif -#endif /* __NetBSD__ || __OpenBSD__ */ - - -#ifdef __NetBSD__ -#include /* NetBSD location for .h files */ -#include -#include -#include -#include -#include -#include -#else /* Traditional location for .h files */ -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include -#include -#include - -#if defined(BKTR_USE_FREEBSD_SMBUS) -#include - -#include "iicbb_if.h" -#include "smbus_if.h" -#endif -#endif - - -/****************************/ -/* *** FreeBSD 4.x code *** */ -/****************************/ - -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), - -#if defined(BKTR_USE_FREEBSD_SMBUS) - /* iicbb interface */ - DEVMETHOD(iicbb_callback, bti2c_iic_callback), - DEVMETHOD(iicbb_setsda, bti2c_iic_setsda), - DEVMETHOD(iicbb_setscl, bti2c_iic_setscl), - DEVMETHOD(iicbb_getsda, bti2c_iic_getsda), - DEVMETHOD(iicbb_getscl, bti2c_iic_getscl), - DEVMETHOD(iicbb_reset, bti2c_iic_reset), - - /* smbus interface */ - DEVMETHOD(smbus_callback, bti2c_smb_callback), - DEVMETHOD(smbus_writeb, bti2c_smb_writeb), - DEVMETHOD(smbus_writew, bti2c_smb_writew), - DEVMETHOD(smbus_readb, bti2c_smb_readb), -#endif - - { 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; - -static struct cdevsw bktr_cdevsw = { - .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, - .d_open = bktr_open, - .d_close = bktr_close, - .d_read = bktr_read, - .d_write = bktr_write, - .d_ioctl = bktr_ioctl, - .d_poll = bktr_poll, - .d_mmap = bktr_mmap, - .d_name = "bktr", -}; - -#ifdef BKTR_USE_FREEBSD_SMBUS -#include -#include -MODULE_DEPEND(bktr, iicbb, IICBB_MINVER, IICBB_MODVER, IICBB_MAXVER); -MODULE_DEPEND(bktr, iicbus, IICBUS_MINVER, IICBUS_MODVER, IICBUS_MAXVER); -MODULE_DEPEND(bktr, smbus, SMBUS_MINVER, SMBUS_MODVER, SMBUS_MAXVER); -#endif -DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, 0, 0); -MODULE_DEPEND(bktr, bktr_mem, 1,1,1); -MODULE_VERSION(bktr, 1); - - -/* - * 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); - - if (BKTR_PCI_VENDOR(type) == PCI_VENDOR_BROOKTREE) - { - switch (BKTR_PCI_PRODUCT(type)) { - case PCI_PRODUCT_BROOKTREE_BT848: - if (rev == 0x12) - device_set_desc(dev, "BrookTree 848A"); - else - device_set_desc(dev, "BrookTree 848"); - return BUS_PROBE_DEFAULT; - case PCI_PRODUCT_BROOKTREE_BT849: - device_set_desc(dev, "BrookTree 849A"); - return BUS_PROBE_DEFAULT; - case PCI_PRODUCT_BROOKTREE_BT878: - device_set_desc(dev, "BrookTree 878"); - return BUS_PROBE_DEFAULT; - case PCI_PRODUCT_BROOKTREE_BT879: - device_set_desc(dev, "BrookTree 879"); - return BUS_PROBE_DEFAULT; - } - } - - return ENXIO; -} - - -/* - * the attach routine. - */ -static int -bktr_attach( device_t dev ) -{ - u_long latency; - u_long fun; - unsigned int rev; - unsigned int unit; - int error = 0; -#ifdef BROOKTREE_IRQ - u_long old_irq, new_irq; -#endif - - struct bktr_softc *bktr = device_get_softc(dev); - - unit = device_get_unit(dev); - - /* build the device name for bktr_name() */ - snprintf(bktr->bktr_xname, sizeof(bktr->bktr_xname), "bktr%d",unit); - - /* - * Enable bus mastering and Memory Mapped device - */ - pci_enable_busmaster(dev); - - /* - * Map control/status registers. - */ - bktr->mem_rid = PCIR_BAR(0); - bktr->res_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &bktr->mem_rid, RF_ACTIVE); - - if (!bktr->res_mem) { - device_printf(dev, "could not map memory\n"); - error = ENXIO; - goto fail; - } - bktr->memt = rman_get_bustag(bktr->res_mem); - bktr->memh = rman_get_bushandle(bktr->res_mem); - - - /* - * Disable the brooktree device - */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - OUTW(bktr, BKTR_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. - */ - bktr->irq_rid = 0; - bktr->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &bktr->irq_rid, 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_TTY, - NULL, 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 compatibility 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 compatibility mode\n"); - fun = fun | 4; /* Enable SiS/VIA compatibility mode (useful for - OPTi chipset motherboards too */ -#endif - pci_write_config(dev, 0x40, fun, 2); - -#if defined(BKTR_USE_FREEBSD_SMBUS) - if (bt848_i2c_attach(dev)) - 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 the device entries */ - bktr->bktrdev = make_dev(&bktr_cdevsw, unit, - 0, 0, 0444, "bktr%d", unit); - bktr->tunerdev= make_dev(&bktr_cdevsw, unit+16, - 0, 0, 0444, "tuner%d", unit); - bktr->vbidev = make_dev(&bktr_cdevsw, unit+32, - 0, 0, 0444, "vbi%d" , unit); - - - /* if this is unit 0 (/dev/bktr0, /dev/tuner0, /dev/vbi0) then make */ - /* alias entries to /dev/bktr /dev/tuner and /dev/vbi */ -#if (__FreeBSD_version >=500000) - if (unit == 0) { - bktr->bktrdev_alias = make_dev_alias(bktr->bktrdev, "bktr"); - bktr->tunerdev_alias= make_dev_alias(bktr->tunerdev, "tuner"); - bktr->vbidev_alias = make_dev_alias(bktr->vbidev, "vbi"); - } -#endif - - gone_in_dev(dev, 13, "bktr driver removed in FreeBSD 13.0\n"); - return 0; - -fail: - if (bktr->res_irq) - bus_release_resource(dev, SYS_RES_IRQ, bktr->irq_rid, bktr->res_irq); - if (bktr->res_mem) - bus_release_resource(dev, SYS_RES_MEMORY, bktr->mem_rid, bktr->res_mem); - return error; - -} - -/* - * the detach routine. - */ -static int -bktr_detach( device_t dev ) -{ - struct bktr_softc *bktr = device_get_softc(dev); - -#ifdef BKTR_NEW_MSP34XX_DRIVER - /* Disable the soundchip and kernel thread */ - if (bktr->msp3400c_info != NULL) - msp_detach(bktr); -#endif - - /* Disable the brooktree device */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - -#if defined(BKTR_USE_FREEBSD_SMBUS) - if (bt848_i2c_detach(dev)) - printf("bktr%d: i2c_attach: can't attach\n", - device_get_unit(dev)); -#endif -#ifdef USE_VBIMUTEX - mtx_destroy(&bktr->vbimutex); -#endif - - /* Note: We do not free memory for RISC programs, grab buffer, vbi buffers */ - /* The memory is retained by the bktr_mem module so we can unload and */ - /* then reload the main bktr driver module */ - - /* Unregister the /dev/bktrN, tunerN and vbiN devices, - * the aliases for unit 0 are automatically destroyed */ - destroy_dev(bktr->vbidev); - destroy_dev(bktr->tunerdev); - destroy_dev(bktr->bktrdev); - - /* - * Deallocate resources. - */ - bus_teardown_intr(dev, bktr->res_irq, bktr->res_ih); - bus_release_resource(dev, SYS_RES_IRQ, bktr->irq_rid, bktr->res_irq); - bus_release_resource(dev, SYS_RES_MEMORY, bktr->mem_rid, bktr->res_mem); - - return 0; -} - -/* - * the shutdown routine. - */ -static int -bktr_shutdown( device_t dev ) -{ - struct bktr_softc *bktr = device_get_softc(dev); - - /* Disable the brooktree device */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - - return 0; -} - - -/* - * Special Memory Allocation - */ -vm_offset_t -get_bktr_mem( int unit, unsigned size ) -{ - vm_offset_t addr = 0; - - addr = (vm_offset_t)contigmalloc(size, M_DEVBUF, M_NOWAIT, 0, - 0xffffffff, 1<<24, 0); - if (addr == 0) - addr = (vm_offset_t)contigmalloc(size, M_DEVBUF, M_NOWAIT, 0, - 0xffffffff, PAGE_SIZE, 0); - 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) - -/* - * - */ -static int -bktr_open( struct cdev *dev, int flags, int fmt, struct thread *td ) -{ - bktr_ptr_t bktr; - int unit; - int result; - - unit = UNIT( dev2unit(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 ) { - bktr->reverse_mute = bt848_reverse_mute & 0xff; - } - } - - if (bt848_slow_msp_audio != -1) { - if ((bt848_slow_msp_audio >> 8) == unit ) { - bktr->slow_msp_audio = (bt848_slow_msp_audio & 0xff); - } - } - -#ifdef BKTR_NEW_MSP34XX_DRIVER - if (bt848_stereo_once != 0) { - if ((bt848_stereo_once >> 8) == unit ) { - bktr->stereo_once = (bt848_stereo_once & 0xff); - } - } - - if (bt848_amsound != -1) { - if ((bt848_amsound >> 8) == unit ) { - bktr->amsound = (bt848_amsound & 0xff); - } - } - - if (bt848_dolby != -1) { - if ((bt848_dolby >> 8) == unit ) { - bktr->dolby = (bt848_dolby & 0xff); - } - } -#endif - - switch ( FUNCTION( dev2unit(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 ); -} - - -/* - * - */ -static int -bktr_close( struct cdev *dev, int flags, int fmt, struct thread *td ) -{ - bktr_ptr_t bktr; - int unit; - int result; - - unit = UNIT( dev2unit(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( dev2unit(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 ); -} - - -/* - * - */ -static int -bktr_read( struct cdev *dev, struct uio *uio, int ioflag ) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev2unit(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( dev2unit(dev) ) ) { - case VIDEO_DEV: - return( video_read( bktr, unit, dev, uio ) ); - case VBI_DEV: - return( vbi_read( bktr, uio, ioflag ) ); - } - return( ENXIO ); -} - - -/* - * - */ -static int -bktr_write( struct cdev *dev, struct uio *uio, int ioflag ) -{ - return( EINVAL ); /* XXX or ENXIO ? */ -} - - -/* - * - */ -static int -bktr_ioctl( struct cdev *dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td ) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev2unit(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); - } - -#ifdef BKTR_GPIO_ACCESS - if (bktr->bigbuf == 0 && cmd != BT848_GPIO_GET_EN && - cmd != BT848_GPIO_SET_EN && cmd != BT848_GPIO_GET_DATA && - cmd != BT848_GPIO_SET_DATA) /* no frame buffer allocated (ioctl failed) */ - return( ENOMEM ); -#else - if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */ - return( ENOMEM ); -#endif - - switch ( FUNCTION( dev2unit(dev) ) ) { - case VIDEO_DEV: - return( video_ioctl( bktr, unit, cmd, arg, td ) ); - case TUNER_DEV: - return( tuner_ioctl( bktr, unit, cmd, arg, td ) ); - } - - return( ENXIO ); -} - - -/* - * - */ -static int -bktr_mmap( struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, - int nprot, vm_memattr_t *memattr ) -{ - int unit; - bktr_ptr_t bktr; - - unit = UNIT(dev2unit(dev)); - - if (FUNCTION(dev2unit(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 ); - - *paddr = vtophys(bktr->bigbuf) + offset; - return( 0 ); -} - -static int -bktr_poll( struct cdev *dev, int events, struct thread *td) -{ - int unit; - bktr_ptr_t bktr; - int revents = 0; - DECLARE_INTR_MASK(s); - - unit = UNIT(dev2unit(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); - } - - LOCK_VBI(bktr); - DISABLE_INTR(s); - - if (events & (POLLIN | POLLRDNORM)) { - - switch ( FUNCTION( dev2unit(dev) ) ) { - case VBI_DEV: - if(bktr->vbisize == 0) - selrecord(td, &bktr->vbi_select); - else - revents |= events & (POLLIN | POLLRDNORM); - break; - } - } - - ENABLE_INTR(s); - UNLOCK_VBI(bktr); - - return (revents); -} - -/*****************/ -/* *** BSDI *** */ -/*****************/ - -#if defined(__bsdi__) -#endif /* __bsdi__ BSDI specific kernel interface routines */ - - -/*****************************/ -/* *** OpenBSD / NetBSD *** */ -/*****************************/ -#if defined(__NetBSD__) || defined(__OpenBSD__) - -#define IPL_VIDEO IPL_BIO /* XXX */ - -static int bktr_intr(void *arg) { return common_bktr_intr(arg); } - -#define bktr_open bktropen -#define bktr_close bktrclose -#define bktr_read bktrread -#define bktr_write bktrwrite -#define bktr_ioctl bktrioctl -#define bktr_mmap bktrmmap - -vm_offset_t vm_page_alloc_contig(vm_offset_t, vm_offset_t, - vm_offset_t, vm_offset_t); - -#if defined(__OpenBSD__) -static int bktr_probe(struct device *, void *, void *); -static void bktr_attach(struct device *, struct device *, void *); -#else -static int bktr_probe(device_t, struct cfdata *, void *); -static void bktr_attach(device_t, device_t, void *); -#endif - -struct cfattach bktr_ca = { - sizeof(struct bktr_softc), bktr_probe, bktr_attach -}; - -#if defined(__NetBSD__) -extern struct cfdriver bktr_cd; -#else -struct cfdriver bktr_cd = { - NULL, "bktr", DV_DULL -}; -#endif - -int -bktr_probe(parent, match, aux) -#if defined(__OpenBSD__) - struct device *parent; - void *match; -#else - device_t parent; - struct cfdata *match; -#endif - void *aux; -{ - struct pci_attach_args *pa = aux; - - if (BKTR_PCI_VENDOR(pa->pa_id) == PCI_VENDOR_BROOKTREE && - (BKTR_PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROOKTREE_BT848 || - BKTR_PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROOKTREE_BT849 || - BKTR_PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROOKTREE_BT878 || - BKTR_PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROOKTREE_BT879)) - return 1; - - return 0; -} - - -/* - * the attach routine. - */ -static void -bktr_attach(parent, self, aux) -#if defined(__OpenBSD__) - struct device *parent; - struct device *self; -#else - device_t parent; - device_t self; -#endif - void *aux; -{ - bktr_ptr_t bktr; - u_long latency; - u_long fun; - unsigned int rev; - -#if defined(__OpenBSD__) - struct pci_attach_args *pa = aux; - pci_chipset_tag_t pc = pa->pa_pc; - - pci_intr_handle_t ih; - const char *intrstr; - int retval; - int unit; - - bktr = (bktr_ptr_t)self; - unit = bktr->bktr_dev.dv_unit; - - bktr->pc = pa->pa_pc; - bktr->tag = pa->pa_tag; - bktr->dmat = pa->pa_dmat; - - /* - * map memory - */ - bktr->memt = pa->pa_memt; - retval = pci_mem_find(pc, pa->pa_tag, PCI_MAPREG_START, - &bktr->phys_base, &bktr->obmemsz, NULL); - if (!retval) - retval = bus_space_map(pa->pa_memt, bktr->phys_base, - bktr->obmemsz, 0, &bktr->memh); - if (retval) { - printf(": couldn't map memory\n"); - return; - } - - - /* - * map interrupt - */ - if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin, - pa->pa_intrline, &ih)) { - printf(": couldn't map interrupt\n"); - return; - } - intrstr = pci_intr_string(pa->pa_pc, ih); - - bktr->ih = pci_intr_establish(pa->pa_pc, ih, IPL_VIDEO, - bktr_intr, bktr, bktr->bktr_dev.dv_xname); - if (bktr->ih == NULL) { - printf(": couldn't establish interrupt"); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - return; - } - - if (intrstr != NULL) - printf(": %s\n", intrstr); -#endif /* __OpenBSD__ */ - -#if defined(__NetBSD__) - struct pci_attach_args *pa = aux; - pci_intr_handle_t ih; - const char *intrstr; - int retval; - int unit; - - bktr = (bktr_ptr_t)self; - unit = bktr->bktr_dev.dv_unit; - bktr->dmat = pa->pa_dmat; - - printf("\n"); - - /* - * map memory - */ - retval = pci_mapreg_map(pa, PCI_MAPREG_START, - PCI_MAPREG_TYPE_MEM - | PCI_MAPREG_MEM_TYPE_32BIT, 0, - &bktr->memt, &bktr->memh, NULL, - &bktr->obmemsz); - DPR(("pci_mapreg_map: memt %x, memh %x, size %x\n", - bktr->memt, (u_int)bktr->memh, (u_int)bktr->obmemsz)); - if (retval) { - printf("%s: couldn't map memory\n", bktr_name(bktr)); - return; - } - - /* - * Disable the brooktree device - */ - OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED); - OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED); - - /* - * map interrupt - */ - if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin, - pa->pa_intrline, &ih)) { - printf("%s: couldn't map interrupt\n", - bktr_name(bktr)); - return; - } - intrstr = pci_intr_string(pa->pa_pc, ih); - bktr->ih = pci_intr_establish(pa->pa_pc, ih, IPL_VIDEO, - bktr_intr, bktr); - if (bktr->ih == NULL) { - printf("%s: couldn't establish interrupt", - bktr_name(bktr)); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - return; - } - if (intrstr != NULL) - printf("%s: interrupting at %s\n", bktr_name(bktr), - intrstr); -#endif /* __NetBSD__ */ - -/* - * 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_conf_read(pa->pa_pc, pa->pa_tag, PCI_LATENCY_TIMER); - latency = (latency >> 8) & 0xff; - - if (!latency) { - if (bootverbose) { - printf("%s: PCI bus latency was 0 changing to %d", - bktr_name(bktr), BROOKTREE_DEF_LATENCY_VALUE); - } - latency = BROOKTREE_DEF_LATENCY_VALUE; - pci_conf_write(pa->pa_pc, pa->pa_tag, - PCI_LATENCY_TIMER, latency<<8); - } - - - /* Enabled Bus Master - XXX: check if all old DMA is stopped first (e.g. after warm - boot) */ - fun = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); - pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, - fun | PCI_COMMAND_MASTER_ENABLE); - - /* read the pci id and determine the card type */ - fun = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG); - rev = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0x000000ff; - - common_bktr_attach(bktr, unit, fun, rev); -} - - -/* - * Special Memory Allocation - */ -vm_offset_t -get_bktr_mem(bktr, dmapp, size) - bktr_ptr_t bktr; - bus_dmamap_t *dmapp; - unsigned int size; -{ - bus_dma_tag_t dmat = bktr->dmat; - bus_dma_segment_t seg; - bus_size_t align; - int rseg; - caddr_t kva; - - /* - * Allocate a DMA area - */ - align = 1 << 24; - if (bus_dmamem_alloc(dmat, size, align, 0, &seg, 1, - &rseg, BUS_DMA_NOWAIT)) { - align = PAGE_SIZE; - if (bus_dmamem_alloc(dmat, size, align, 0, &seg, 1, - &rseg, BUS_DMA_NOWAIT)) { - printf("%s: Unable to dmamem_alloc of %d bytes\n", - bktr_name(bktr), size); - return 0; - } - } - if (bus_dmamem_map(dmat, &seg, rseg, size, - &kva, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { - printf("%s: Unable to dmamem_map of %d bytes\n", - bktr_name(bktr), size); - bus_dmamem_free(dmat, &seg, rseg); - return 0; - } -#ifdef __OpenBSD__ - bktr->dm_mapsize = size; -#endif - /* - * Create and locd the DMA map for the DMA area - */ - if (bus_dmamap_create(dmat, size, 1, size, 0, BUS_DMA_NOWAIT, dmapp)) { - printf("%s: Unable to dmamap_create of %d bytes\n", - bktr_name(bktr), size); - bus_dmamem_unmap(dmat, kva, size); - bus_dmamem_free(dmat, &seg, rseg); - return 0; - } - if (bus_dmamap_load(dmat, *dmapp, kva, size, NULL, BUS_DMA_NOWAIT)) { - printf("%s: Unable to dmamap_load of %d bytes\n", - bktr_name(bktr), size); - bus_dmamem_unmap(dmat, kva, size); - bus_dmamem_free(dmat, &seg, rseg); - bus_dmamap_destroy(dmat, *dmapp); - return 0; - } - return (vm_offset_t)kva; -} - -void -free_bktr_mem(bktr, dmap, kva) - bktr_ptr_t bktr; - bus_dmamap_t dmap; - vm_offset_t kva; -{ - bus_dma_tag_t dmat = bktr->dmat; - -#ifdef __NetBSD__ - bus_dmamem_unmap(dmat, (caddr_t)kva, dmap->dm_mapsize); -#else - bus_dmamem_unmap(dmat, (caddr_t)kva, bktr->dm_mapsize); -#endif - bus_dmamem_free(dmat, dmap->dm_segs, 1); - bus_dmamap_destroy(dmat, dmap); -} - - -/*--------------------------------------------------------- -** -** BrookTree 848 character device driver routines -** -**--------------------------------------------------------- -*/ - - -#define VIDEO_DEV 0x00 -#define TUNER_DEV 0x01 -#define VBI_DEV 0x02 - -#define UNIT(x) (dev2unit((x) & 0x0f)) -#define FUNCTION(x) (dev2unit((x >> 4) & 0x0f)) - -/* - * - */ -int -bktr_open(dev_t dev, int flags, int fmt, struct thread *td) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev); - - /* unit out of range */ - if ((unit > bktr_cd.cd_ndevs) || (bktr_cd.cd_devs[unit] == NULL)) - return(ENXIO); - - bktr = bktr_cd.cd_devs[unit]; - - if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */ - return(ENXIO); - - switch (FUNCTION(dev)) { - case VIDEO_DEV: - return(video_open(bktr)); - case TUNER_DEV: - return(tuner_open(bktr)); - case VBI_DEV: - return(vbi_open(bktr)); - } - - return(ENXIO); -} - - -/* - * - */ -int -bktr_close(dev_t dev, int flags, int fmt, struct thread *td) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev); - - bktr = bktr_cd.cd_devs[unit]; - - switch (FUNCTION(dev)) { - case VIDEO_DEV: - return(video_close(bktr)); - case TUNER_DEV: - return(tuner_close(bktr)); - case VBI_DEV: - return(vbi_close(bktr)); - } - - return(ENXIO); -} - -/* - * - */ -int -bktr_read(dev_t dev, struct uio *uio, int ioflag) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev); - - bktr = bktr_cd.cd_devs[unit]; - - switch (FUNCTION(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) -{ - /* operation not supported */ - return(EOPNOTSUPP); -} - -/* - * - */ -int -bktr_ioctl(dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td) -{ - bktr_ptr_t bktr; - int unit; - - unit = UNIT(dev); - - bktr = bktr_cd.cd_devs[unit]; - - if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */ - return(ENOMEM); - - switch (FUNCTION(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); -} - -/* - * - */ -paddr_t -bktr_mmap(dev_t dev, off_t offset, int nprot) -{ - int unit; - bktr_ptr_t bktr; - - unit = UNIT(dev); - - if (FUNCTION(dev) > 0) /* only allow mmap on /dev/bktr[n] */ - return(-1); - - bktr = bktr_cd.cd_devs[unit]; - - if ((vaddr_t)offset < 0) - return(-1); - - if ((vaddr_t)offset >= bktr->alloc_pages * PAGE_SIZE) - return(-1); - -#ifdef __NetBSD__ - return (bus_dmamem_mmap(bktr->dmat, bktr->dm_mem->dm_segs, 1, - (vaddr_t)offset, nprot, BUS_DMA_WAITOK)); -#else - return(i386_btop(vtophys(bktr->bigbuf) + offset)); -#endif -} - -#endif /* __NetBSD__ || __OpenBSD__ */ diff --git a/sys/dev/bktr/bktr_os.h b/sys/dev/bktr/bktr_os.h deleted file mode 100644 index cd4ea20b3b8d..000000000000 --- a/sys/dev/bktr/bktr_os.h +++ /dev/null @@ -1,87 +0,0 @@ -/* $FreeBSD$ */ - -/* - * 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_os : This has all the Operating System dependent code. - * - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - -/******************************/ -/* *** Memory Allocation *** */ -/******************************/ -#if (defined(__FreeBSD__) || defined(__bsdi__)) -vm_offset_t get_bktr_mem( int unit, unsigned size ); -#endif - -#if (defined(__NetBSD__) || defined(__OpenBSD__)) -vm_offset_t get_bktr_mem(bktr_ptr_t, bus_dmamap_t *, unsigned size); -void free_bktr_mem(bktr_ptr_t, bus_dmamap_t, vm_offset_t); -#endif - -/************************************/ -/* *** Interrupt Enable/Disable *** */ -/************************************/ -#if defined(__FreeBSD__) -#if (__FreeBSD_version >=500000) -#define USE_VBIMUTEX -#define DECLARE_INTR_MASK(s) /* no need to declare 's' */ -#define DISABLE_INTR(s) -#define ENABLE_INTR(s) -#else -#define DECLARE_INTR_MASK(s) intrmask_t s -#define DISABLE_INTR(s) s=spltty() -#define ENABLE_INTR(s) splx(s) -#endif -#else -#define DECLARE_INTR_MASK(s) /* no need to declare 's' */ -#define DISABLE_INTR(s) disable_intr() -#define ENABLE_INTR(s) enable_intr() -#endif - -#ifdef USE_VBIMUTEX -#define LOCK_VBI(bktr) mtx_lock(&bktr->vbimutex) -#define UNLOCK_VBI(bktr) mtx_unlock(&bktr->vbimutex) -#else -#define LOCK_VBI(bktr) -#define UNLOCK_VBI(bktr) -#endif diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h deleted file mode 100644 index 16e4bdbeb700..000000000000 --- a/sys/dev/bktr/bktr_reg.h +++ /dev/null @@ -1,730 +0,0 @@ -/*- - * $FreeBSD$ - * - * SPDX-License-Identifier: BSD-4-Clause - * - * Copyright (c) 1999 Roger Hardiman - * Copyright (c) 1998 Amancio Hasty - * Copyright (c) 1995 Mark Tinguely and Jim Lowe - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Mark Tinguely and Jim Lowe - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifdef __NetBSD__ -#include /* device_t */ -#include -#include /* struct selinfo */ -# ifdef DEBUG -# define bootverbose 1 -# else -# define bootverbose 0 -# endif -#endif - -/* - * The kernel options for the driver now all begin with BKTR. - * Support the older kernel options on FreeBSD and OpenBSD. - * - */ -#if defined(__FreeBSD__) || defined(__OpenBSD__) -#if defined(BROOKTREE_ALLOC_PAGES) -#define BKTR_ALLOC_PAGES BROOKTREE_ALLOC_PAGES -#endif - -#if defined(BROOKTREE_SYSTEM_DEFAULT) -#define BKTR_SYSTEM_DEFAULT BROOKTREE_SYSTEM_DEFAULT -#endif - -#if defined(OVERRIDE_CARD) -#define BKTR_OVERRIDE_CARD OVERRIDE_CARD -#endif - -#if defined(OVERRIDE_TUNER) -#define BKTR_OVERRIDE_TUNER OVERRIDE_TUNER -#endif - -#if defined(OVERRIDE_DBX) -#define BKTR_OVERRIDE_DBX OVERRIDE_DBX -#endif - -#if defined(OVERRIDE_MSP) -#define BKTR_OVERRIDE_MSP OVERRIDE_MSP -#endif - -#endif - - -#ifndef PCI_LATENCY_TIMER -#define PCI_LATENCY_TIMER 0x0c /* pci timer register */ -#endif - -/* - * Definitions for the Brooktree 848/878 video capture to pci interface. - */ -#ifndef __NetBSD__ -#define BKTR_PCI_VENDOR_SHIFT 0 -#define BKTR_PCI_VENDOR_MASK 0xffff -#define BKTR_PCI_VENDOR(id) \ - (((id) >> BKTR_PCI_VENDOR_SHIFT) & BKTR_PCI_VENDOR_MASK) - -#define BKTR_PCI_PRODUCT_SHIFT 16 -#define BKTR_PCI_PRODUCT_MASK 0xffff -#define BKTR_PCI_PRODUCT(id) \ - (((id) >> BKTR_PCI_PRODUCT_SHIFT) & BKTR_PCI_PRODUCT_MASK) - -/* PCI vendor ID */ -#define PCI_VENDOR_BROOKTREE 0x109e /* Brooktree */ -/* Brooktree products */ -#define PCI_PRODUCT_BROOKTREE_BT848 0x0350 /* Bt848 Video Capture */ -#define PCI_PRODUCT_BROOKTREE_BT849 0x0351 /* Bt849 Video Capture */ -#define PCI_PRODUCT_BROOKTREE_BT878 0x036e /* Bt878 Video Capture */ -#define PCI_PRODUCT_BROOKTREE_BT879 0x036f /* Bt879 Video Capture */ -#endif - -#define BROOKTREE_848 1 -#define BROOKTREE_848A 2 -#define BROOKTREE_849A 3 -#define BROOKTREE_878 4 -#define BROOKTREE_879 5 - -typedef volatile u_int bregister_t; -/* - * if other persuasion endian, then compiler will probably require that - * these next - * macros be reversed - */ -#define BTBYTE(what) bregister_t what:8; int :24 -#define BTWORD(what) bregister_t what:16; int: 16 -#define BTLONG(what) bregister_t what:32 - -struct bt848_registers { - BTBYTE (dstatus); /* 0, 1,2,3 */ -#define BT848_DSTATUS_PRES (1<<7) -#define BT848_DSTATUS_HLOC (1<<6) -#define BT848_DSTATUS_FIELD (1<<5) -#define BT848_DSTATUS_NUML (1<<4) -#define BT848_DSTATUS_CSEL (1<<3) -#define BT848_DSTATUS_PLOCK (1<<2) -#define BT848_DSTATUS_LOF (1<<1) -#define BT848_DSTATUS_COF (1<<0) - BTBYTE (iform); /* 4, 5,6,7 */ -#define BT848_IFORM_MUXSEL (0x3<<5) -# define BT848_IFORM_M_MUX1 (0x03<<5) -# define BT848_IFORM_M_MUX0 (0x02<<5) -# define BT848_IFORM_M_MUX2 (0x01<<5) -# define BT848_IFORM_M_MUX3 (0x0) -# define BT848_IFORM_M_RSVD (0x00<<5) -#define BT848_IFORM_XTSEL (0x3<<3) -# define BT848_IFORM_X_AUTO (0x03<<3) -# define BT848_IFORM_X_XT1 (0x02<<3) -# define BT848_IFORM_X_XT0 (0x01<<3) -# define BT848_IFORM_X_RSVD (0x00<<3) - BTBYTE (tdec); /* 8, 9,a,b */ - BTBYTE (e_crop); /* c, d,e,f */ - BTBYTE (e_vdelay_lo); /* 10, 11,12,13 */ - BTBYTE (e_vactive_lo); /* 14, 15,16,17 */ - BTBYTE (e_delay_lo); /* 18, 19,1a,1b */ - BTBYTE (e_hactive_lo); /* 1c, 1d,1e,1f */ - BTBYTE (e_hscale_hi); /* 20, 21,22,23 */ - BTBYTE (e_hscale_lo); /* 24, 25,26,27 */ - BTBYTE (bright); /* 28, 29,2a,2b */ - BTBYTE (e_control); /* 2c, 2d,2e,2f */ -#define BT848_E_CONTROL_LNOTCH (1<<7) -#define BT848_E_CONTROL_COMP (1<<6) -#define BT848_E_CONTROL_LDEC (1<<5) -#define BT848_E_CONTROL_CBSENSE (1<<4) -#define BT848_E_CONTROL_RSVD (1<<3) -#define BT848_E_CONTROL_CON_MSB (1<<2) -#define BT848_E_CONTROL_SAT_U_MSB (1<<1) -#define BT848_E_CONTROL_SAT_V_MSB (1<<0) - BTBYTE (contrast_lo); /* 30, 31,32,33 */ - BTBYTE (sat_u_lo); /* 34, 35,36,37 */ - BTBYTE (sat_v_lo); /* 38, 39,3a,3b */ - BTBYTE (hue); /* 3c, 3d,3e,3f */ - BTBYTE (e_scloop); /* 40, 41,42,43 */ -#define BT848_E_SCLOOP_RSVD1 (1<<7) -#define BT848_E_SCLOOP_CAGC (1<<6) -#define BT848_E_SCLOOP_CKILL (1<<5) -#define BT848_E_SCLOOP_HFILT (0x3<<3) -# define BT848_E_SCLOOP_HFILT_ICON (0x3<<3) -# define BT848_E_SCLOOP_HFILT_QCIF (0x2<<3) -# define BT848_E_SCLOOP_HFILT_CIF (0x1<<3) -# define BT848_E_SCLOOP_HFILT_AUTO (0x0<<3) -#define BT848_E_SCLOOP_RSVD0 (0x7<<0) - int :32; /* 44, 45,46,47 */ - BTBYTE (oform); /* 48, 49,4a,4b */ - BTBYTE (e_vscale_hi); /* 4c, 4d,4e,4f */ - BTBYTE (e_vscale_lo); /* 50, 51,52,53 */ - BTBYTE (test); /* 54, 55,56,57 */ - int :32; /* 58, 59,5a,5b */ - int :32; /* 5c, 5d,5e,5f */ - BTLONG (adelay); /* 60, 61,62,63 */ - BTBYTE (bdelay); /* 64, 65,66,67 */ - BTBYTE (adc); /* 68, 69,6a,6b */ -#define BT848_ADC_RESERVED (0x80) /* required pattern */ -#define BT848_ADC_SYNC_T (1<<5) -#define BT848_ADC_AGC_EN (1<<4) -#define BT848_ADC_CLK_SLEEP (1<<3) -#define BT848_ADC_Y_SLEEP (1<<2) -#define BT848_ADC_C_SLEEP (1<<1) -#define BT848_ADC_CRUSH (1<<0) - BTBYTE (e_vtc); /* 6c, 6d,6e,6f */ - int :32; /* 70, 71,72,73 */ - int :32; /* 74, 75,76,77 */ - int :32; /* 78, 79,7a,7b */ - BTLONG (sreset); /* 7c, 7d,7e,7f */ - u_char filler1[0x84-0x80]; - BTBYTE (tgctrl); /* 84, 85,86,87 */ -#define BT848_TGCTRL_TGCKI (3<<3) -#define BT848_TGCTRL_TGCKI_XTAL (0<<3) -#define BT848_TGCTRL_TGCKI_PLL (1<<3) -#define BT848_TGCTRL_TGCKI_GPCLK (2<<3) -#define BT848_TGCTRL_TGCKI_GPCLK_I (3<<3) - u_char filler[0x8c-0x88]; - BTBYTE (o_crop); /* 8c, 8d,8e,8f */ - BTBYTE (o_vdelay_lo); /* 90, 91,92,93 */ - BTBYTE (o_vactive_lo); /* 94, 95,96,97 */ - BTBYTE (o_delay_lo); /* 98, 99,9a,9b */ - BTBYTE (o_hactive_lo); /* 9c, 9d,9e,9f */ - BTBYTE (o_hscale_hi); /* a0, a1,a2,a3 */ - BTBYTE (o_hscale_lo); /* a4, a5,a6,a7 */ - int :32; /* a8, a9,aa,ab */ - BTBYTE (o_control); /* ac, ad,ae,af */ -#define BT848_O_CONTROL_LNOTCH (1<<7) -#define BT848_O_CONTROL_COMP (1<<6) -#define BT848_O_CONTROL_LDEC (1<<5) -#define BT848_O_CONTROL_CBSENSE (1<<4) -#define BT848_O_CONTROL_RSVD (1<<3) -#define BT848_O_CONTROL_CON_MSB (1<<2) -#define BT848_O_CONTROL_SAT_U_MSB (1<<1) -#define BT848_O_CONTROL_SAT_V_MSB (1<<0) - u_char fillter4[16]; - BTBYTE (o_scloop); /* c0, c1,c2,c3 */ -#define BT848_O_SCLOOP_RSVD1 (1<<7) -#define BT848_O_SCLOOP_CAGC (1<<6) -#define BT848_O_SCLOOP_CKILL (1<<5) -#define BT848_O_SCLOOP_HFILT (0x3<<3) -#define BT848_O_SCLOOP_HFILT_ICON (0x3<<3) -#define BT848_O_SCLOOP_HFILT_QCIF (0x2<<3) -#define BT848_O_SCLOOP_HFILT_CIF (0x1<<3) -#define BT848_O_SCLOOP_HFILT_AUTO (0x0<<3) -#define BT848_O_SCLOOP_RSVD0 (0x7<<0) - int :32; /* c4, c5,c6,c7 */ - int :32; /* c8, c9,ca,cb */ - BTBYTE (o_vscale_hi); /* cc, cd,ce,cf */ - BTBYTE (o_vscale_lo); /* d0, d1,d2,d3 */ - BTBYTE (color_fmt); /* d4, d5,d6,d7 */ - bregister_t color_ctl_swap :4; /* d8 */ -#define BT848_COLOR_CTL_WSWAP_ODD (1<<3) -#define BT848_COLOR_CTL_WSWAP_EVEN (1<<2) -#define BT848_COLOR_CTL_BSWAP_ODD (1<<1) -#define BT848_COLOR_CTL_BSWAP_EVEN (1<<0) - bregister_t color_ctl_gamma :1; - bregister_t color_ctl_rgb_ded :1; - bregister_t color_ctl_color_bars :1; - bregister_t color_ctl_ext_frmrate :1; -#define BT848_COLOR_CTL_GAMMA (1<<4) -#define BT848_COLOR_CTL_RGB_DED (1<<5) -#define BT848_COLOR_CTL_COLOR_BARS (1<<6) -#define BT848_COLOR_CTL_EXT_FRMRATE (1<<7) - int :24; /* d9,da,db */ - BTBYTE (cap_ctl); /* dc, dd,de,df */ -#define BT848_CAP_CTL_DITH_FRAME (1<<4) -#define BT848_CAP_CTL_VBI_ODD (1<<3) -#define BT848_CAP_CTL_VBI_EVEN (1<<2) -#define BT848_CAP_CTL_ODD (1<<1) -#define BT848_CAP_CTL_EVEN (1<<0) - BTBYTE (vbi_pack_size); /* e0, e1,e2,e3 */ - BTBYTE (vbi_pack_del); /* e4, e5,e6,e7 */ - int :32; /* e8, e9,ea,eb */ - BTBYTE (o_vtc); /* ec, ed,ee,ef */ - BTBYTE (pll_f_lo); /* f0, f1,f2,f3 */ - BTBYTE (pll_f_hi); /* f4, f5,f6,f7 */ - BTBYTE (pll_f_xci); /* f8, f9,fa,fb */ -#define BT848_PLL_F_C (1<<6) -#define BT848_PLL_F_X (1<<7) - u_char filler2[0x100-0xfc]; - BTLONG (int_stat); /* 100, 101,102,103 */ - BTLONG (int_mask); /* 104, 105,106,107 */ -#define BT848_INT_RISCS (0xf<<28) -#define BT848_INT_RISC_EN (1<<27) -#define BT848_INT_RACK (1<<25) -#define BT848_INT_FIELD (1<<24) -#define BT848_INT_MYSTERYBIT (1<<23) -#define BT848_INT_SCERR (1<<19) -#define BT848_INT_OCERR (1<<18) -#define BT848_INT_PABORT (1<<17) -#define BT848_INT_RIPERR (1<<16) -#define BT848_INT_PPERR (1<<15) -#define BT848_INT_FDSR (1<<14) -#define BT848_INT_FTRGT (1<<13) -#define BT848_INT_FBUS (1<<12) -#define BT848_INT_RISCI (1<<11) -#define BT848_INT_GPINT (1<<9) -#define BT848_INT_I2CDONE (1<<8) -#define BT848_INT_RSV1 (1<<7) -#define BT848_INT_RSV0 (1<<6) -#define BT848_INT_VPRES (1<<5) -#define BT848_INT_HLOCK (1<<4) -#define BT848_INT_OFLOW (1<<3) -#define BT848_INT_HSYNC (1<<2) -#define BT848_INT_VSYNC (1<<1) -#define BT848_INT_FMTCHG (1<<0) - int :32; /* 108, 109,10a,10b */ - BTWORD (gpio_dma_ctl); /* 10c, 10d,10e,10f */ -#define BT848_DMA_CTL_PL23TP4 (0<<6) /* planar1 trigger 4 */ -#define BT848_DMA_CTL_PL23TP8 (1<<6) /* planar1 trigger 8 */ -#define BT848_DMA_CTL_PL23TP16 (2<<6) /* planar1 trigger 16 */ -#define BT848_DMA_CTL_PL23TP32 (3<<6) /* planar1 trigger 32 */ -#define BT848_DMA_CTL_PL1TP4 (0<<4) /* planar1 trigger 4 */ -#define BT848_DMA_CTL_PL1TP8 (1<<4) /* planar1 trigger 8 */ -#define BT848_DMA_CTL_PL1TP16 (2<<4) /* planar1 trigger 16 */ -#define BT848_DMA_CTL_PL1TP32 (3<<4) /* planar1 trigger 32 */ -#define BT848_DMA_CTL_PKTP4 (0<<2) /* packed trigger 4 */ -#define BT848_DMA_CTL_PKTP8 (1<<2) /* packed trigger 8 */ -#define BT848_DMA_CTL_PKTP16 (2<<2) /* packed trigger 16 */ -#define BT848_DMA_CTL_PKTP32 (3<<2) /* packed trigger 32 */ -#define BT848_DMA_CTL_RISC_EN (1<<1) -#define BT848_DMA_CTL_FIFO_EN (1<<0) - BTLONG (i2c_data_ctl); /* 110, 111,112,113 */ -#define BT848_DATA_CTL_I2CDIV (0xf<<4) -#define BT848_DATA_CTL_I2CSYNC (1<<3) -#define BT848_DATA_CTL_I2CW3B (1<<2) -#define BT848_DATA_CTL_I2CSCL (1<<1) -#define BT848_DATA_CTL_I2CSDA (1<<0) - BTLONG (risc_strt_add); /* 114, 115,116,117 */ - BTLONG (gpio_out_en); /* 118, 119,11a,11b */ /* really 24 bits */ - BTLONG (gpio_reg_inp); /* 11c, 11d,11e,11f */ /* really 24 bits */ - BTLONG (risc_count); /* 120, 121,122,123 */ - u_char filler3[0x200-0x124]; - BTLONG (gpio_data); /* 200, 201,202,203 */ /* really 24 bits */ -}; - - -#define BKTR_DSTATUS 0x000 -#define BKTR_IFORM 0x004 -#define BKTR_TDEC 0x008 -#define BKTR_E_CROP 0x00C -#define BKTR_O_CROP 0x08C -#define BKTR_E_VDELAY_LO 0x010 -#define BKTR_O_VDELAY_LO 0x090 -#define BKTR_E_VACTIVE_LO 0x014 -#define BKTR_O_VACTIVE_LO 0x094 -#define BKTR_E_DELAY_LO 0x018 -#define BKTR_O_DELAY_LO 0x098 -#define BKTR_E_HACTIVE_LO 0x01C -#define BKTR_O_HACTIVE_LO 0x09C -#define BKTR_E_HSCALE_HI 0x020 -#define BKTR_O_HSCALE_HI 0x0A0 -#define BKTR_E_HSCALE_LO 0x024 -#define BKTR_O_HSCALE_LO 0x0A4 -#define BKTR_BRIGHT 0x028 -#define BKTR_E_CONTROL 0x02C -#define BKTR_O_CONTROL 0x0AC -#define BKTR_CONTRAST_LO 0x030 -#define BKTR_SAT_U_LO 0x034 -#define BKTR_SAT_V_LO 0x038 -#define BKTR_HUE 0x03C -#define BKTR_E_SCLOOP 0x040 -#define BKTR_O_SCLOOP 0x0C0 -#define BKTR_OFORM 0x048 -#define BKTR_E_VSCALE_HI 0x04C -#define BKTR_O_VSCALE_HI 0x0CC -#define BKTR_E_VSCALE_LO 0x050 -#define BKTR_O_VSCALE_LO 0x0D0 -#define BKTR_TEST 0x054 -#define BKTR_ADELAY 0x060 -#define BKTR_BDELAY 0x064 -#define BKTR_ADC 0x068 -#define BKTR_E_VTC 0x06C -#define BKTR_O_VTC 0x0EC -#define BKTR_SRESET 0x07C -#define BKTR_COLOR_FMT 0x0D4 -#define BKTR_COLOR_CTL 0x0D8 -#define BKTR_CAP_CTL 0x0DC -#define BKTR_VBI_PACK_SIZE 0x0E0 -#define BKTR_VBI_PACK_DEL 0x0E4 -#define BKTR_INT_STAT 0x100 -#define BKTR_INT_MASK 0x104 -#define BKTR_RISC_COUNT 0x120 -#define BKTR_RISC_STRT_ADD 0x114 -#define BKTR_GPIO_DMA_CTL 0x10C -#define BKTR_GPIO_OUT_EN 0x118 -#define BKTR_GPIO_REG_INP 0x11C -#define BKTR_GPIO_DATA 0x200 -#define BKTR_I2C_DATA_CTL 0x110 -#define BKTR_TGCTRL 0x084 -#define BKTR_PLL_F_LO 0x0F0 -#define BKTR_PLL_F_HI 0x0F4 -#define BKTR_PLL_F_XCI 0x0F8 - -/* - * device support for onboard tv tuners - */ - -/* description of the LOGICAL tuner */ -struct TVTUNER { - int frequency; - u_char chnlset; - u_char channel; - u_char band; - u_char afc; - u_char radio_mode; /* current mode of the radio mode */ -}; - -/* description of the PHYSICAL tuner */ -struct TUNER { - char* name; - u_char type; - u_char pllControl[4]; - u_char bandLimits[ 2 ]; - u_char bandAddrs[ 4 ]; /* 3 first for the 3 TV - ** bands. Last for radio - ** band (0x00=NoRadio). - */ - -}; - -/* description of the card */ -#define EEPROMBLOCKSIZE 32 -struct CARDTYPE { - unsigned int card_id; /* card id (from #define's) */ - char* name; - const struct TUNER* tuner; /* Tuner details */ - u_char tuner_pllAddr; /* Tuner i2c address */ - u_char dbx; /* Has DBX chip? */ - u_char msp3400c; /* Has msp3400c chip? */ - u_char dpl3518a; /* Has dpl3518a chip? */ - u_char eepromAddr; - u_char eepromSize; /* bytes / EEPROMBLOCKSIZE */ - u_int audiomuxs[ 5 ]; /* tuner, ext (line-in) */ - /* int/unused (radio) */ - /* mute, present */ - u_int gpio_mux_bits; /* GPIO mask for audio mux */ -}; - -struct format_params { - /* Total lines, lines before image, image lines */ - int vtotal, vdelay, vactive; - /* Total unscaled horizontal pixels, pixels before image, image pixels */ - int htotal, hdelay, hactive; - /* Scaled horizontal image pixels, Total Scaled horizontal pixels */ - int scaled_hactive, scaled_htotal; - /* frame rate . for ntsc is 30 frames per second */ - int frame_rate; - /* A-delay and B-delay */ - u_char adelay, bdelay; - /* Iform XTSEL value */ - int iform_xtsel; - /* VBI number of lines per field, and number of samples per line */ - int vbi_num_lines, vbi_num_samples; -}; - -#if defined(BKTR_USE_FREEBSD_SMBUS) -struct bktr_i2c_softc { - int bus_owned; - - device_t iicbb; - device_t smbus; -}; -#endif - - -/* Bt848/878 register access - * The registers can either be access via a memory mapped structure - * or accessed via bus_space. - * bus_0pace access allows cross platform support, where as the - * memory mapped structure method only works on 32 bit processors - * with the right type of endianness. - */ -#if defined(__NetBSD__) || defined(__FreeBSD__) -#define INB(bktr,offset) bus_space_read_1((bktr)->memt,(bktr)->memh,(offset)) -#define INW(bktr,offset) bus_space_read_2((bktr)->memt,(bktr)->memh,(offset)) -#define INL(bktr,offset) bus_space_read_4((bktr)->memt,(bktr)->memh,(offset)) -#define OUTB(bktr,offset,value) bus_space_write_1((bktr)->memt,(bktr)->memh,(offset),(value)) -#define OUTW(bktr,offset,value) bus_space_write_2((bktr)->memt,(bktr)->memh,(offset),(value)) -#define OUTL(bktr,offset,value) bus_space_write_4((bktr)->memt,(bktr)->memh,(offset),(value)) -#else -#define INB(bktr,offset) *(volatile unsigned char*) ((int)((bktr)->memh)+(offset)) -#define INW(bktr,offset) *(volatile unsigned short*)((int)((bktr)->memh)+(offset)) -#define INL(bktr,offset) *(volatile unsigned int*) ((int)((bktr)->memh)+(offset)) -#define OUTB(bktr,offset,value) *(volatile unsigned char*) ((int)((bktr)->memh)+(offset)) = (value) -#define OUTW(bktr,offset,value) *(volatile unsigned short*)((int)((bktr)->memh)+(offset)) = (value) -#define OUTL(bktr,offset,value) *(volatile unsigned int*) ((int)((bktr)->memh)+(offset)) = (value) -#endif - - -typedef struct bktr_clip bktr_clip_t; - -/* - * BrookTree 848 info structure, one per bt848 card installed. - */ -struct bktr_softc { - -#if defined (__bsdi__) - struct device bktr_dev; /* base device */ - struct isadev bktr_id; /* ISA device */ - struct intrhand bktr_ih; /* interrupt vectoring */ - #define pcici_t pci_devaddr_t -#endif - -#if defined(__NetBSD__) - struct device bktr_dev; /* base device */ - bus_dma_tag_t dmat; /* DMA tag */ - bus_space_tag_t memt; - bus_space_handle_t memh; - bus_size_t obmemsz; /* size of en card (bytes) */ - void *ih; - bus_dmamap_t dm_prog; - bus_dmamap_t dm_oprog; - bus_dmamap_t dm_mem; - bus_dmamap_t dm_vbidata; - bus_dmamap_t dm_vbibuffer; -#endif - -#if defined(__OpenBSD__) - struct device bktr_dev; /* base device */ - bus_dma_tag_t dmat; /* DMA tag */ - bus_space_tag_t memt; - bus_space_handle_t memh; - bus_size_t obmemsz; /* size of en card (bytes) */ - void *ih; - bus_dmamap_t dm_prog; - bus_dmamap_t dm_oprog; - bus_dmamap_t dm_mem; - bus_dmamap_t dm_vbidata; - bus_dmamap_t dm_vbibuffer; - size_t dm_mapsize; - pci_chipset_tag_t pc; /* Opaque PCI chipset tag */ - pcitag_t tag; /* PCI tag, for doing PCI commands */ - vm_offset_t phys_base; /* Bt848 register physical address */ -#endif - -#if defined (__FreeBSD__) - int mem_rid; /* 4.x resource id */ - struct resource *res_mem; /* 4.x resource descriptor for registers */ - int irq_rid; /* 4.x resource id */ - struct resource *res_irq; /* 4.x resource descriptor for interrupt */ - void *res_ih; /* 4.x newbus interrupt handler cookie */ - struct cdev *bktrdev; /* 4.x device entry for /dev/bktrN */ - struct cdev *tunerdev; /* 4.x device entry for /dev/tunerN */ - struct cdev *vbidev; /* 4.x device entry for /dev/vbiN */ - struct cdev *bktrdev_alias; /* alias /dev/bktr to /dev/bktr0 */ - struct cdev *tunerdev_alias; /* alias /dev/tuner to /dev/tuner0 */ - struct cdev *vbidev_alias; /* alias /dev/vbi to /dev/vbi0 */ - #if (__FreeBSD_version >= 500000) - struct mtx vbimutex; /* Mutex protecting vbi buffer */ - #endif - bus_space_tag_t memt; /* Bus space register access functions */ - bus_space_handle_t memh; /* Bus space register access functions */ - bus_size_t obmemsz;/* Size of card (bytes) */ -#if defined(BKTR_USE_FREEBSD_SMBUS) - struct bktr_i2c_softc i2c_sc; /* bt848_i2c device */ -#endif - char bktr_xname[7]; /* device name and unit number */ -#endif - - - /* The following definitions are for the contiguous memory */ -#ifdef __NetBSD__ - vaddr_t bigbuf; /* buffer that holds the captured image */ - vaddr_t vbidata; /* RISC program puts VBI data from the current frame here */ - vaddr_t vbibuffer; /* Circular buffer holding VBI data for the user */ - vaddr_t dma_prog; /* RISC prog for single and/or even field capture*/ - vaddr_t odd_dma_prog; /* RISC program for Odd field capture */ -#else - vm_offset_t bigbuf; /* buffer that holds the captured image */ - vm_offset_t vbidata; /* RISC program puts VBI data from the current frame here */ - vm_offset_t vbibuffer; /* Circular buffer holding VBI data for the user */ - vm_offset_t dma_prog; /* RISC prog for single and/or even field capture*/ - vm_offset_t odd_dma_prog;/* RISC program for Odd field capture */ -#endif - - - /* the following definitions are common over all platforms */ - int alloc_pages; /* number of pages in bigbuf */ - int vbiinsert; /* Position for next write into circular buffer */ - int vbistart; /* Position of last read from circular buffer */ - int vbisize; /* Number of bytes in the circular buffer */ - uint32_t vbi_sequence_number; /* sequence number for VBI */ - int vbi_read_blocked; /* user process blocked on read() from /dev/vbi */ - struct selinfo vbi_select; /* Data used by select() on /dev/vbi */ - - - struct proc *proc; /* process to receive raised signal */ - int signal; /* signal to send to process */ - int clr_on_start; /* clear cap buf on capture start? */ -#define METEOR_SIG_MODE_MASK 0xffff0000 -#define METEOR_SIG_FIELD_MODE 0x00010000 -#define METEOR_SIG_FRAME_MODE 0x00000000 - char dma_prog_loaded; - struct meteor_mem *mem; /* used to control sync. multi-frame output */ - u_long synch_wait; /* wait for free buffer before continuing */ - short current; /* frame number in buffer (1-frames) */ - short rows; /* number of rows in a frame */ - short cols; /* number of columns in a frame */ - int capture_area_x_offset; /* Usually the full 640x480(NTSC) image is */ - int capture_area_y_offset; /* captured. The capture area allows for */ - int capture_area_x_size; /* example 320x200 pixels from the centre */ - int capture_area_y_size; /* of the video image to be captured. */ - char capture_area_enabled; /* When TRUE use user's capture area. */ - int pixfmt; /* active pixel format (idx into fmt tbl) */ - int pixfmt_compat; /* Y/N - in meteor pix fmt compat mode */ - u_long format; /* frame format rgb, yuv, etc.. */ - short frames; /* number of frames allocated */ - int frame_size; /* number of bytes in a frame */ - u_long fifo_errors; /* number of fifo capture errors since open */ - u_long dma_errors; /* number of DMA capture errors since open */ - u_long frames_captured;/* number of frames captured since open */ - u_long even_fields_captured; /* number of even fields captured */ - u_long odd_fields_captured; /* number of odd fields captured */ - u_long range_enable; /* enable range checking ?? */ - u_short capcontrol; /* reg 0xdc capture control */ - u_short bktr_cap_ctl; - volatile u_int flags; -#define METEOR_INITALIZED 0x00000001 -#define METEOR_OPEN 0x00000002 -#define METEOR_MMAP 0x00000004 -#define METEOR_INTR 0x00000008 -#define METEOR_READ 0x00000010 /* XXX never gets referenced */ -#define METEOR_SINGLE 0x00000020 /* get single frame */ -#define METEOR_CONTIN 0x00000040 /* continuously get frames */ -#define METEOR_SYNCAP 0x00000080 /* synchronously get frames */ -#define METEOR_CAP_MASK 0x000000f0 -#define METEOR_NTSC 0x00000100 -#define METEOR_PAL 0x00000200 -#define METEOR_SECAM 0x00000400 -#define BROOKTREE_NTSC 0x00000100 /* used in video open() and */ -#define BROOKTREE_PAL 0x00000200 /* in the kernel config */ -#define BROOKTREE_SECAM 0x00000400 /* file */ -#define METEOR_AUTOMODE 0x00000800 -#define METEOR_FORM_MASK 0x00000f00 -#define METEOR_DEV0 0x00001000 -#define METEOR_DEV1 0x00002000 -#define METEOR_DEV2 0x00004000 -#define METEOR_DEV3 0x00008000 -#define METEOR_DEV_SVIDEO 0x00006000 -#define METEOR_DEV_RGB 0x0000a000 -#define METEOR_DEV_MASK 0x0000f000 -#define METEOR_RGB16 0x00010000 -#define METEOR_RGB24 0x00020000 -#define METEOR_YUV_PACKED 0x00040000 -#define METEOR_YUV_PLANAR 0x00080000 -#define METEOR_WANT_EVEN 0x00100000 /* want even frame */ -#define METEOR_WANT_ODD 0x00200000 /* want odd frame */ -#define METEOR_WANT_MASK 0x00300000 -#define METEOR_ONLY_EVEN_FIELDS 0x01000000 -#define METEOR_ONLY_ODD_FIELDS 0x02000000 -#define METEOR_ONLY_FIELDS_MASK 0x03000000 -#define METEOR_YUV_422 0x04000000 -#define METEOR_OUTPUT_FMT_MASK 0x040f0000 -#define METEOR_WANT_TS 0x08000000 /* time-stamp a frame */ -#define METEOR_RGB 0x20000000 /* meteor rgb unit */ -#define METEOR_FIELD_MODE 0x80000000 - u_char tflags; /* Tuner flags (/dev/tuner) */ -#define TUNER_INITALIZED 0x00000001 -#define TUNER_OPEN 0x00000002 - u_char vbiflags; /* VBI flags (/dev/vbi) */ -#define VBI_INITALIZED 0x00000001 -#define VBI_OPEN 0x00000002 -#define VBI_CAPTURE 0x00000004 - u_short fps; /* frames per second */ - struct meteor_video video; - struct TVTUNER tuner; - struct CARDTYPE card; - u_char audio_mux_select; /* current mode of the audio */ - u_char audio_mute_state; /* mute state of the audio */ - u_char format_params; - u_long current_sol; - u_long current_col; - int clip_start; - int line_length; - int last_y; - int y; - int y2; - int yclip; - int yclip2; - int max_clip_node; - bktr_clip_t clip_list[100]; - int reverse_mute; /* Swap the GPIO values for Mute and TV Audio */ - int bt848_tuner; - int bt848_card; - u_long id; -#define BT848_USE_XTALS 0 -#define BT848_USE_PLL 1 - int xtal_pll_mode; /* Use XTAL or PLL mode for PAL/SECAM */ - int remote_control; /* remote control detected */ - int remote_control_addr; /* remote control i2c address */ - char msp_version_string[9]; /* MSP version string 34xxx-xx */ - int msp_addr; /* MSP i2c address */ - char dpl_version_string[9]; /* DPL version string 35xxx-xx */ - int dpl_addr; /* DPL i2c address */ - int slow_msp_audio; /* 0 = use fast MSP3410/3415 programming sequence */ - /* 1 = use slow MSP3410/3415 programming sequence */ - /* 2 = use Tuner's Mono audio output via the MSP chip */ - int msp_use_mono_source; /* use Tuner's Mono audio output via the MSP chip */ - int audio_mux_present; /* 1 = has audio mux on GPIO lines, 0 = no audio mux */ - int msp_source_selected; /* 0 = TV source, 1 = Line In source, 2 = FM Radio Source */ - -#ifdef BKTR_NEW_MSP34XX_DRIVER - /* msp3400c related data */ - void * msp3400c_info; - int stereo_once; - int amsound; - int mspsimple; - int dolby; -#endif - -}; - -typedef struct bktr_softc bktr_reg_t; -typedef struct bktr_softc* bktr_ptr_t; - -#define Bt848_MAX_SIGN 16 - -struct bt848_card_sig { - int card; - int tuner; - u_char signature[Bt848_MAX_SIGN]; -}; - - -/***********************************************************/ -/* ioctl_cmd_t int on old versions, u_long on new versions */ -/***********************************************************/ - -#if defined(__FreeBSD__) -typedef u_long ioctl_cmd_t; -#endif - -#if defined(__NetBSD__) || defined(__OpenBSD__) -typedef u_long ioctl_cmd_t; -#endif - - diff --git a/sys/dev/bktr/bktr_tuner.c b/sys/dev/bktr/bktr_tuner.c deleted file mode 100644 index e17a4fb89a71..000000000000 --- a/sys/dev/bktr/bktr_tuner.c +++ /dev/null @@ -1,1436 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * 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_tuner : This deals with controlling the tuner fitted to TV cards. - */ - -#include -#include -#include -#ifdef __NetBSD__ -#include -#endif - -#ifdef __FreeBSD__ -#if (__FreeBSD_version < 500000) -#include /* for DELAY */ -#include -#else -#include -#include -#include -#include -#endif - -#include -#include -#endif - -#ifdef __NetBSD__ -#include /* NetBSD .h file location */ -#include -#include -#include -#include -#else -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include -#endif - - - -#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 */ - - -#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 - -#define TSA552x_CB_MSB (0x80) -#define TSA552x_CB_CP (1<<6) /* set this for fast tuning */ -#define TSA552x_CB_T2 (1<<5) /* test mode - Normally set to 0 */ -#define TSA552x_CB_T1 (1<<4) /* test mode - Normally set to 0 */ -#define TSA552x_CB_T0 (1<<3) /* test mode - Normally set to 1 */ -#define TSA552x_CB_RSA (1<<2) /* 0 for 31.25 khz, 1 for 62.5 kHz */ -#define TSA552x_CB_RSB (1<<1) /* 0 for FM 50kHz steps, 1 = Use RSA*/ -#define TSA552x_CB_OS (1<<0) /* Set to 0 for normal operation */ - -#define TSA552x_RADIO (TSA552x_CB_MSB | \ - TSA552x_CB_T0) - -/* 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 - - -static void mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq); - - -static const struct TUNER tuners[] = { -/* XXX FIXME: fill in the band-switch crosspoints */ - /* NO_TUNER */ - { "", /* 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_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_SECAM */ - { "Philips SECAM", /* the 'name' */ - TTYPE_SECAM, /* input type */ - { TSA552x_SCONTROL, /* control byte for Tuner PLL */ - TSA552x_SCONTROL, - TSA552x_SCONTROL, - 0x00 }, - { 0x00, 0x00 }, /* band-switch crosspoints */ - { 0xa7, 0x97, 0x37, 0x00 } }, /* 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_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_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 */ - { 0xa7, 0x97, 0x37, 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 */ - - /* MT2032 Microtune */ - { "MT2032", /* 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 */ - - /* LG TPI8PSB12P PAL */ - { "LG TPI8PSB12P PAL", /* 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, 0x8e } }, /* the band-switch values */ - - /* PHILIPS FI1216 */ - { "PHILIPS_FI1216", /* the 'name' */ - TTYPE_PAL, /* input type */ - { TSBH1_FCONTROL, /* control byte for Tuner PLL */ - TSBH1_FCONTROL, - TSBH1_FCONTROL, - 0x00 }, - { 0x00, 0x00 }, /* band-switch crosspoints */ - { 0x01, 0x02, 0x04, 0x00 } }, /* the band-switch values */ -}; - - -/* 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[] = { - 116, (int)( 45.75 * FREQFACTOR), 0, - 100, (int)(649.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 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[] = { - 116, (int)( 45.75 * FREQFACTOR), 0, - 100, (int)(648.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 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: 58.75 mHz - */ -#define OFFSET 6.00 -#define IF_FREQ 58.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: 58.75 mHz - */ -#define OFFSET 6.00 -#define IF_FREQ 58.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 -#define IF_FREQ 38.90 -static int australia[] = { - 83, (int)(IF_FREQ * FREQFACTOR), 0, - 28, (int)(527.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 10, (int)(209.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 6, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 4, (int)( 95.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 3, (int)( 86.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 1, (int)( 57.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), - 0 -}; -#undef OFFSET -#undef IF_FREQ - -/* - * France broadcast channels - */ -#define OFFSET 8.00 -#define IF_FREQ 38.90 -static int france[] = { - 69, (int)(IF_FREQ * FREQFACTOR), 0, - 21, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), /* 21 -> 69 */ - 5, (int)(176.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), /* 5 -> 10 */ - 4, (int)( 63.75 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), /* 4 */ - 3, (int)( 60.50 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), /* 3 */ - 1, (int)( 47.75 * FREQFACTOR), (int)(OFFSET * FREQFACTOR), /* 1 2 */ - 0 -}; -#undef OFFSET -#undef IF_FREQ - -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"}, - {france, "france"}, - -}; - -#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 (bktr->format_params == BT848_IFORM_F_NTSCJ || \ - bktr->format_params == BT848_IFORM_F_NTSCM ? \ - nabcst[1] : weurope[1]) - - -/* Initialise the tuner structures in the bktr_softc */ -/* This is needed as the tuner details are no longer globally declared */ - -void select_tuner( bktr_ptr_t bktr, int tuner_type ) { - if (tuner_type < Bt848_MAX_TUNER) { - bktr->card.tuner = &tuners[ tuner_type ]; - } else { - bktr->card.tuner = NULL; - } -} - -/* - * Tuner Notes: - * Programming the tuner properly is quite complicated. - * Here are some notes, based on a FM1246 data sheet for a PAL-I tuner. - * The tuner (front end) covers 45.75 Mhz - 855.25 Mhz and an FM band of - * 87.5 Mhz to 108.0 Mhz. - * - * RF and IF. RF = radio frequencies, it is the transmitted signal. - * IF is the Intermediate Frequency (the offset from the base - * signal where the video, color, audio and NICAM signals are. - * - * Eg, Picture at 38.9 Mhz, Colour at 34.47 MHz, sound at 32.9 MHz - * NICAM at 32.348 Mhz. - * Strangely enough, there is an IF (intermediate frequency) for - * FM Radio which is 10.7 Mhz. - * - * The tuner also works in Bands. Philips bands are - * FM radio band 87.50 to 108.00 MHz - * Low band 45.75 to 170.00 MHz - * Mid band 170.00 to 450.00 MHz - * High band 450.00 to 855.25 MHz - * - * - * Now we need to set the PLL on the tuner to the required freuqncy. - * It has a programmable divisor. - * For TV we want - * N = 16 (freq RF(pc) + freq IF(pc)) pc is picture carrier and RF and IF - * are in MHz. - - * For RADIO we want a different equation. - * freq IF is 10.70 MHz (so the data sheet tells me) - * N = (freq RF + freq IF) / step size - * The step size must be set to 50 khz (so the data sheet tells me) - * (note this is 50 kHz, the other things are in MHz) - * so we end up with N = 20x(freq RF + 10.7) - * - */ - -#define LOW_BAND 0 -#define MID_BAND 1 -#define HIGH_BAND 2 -#define FM_RADIO_BAND 3 - - -/* Check if these are correct for other than Philips PAL */ -#define STATUSBIT_COLD 0x80 -#define STATUSBIT_LOCK 0x40 -#define STATUSBIT_TV 0x20 -#define STATUSBIT_STEREO 0x10 /* valid if FM (aka not TV) */ -#define STATUSBIT_ADC 0x07 - -/* - * set the frequency of the tuner - * If 'type' is TV_FREQUENCY, the frequency is freq MHz*16 - * If 'type' is FM_RADIO_FREQUENCY, the frequency is freq MHz * 100 - * (note *16 gives is 4 bits of fraction, eg steps of nnn.0625) - * - */ -int -tv_freq( bktr_ptr_t bktr, int frequency, int type ) -{ - const struct TUNER* tuner; - u_char addr; - u_char control; - u_char band; - int N; - int band_select = 0; -#if defined( TEST_TUNER_AFC ) - int oldFrequency, afcDelta; -#endif - - tuner = bktr->card.tuner; - if ( tuner == NULL ) - return( -1 ); - - if (tuner == &tuners[TUNER_MT2032]) { - mt2032_set_tv_freq(bktr, frequency); - return 0; - } - if (type == TV_FREQUENCY) { - /* - * select the band based on frequency - * XXX FIXME: get the cross-over points from the tuner struct - */ - if ( frequency < (160 * FREQFACTOR ) ) - band_select = LOW_BAND; - else if ( frequency < (454 * FREQFACTOR ) ) - band_select = MID_BAND; - else - band_select = HIGH_BAND; - -#if defined( TEST_TUNER_AFC ) - if ( bktr->tuner.afc ) - frequency -= 4; -#endif - /* - * N = 16 * { fRF(pc) + fIF(pc) } - * or N = 16* fRF(pc) + 16*fIF(pc) } - * where: - * pc is picture carrier, fRF & fIF are in MHz - * - * fortunatly, frequency is passed in as MHz * 16 - * and the TBL_IF frequency is also stored in MHz * 16 - */ - N = frequency + TBL_IF; - - /* set the address of the PLL */ - addr = bktr->card.tuner_pllAddr; - control = tuner->pllControl[ band_select ]; - band = tuner->bandAddrs[ band_select ]; - - if(!(band && control)) /* Don't try to set un- */ - return(-1); /* supported modes. */ - - 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 defined( TEST_TUNER_AFC ) - oldFrequency = frequency; -#endif - if ( (N = do_afc( bktr, addr, N )) < 0 ) { - /* AFC failed, restore requested frequency */ - N = frequency + TBL_IF; -#if defined( TEST_TUNER_AFC ) - printf("%s: do_afc: failed to lock\n", - bktr_name(bktr)); -#endif - i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff ); - } - else - frequency = N - TBL_IF; -#if defined( TEST_TUNER_AFC ) - printf("%s: do_afc: returned freq %d (%d %% %d)\n", bktr_name(bktr), frequency, frequency / 16, frequency % 16); - afcDelta = frequency - oldFrequency; - printf("%s: changed by: %d clicks (%d mod %d)\n", bktr_name(bktr), afcDelta, afcDelta / 16, afcDelta % 16); -#endif - } -#endif /* TUNER_AFC */ - - bktr->tuner.frequency = frequency; - } - - if ( type == FM_RADIO_FREQUENCY ) { - band_select = FM_RADIO_BAND; - - /* - * N = { fRF(pc) + fIF(pc) }/step_size - * The step size is 50kHz for FM radio. - * (eg after 102.35MHz comes 102.40 MHz) - * fIF is 10.7 MHz (as detailed in the specs) - * - * frequency is passed in as MHz * 100 - * - * So, we have N = (frequency/100 + 10.70) /(50/1000) - */ - N = (frequency + 1070)/5; - - /* set the address of the PLL */ - addr = bktr->card.tuner_pllAddr; - control = tuner->pllControl[ band_select ]; - band = tuner->bandAddrs[ band_select ]; - - if(!(band && control)) /* Don't try to set un- */ - return(-1); /* supported modes. */ - - band |= bktr->tuner.radio_mode; /* tuner.radio_mode is set in - * the ioctls RADIO_SETMODE - * and RADIO_GETMODE */ - - i2cWrite( bktr, addr, control, band ); - i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff ); - - bktr->tuner.frequency = (N * 5) - 1070; - - - } - - - return( 0 ); -} - - - -#if defined( TUNER_AFC ) -/* - * - */ -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( "%s: Original freq: %d, status: 0x%02x\n", bktr_name(bktr), 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( "%s: no lock!\n", bktr_name(bktr) ); -#endif - goto fubar; - } - - switch( status & AFC_BITS ) { - case AFC_FREQ_CENTERED: -#if defined( TEST_TUNER_AFC ) - printf( "%s: Centered, freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status ); -#endif - return( frequency ); - - case AFC_FREQ_MINUS_125: - case AFC_FREQ_MINUS_62: -#if defined( TEST_TUNER_AFC ) - printf( "%s: Low, freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status ); -#endif - --frequency; - break; - - case AFC_FREQ_PLUS_62: - case AFC_FREQ_PLUS_125: -#if defined( TEST_TUNER_AFC ) - printf( "%s: Hi, freq: %d, status: 0x%02x\n", bktr_name(bktr), 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 - - -/* - * Get the Tuner status and signal strength - */ -int get_tuner_status( bktr_ptr_t bktr ) { - if (bktr->card.tuner == &tuners[TUNER_MT2032]) - return 0; - return i2cRead( bktr, bktr->card.tuner_pllAddr + 1 ); -} - -/* - * set the channel of the tuner - */ -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, TV_FREQUENCY ) < 0 ) - return( -1 ); - - /* OK to update records */ - return( (bktr->tuner.channel = channel) ); -} - -/* - * get channelset name - */ -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 ); -} - - - - -#define TDA9887_ADDR 0x86 - -static int -TDA9887_init(bktr_ptr_t bktr, int output2_enable) -{ - u_char addr = TDA9887_ADDR; - - i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0); - i2cWrite(bktr, addr, 1, 0x6e); /* takeover point / de-emphasis */ - - /* PAL BG: 0x09 PAL I: 0x0a NTSC: 0x04 */ -#ifdef MT2032_NTSC - i2cWrite(bktr, addr, 2, 0x04); -#else - i2cWrite(bktr, addr, 2, 0x09); -#endif - return 0; -} - - - -#define MT2032_OPTIMIZE_VCO 1 - -/* holds the value of XOGC register after init */ -static int MT2032_XOGC = 4; - -/* card.tuner_pllAddr not set during init */ -#define MT2032_ADDR 0xc0 - -#ifndef MT2032_ADDR -#define MT2032_ADDR (bktr->card.tuner_pllAddr) -#endif - -static int -_MT2032_GetRegister(bktr_ptr_t bktr, u_char regNum) -{ - int ch; - - if (i2cWrite(bktr, MT2032_ADDR, regNum, -1) == -1) { - if (bootverbose) - printf("%s: MT2032 write failed (i2c addr %#x)\n", - bktr_name(bktr), MT2032_ADDR); - return -1; - } - if ((ch = i2cRead(bktr, MT2032_ADDR + 1)) == -1) { - if (bootverbose) - printf("%s: MT2032 get register %d failed\n", - bktr_name(bktr), regNum); - return -1; - } - return ch; -} - -static void -_MT2032_SetRegister(bktr_ptr_t bktr, u_char regNum, u_char data) -{ - i2cWrite(bktr, MT2032_ADDR, regNum, data); -} - -#define MT2032_GetRegister(r) _MT2032_GetRegister(bktr,r) -#define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d) - - -int -mt2032_init(bktr_ptr_t bktr) -{ - u_char rdbuf[22]; - int xogc, xok = 0; - int i; - int x; - - TDA9887_init(bktr, 0); - - for (i = 0; i < 21; i++) { - if ((x = MT2032_GetRegister(i)) == -1) - break; - rdbuf[i] = x; - } - if (i < 21) - return -1; - - printf("%s: MT2032: Companycode=%02x%02x Part=%02x Revision=%02x\n", - bktr_name(bktr), - rdbuf[0x11], rdbuf[0x12], rdbuf[0x13], rdbuf[0x14]); - if (rdbuf[0x13] != 4) { - printf("%s: MT2032 not found or unknown type\n", bktr_name(bktr)); - return -1; - } - - /* Initialize Registers per spec. */ - MT2032_SetRegister(2, 0xff); - MT2032_SetRegister(3, 0x0f); - MT2032_SetRegister(4, 0x1f); - MT2032_SetRegister(6, 0xe4); - MT2032_SetRegister(7, 0x8f); - MT2032_SetRegister(8, 0xc3); - MT2032_SetRegister(9, 0x4e); - MT2032_SetRegister(10, 0xec); - MT2032_SetRegister(13, 0x32); - - /* Adjust XOGC (register 7), wait for XOK */ - xogc = 7; - do { - DELAY(10000); - xok = MT2032_GetRegister(0x0e) & 0x01; - if (xok == 1) { - break; - } - xogc--; - if (xogc == 3) { - xogc = 4; /* min. 4 per spec */ - break; - } - MT2032_SetRegister(7, 0x88 + xogc); - } while (xok != 1); - - TDA9887_init(bktr, 1); - - MT2032_XOGC = xogc; - - return 0; -} - -static int -MT2032_SpurCheck(int f1, int f2, int spectrum_from, int spectrum_to) -{ - int n1 = 1, n2, f; - - f1 = f1 / 1000; /* scale to kHz to avoid 32bit overflows */ - f2 = f2 / 1000; - spectrum_from /= 1000; - spectrum_to /= 1000; - - do { - n2 = -n1; - f = n1 * (f1 - f2); - do { - n2--; - f = f - f2; - if ((f > spectrum_from) && (f < spectrum_to)) { - return 1; - } - } while ((f > (f2 - spectrum_to)) || (n2 > -5)); - n1++; - } while (n1 < 5); - - return 0; -} - -static int -MT2032_ComputeFreq( - int rfin, - int if1, - int if2, - int spectrum_from, - int spectrum_to, - unsigned char *buf, - int *ret_sel, - int xogc -) -{ /* all in Hz */ - int fref, lo1, lo1n, lo1a, s, sel; - int lo1freq, desired_lo1, desired_lo2, lo2, lo2n, lo2a, - lo2num, lo2freq; - int nLO1adjust; - - fref = 5250 * 1000; /* 5.25MHz */ - - /* per spec 2.3.1 */ - desired_lo1 = rfin + if1; - lo1 = (2 * (desired_lo1 / 1000) + (fref / 1000)) / (2 * fref / 1000); - lo1freq = lo1 * fref; - desired_lo2 = lo1freq - rfin - if2; - - /* per spec 2.3.2 */ - for (nLO1adjust = 1; nLO1adjust < 3; nLO1adjust++) { - if (!MT2032_SpurCheck(lo1freq, desired_lo2, spectrum_from, spectrum_to)) { - break; - } - if (lo1freq < desired_lo1) { - lo1 += nLO1adjust; - } else { - lo1 -= nLO1adjust; - } - - lo1freq = lo1 * fref; - desired_lo2 = lo1freq - rfin - if2; - } - - /* per spec 2.3.3 */ - s = lo1freq / 1000 / 1000; - - if (MT2032_OPTIMIZE_VCO) { - if (s > 1890) { - sel = 0; - } else if (s > 1720) { - sel = 1; - } else if (s > 1530) { - sel = 2; - } else if (s > 1370) { - sel = 3; - } else { - sel = 4;/* >1090 */ - } - } else { - if (s > 1790) { - sel = 0;/* <1958 */ - } else if (s > 1617) { - sel = 1; - } else if (s > 1449) { - sel = 2; - } else if (s > 1291) { - sel = 3; - } else { - sel = 4;/* >1090 */ - } - } - - *ret_sel = sel; - - /* per spec 2.3.4 */ - lo1n = lo1 / 8; - lo1a = lo1 - (lo1n * 8); - lo2 = desired_lo2 / fref; - lo2n = lo2 / 8; - lo2a = lo2 - (lo2n * 8); - /* scale to fit in 32bit arith */ - lo2num = ((desired_lo2 / 1000) % (fref / 1000)) * 3780 / (fref / 1000); - lo2freq = (lo2a + 8 * lo2n) * fref + lo2num * (fref / 1000) / 3780 * 1000; - - if (lo1a < 0 || lo1a > 7 || lo1n < 17 || lo1n > 48 || lo2a < 0 || - lo2a > 7 || lo2n < 17 || lo2n > 30) { - printf("MT2032: parameter out of range\n"); - return -1; - } - /* set up MT2032 register map for transfer over i2c */ - buf[0] = lo1n - 1; - buf[1] = lo1a | (sel << 4); - buf[2] = 0x86; /* LOGC */ - buf[3] = 0x0f; /* reserved */ - buf[4] = 0x1f; - buf[5] = (lo2n - 1) | (lo2a << 5); - if (rfin < 400 * 1000 * 1000) { - buf[6] = 0xe4; - } else { - buf[6] = 0xf4; /* set PKEN per rev 1.2 */ - } - - buf[7] = 8 + xogc; - buf[8] = 0xc3; /* reserved */ - buf[9] = 0x4e; /* reserved */ - buf[10] = 0xec; /* reserved */ - buf[11] = (lo2num & 0xff); - buf[12] = (lo2num >> 8) | 0x80; /* Lo2RST */ - - return 0; -} - -static int -MT2032_CheckLOLock(bktr_ptr_t bktr) -{ - int t, lock = 0; - for (t = 0; t < 10; t++) { - lock = MT2032_GetRegister(0x0e) & 0x06; - if (lock == 6) { - break; - } - DELAY(1000); - } - return lock; -} - -static int -MT2032_OptimizeVCO(bktr_ptr_t bktr, int sel, int lock) -{ - int tad1, lo1a; - - tad1 = MT2032_GetRegister(0x0f) & 0x07; - - if (tad1 == 0) { - return lock; - } - if (tad1 == 1) { - return lock; - } - if (tad1 == 2) { - if (sel == 0) { - return lock; - } else { - sel--; - } - } else { - if (sel < 4) { - sel++; - } else { - return lock; - } - } - lo1a = MT2032_GetRegister(0x01) & 0x07; - MT2032_SetRegister(0x01, lo1a | (sel << 4)); - lock = MT2032_CheckLOLock(bktr); - return lock; -} - -static int -MT2032_SetIFFreq(bktr_ptr_t bktr, int rfin, int if1, int if2, int from, int to) -{ - u_char buf[21]; - int lint_try, sel, lock = 0; - - if (MT2032_ComputeFreq(rfin, if1, if2, from, to, &buf[0], &sel, MT2032_XOGC) == -1) - return -1; - - TDA9887_init(bktr, 0); - - /* send only the relevant registers per Rev. 1.2 */ - MT2032_SetRegister(0, buf[0x00]); - MT2032_SetRegister(1, buf[0x01]); - MT2032_SetRegister(2, buf[0x02]); - - MT2032_SetRegister(5, buf[0x05]); - MT2032_SetRegister(6, buf[0x06]); - MT2032_SetRegister(7, buf[0x07]); - - MT2032_SetRegister(11, buf[0x0B]); - MT2032_SetRegister(12, buf[0x0C]); - - /* wait for PLLs to lock (per manual), retry LINT if not. */ - for (lint_try = 0; lint_try < 2; lint_try++) { - lock = MT2032_CheckLOLock(bktr); - - if (MT2032_OPTIMIZE_VCO) { - lock = MT2032_OptimizeVCO(bktr, sel, lock); - } - if (lock == 6) { - break; - } - /* set LINT to re-init PLLs */ - MT2032_SetRegister(7, 0x80 + 8 + MT2032_XOGC); - DELAY(10000); - MT2032_SetRegister(7, 8 + MT2032_XOGC); - } - if (lock != 6) - printf("%s: PLL didn't lock\n", bktr_name(bktr)); - - MT2032_SetRegister(2, 0x20); - - TDA9887_init(bktr, 1); - return 0; -} - -static void -mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq) -{ - int if2,from,to; - int stat, tad; - -#ifdef MT2032_NTSC - from=40750*1000; - to=46750*1000; - if2=45750*1000; -#else - from=32900*1000; - to=39900*1000; - if2=38900*1000; -#endif - - if (MT2032_SetIFFreq(bktr, freq*62500 /* freq*1000*1000/16 */, - 1090*1000*1000, if2, from, to) == 0) { - bktr->tuner.frequency = freq; - stat = MT2032_GetRegister(0x0e); - tad = MT2032_GetRegister(0x0f); - if (bootverbose) - printf("%s: frequency set to %d, st = %#x, tad = %#x\n", - bktr_name(bktr), freq*62500, stat, tad); - } -} diff --git a/sys/dev/bktr/bktr_tuner.h b/sys/dev/bktr/bktr_tuner.h deleted file mode 100644 index 1d52ad2e563c..000000000000 --- a/sys/dev/bktr/bktr_tuner.h +++ /dev/null @@ -1,107 +0,0 @@ -/* $FreeBSD$ */ - -/* - * 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_tuner : This deals with controlling the tuner fitted to TV cards. - * - */ - -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * 1. Redistributions of source code must retain the - * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Amancio Hasty and - * Roger Hardiman - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* Definitions for 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 TUNER_MT2032 14 -#define LG_TPI8PSB12P_PAL 15 -#define PHILIPS_FI1216 16 -#define Bt848_MAX_TUNER 17 - -/* experimental code for Automatic Frequency Control */ -#define TUNER_AFC - -/* - * Fill in the tuner entries in the bktr_softc based on the selected tuner - * type (from the list of tuners above) - */ -void select_tuner( bktr_ptr_t bktr, int tuner_type ); - -/* - * The Channel Set maps TV channels eg Ch 36, Ch 51, onto frequencies - * and is country specific. - */ -int tuner_getchnlset( struct bktr_chnlset *chnlset ); - -/* - * tv_channel sets the tuner to channel 'n' using the current Channel Set - * tv_freq sets the tuner to a specific frequency for TV or for FM Radio - * get_tuner_status can be used to get the signal strength. - */ -#define TV_FREQUENCY 0 -#define FM_RADIO_FREQUENCY 1 -int tv_channel( bktr_ptr_t bktr, int channel ); -int tv_freq( bktr_ptr_t bktr, int frequency, int type ); -int get_tuner_status( bktr_ptr_t bktr ); - -#if defined( TUNER_AFC ) -int do_afc( bktr_ptr_t bktr, int addr, int frequency ); -#endif /* TUNER_AFC */ - -int mt2032_init(bktr_ptr_t bktr); - -/* - * This is for start-up convenience only, NOT mandatory. - */ -#if !defined( DEFAULT_CHNLSET ) -#define DEFAULT_CHNLSET CHNLSET_WEUROPE -#endif - diff --git a/sys/dev/bktr/ioctl_bt848.h b/sys/dev/bktr/ioctl_bt848.h deleted file mode 100644 index 6e50b615deb2..000000000000 --- a/sys/dev/bktr/ioctl_bt848.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - * extensions to ioctl_meteor.h for the bt848 cards - * - * $FreeBSD$ - */ - -#ifndef _DEV_BKTR_IOCTL_BT848_H_ -#define _DEV_BKTR_IOCTL_BT848_H_ - -/* - * frequency sets - */ -#define CHNLSET_NABCST 1 -#define CHNLSET_CABLEIRC 2 -#define CHNLSET_CABLEHRC 3 -#define CHNLSET_WEUROPE 4 -#define CHNLSET_JPNBCST 5 -#define CHNLSET_JPNCABLE 6 -#define CHNLSET_XUSSR 7 -#define CHNLSET_AUSTRALIA 8 -#define CHNLSET_FRANCE 9 -#define CHNLSET_MIN CHNLSET_NABCST -#define CHNLSET_MAX CHNLSET_FRANCE - - -/* - * constants for various tuner registers - */ -#define BT848_HUEMIN (-90) -#define BT848_HUEMAX 90 -#define BT848_HUECENTER 0 -#define BT848_HUERANGE 179.3 -#define BT848_HUEREGMIN (-128) -#define BT848_HUEREGMAX 127 -#define BT848_HUESTEPS 256 - -#define BT848_BRIGHTMIN (-50) -#define BT848_BRIGHTMAX 50 -#define BT848_BRIGHTCENTER 0 -#define BT848_BRIGHTRANGE 99.6 -#define BT848_BRIGHTREGMIN (-128) -#define BT848_BRIGHTREGMAX 127 -#define BT848_BRIGHTSTEPS 256 - -#define BT848_CONTRASTMIN 0 -#define BT848_CONTRASTMAX 237 -#define BT848_CONTRASTCENTER 100 -#define BT848_CONTRASTRANGE 236.57 -#define BT848_CONTRASTREGMIN 0 -#define BT848_CONTRASTREGMAX 511 -#define BT848_CONTRASTSTEPS 512 - -#define BT848_CHROMAMIN 0 -#define BT848_CHROMAMAX 284 -#define BT848_CHROMACENTER 100 -#define BT848_CHROMARANGE 283.89 -#define BT848_CHROMAREGMIN 0 -#define BT848_CHROMAREGMAX 511 -#define BT848_CHROMASTEPS 512 - -#define BT848_SATUMIN 0 -#define BT848_SATUMAX 202 -#define BT848_SATUCENTER 100 -#define BT848_SATURANGE 201.18 -#define BT848_SATUREGMIN 0 -#define BT848_SATUREGMAX 511 -#define BT848_SATUSTEPS 512 - -#define BT848_SATVMIN 0 -#define BT848_SATVMAX 284 -#define BT848_SATVCENTER 100 -#define BT848_SATVRANGE 283.89 -#define BT848_SATVREGMIN 0 -#define BT848_SATVREGMAX 511 -#define BT848_SATVSTEPS 512 - - -/* - * audio stuff - */ -#define AUDIO_TUNER 0x00 /* command for the audio routine */ -#define AUDIO_EXTERN 0x01 /* don't confuse them with bit */ -#define AUDIO_INTERN 0x02 /* settings */ -#define AUDIO_MUTE 0x80 -#define AUDIO_UNMUTE 0x81 - - -/* - * EEProm stuff - */ -struct eeProm { - short offset; - short count; - unsigned char bytes[ 256 ]; -}; - - -/* - * XXX: this is a hack, should be in ioctl_meteor.h - * here to avoid touching that file for now... - */ -#define TVTUNER_SETCHNL _IOW('x', 32, unsigned int) /* set channel */ -#define TVTUNER_GETCHNL _IOR('x', 32, unsigned int) /* get channel */ -#define TVTUNER_SETTYPE _IOW('x', 33, unsigned int) /* set tuner type */ -#define TVTUNER_GETTYPE _IOR('x', 33, unsigned int) /* get tuner type */ -#define TVTUNER_GETSTATUS _IOR('x', 34, unsigned int) /* get tuner status */ -#define TVTUNER_SETFREQ _IOW('x', 35, unsigned int) /* set frequency */ -#define TVTUNER_GETFREQ _IOR('x', 36, unsigned int) /* get frequency */ - - -#define BT848_SHUE _IOW('x', 37, int) /* set hue */ -#define BT848_GHUE _IOR('x', 37, int) /* get hue */ -#define BT848_SBRIG _IOW('x', 38, int) /* set brightness */ -#define BT848_GBRIG _IOR('x', 38, int) /* get brightness */ -#define BT848_SCSAT _IOW('x', 39, int) /* set chroma sat */ -#define BT848_GCSAT _IOR('x', 39, int) /* get UV saturation */ -#define BT848_SCONT _IOW('x', 40, int) /* set contrast */ -#define BT848_GCONT _IOR('x', 40, int) /* get contrast */ -#define BT848_SVSAT _IOW('x', 41, int) /* set chroma V sat */ -#define BT848_GVSAT _IOR('x', 41, int) /* get V saturation */ -#define BT848_SUSAT _IOW('x', 42, int) /* set chroma U sat */ -#define BT848_GUSAT _IOR('x', 42, int) /* get U saturation */ - -#define BT848_SCBARS _IOR('x', 43, int) /* set colorbar */ -#define BT848_CCBARS _IOR('x', 44, int) /* clear colorbar */ - - -#define BT848_SAUDIO _IOW('x', 46, int) /* set audio channel */ -#define BT848_GAUDIO _IOR('x', 47, int) /* get audio channel */ -#define BT848_SBTSC _IOW('x', 48, int) /* set audio channel */ - -#define BT848_GSTATUS _IOR('x', 49, unsigned int) /* reap status */ - -#define BT848_WEEPROM _IOWR('x', 50, struct eeProm) /* write to EEProm */ -#define BT848_REEPROM _IOWR('x', 51, struct eeProm) /* read from EEProm */ - -#define BT848_SIGNATURE _IOWR('x', 52, struct eeProm) /* read card sig */ - -#define TVTUNER_SETAFC _IOW('x', 53, int) /* turn AFC on/off */ -#define TVTUNER_GETAFC _IOR('x', 54, int) /* query AFC on/off */ -#define BT848_SLNOTCH _IOW('x', 55, int) /* set luma notch */ -#define BT848_GLNOTCH _IOR('x', 56, int) /* get luma notch */ - -/* Read/Write the BT848's I2C bus directly - * b7-b0: data (read/write) - * b15-b8: internal peripheral register (write) - * b23-b16: i2c addr (write) - * b31-b24: 1 = write, 0 = read - */ -#define BT848_I2CWR _IOWR('x', 57, unsigned long) /* i2c read-write */ - -struct bktr_msp_control { - unsigned char function; - unsigned int address; - unsigned int data; -}; - -#define BT848_MSP_RESET _IO('x', 76) /* MSP chip reset */ -#define BT848_MSP_READ _IOWR('x', 77, struct bktr_msp_control) /* MSP chip read */ -#define BT848_MSP_WRITE _IOWR('x', 78, struct bktr_msp_control) /* MSP chip write */ - -/* Support for radio tuner */ -#define RADIO_SETMODE _IOW('x', 58, unsigned int) /* set radio modes */ -#define RADIO_GETMODE _IOR('x', 58, unsigned char) /* get radio modes */ -#define RADIO_AFC 0x01 /* These modes will probably not */ -#define RADIO_MONO 0x02 /* work on the FRxxxx. It does */ -#define RADIO_MUTE 0x08 /* work on the FMxxxx. */ -#define RADIO_SETFREQ _IOW('x', 59, unsigned int) /* set frequency */ -#define RADIO_GETFREQ _IOR('x', 59, unsigned int) /* set frequency */ - /* Argument is frequency*100MHz */ - -/* - * XXX: more bad magic, - * we need to fix the METEORGINPUT to return something public - * duplicate them here for now... - */ -#define METEOR_DEV0 0x00001000 -#define METEOR_DEV1 0x00002000 -#define METEOR_DEV2 0x00004000 -#define METEOR_DEV3 0x00008000 -#define METEOR_DEV_SVIDEO 0x00006000 -/* - * right now I don't know were to put these, but as they are suppose to be - * a part of a common video capture interface, these should be relocated to - * another place. Probably most of the METEOR_xxx defines need to be - * renamed and moved to a common header - */ - -typedef enum { METEOR_PIXTYPE_RGB, METEOR_PIXTYPE_YUV, - METEOR_PIXTYPE_YUV_PACKED, - METEOR_PIXTYPE_YUV_12 } METEOR_PIXTYPE; - - -struct meteor_pixfmt { - unsigned int index; /* Index in supported pixfmt list */ - METEOR_PIXTYPE type; /* What's the board gonna feed us */ - unsigned int Bpp; /* Bytes per pixel */ - unsigned long masks[3]; /* R,G,B or Y,U,V masks, respectively */ - unsigned swap_bytes :1; /* Bytes swapped within shorts */ - unsigned swap_shorts:1; /* Shorts swapped within longs */ -}; - - -struct bktr_clip { - int x_min; - int x_max; - int y_min; - int y_max; -}; - -#define BT848_MAX_CLIP_NODE 100 -struct _bktr_clip { - struct bktr_clip x[BT848_MAX_CLIP_NODE]; -}; - -/* - * I'm using METEOR_xxx just because that will be common to other interface - * and less of a surprise - */ -#define METEORSACTPIXFMT _IOW('x', 64, int ) -#define METEORGACTPIXFMT _IOR('x', 64, int ) -#define METEORGSUPPIXFMT _IOWR('x', 65, struct meteor_pixfmt) - -/* set clip list */ -#define BT848SCLIP _IOW('x', 66, struct _bktr_clip ) -#define BT848GCLIP _IOR('x', 66, struct _bktr_clip ) - - -/* set input format */ -#define BT848SFMT _IOW('x', 67, unsigned long ) -#define BT848GFMT _IOR('x', 67, unsigned long ) - -/* set clear-buffer-on-start */ -#define BT848SCBUF _IOW('x', 68, int) -#define BT848GCBUF _IOR('x', 68, int) - -/* set capture area */ -/* The capture area is the area of the video image which is grabbed */ -/* Usually the capture area is 640x480 (768x576 PAL) pixels */ -/* This area is then scaled to the dimensions the user requires */ -/* using the METEORGEO ioctl */ -/* However, the capture area could be 400x300 pixels from the top right */ -/* corner of the video image */ -struct bktr_capture_area { - int x_offset; - int y_offset; - int x_size; - int y_size; -}; -#define BT848_SCAPAREA _IOW('x', 69, struct bktr_capture_area) -#define BT848_GCAPAREA _IOR('x', 69, struct bktr_capture_area) - - -/* Get channel Set */ -#define BT848_MAX_CHNLSET_NAME_LEN 16 -struct bktr_chnlset { - short index; - short max_channel; - char name[BT848_MAX_CHNLSET_NAME_LEN]; -}; -#define TVTUNER_GETCHNLSET _IOWR('x', 70, struct bktr_chnlset) - - - -/* Infra Red Remote Control */ -struct bktr_remote { - unsigned char data[3]; -}; -#define REMOTE_GETKEY _IOR('x', 71, struct bktr_remote)/*read the remote */ - /*control receiver*/ - /*returns raw data*/ - - -/* - * Direct access to GPIO pins. You must add BKTR_GPIO_ACCESS to your kernel - * configuration file to use these - */ -#define BT848_GPIO_SET_EN _IOW('x', 72, int) /* set gpio_out_en */ -#define BT848_GPIO_GET_EN _IOR('x', 73, int) /* get gpio_out_en */ -#define BT848_GPIO_SET_DATA _IOW('x', 74, int) /* set gpio_data */ -#define BT848_GPIO_GET_DATA _IOR('x', 75, int) /* get gpio_data */ - - - -/* XXX - Copied from /sys/pci/brktree_reg.h */ -#define BT848_IFORM_FORMAT (0x7<<0) -# define BT848_IFORM_F_RSVD (0x7) -# define BT848_IFORM_F_SECAM (0x6) -# define BT848_IFORM_F_PALN (0x5) -# define BT848_IFORM_F_PALM (0x4) -# define BT848_IFORM_F_PALBDGHI (0x3) -# define BT848_IFORM_F_NTSCJ (0x2) -# define BT848_IFORM_F_NTSCM (0x1) -# define BT848_IFORM_F_AUTO (0x0) - - -#endif /* _DEV_BKTR_IOCTL_BT848_H_ */ - diff --git a/sys/dev/bktr/ioctl_meteor.h b/sys/dev/bktr/ioctl_meteor.h deleted file mode 100644 index 9a1959c6206e..000000000000 --- a/sys/dev/bktr/ioctl_meteor.h +++ /dev/null @@ -1,189 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-4-Clause - * - * Copyright (c) 1995 Mark Tinguely and Jim Lowe - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Mark Tinguely and Jim Lowe - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ -/* - * ioctl constants for Matrox Meteor Capture card. - */ - -#ifndef _DEV_BKTR_IOCTL_METEOR_H_ -#define _DEV_BKTR_IOCTL_METEOR_H_ - -#ifndef _KERNEL -#include -#endif -#include - -struct meteor_capframe { - short command; /* see below for valid METEORCAPFRM commands */ - short lowat; /* start transfer if < this number */ - short hiwat; /* stop transfer if > this number */ -} ; - -/* structure for METEOR[GS]ETGEO - get/set geometry */ -struct meteor_geomet { - unsigned short rows; - unsigned short columns; - unsigned short frames; - unsigned long oformat; -} ; - -/* structure for METEORGCOUNT-get count of frames, fifo errors and dma errors */ -struct meteor_counts { - unsigned long fifo_errors; /* count of fifo errors since open */ - unsigned long dma_errors; /* count of dma errors since open */ - unsigned long frames_captured; /* count of frames captured since open */ - unsigned long even_fields_captured; /* count of even fields captured */ - unsigned long odd_fields_captured; /* count of odd fields captured */ -} ; - -/* structure for getting and setting direct transfers to vram */ -struct meteor_video { - unsigned long addr; /* Address of location to dma to */ - unsigned long width; /* Width of memory area */ - unsigned long banksize; /* Size of Vram bank */ - unsigned long ramsize; /* Size of Vram */ -}; - -#define METEORCAPTUR _IOW('x', 1, int) /* capture a frame */ -#define METEORCAPFRM _IOW('x', 2, struct meteor_capframe) /* sync capture */ -#define METEORSETGEO _IOW('x', 3, struct meteor_geomet) /* set geometry */ -#define METEORGETGEO _IOR('x', 4, struct meteor_geomet) /* get geometry */ -#define METEORSTATUS _IOR('x', 5, unsigned short) /* get status */ -#define METEORSHUE _IOW('x', 6, signed char) /* set hue */ -#define METEORGHUE _IOR('x', 6, signed char) /* get hue */ -#define METEORSFMT _IOW('x', 7, unsigned long) /* set format */ -#define METEORGFMT _IOR('x', 7, unsigned long) /* get format */ -#define METEORSINPUT _IOW('x', 8, unsigned long) /* set input dev */ -#define METEORGINPUT _IOR('x', 8, unsigned long) /* get input dev */ -#define METEORSCHCV _IOW('x', 9, unsigned char) /* set uv gain */ -#define METEORGCHCV _IOR('x', 9, unsigned char) /* get uv gain */ -#define METEORSCOUNT _IOW('x',10, struct meteor_counts) -#define METEORGCOUNT _IOR('x',10, struct meteor_counts) -#define METEORSFPS _IOW('x',11, unsigned short) /* set fps */ -#define METEORGFPS _IOR('x',11, unsigned short) /* get fps */ -#define METEORSSIGNAL _IOW('x', 12, unsigned int) /* set signal */ -#define METEORGSIGNAL _IOR('x', 12, unsigned int) /* get signal */ -#define METEORSVIDEO _IOW('x', 13, struct meteor_video) /* set video */ -#define METEORGVIDEO _IOR('x', 13, struct meteor_video) /* get video */ -#define METEORSBRIG _IOW('x', 14, unsigned char) /* set brightness */ -#define METEORGBRIG _IOR('x', 14, unsigned char) /* get brightness */ -#define METEORSCSAT _IOW('x', 15, unsigned char) /* set chroma sat */ -#define METEORGCSAT _IOR('x', 15, unsigned char) /* get uv saturation */ -#define METEORSCONT _IOW('x', 16, unsigned char) /* set contrast */ -#define METEORGCONT _IOR('x', 16, unsigned char) /* get contrast */ -#define METEORSBT254 _IOW('x', 17, unsigned short) /* set Bt254 reg */ -#define METEORGBT254 _IOR('x', 17, unsigned short) /* get Bt254 reg */ -#define METEORSHWS _IOW('x', 18, unsigned char) /* set hor start reg */ -#define METEORGHWS _IOR('x', 18, unsigned char) /* get hor start reg */ -#define METEORSVWS _IOW('x', 19, unsigned char) /* set vert start reg */ -#define METEORGVWS _IOR('x', 19, unsigned char) /* get vert start reg */ -#define METEORSTS _IOW('x', 20, unsigned char) /* set time stamp */ -#define METEORGTS _IOR('x', 20, unsigned char) /* get time stamp */ - -#define METEOR_STATUS_ID_MASK 0xf000 /* ID of 7196 */ -#define METEOR_STATUS_DIR 0x0800 /* Direction of Expansion port YUV */ -#define METEOR_STATUS_OEF 0x0200 /* Field detected: Even/Odd */ -#define METEOR_STATUS_SVP 0x0100 /* State of VRAM Port:inactive/active */ -#define METEOR_STATUS_STTC 0x0080 /* Time Constant: TV/VCR */ -#define METEOR_STATUS_HCLK 0x0040 /* Horiz PLL: locked/unlocked */ -#define METEOR_STATUS_FIDT 0x0020 /* Field detect: 50/60hz */ -#define METEOR_STATUS_ALTD 0x0002 /* Line alt: no line alt/line alt */ -#define METEOR_STATUS_CODE 0x0001 /* Colour info: no colour/colour */ - - /* METEORCAPTUR capture options */ -#define METEOR_CAP_SINGLE 0x0001 /* capture one frame */ -#define METEOR_CAP_CONTINOUS 0x0002 /* continuously capture */ -#define METEOR_CAP_STOP_CONT 0x0004 /* stop the continuous capture */ - - /* METEORCAPFRM capture commands */ -#define METEOR_CAP_N_FRAMES 0x0001 /* capture N frames */ -#define METEOR_CAP_STOP_FRAMES 0x0002 /* stop capture N frames */ -#define METEOR_HALT_N_FRAMES 0x0003 /* halt of capture N frames */ -#define METEOR_CONT_N_FRAMES 0x0004 /* continue after above halt */ - - /* valid video input formats: */ -#define METEOR_FMT_NTSC 0x00100 /* NTSC -- initialized default */ -#define METEOR_FMT_PAL 0x00200 /* PAL */ -#define METEOR_FMT_SECAM 0x00400 /* SECAM */ -#define METEOR_FMT_AUTOMODE 0x00800 /* auto-mode */ -#define METEOR_INPUT_DEV0 0x01000 /* camera input 0 -- default */ -#define METEOR_INPUT_DEV_RCA METEOR_INPUT_DEV0 -#define METEOR_INPUT_DEV1 0x02000 /* camera input 1 */ -#define METEOR_INPUT_DEV2 0x04000 /* camera input 2 */ -#define METEOR_INPUT_DEV3 0x08000 /* camera input 3 */ -#define METEOR_INPUT_DEV_RGB 0x0a000 /* for rgb version of meteor */ -#define METEOR_INPUT_DEV_SVIDEO 0x06000 /* S-video input port */ - - /* valid video output formats: */ -#define METEOR_GEO_RGB16 0x0010000 /* packed -- initialized default */ -#define METEOR_GEO_RGB24 0x0020000 /* RBG 24 bits packed */ - /* internally stored in 32 bits */ -#define METEOR_GEO_YUV_PACKED 0x0040000 /* 4-2-2 YUV 16 bits packed */ -#define METEOR_GEO_YUV_PLANAR 0x0080000 /* 4-2-2 YUV 16 bits planer */ -#define METEOR_GEO_YUV_PLANER METEOR_GEO_YUV_PLANAR -#define METEOR_GEO_UNSIGNED 0x0400000 /* unsigned uv outputs */ -#define METEOR_GEO_EVEN_ONLY 0x1000000 /* set for even only field capture */ -#define METEOR_GEO_ODD_ONLY 0x2000000 /* set for odd only field capture */ -#define METEOR_GEO_FIELD_MASK 0x3000000 -#define METEOR_GEO_YUV_422 0x4000000 /* 4-2-2 YUV in Y-U-V combined */ -#define METEOR_GEO_OUTPUT_MASK 0x40f0000 -#define METEOR_GEO_YUV_12 0x10000000 /* YUV 12 format */ -#define METEOR_GEO_YUV_9 0x40000000 /* YUV 9 format */ - -#define METEOR_FIELD_MODE 0x80000000 /* Field cap or Frame cap */ - -#define METEOR_SIG_MODE_MASK 0xffff0000 -#define METEOR_SIG_FRAME 0x00000000 /* signal every frame */ -#define METEOR_SIG_FIELD 0x00010000 /* signal every field */ - - /* following structure is used to coordinate the synchronous */ - -struct meteor_mem { - /* kernel write only */ - int frame_size; /* row*columns*depth */ - unsigned num_bufs; /* number of frames in buffer (1-32) */ - /* user and kernel change these */ - int lowat; /* kernel starts capture if < this number */ - int hiwat; /* kernel stops capture if > this number. - hiwat <= numbufs */ - unsigned active; /* bit mask of active frame buffers - kernel sets, user clears */ - int num_active_bufs; /* count of active frame buffer - kernel increments, user decrements */ - - /* reference to mmapped data */ - caddr_t buf; /* The real space (virtual addr) */ -} ; - -#endif /* !_DEV_BKTR_IOCTL_METEOR_H_ */ diff --git a/sys/dev/bktr/msp34xx.c b/sys/dev/bktr/msp34xx.c deleted file mode 100644 index a37c6cb8715f..000000000000 --- a/sys/dev/bktr/msp34xx.c +++ /dev/null @@ -1,1254 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1997-2001 Gerd Knorr - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * programming the msp34* sound processor family - * - * (c) 1997-2001 Gerd Knorr - * - * what works and what doesn't: - * - * AM-Mono - * Support for Hauppauge cards added (decoding handled by tuner) added by - * Frederic Crozat - * - * FM-Mono - * should work. The stereo modes are backward compatible to FM-mono, - * therefore FM-Mono should be always available. - * - * FM-Stereo (B/G, used in germany) - * should work, with autodetect - * - * FM-Stereo (satellite) - * should work, no autodetect (i.e. default is mono, but you can - * switch to stereo -- untested) - * - * NICAM (B/G, L , used in UK, Scandinavia, Spain and France) - * should work, with autodetect. Support for NICAM was added by - * Pekka Pietikainen - * - * - * TODO: - * - better SAT support - * - * - * 980623 Thomas Sailer (sailer@ife.ee.ethz.ch) - * using soundcore instead of OSS - * - * - * The FreeBSD modifications by Alexander Langer - * are in the public domain. Please contact me (Alex) and not Gerd for - * any problems you encounter under FreeBSD. - * - * FreeBSD TODO: - * - mutex handling (currently not mp-safe) - * - the various options here as loader tunables or compile time or whatever - * - how does the new dolby flag work with the current dpl_* stuff? - * Maybe it's just enough to set the dolby flag to 1 and it works. - * As I don't have a dolby card myself, I can't test it, though. - */ - -#include "opt_bktr.h" /* Include any kernel config options */ -#ifdef BKTR_NEW_MSP34XX_DRIVER /* file only needed for new driver */ - -#include -#include -#include -#include - -#include -#include -#include - -#ifdef BKTR_USE_FREEBSD_SMBUS -#include /* required by bktr_reg.h */ -#endif - -#include /* required by bktr_reg.h */ - -#include -#include /* extensions to ioctl_meteor.h */ -#include -#include -#include -#include - -#define VIDEO_MODE_PAL 0 -#define VIDEO_MODE_NTSC 1 -#define VIDEO_MODE_SECAM 2 -#define VIDEO_MODE_AUTO 3 - -#define VIDEO_SOUND_MONO 1 -#define VIDEO_SOUND_STEREO 2 -#define VIDEO_SOUND_LANG1 4 -#define VIDEO_SOUND_LANG2 8 - -#define DFP_COUNT 0x41 - -struct msp3400c { - int simple; - int nicam; - int mode; - int norm; - int stereo; - int nicam_on; - int acb; - int main, second; /* sound carrier */ - int input; - - int muted; - int left, right; /* volume */ - int bass, treble; - - /* shadow register set */ - int dfp_regs[DFP_COUNT]; - - /* thread */ - struct proc *kthread; - - int active,restart,rmmod; - - int watch_stereo; - int halt_thread; -}; - -#define VIDEO_MODE_RADIO 16 /* norm magic for radio mode */ - -/* ---------------------------------------------------------------------- */ - -#define dprintk(...) do { \ - if (bootverbose) { \ - printf("%s: ", bktr_name(client)); \ - printf(__VA_ARGS__); \ - } \ -} while (0) - -/* ---------------------------------------------------------------------- */ - -#define I2C_MSP3400C 0x80 -#define I2C_MSP3400C_DEM 0x10 -#define I2C_MSP3400C_DFP 0x12 - -/* ----------------------------------------------------------------------- */ -/* functions for talking to the MSP3400C Sound processor */ - -static int msp3400c_reset(bktr_ptr_t client) -{ - /* use our own which handles config(8) options */ - msp_dpl_reset(client, client->msp_addr); - - return 0; -} - -static int -msp3400c_read(bktr_ptr_t client, int dev, int addr) -{ - /* use our own */ - return(msp_dpl_read(client, client->msp_addr, dev, addr)); -} - -static int -msp3400c_write(bktr_ptr_t client, int dev, int addr, int val) -{ - /* use our own */ - msp_dpl_write(client, client->msp_addr, dev, addr, val); - - return(0); -} - -/* ------------------------------------------------------------------------ */ - -/* This macro is allowed for *constants* only, gcc must calculate it - at compile time. Remember -- no floats in kernel mode */ -#define MSP_CARRIER(freq) ((int)((float)(freq/18.432)*(1<<24))) - -#define MSP_MODE_AM_DETECT 0 -#define MSP_MODE_FM_RADIO 2 -#define MSP_MODE_FM_TERRA 3 -#define MSP_MODE_FM_SAT 4 -#define MSP_MODE_FM_NICAM1 5 -#define MSP_MODE_FM_NICAM2 6 -#define MSP_MODE_AM_NICAM 7 -#define MSP_MODE_BTSC 8 -#define MSP_MODE_EXTERN 9 - -static struct MSP_INIT_DATA_DEM { - int fir1[6]; - int fir2[6]; - int cdo1; - int cdo2; - int ad_cv; - int mode_reg; - int dfp_src; - int dfp_matrix; -} msp_init_data[] = { - /* AM (for carrier detect / msp3400) */ - { { 75, 19, 36, 35, 39, 40 }, { 75, 19, 36, 35, 39, 40 }, - MSP_CARRIER(5.5), MSP_CARRIER(5.5), - 0x00d0, 0x0500, 0x0020, 0x3000}, - - /* AM (for carrier detect / msp3410) */ - { { -1, -1, -8, 2, 59, 126 }, { -1, -1, -8, 2, 59, 126 }, - MSP_CARRIER(5.5), MSP_CARRIER(5.5), - 0x00d0, 0x0100, 0x0020, 0x3000}, - - /* FM Radio */ - { { -8, -8, 4, 6, 78, 107 }, { -8, -8, 4, 6, 78, 107 }, - MSP_CARRIER(10.7), MSP_CARRIER(10.7), - 0x00d0, 0x0480, 0x0020, 0x3000 }, - - /* Terrestrial FM-mono + FM-stereo */ - { { 3, 18, 27, 48, 66, 72 }, { 3, 18, 27, 48, 66, 72 }, - MSP_CARRIER(5.5), MSP_CARRIER(5.5), - 0x00d0, 0x0480, 0x0030, 0x3000}, - - /* Sat FM-mono */ - { { 1, 9, 14, 24, 33, 37 }, { 3, 18, 27, 48, 66, 72 }, - MSP_CARRIER(6.5), MSP_CARRIER(6.5), - 0x00c6, 0x0480, 0x0000, 0x3000}, - - /* NICAM/FM -- B/G (5.5/5.85), D/K (6.5/5.85) */ - { { -2, -8, -10, 10, 50, 86 }, { 3, 18, 27, 48, 66, 72 }, - MSP_CARRIER(5.5), MSP_CARRIER(5.5), - 0x00d0, 0x0040, 0x0120, 0x3000}, - - /* NICAM/FM -- I (6.0/6.552) */ - { { 2, 4, -6, -4, 40, 94 }, { 3, 18, 27, 48, 66, 72 }, - MSP_CARRIER(6.0), MSP_CARRIER(6.0), - 0x00d0, 0x0040, 0x0120, 0x3000}, - - /* NICAM/AM -- L (6.5/5.85) */ - { { -2, -8, -10, 10, 50, 86 }, { -4, -12, -9, 23, 79, 126 }, - MSP_CARRIER(6.5), MSP_CARRIER(6.5), - 0x00c6, 0x0140, 0x0120, 0x7c03}, -}; - -struct CARRIER_DETECT { - int cdo; - char *name; -}; - -static struct CARRIER_DETECT carrier_detect_main[] = { - /* main carrier */ - { MSP_CARRIER(4.5), "4.5 NTSC" }, - { MSP_CARRIER(5.5), "5.5 PAL B/G" }, - { MSP_CARRIER(6.0), "6.0 PAL I" }, - { MSP_CARRIER(6.5), "6.5 PAL D/K + SAT + SECAM" } -}; - -static struct CARRIER_DETECT carrier_detect_55[] = { - /* PAL B/G */ - { MSP_CARRIER(5.7421875), "5.742 PAL B/G FM-stereo" }, - { MSP_CARRIER(5.85), "5.85 PAL B/G NICAM" } -}; - -static struct CARRIER_DETECT carrier_detect_65[] = { - /* PAL SAT / SECAM */ - { MSP_CARRIER(5.85), "5.85 PAL D/K + SECAM NICAM" }, - { MSP_CARRIER(6.2578125), "6.25 PAL D/K1 FM-stereo" }, - { MSP_CARRIER(6.7421875), "6.74 PAL D/K2 FM-stereo" }, - { MSP_CARRIER(7.02), "7.02 PAL SAT FM-stereo s/b" }, - { MSP_CARRIER(7.20), "7.20 PAL SAT FM-stereo s" }, - { MSP_CARRIER(7.38), "7.38 PAL SAT FM-stereo b" }, -}; - -#define CARRIER_COUNT(x) (sizeof(x)/sizeof(struct CARRIER_DETECT)) - -/* ----------------------------------------------------------------------- */ - -#define SCART_MASK 0 -#define SCART_IN1 1 -#define SCART_IN2 2 -#define SCART_IN1_DA 3 -#define SCART_IN2_DA 4 -#define SCART_IN3 5 -#define SCART_IN4 6 -#define SCART_MONO 7 -#define SCART_MUTE 8 - -static int scarts[3][9] = { - /* MASK IN1 IN2 IN1_DA IN2_DA IN3 IN4 MONO MUTE */ - { 0x0320, 0x0000, 0x0200, -1, -1, 0x0300, 0x0020, 0x0100, 0x0320 }, - { 0x0c40, 0x0440, 0x0400, 0x0c00, 0x0040, 0x0000, 0x0840, 0x0800, 0x0c40 }, - { 0x3080, 0x1000, 0x1080, 0x0000, 0x0080, 0x2080, 0x3080, 0x2000, 0x3000 }, -}; - -static char *scart_names[] = { - "mask", "in1", "in2", "in1 da", "in2 da", "in3", "in4", "mono", "mute" -}; - -static void -msp3400c_set_scart(bktr_ptr_t client, int in, int out) -{ - struct msp3400c *msp = client->msp3400c_info; - - if (-1 == scarts[out][in]) - return; - - dprintk("msp34xx: scart switch: %s => %d\n",scart_names[in],out); - msp->acb &= ~scarts[out][SCART_MASK]; - msp->acb |= scarts[out][in]; - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0013, msp->acb); -} - -/* ------------------------------------------------------------------------ */ - -static void msp3400c_setcarrier(bktr_ptr_t client, int cdo1, int cdo2) -{ - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0093, cdo1 & 0xfff); - msp3400c_write(client,I2C_MSP3400C_DEM, 0x009b, cdo1 >> 12); - msp3400c_write(client,I2C_MSP3400C_DEM, 0x00a3, cdo2 & 0xfff); - msp3400c_write(client,I2C_MSP3400C_DEM, 0x00ab, cdo2 >> 12); - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0056, 0); /*LOAD_REG_1/2*/ -} - -static void msp3400c_setvolume(bktr_ptr_t client, - int muted, int left, int right) -{ - int vol = 0,val = 0,balance = 0; - - if (!muted) { - vol = (left > right) ? left : right; - val = (vol * 0x73 / 65535) << 8; - } - if (vol > 0) { - balance = ((right-left) * 127) / vol; - } - - dprintk("msp34xx: setvolume: mute=%s %d:%d v=0x%02x b=0x%02x\n", - muted ? "on" : "off", left, right, val>>8, balance); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0000, val); /* loudspeaker */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0006, val); /* headphones */ - /* scart - on/off only */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0007, val ? 0x4000 : 0); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0001, balance << 8); -} - -static void msp3400c_setbass(bktr_ptr_t client, int bass) -{ - int val = ((bass-32768) * 0x60 / 65535) << 8; - - dprintk("msp34xx: setbass: %d 0x%02x\n",bass, val>>8); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0002, val); /* loudspeaker */ -} - -static void msp3400c_settreble(bktr_ptr_t client, int treble) -{ - int val = ((treble-32768) * 0x60 / 65535) << 8; - - dprintk("msp34xx: settreble: %d 0x%02x\n",treble, val>>8); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0003, val); /* loudspeaker */ -} - -static void msp3400c_setmode(bktr_ptr_t client, int type) -{ - struct msp3400c *msp = client->msp3400c_info; - int i; - - dprintk("msp3400: setmode: %d\n",type); - msp->mode = type; - msp->stereo = VIDEO_SOUND_MONO; - - msp3400c_write(client,I2C_MSP3400C_DEM, 0x00bb, /* ad_cv */ - msp_init_data[type].ad_cv); - - for (i = 5; i >= 0; i--) /* fir 1 */ - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0001, - msp_init_data[type].fir1[i]); - - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0005, 0x0004); /* fir 2 */ - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0005, 0x0040); - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0005, 0x0000); - for (i = 5; i >= 0; i--) - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0005, - msp_init_data[type].fir2[i]); - - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0083, /* MODE_REG */ - msp_init_data[type].mode_reg); - - msp3400c_setcarrier(client, msp_init_data[type].cdo1, - msp_init_data[type].cdo2); - - msp3400c_write(client,I2C_MSP3400C_DEM, 0x0056, 0); /*LOAD_REG_1/2*/ - - if (client->dolby) { - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008, - 0x0520); /* I2S1 */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009, - 0x0620); /* I2S2 */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b, - msp_init_data[type].dfp_src); - } else { - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008, - msp_init_data[type].dfp_src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009, - msp_init_data[type].dfp_src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b, - msp_init_data[type].dfp_src); - } - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a, - msp_init_data[type].dfp_src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, - msp_init_data[type].dfp_matrix); - - if (msp->nicam) { - /* nicam prescale */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0010, 0x5a00); /* was: 0x3000 */ - } -} - -/* turn on/off nicam + stereo */ -static void msp3400c_setstereo(bktr_ptr_t client, int mode) -{ - static char *strmode[] = { "0", "mono", "stereo", "3", - "lang1", "5", "6", "7", "lang2" }; - struct msp3400c *msp = client->msp3400c_info; - int nicam=0; /* channel source: FM/AM or nicam */ - int src=0; - - /* switch demodulator */ - switch (msp->mode) { - case MSP_MODE_FM_TERRA: - dprintk("msp3400: FM setstereo: %s\n",strmode[mode]); - msp3400c_setcarrier(client,msp->second,msp->main); - switch (mode) { - case VIDEO_SOUND_STEREO: - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3001); - break; - case VIDEO_SOUND_MONO: - case VIDEO_SOUND_LANG1: - case VIDEO_SOUND_LANG2: - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000e, 0x3000); - break; - } - break; - case MSP_MODE_FM_SAT: - dprintk("msp3400: SAT setstereo: %s\n",strmode[mode]); - switch (mode) { - case VIDEO_SOUND_MONO: - msp3400c_setcarrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5)); - break; - case VIDEO_SOUND_STEREO: - msp3400c_setcarrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02)); - break; - case VIDEO_SOUND_LANG1: - msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); - break; - case VIDEO_SOUND_LANG2: - msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); - break; - } - break; - case MSP_MODE_FM_NICAM1: - case MSP_MODE_FM_NICAM2: - case MSP_MODE_AM_NICAM: - dprintk("msp3400: NICAM setstereo: %s\n",strmode[mode]); - msp3400c_setcarrier(client,msp->second,msp->main); - if (msp->nicam_on) - nicam=0x0100; - break; - case MSP_MODE_BTSC: - dprintk("msp3400: BTSC setstereo: %s\n",strmode[mode]); - nicam=0x0300; - break; - case MSP_MODE_EXTERN: - dprintk("msp3400: extern setstereo: %s\n",strmode[mode]); - nicam = 0x0200; - break; - case MSP_MODE_FM_RADIO: - dprintk("msp3400: FM-Radio setstereo: %s\n",strmode[mode]); - break; - default: - dprintk("msp3400: mono setstereo\n"); - return; - } - - /* switch audio */ - switch (mode) { - case VIDEO_SOUND_STEREO: - src = 0x0020 | nicam; -#if 0 - /* spatial effect */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0005,0x4000); -#endif - break; - case VIDEO_SOUND_MONO: - if (msp->mode == MSP_MODE_AM_NICAM) { - dprintk("msp3400: switching to AM mono\n"); - /* AM mono decoding is handled by tuner, not MSP chip */ - /* SCART switching control register */ - msp3400c_set_scart(client,SCART_MONO,0); - src = 0x0200; - break; - } - case VIDEO_SOUND_LANG1: - src = 0x0000 | nicam; - break; - case VIDEO_SOUND_LANG2: - src = 0x0010 | nicam; - break; - } - dprintk("msp3400: setstereo final source/matrix = 0x%x\n", src); - - if (client->dolby) { - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,0x0520); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,0x0620); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src); - } else { - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0008,src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0009,src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000a,src); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000b,src); - } -} - -static void -msp3400c_print_mode(struct msp3400c *msp) -{ - if (msp->main == msp->second) { - printf("bktr: msp3400: mono sound carrier: %d.%03d MHz\n", - msp->main/910000,(msp->main/910)%1000); - } else { - printf("bktr: msp3400: main sound carrier: %d.%03d MHz\n", - msp->main/910000,(msp->main/910)%1000); - } - if (msp->mode == MSP_MODE_FM_NICAM1 || - msp->mode == MSP_MODE_FM_NICAM2) - printf("bktr: msp3400: NICAM/FM carrier : %d.%03d MHz\n", - msp->second/910000,(msp->second/910)%1000); - if (msp->mode == MSP_MODE_AM_NICAM) - printf("bktr: msp3400: NICAM/AM carrier : %d.%03d MHz\n", - msp->second/910000,(msp->second/910)%1000); - if (msp->mode == MSP_MODE_FM_TERRA && - msp->main != msp->second) { - printf("bktr: msp3400: FM-stereo carrier : %d.%03d MHz\n", - msp->second/910000,(msp->second/910)%1000); - } -} - -static void -msp3400c_restore_dfp(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - int i; - - for (i = 0; i < DFP_COUNT; i++) { - if (-1 == msp->dfp_regs[i]) - continue; - msp3400c_write(client,I2C_MSP3400C_DFP, i, msp->dfp_regs[i]); - } -} - -/* ----------------------------------------------------------------------- */ - -struct REGISTER_DUMP { - int addr; - char *name; -}; - -struct REGISTER_DUMP d1[] = { - { 0x007e, "autodetect" }, - { 0x0023, "C_AD_BITS " }, - { 0x0038, "ADD_BITS " }, - { 0x003e, "CIB_BITS " }, - { 0x0057, "ERROR_RATE" }, -}; - -static int -autodetect_stereo(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - int val; - int newstereo = msp->stereo; - int newnicam = msp->nicam_on; - int update = 0; - - switch (msp->mode) { - case MSP_MODE_FM_TERRA: - val = msp3400c_read(client, I2C_MSP3400C_DFP, 0x18); - if (val > 32767) - val -= 65536; - dprintk("msp34xx: stereo detect register: %d\n",val); - - if (val > 4096) { - newstereo = VIDEO_SOUND_STEREO | VIDEO_SOUND_MONO; - } else if (val < -4096) { - newstereo = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; - } else { - newstereo = VIDEO_SOUND_MONO; - } - newnicam = 0; - break; - case MSP_MODE_FM_NICAM1: - case MSP_MODE_FM_NICAM2: - case MSP_MODE_AM_NICAM: - val = msp3400c_read(client, I2C_MSP3400C_DEM, 0x23); - dprintk("msp34xx: nicam sync=%d, mode=%d\n",val & 1, (val & 0x1e) >> 1); - - if (val & 1) { - /* nicam synced */ - switch ((val & 0x1e) >> 1) { - case 0: - case 8: - newstereo = VIDEO_SOUND_STEREO; - break; - case 1: - case 9: - newstereo = VIDEO_SOUND_MONO - | VIDEO_SOUND_LANG1; - break; - case 2: - case 10: - newstereo = VIDEO_SOUND_MONO - | VIDEO_SOUND_LANG1 - | VIDEO_SOUND_LANG2; - break; - default: - newstereo = VIDEO_SOUND_MONO; - break; - } - newnicam=1; - } else { - newnicam = 0; - newstereo = VIDEO_SOUND_MONO; - } - break; - case MSP_MODE_BTSC: - val = msp3400c_read(client, I2C_MSP3400C_DEM, 0x200); - dprintk("msp3410: status=0x%x (pri=%s, sec=%s, %s%s%s)\n", - val, - (val & 0x0002) ? "no" : "yes", - (val & 0x0004) ? "no" : "yes", - (val & 0x0040) ? "stereo" : "mono", - (val & 0x0080) ? ", nicam 2nd mono" : "", - (val & 0x0100) ? ", bilingual/SAP" : ""); - newstereo = VIDEO_SOUND_MONO; - if (val & 0x0040) newstereo |= VIDEO_SOUND_STEREO; - if (val & 0x0100) newstereo |= VIDEO_SOUND_LANG1; - break; - } - if (newstereo != msp->stereo) { - update = 1; - dprintk("msp34xx: watch: stereo %d => %d\n", - msp->stereo,newstereo); - msp->stereo = newstereo; - } - if (newnicam != msp->nicam_on) { - update = 1; - dprintk("msp34xx: watch: nicam %d => %d\n", - msp->nicam_on,newnicam); - msp->nicam_on = newnicam; - } - return update; -} - -/* - * A kernel thread for msp3400 control -- we don't want to block the - * in the ioctl while doing the sound carrier & stereo detect - */ - -/* stereo/multilang monitoring */ -static void watch_stereo(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - - if (autodetect_stereo(client)) { - if (msp->stereo & VIDEO_SOUND_STEREO) - msp3400c_setstereo(client,VIDEO_SOUND_STEREO); - else if (msp->stereo & VIDEO_SOUND_LANG1) - msp3400c_setstereo(client,VIDEO_SOUND_LANG1); - else - msp3400c_setstereo(client,VIDEO_SOUND_MONO); - } - if (client->stereo_once) - msp->watch_stereo = 0; - -} - -static void msp3400c_thread(void *data) -{ - bktr_ptr_t client = data; - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - - struct CARRIER_DETECT *cd; - int count, max1,max2,val1,val2, val,this; - - dprintk("msp3400: thread started\n"); - - mtx_lock(&Giant); - for (;;) { - if (msp->rmmod) - goto done; - tsleep(msp->kthread, PRIBIO, "idle", 0); - if (msp->rmmod) - goto done; - if (msp->halt_thread) { - msp->watch_stereo = 0; - msp->halt_thread = 0; - continue; - } - - if (VIDEO_MODE_RADIO == msp->norm || - MSP_MODE_EXTERN == msp->mode) - continue; /* nothing to do */ - - msp->active = 1; - - if (msp->watch_stereo) { - watch_stereo(client); - msp->active = 0; - continue; - } - - /* some time for the tuner to sync */ - tsleep(msp->kthread, PRIBIO, "tuner sync", hz/2); - - restart: - if (VIDEO_MODE_RADIO == msp->norm || - MSP_MODE_EXTERN == msp->mode) - continue; /* nothing to do */ - msp->restart = 0; - msp3400c_setvolume(client, msp->muted, 0, 0); - msp3400c_setmode(client, MSP_MODE_AM_DETECT /* +1 */ ); - val1 = val2 = 0; - max1 = max2 = -1; - msp->watch_stereo = 0; - - /* carrier detect pass #1 -- main carrier */ - cd = carrier_detect_main; count = CARRIER_COUNT(carrier_detect_main); - - if (client->amsound && (msp->norm == VIDEO_MODE_SECAM)) { - /* autodetect doesn't work well with AM ... */ - max1 = 3; - count = 0; - dprintk("msp3400: AM sound override\n"); - } - - for (this = 0; this < count; this++) { - msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); - - tsleep(msp->kthread, PRIBIO, "carrier detect", hz/100); - - if (msp->restart) - msp->restart = 0; - - val = msp3400c_read(client, I2C_MSP3400C_DFP, 0x1b); - if (val > 32767) - val -= 65536; - if (val1 < val) - val1 = val, max1 = this; - dprintk("msp3400: carrier1 val: %5d / %s\n", val,cd[this].name); - } - - /* carrier detect pass #2 -- second (stereo) carrier */ - switch (max1) { - case 1: /* 5.5 */ - cd = carrier_detect_55; count = CARRIER_COUNT(carrier_detect_55); - break; - case 3: /* 6.5 */ - cd = carrier_detect_65; count = CARRIER_COUNT(carrier_detect_65); - break; - case 0: /* 4.5 */ - case 2: /* 6.0 */ - default: - cd = NULL; count = 0; - break; - } - - if (client->amsound && (msp->norm == VIDEO_MODE_SECAM)) { - /* autodetect doesn't work well with AM ... */ - cd = NULL; count = 0; max2 = 0; - } - for (this = 0; this < count; this++) { - msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); - - tsleep(msp->kthread, PRIBIO, "carrier detection", hz/100); - if (msp->restart) - goto restart; - - val = msp3400c_read(client, I2C_MSP3400C_DFP, 0x1b); - if (val > 32767) - val -= 65536; - if (val2 < val) - val2 = val, max2 = this; - dprintk("msp3400: carrier2 val: %5d / %s\n", val,cd[this].name); - } - - /* programm the msp3400 according to the results */ - msp->main = carrier_detect_main[max1].cdo; - switch (max1) { - case 1: /* 5.5 */ - if (max2 == 0) { - /* B/G FM-stereo */ - msp->second = carrier_detect_55[max2].cdo; - msp3400c_setmode(client, MSP_MODE_FM_TERRA); - msp->nicam_on = 0; - /* XXX why mono? this probably can do stereo... - Alex*/ - msp3400c_setstereo(client, VIDEO_SOUND_MONO); - msp->watch_stereo = 1; - } else if (max2 == 1 && msp->nicam) { - /* B/G NICAM */ - msp->second = carrier_detect_55[max2].cdo; - msp3400c_setmode(client, MSP_MODE_FM_NICAM1); - msp->nicam_on = 1; - msp3400c_setcarrier(client, msp->second, msp->main); - msp->watch_stereo = 1; - } else { - goto no_second; - } - break; - case 2: /* 6.0 */ - /* PAL I NICAM */ - msp->second = MSP_CARRIER(6.552); - msp3400c_setmode(client, MSP_MODE_FM_NICAM2); - msp->nicam_on = 1; - msp3400c_setcarrier(client, msp->second, msp->main); - msp->watch_stereo = 1; - break; - case 3: /* 6.5 */ - if (max2 == 1 || max2 == 2) { - /* D/K FM-stereo */ - msp->second = carrier_detect_65[max2].cdo; - msp3400c_setmode(client, MSP_MODE_FM_TERRA); - msp->nicam_on = 0; - msp3400c_setstereo(client, VIDEO_SOUND_MONO); - msp->watch_stereo = 1; - } else if (max2 == 0 && - msp->norm == VIDEO_MODE_SECAM) { - /* L NICAM or AM-mono */ - msp->second = carrier_detect_65[max2].cdo; - msp3400c_setmode(client, MSP_MODE_AM_NICAM); - msp->nicam_on = 0; - msp3400c_setstereo(client, VIDEO_SOUND_MONO); - msp3400c_setcarrier(client, msp->second, msp->main); - /* volume prescale for SCART (AM mono input) */ - msp3400c_write(client,I2C_MSP3400C_DFP, 0x000d, 0x1900); - msp->watch_stereo = 1; - } else if (max2 == 0 && msp->nicam) { - /* D/K NICAM */ - msp->second = carrier_detect_65[max2].cdo; - msp3400c_setmode(client, MSP_MODE_FM_NICAM1); - msp->nicam_on = 1; - msp3400c_setcarrier(client, msp->second, msp->main); - msp->watch_stereo = 1; - } else { - goto no_second; - } - break; - case 0: /* 4.5 */ - default: - no_second: - msp->second = carrier_detect_main[max1].cdo; - msp3400c_setmode(client, MSP_MODE_FM_TERRA); - msp->nicam_on = 0; - msp3400c_setcarrier(client, msp->second, msp->main); - msp->stereo = VIDEO_SOUND_MONO; - msp3400c_setstereo(client, VIDEO_SOUND_MONO); - break; - } - - if (msp->watch_stereo) - watch_stereo(client); - - /* unmute + restore dfp registers */ - msp3400c_setvolume(client, msp->muted, msp->left, msp->right); - msp3400c_restore_dfp(client); - - if (bootverbose) - msp3400c_print_mode(msp); - - msp->active = 0; - } - -done: - dprintk("msp3400: thread: exit\n"); - msp->active = 0; - - msp->kthread = NULL; - wakeup(&msp->kthread); - mtx_unlock(&Giant); - - kproc_exit(0); -} - -/* ----------------------------------------------------------------------- */ -/* this one uses the automatic sound standard detection of newer */ -/* msp34xx chip versions */ - -static struct MODES { - int retval; - int main, second; - char *name; -} modelist[] = { - { 0x0000, 0, 0, "ERROR" }, - { 0x0001, 0, 0, "autodetect start" }, - { 0x0002, MSP_CARRIER(4.5), MSP_CARRIER(4.72), "4.5/4.72 M Dual FM-Stereo" }, - { 0x0003, MSP_CARRIER(5.5), MSP_CARRIER(5.7421875), "5.5/5.74 B/G Dual FM-Stereo" }, - { 0x0004, MSP_CARRIER(6.5), MSP_CARRIER(6.2578125), "6.5/6.25 D/K1 Dual FM-Stereo" }, - { 0x0005, MSP_CARRIER(6.5), MSP_CARRIER(6.7421875), "6.5/6.74 D/K2 Dual FM-Stereo" }, - { 0x0006, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5 D/K FM-Mono (HDEV3)" }, - { 0x0008, MSP_CARRIER(5.5), MSP_CARRIER(5.85), "5.5/5.85 B/G NICAM FM" }, - { 0x0009, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 L NICAM AM" }, - { 0x000a, MSP_CARRIER(6.0), MSP_CARRIER(6.55), "6.0/6.55 I NICAM FM" }, - { 0x000b, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 D/K NICAM FM" }, - { 0x000c, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 D/K NICAM FM (HDEV2)" }, - { 0x0020, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M BTSC-Stereo" }, - { 0x0021, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M BTSC-Mono + SAP" }, - { 0x0030, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M EIA-J Japan Stereo" }, - { 0x0040, MSP_CARRIER(10.7), MSP_CARRIER(10.7), "10.7 FM-Stereo Radio" }, - { 0x0050, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5 SAT-Mono" }, - { 0x0051, MSP_CARRIER(7.02), MSP_CARRIER(7.20), "7.02/7.20 SAT-Stereo" }, - { 0x0060, MSP_CARRIER(7.2), MSP_CARRIER(7.2), "7.2 SAT ADR" }, - { -1, 0, 0, NULL }, /* EOF */ -}; - -static void msp3410d_thread(void *data) -{ - bktr_ptr_t client = data; - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - int mode,val,i,std; - int timo = 0; - - dprintk("msp3410: thread started\n"); - - mtx_lock(&Giant); - for (;;) { - if (msp->rmmod) - goto done; - if (!msp->watch_stereo) - timo = 0; - else - timo = 10*hz; - tsleep(msp->kthread, PRIBIO, "idle", timo); - if (msp->rmmod) - goto done; - if (msp->halt_thread) { - msp->watch_stereo = 0; - msp->halt_thread = 0; - dprintk("msp3410: thread halted\n"); - continue; - } - - if (msp->mode == MSP_MODE_EXTERN) - continue; - - msp->active = 1; - - if (msp->watch_stereo) { - watch_stereo(client); - msp->active = 0; - continue; - } - - /* some time for the tuner to sync */ - tsleep(msp->kthread, PRIBIO, "tuner sync", hz/2); - - restart: - if (msp->mode == MSP_MODE_EXTERN) - continue; - msp->restart = 0; - msp->watch_stereo = 0; - - /* put into sane state (and mute) */ - msp3400c_reset(client); - - /* start autodetect */ - switch (msp->norm) { - case VIDEO_MODE_PAL: - mode = 0x1003; - std = 1; - break; - case VIDEO_MODE_NTSC: /* BTSC */ - mode = 0x2003; - std = 0x0020; - break; - case VIDEO_MODE_SECAM: - mode = 0x0003; - std = 1; - break; - case VIDEO_MODE_RADIO: - mode = 0x0003; - std = 0x0040; - break; - default: - mode = 0x0003; - std = 1; - break; - } - msp3400c_write(client, I2C_MSP3400C_DEM, 0x30, mode); - msp3400c_write(client, I2C_MSP3400C_DEM, 0x20, std); - - if (bootverbose) { - int i; - for (i = 0; modelist[i].name != NULL; i++) - if (modelist[i].retval == std) - break; - dprintk("msp3410: setting mode: %s (0x%04x)\n", - modelist[i].name ? modelist[i].name : "unknown",std); - } - - if (std != 1) { - /* programmed some specific mode */ - val = std; - } else { - /* triggered autodetect */ - for (;;) { - tsleep(msp->kthread, PRIBIO, "autodetection", hz/10); - if (msp->restart) - goto restart; - - /* check results */ - val = msp3400c_read(client, I2C_MSP3400C_DEM, 0x7e); - if (val < 0x07ff) - break; - dprintk("msp3410: detection still in progress\n"); - } - } - for (i = 0; modelist[i].name != NULL; i++) - if (modelist[i].retval == val) - break; - dprintk("msp3410: current mode: %s (0x%04x)\n", - modelist[i].name ? modelist[i].name : "unknown", - val); - msp->main = modelist[i].main; - msp->second = modelist[i].second; - - if (client->amsound && (msp->norm == VIDEO_MODE_SECAM) && (val != 0x0009)) { - /* autodetection has failed, let backup */ - dprintk("msp3410: autodetection failed, switching to backup mode: %s (0x%04x)\n", - modelist[8].name ? modelist[8].name : "unknown",val); - val = 0x0009; - msp3400c_write(client, I2C_MSP3400C_DEM, 0x20, val); - } - - /* set various prescales */ - msp3400c_write(client, I2C_MSP3400C_DFP, 0x0d, 0x1900); /* scart */ - msp3400c_write(client, I2C_MSP3400C_DFP, 0x0e, 0x2403); /* FM */ - msp3400c_write(client, I2C_MSP3400C_DFP, 0x10, 0x5a00); /* nicam */ - - /* set stereo */ - switch (val) { - case 0x0008: /* B/G NICAM */ - case 0x000a: /* I NICAM */ - if (val == 0x0008) - msp->mode = MSP_MODE_FM_NICAM1; - else - msp->mode = MSP_MODE_FM_NICAM2; - /* just turn on stereo */ - msp->stereo = VIDEO_SOUND_STEREO; - msp->nicam_on = 1; - msp->watch_stereo = 1; - msp3400c_setstereo(client,VIDEO_SOUND_STEREO); - break; - case 0x0009: - msp->mode = MSP_MODE_AM_NICAM; - msp->stereo = VIDEO_SOUND_MONO; - msp->nicam_on = 1; - msp3400c_setstereo(client,VIDEO_SOUND_MONO); - msp->watch_stereo = 1; - break; - case 0x0020: /* BTSC */ - /* just turn on stereo */ - msp->mode = MSP_MODE_BTSC; - msp->stereo = VIDEO_SOUND_STEREO; - msp->nicam_on = 0; - msp->watch_stereo = 1; - msp3400c_setstereo(client,VIDEO_SOUND_STEREO); - break; - case 0x0040: /* FM radio */ - msp->mode = MSP_MODE_FM_RADIO; - msp->stereo = VIDEO_SOUND_STEREO; - msp->nicam_on = 0; - msp->watch_stereo = 0; - /* scart routing */ - msp3400c_set_scart(client,SCART_IN2,0); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x08, 0x0220); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x09, 0x0220); - msp3400c_write(client,I2C_MSP3400C_DFP, 0x0b, 0x0220); - break; - case 0x0003: - msp->mode = MSP_MODE_FM_TERRA; - msp->stereo = VIDEO_SOUND_STEREO; - msp->nicam_on = 0; - msp->watch_stereo = 1; - msp3400c_setstereo(client,VIDEO_SOUND_STEREO); - break; - } - - if (msp->watch_stereo) - watch_stereo(client); - - /* unmute + restore dfp registers */ - msp3400c_setbass(client, msp->bass); - msp3400c_settreble(client, msp->treble); - msp3400c_setvolume(client, msp->muted, msp->left, msp->right); - msp3400c_restore_dfp(client); - - msp->active = 0; - } - -done: - dprintk("msp3410: thread: exit\n"); - msp->active = 0; - - msp->kthread = NULL; - wakeup(&msp->kthread); - mtx_unlock(&Giant); - - kproc_exit(0); -} - -int msp_attach(bktr_ptr_t bktr) -{ - struct msp3400c *msp; - int rev1,rev2,i; - int err; - char buf[20]; - - msp = (struct msp3400c *) malloc(sizeof(struct msp3400c), M_DEVBUF, M_NOWAIT); - if (msp == NULL) - return ENOMEM; - bktr->msp3400c_info = msp; - - memset(msp,0,sizeof(struct msp3400c)); - msp->left = 65535; - msp->right = 65535; - msp->bass = 32768; - msp->treble = 32768; - msp->input = -1; - - for (i = 0; i < DFP_COUNT; i++) - msp->dfp_regs[i] = -1; - - msp3400c_reset(bktr); - - rev1 = msp3400c_read(bktr, I2C_MSP3400C_DFP, 0x1e); - if (-1 != rev1) - rev2 = msp3400c_read(bktr, I2C_MSP3400C_DFP, 0x1f); - if ((-1 == rev1) || (0 == rev1 && 0 == rev2)) { - free(msp, M_DEVBUF); - bktr->msp3400c_info = NULL; - printf("%s: msp3400: error while reading chip version\n", bktr_name(bktr)); - return ENXIO; - } - -#if 0 - /* this will turn on a 1kHz beep - might be useful for debugging... */ - msp3400c_write(bktr,I2C_MSP3400C_DFP, 0x0014, 0x1040); -#endif - - sprintf(buf,"MSP34%02d%c-%c%d", - (rev2>>8)&0xff, (rev1&0xff)+'@', ((rev1>>8)&0xff)+'@', rev2&0x1f); - msp->nicam = (((rev2>>8)&0xff) != 00) ? 1 : 0; - - if (bktr->mspsimple == -1) { - /* default mode */ - /* msp->simple = (((rev2>>8)&0xff) == 0) ? 0 : 1; */ - msp->simple = ((rev1&0xff)+'@' > 'C'); - } else { - /* use kenv value */ - msp->simple = bktr->mspsimple; - } - - /* hello world :-) */ - if (bootverbose) { - printf("%s: msp34xx: init: chip=%s", bktr_name(bktr), buf); - if (msp->nicam) - printf(", has NICAM support"); - printf("\n"); - } - - /* startup control thread */ - err = kproc_create(msp->simple ? msp3410d_thread : msp3400c_thread, - bktr, &msp->kthread, (RFFDG | RFPROC), 0, - "%s_msp34xx_thread", bktr->bktr_xname); - if (err) { - printf("%s: Error returned by kproc_create: %d", bktr_name(bktr), err); - free(msp, M_DEVBUF); - bktr->msp3400c_info = NULL; - return ENXIO; - } - wakeup(msp->kthread); - - /* done */ - return 0; -} - -int msp_detach(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - - /* shutdown control thread */ - if (msp->kthread) - { - /* XXX mutex lock required */ - mtx_lock(&Giant); - msp->rmmod = 1; - msp->watch_stereo = 0; - wakeup(msp->kthread); - - while (msp->kthread) - tsleep(&msp->kthread, PRIBIO, "wait for kthread", hz/10); - mtx_unlock(&Giant); - } - - if (client->msp3400c_info != NULL) { - free(client->msp3400c_info, M_DEVBUF); - client->msp3400c_info = NULL; - } - - msp3400c_reset(client); - - return 0; -} - -void msp_wake_thread(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - - msp3400c_setvolume(client,msp->muted,0,0); - msp->watch_stereo=0; - if (msp->active) - msp->restart = 1; - wakeup(msp->kthread); -} - -void msp_halt_thread(bktr_ptr_t client) -{ - struct msp3400c *msp = (struct msp3400c*)client->msp3400c_info; - - msp3400c_setvolume(client,msp->muted,0,0); - if (msp->active) - msp->restart = 1; - msp->halt_thread = 1; - wakeup(msp->kthread); -} -#endif /* BKTR_NEW_MSP34XX_DRIVER */ diff --git a/sys/modules/Makefile b/sys/modules/Makefile index b4a116ddcacc..461998568040 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -67,7 +67,6 @@ SUBDIR= \ bhnd \ ${_bxe} \ ${_bios} \ - ${_bktr} \ ${_blake2} \ bnxt \ bridgestp \ @@ -583,7 +582,6 @@ _agp= agp _an= an _aout= aout _bios= bios -_bktr= bktr .if ${MK_SOURCELESS_UCODE} != "no" _bxe= bxe .endif diff --git a/sys/modules/bktr/Makefile b/sys/modules/bktr/Makefile deleted file mode 100644 index 1a9e0376921f..000000000000 --- a/sys/modules/bktr/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $FreeBSD$ - -SUBDIR = -SUBDIR += bktr -SUBDIR += bktr_mem - -.include diff --git a/sys/modules/bktr/Makefile.inc b/sys/modules/bktr/Makefile.inc deleted file mode 100644 index 265f86d1ed55..000000000000 --- a/sys/modules/bktr/Makefile.inc +++ /dev/null @@ -1,3 +0,0 @@ -# $FreeBSD$ - -.include "../Makefile.inc" diff --git a/sys/modules/bktr/bktr/Makefile b/sys/modules/bktr/bktr/Makefile deleted file mode 100644 index 4345abeaedf6..000000000000 --- a/sys/modules/bktr/bktr/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# $FreeBSD$ - -# Makefile for the bktr Brooktree Bt848/Bt878 PCI video capture device - -.PATH: ${SRCTOP}/sys/dev/bktr - -KMOD= bktr -SRCS= bktr_core.c bktr_os.c bktr_audio.c bktr_tuner.c bktr_card.c msp34xx.c \ - opt_bktr.h bus_if.h device_if.h \ - pci_if.h - -CFLAGS+= -DBKTR_FREEBSD_MODULE - -.if defined(BKTR_USE_FREEBSD_SMBUS) -SRCS+= bktr_i2c.c iicbb_if.h iicbus_if.h smbus_if.h -CFLAGS+= -DBKTR_USE_FREEBSD_SMBUS -.endif - -.include diff --git a/sys/modules/bktr/bktr_mem/Makefile b/sys/modules/bktr/bktr_mem/Makefile deleted file mode 100644 index 12c9cbd26189..000000000000 --- a/sys/modules/bktr/bktr_mem/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ - -.PATH: ${SRCTOP}/sys/dev/bktr - -KMOD= bktr_mem -SRCS= bktr_mem.c -EXPORT_SYMS= bktr_has_stored_addresses \ - bktr_store_address \ - bktr_retrieve_address - -.include diff --git a/sys/sys/param.h b/sys/sys/param.h index a690ad9ffdb3..13742bf3c5ff 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -60,7 +60,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1300081 /* Master, propagated to newvers */ +#define __FreeBSD_version 1300082 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,