⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tda9887.c

📁 dvb数字电视实现参考 dvb数字电视实现参考
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <linux/module.h>#include <linux/kernel.h>#include <linux/i2c.h>#include <linux/types.h>#include <linux/videodev.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/slab.h>#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)#include "audiochip.h"#include "id.h"#include "i2c-compat.h"#else#include <media/audiochip.h>#include <media/id.h>#endif/* Chips:   TDA9885 (PAL, NTSC)   TDA9886 (PAL, SECAM, NTSC)   TDA9887 (PAL, SECAM, NTSC, FM Radio)   found on:   - Pinnacle PCTV (Jul.2002 Version with MT2032, bttv)      TDA9887 (world), TDA9885 (USA)      Note: OP2 of tda988x must be set to 1, else MT2032 is disabled!   - KNC One TV-Station RDS (saa7134)*//* Addresses to scan */static unsigned short normal_i2c[] = {	0x86 >>1,	0x96 >>1,	I2C_CLIENT_END,};static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END};I2C_CLIENT_INSMOD;/* insmod options */static unsigned int debug = 0;MODULE_PARM(debug,"i");MODULE_LICENSE("GPL");/* ---------------------------------------------------------------------- */#define UNSET       (-1U)#define PREFIX      "tda9885/6/7: "#define dprintk     if (debug) printkstruct tda9887 {	struct i2c_client  client;	v4l2_std_id        std;	unsigned int       radio;	unsigned int       pinnacle_id;};struct tvnorm {	v4l2_std_id       std;	char              *name;	unsigned char     b;	unsigned char     c;	unsigned char     e;};static struct i2c_driver driver;static struct i2c_client client_template;/* ---------------------------------------------------------------------- *///// TDA defines////// first reg (b)#define cVideoTrapBypassOFF     0x00    // bit b0#define cVideoTrapBypassON      0x01    // bit b0#define cAutoMuteFmInactive     0x00    // bit b1#define cAutoMuteFmActive       0x02    // bit b1#define cIntercarrier           0x00    // bit b2#define cQSS                    0x04    // bit b2#define cPositiveAmTV           0x00    // bit b3:4#define cFmRadio                0x08    // bit b3:4#define cNegativeFmTV           0x10    // bit b3:4#define cForcedMuteAudioON      0x20    // bit b5#define cForcedMuteAudioOFF     0x00    // bit b5#define cOutputPort1Active      0x00    // bit b6#define cOutputPort1Inactive    0x40    // bit b6#define cOutputPort2Active      0x00    // bit b7#define cOutputPort2Inactive    0x80    // bit b7//// second reg (c)#define cDeemphasisOFF          0x00    // bit c5#define cDeemphasisON           0x20    // bit c5#define cDeemphasis75           0x00    // bit c6#define cDeemphasis50           0x40    // bit c6#define cAudioGain0             0x00    // bit c7#define cAudioGain6             0x80    // bit c7//// third reg (e)#define cAudioIF_4_5             0x00    // bit e0:1#define cAudioIF_5_5             0x01    // bit e0:1#define cAudioIF_6_0             0x02    // bit e0:1#define cAudioIF_6_5             0x03    // bit e0:1#define cVideoIF_58_75           0x00    // bit e2:4#define cVideoIF_45_75           0x04    // bit e2:4#define cVideoIF_38_90           0x08    // bit e2:4#define cVideoIF_38_00           0x0C    // bit e2:4#define cVideoIF_33_90           0x10    // bit e2:4#define cVideoIF_33_40           0x14    // bit e2:4#define cRadioIF_45_75           0x18    // bit e2:4#define cRadioIF_38_90           0x1C    // bit e2:4#define cTunerGainNormal         0x00    // bit e5#define cTunerGainLow            0x20    // bit e5#define cGating_18               0x00    // bit e6#define cGating_36               0x40    // bit e6#define cAgcOutON                0x80    // bit e7#define cAgcOutOFF               0x00    // bit e7/* ---------------------------------------------------------------------- */static struct tvnorm tvnorms[] = {	{		.std   = V4L2_STD_PAL_BG,		.name  = "PAL-BG",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cAudioIF_5_5   |			   cVideoIF_38_90 ),	},{		.std   = V4L2_STD_PAL_I,		.name  = "PAL-I",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cAudioIF_6_0   |			   cVideoIF_38_90 ),	},{		.std   = V4L2_STD_PAL_DK,		.name  = "PAL-DK",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cAudioIF_6_5   |			   cVideoIF_38_00 ),	},{		.std   = V4L2_STD_PAL_M | V4L2_STD_PAL_N,		.name  = "PAL-M/N",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis75  ),		.e     = ( cAudioIF_4_5   |			   cVideoIF_45_75 ),	},{		.std   = V4L2_STD_SECAM_L,		.name  = "SECAM-L",		.b     = ( cPositiveAmTV  |			   cQSS           ),		.e     = ( cAudioIF_6_5   |			   cVideoIF_38_90 ),	},{		.std   = V4L2_STD_SECAM_DK,		.name  = "SECAM-DK",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cAudioIF_6_5   |			   cVideoIF_38_00 ),	},{		.std   = V4L2_STD_NTSC_M,		.name  = "NTSC-M",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cGating_36     |			   cAudioIF_4_5   |			   cVideoIF_45_75 ),	},{		.std   = V4L2_STD_NTSC_M_JP,		.name  = "NTSC-JP",		.b     = ( cNegativeFmTV  ),		.c     = ( cDeemphasisON  |			   cDeemphasis50  ),		.e     = ( cGating_36     |			   cAudioIF_4_5   |			   cVideoIF_58_75 ),	}};static struct tvnorm radio = {	.name = "radio",	.b    = ( cFmRadio       |		  cQSS           ),	.c    = ( cDeemphasisON  |		  cDeemphasis50  ),	.e    = ( cAudioIF_5_5   |		  cRadioIF_38_90 ),};/* ---------------------------------------------------------------------- */static void dump_read_message(unsigned char *buf){	static char *afc[16] = {		"- 12.5 kHz",		"- 37.5 kHz",		"- 62.5 kHz",		"- 87.5 kHz",		"-112.5 kHz",		"-137.5 kHz",		"-162.5 kHz",		"-187.5 kHz [min]",		"+187.5 kHz [max]",		"+162.5 kHz",		"+137.5 kHz",		"+112.5 kHz",		"+ 87.5 kHz",		"+ 62.5 kHz",		"+ 37.5 kHz",		"+ 12.5 kHz",	};	printk(PREFIX "read: 0x%2x\n", buf[0]);	printk("  after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no");	printk("  afc            : %s\n", afc[(buf[0] >> 1) & 0x0f]);	printk("  afc window     : %s\n", (buf[0] & 0x40) ? "in" : "out");	printk("  vfi level      : %s\n", (buf[0] & 0x80) ? "high" : "low");}static void dump_write_message(unsigned char *buf){	static char *sound[4] = {		"AM/TV",		"FM/radio",		"FM/TV",		"FM/radio"	};	static char *adjust[32] = {		"-16", "-15", "-14", "-13", "-12", "-11", "-10", "-9",		"-8",  "-7",  "-6",  "-5",  "-4",  "-3",  "-2",  "-1",		"0",   "+1",  "+2",  "+3",  "+4",  "+5",  "+6",  "+7",		"+8",  "+9",  "+10", "+11", "+12", "+13", "+14", "+15"	};	static char *deemph[4] = {		"no", "no", "75", "50"	};	static char *carrier[4] = {		"4.5 MHz",		"5.5 MHz",		"6.0 MHz",		"6.5 MHz / AM"	};	static char *vif[8] = {		"58.75 MHz",		"45.75 MHz",		"38.9 MHz",		"38.0 MHz",		"33.9 MHz",		"33.4 MHz",		"45.75 MHz + pin13",		"38.9 MHz + pin13",	};	static char *rif[4] = {		"44 MHz",		"52 MHz",		"52 MHz",		"44 MHz",	};	printk(PREFIX "write: byte B 0x%02x\n",buf[1]);	printk("  B0   video mode      : %s\n",	       (buf[1] & 0x01) ? "video trap" : "sound trap");	printk("  B1   auto mute fm    : %s\n",	       (buf[1] & 0x02) ? "yes" : "no");	printk("  B2   carrier mode    : %s\n",	       (buf[1] & 0x04) ? "QSS" : "Intercarrier");	printk("  B3-4 tv sound/radio  : %s\n",	       sound[(buf[1] & 0x18) >> 3]);	printk("  B5   force mute audio: %s\n",	       (buf[1] & 0x20) ? "yes" : "no");	printk("  B6   output port 1   : %s\n",	       (buf[1] & 0x40) ? "high" : "low");	printk("  B7   output port 2   : %s\n",	       (buf[1] & 0x80) ? "high" : "low");	printk(PREFIX "write: byte C 0x%02x\n",buf[2]);	printk("  C0-4 top adjustment  : %s dB\n", adjust[buf[2] & 0x1f]);	printk("  C5-6 de-emphasis     : %s\n", deemph[(buf[2] & 0x60) >> 5]);	printk("  C7   audio gain      : %s\n",	       (buf[2] & 0x80) ? "-6" : "0");	printk(PREFIX "write: byte E 0x%02x\n",buf[3]);	printk("  E0-1 sound carrier   : %s\n",	       carrier[(buf[3] & 0x03)]);	printk("  E6   l pll ganting   : %s\n",	       (buf[3] & 0x40) ? "36" : "13");	if (buf[1] & 0x08) {		/* radio */		printk("  E2-4 video if        : %s\n",		       rif[(buf[3] & 0x0c) >> 2]);		printk("  E7   vif agc output  : %s\n",		       (buf[3] & 0x80)		       ? ((buf[3] & 0x10) ? "fm-agc radio" : "sif-agc radio")		       : "fm radio carrier afc");	} else {		/* video */		printk("  E2-4 video if        : %s\n",		       vif[(buf[3] & 0x1c) >> 2]);		printk("  E5   tuner gain      : %s\n",		       (buf[3] & 0x80)		       ? ((buf[3] & 0x20) ? "external" : "normal")		       : ((buf[3] & 0x20) ? "minimum"  : "normal"));		printk("  E7   vif agc output  : %s\n",		       (buf[3] & 0x80)		       ? ((buf[3] & 0x20)			  ? "pin3 port, pin22 vif agc out"			  : "pin22 port, pin3 vif acg ext in")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -