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

📄 tvaudio.c

📁 saa7134-0.2.9.tar.gz 电视卡驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 0x00 - VR in TDA9855 *//* 0x01 - VL in TDA9855 *//* lower 7 bits control gain from -71dB (0x28) to 16dB (0x7f) * in 1dB steps - mute is 0x27 *//* 0x02 - BA in TDA9855 */ /* lower 5 bits control bass gain from -12dB (0x06) to 16.5dB (0x19) * in .5dB steps - 0 is 0x0E *//* 0x03 - TR in TDA9855 *//* 4 bits << 1 control treble gain from -12dB (0x3) to 12dB (0xb) * in 3dB steps - 0 is 0x7 *//* Masks for bits in both chips' subaddresses *//* 0x04 - SW in TDA9855, C4/Control 1 in TDA9850 *//* Unique to TDA9855: *//* 4 bits << 2 control subwoofer/surround gain from -14db (0x1) to 14db (0xf) * in 3dB steps - mute is 0x0 */ /* Unique to TDA9850: *//* lower 4 bits control stereo noise threshold, over which stereo turns off * set to values of 0x00 through 0x0f for Ster1 through Ster16 *//* 0x05 - C5 - Control 1 in TDA9855 , Control 2 in TDA9850*//* Unique to TDA9855: */#define TDA9855_MUTE	1<<7 /* GMU, Mute at outputs */#define TDA9855_AVL	1<<6 /* AVL, Automatic Volume Level */#define TDA9855_LOUD	1<<5 /* Loudness, 1==off */#define TDA9855_SUR	1<<3 /* Surround / Subwoofer 1==.5(L-R) 0==.5(L+R) */			     /* Bits 0 to 3 select various combinations                              * of line in and line out, only the                               * interesting ones are defined */#define TDA9855_EXT	1<<2 /* Selects inputs LIR and LIL.  Pins 41 & 12 */#define TDA9855_INT	0    /* Selects inputs LOR and LOL.  (internal) *//* Unique to TDA9850:  *//* lower 4 bits contol SAP noise threshold, over which SAP turns off * set to values of 0x00 through 0x0f for SAP1 through SAP16 *//* 0x06 - C6 - Control 2 in TDA9855, Control 3 in TDA9850 *//* Common to TDA9855 and TDA9850: */#define TDA985x_SAP	3<<6 /* Selects SAP output, mute if not received */#define TDA985x_STEREO	1<<6 /* Selects Stereo ouput, mono if not received */#define TDA985x_MONO	0    /* Forces Mono output */#define TDA985x_LMU	1<<3 /* Mute (LOR/LOL for 9855, OUTL/OUTR for 9850) *//* Unique to TDA9855: */#define TDA9855_TZCM	1<<5 /* If set, don't mute till zero crossing */#define TDA9855_VZCM	1<<4 /* If set, don't change volume till zero crossing*/#define TDA9855_LINEAR	0    /* Linear Stereo */#define TDA9855_PSEUDO	1    /* Pseudo Stereo */#define TDA9855_SPAT_30	2    /* Spatial Stereo, 30% anti-phase crosstalk */#define TDA9855_SPAT_50	3    /* Spatial Stereo, 52% anti-phase crosstalk */#define TDA9855_E_MONO	7    /* Forced mono - mono select elseware, so useless*//* 0x07 - C7 - Control 3 in TDA9855, Control 4 in TDA9850 *//* Common to both TDA9855 and TDA9850: *//* lower 4 bits control input gain from -3.5dB (0x0) to 4dB (0xF) * in .5dB steps -  0dB is 0x7 *//* 0x08, 0x09 - A1 and A2 (read/write) *//* Common to both TDA9855 and TDA9850: *//* lower 5 bites are wideband and spectral expander alignment * from 0x00 to 0x1f - nominal at 0x0f and 0x10 (read/write) */#define TDA985x_STP	1<<5 /* Stereo Pilot/detect (read-only) */#define TDA985x_SAPP	1<<6 /* SAP Pilot/detect (read-only) */#define TDA985x_STS	1<<7 /* Stereo trigger 1= <35mV 0= <30mV (write-only)*//* 0x0a - A3 *//* Common to both TDA9855 and TDA9850: *//* lower 3 bits control timing current for alignment: -30% (0x0), -20% (0x1), * -10% (0x2), nominal (0x3), +10% (0x6), +20% (0x5), +30% (0x4) */#define TDA985x_ADJ	1<<7 /* Stereo adjust on/off (wideband and spectral */static int tda9855_volume(int val) { return val/0x2e8+0x27; }static int tda9855_bass(int val)   { return val/0xccc+0x06; }static int tda9855_treble(int val) { return (val/0x1c71+0x3)<<1; }static int  tda985x_getmode(struct CHIPSTATE *chip){	int mode;	mode = ((TDA985x_STP | TDA985x_SAPP) & 		chip_read(chip)) >> 4;	/* Add mono mode regardless of SAP and stereo */	/* Allows forced mono */	return mode | VIDEO_SOUND_MONO;}static void tda985x_setmode(struct CHIPSTATE *chip, int mode){	int update = 1;	int c6 = chip->shadow.bytes[TDA985x_C6+1] & 0x3f;		switch (mode) {	case VIDEO_SOUND_MONO:		c6 |= TDA985x_MONO;		break;	case VIDEO_SOUND_STEREO:		c6 |= TDA985x_STEREO;		break;	case VIDEO_SOUND_LANG1:		c6 |= TDA985x_SAP;		break;	default:		update = 0;	}	if (update)		chip_write(chip,TDA985x_C6,c6);}/* ---------------------------------------------------------------------- *//* audio chip descriptions - defines+functions for tda9873h               *//* Subaddresses for TDA9873H */#define TDA9873_SW	0x00 /* Switching                    */#define TDA9873_AD	0x01 /* Adjust                       */#define TDA9873_PT	0x02 /* Port                         *//* Subaddress 0x00: Switching Data  * B7..B0: * * B1, B0: Input source selection *  0,  0  internal *  1,  0  external stereo *  0,  1  external mono */#define TDA9873_INP_MASK    3#define TDA9873_INTERNAL    0#define TDA9873_EXT_STEREO  2#define TDA9873_EXT_MONO    1/*    B3, B2: output signal select * B4    : transmission mode  *  0, 0, 1   Mono *  1, 0, 0   Stereo *  1, 1, 1   Stereo (reversed channel)     *  0, 0, 0   Dual AB *  0, 0, 1   Dual AA *  0, 1, 0   Dual BB *  0, 1, 1   Dual BA */#define TDA9873_TR_MASK     (7 << 2)#define TDA9873_TR_MONO     4#define TDA9873_TR_STEREO   1 << 4#define TDA9873_TR_REVERSE  (1 << 3) & (1 << 2)#define TDA9873_TR_DUALA    1 << 2#define TDA9873_TR_DUALB    1 << 3/* output level controls * B5:  output level switch (0 = reduced gain, 1 = normal gain) * B6:  mute                (1 = muted) * B7:  auto-mute           (1 = auto-mute enabled) */#define TDA9873_GAIN_NORMAL 1 << 5#define TDA9873_MUTE        1 << 6#define TDA9873_AUTOMUTE    1 << 7/* Subaddress 0x01:  Adjust/standard *//* Lower 4 bits (C3..C0) control stereo adjustment on R channel (-0.6 - +0.7 dB) * Recommended value is +0 dB */#define	TDA9873_STEREO_ADJ	0x06 /* 0dB gain *//* Bits C6..C4 control FM stantard   * C6, C5, C4 *  0,  0,  0   B/G (PAL FM) *  0,  0,  1   M *  0,  1,  0   D/K(1) *  0,  1,  1   D/K(2) *  1,  0,  0   D/K(3) *  1,  0,  1   I */#define TDA9873_BG		0#define TDA9873_M       1#define TDA9873_DK1     2#define TDA9873_DK2     3#define TDA9873_DK3     4#define TDA9873_I       5/* C7 controls identification response time (1=fast/0=normal) */#define TDA9873_IDR_NORM 0#define TDA9873_IDR_FAST 1 << 7/* Subaddress 0x02: Port data */ /* E1, E0   free programmable ports P1/P2    0,  0   both ports low    0,  1   P1 high    1,  0   P2 high    1,  1   both ports high*/#define TDA9873_PORTS    3/* E2: test port */#define TDA9873_TST_PORT 1 << 2/* E5..E3 control mono output channel (together with transmission mode bit B4) * * E5 E4 E3 B4     OUTM *  0  0  0  0     mono *  0  0  1  0     DUAL B *  0  1  0  1     mono (from stereo decoder) */#define TDA9873_MOUT_MONO   0#define TDA9873_MOUT_FMONO  0#define TDA9873_MOUT_DUALA  0 #define TDA9873_MOUT_DUALB  1 << 3 #define TDA9873_MOUT_ST     1 << 4 #define TDA9873_MOUT_EXTM   (1 << 4 ) & (1 << 3)#define TDA9873_MOUT_EXTL   1 << 5 #define TDA9873_MOUT_EXTR   (1 << 5 ) & (1 << 3)#define TDA9873_MOUT_EXTLR  (1 << 5 ) & (1 << 4)#define TDA9873_MOUT_MUTE   (1 << 5 ) & (1 << 4) & (1 << 3)/* Status bits: (chip read) */#define TDA9873_PONR        0 /* Power-on reset detected if = 1 */#define TDA9873_STEREO      2 /* Stereo sound is identified     */#define TDA9873_DUAL        4 /* Dual sound is identified       */static int tda9873_getmode(struct CHIPSTATE *chip){	int val,mode;	val = chip_read(chip);	mode = VIDEO_SOUND_MONO;	if (val & TDA9873_STEREO)		mode |= VIDEO_SOUND_STEREO;	if (val & TDA9873_DUAL)		mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;	dprintk ("tda9873_getmode(): raw chip read: %d, return: %d\n",		 val, mode);	return mode;}static void tda9873_setmode(struct CHIPSTATE *chip, int mode){	int sw_data  = chip->shadow.bytes[TDA9873_SW+1] & ~ TDA9873_TR_MASK;	/*	int adj_data = chip->shadow.bytes[TDA9873_AD+1] ; */	if ((sw_data & TDA9873_INP_MASK) != TDA9873_INTERNAL) {		dprintk("tda9873_setmode(): external input\n");		return;	}		dprintk("tda9873_setmode(): chip->shadow.bytes[%d] = %d\n", TDA9873_SW+1, chip->shadow.bytes[TDA9873_SW+1]);	dprintk("tda9873_setmode(): sw_data  = %d\n", sw_data);	switch (mode) {	case VIDEO_SOUND_MONO:		sw_data |= TDA9873_TR_MONO;   		break;	case VIDEO_SOUND_STEREO:		sw_data |= TDA9873_TR_STEREO;		break;	case VIDEO_SOUND_LANG1:		sw_data |= TDA9873_TR_DUALA;		break;	case VIDEO_SOUND_LANG2:		sw_data |= TDA9873_TR_DUALB;		break;	default:		chip->mode = 0;		return;	}	chip_write(chip, TDA9873_SW, sw_data);	dprintk("tda9873_setmode(): req. mode %d; chip_write: %d\n",		mode, sw_data);}static int tda9873_checkit(struct CHIPSTATE *chip){	int rc;	if (-1 == (rc = chip_read2(chip,254)))		return 0;	return (rc & ~0x1f) == 0x80;}/* ---------------------------------------------------------------------- *//* audio chip description - defines+functions for tda9874h and tda9874a   *//* Dariusz Kowalewski <darekk@automex.pl>                                 *//* Subaddresses for TDA9874H and TDA9874A (slave rx) */#define TDA9874A_AGCGR		0x00	/* AGC gain */#define TDA9874A_GCONR		0x01	/* general config */#define TDA9874A_MSR		0x02	/* monitor select */#define TDA9874A_C1FRA		0x03	/* carrier 1 freq. */#define TDA9874A_C1FRB		0x04	/* carrier 1 freq. */#define TDA9874A_C1FRC		0x05	/* carrier 1 freq. */#define TDA9874A_C2FRA		0x06	/* carrier 2 freq. */#define TDA9874A_C2FRB		0x07	/* carrier 2 freq. */#define TDA9874A_C2FRC		0x08	/* carrier 2 freq. */#define TDA9874A_DCR		0x09	/* demodulator config */#define TDA9874A_FMER		0x0a	/* FM de-emphasis */#define TDA9874A_FMMR		0x0b	/* FM dematrix */#define TDA9874A_C1OLAR		0x0c	/* ch.1 output level adj. */#define TDA9874A_C2OLAR		0x0d	/* ch.2 output level adj. */#define TDA9874A_NCONR		0x0e	/* NICAM config */#define TDA9874A_NOLAR		0x0f	/* NICAM output level adj. */#define TDA9874A_NLELR		0x10	/* NICAM lower error limit */#define TDA9874A_NUELR		0x11	/* NICAM upper error limit */#define TDA9874A_AMCONR		0x12	/* audio mute control */#define TDA9874A_SDACOSR	0x13	/* stereo DAC output select */#define TDA9874A_AOSR		0x14	/* analog output select */#define TDA9874A_DAICONR	0x15	/* digital audio interface config */#define TDA9874A_I2SOSR		0x16	/* I2S-bus output select */#define TDA9874A_I2SOLAR	0x17	/* I2S-bus output level adj. */#define TDA9874A_MDACOSR	0x18	/* mono DAC output select (tda9874a) */#define TDA9874A_ESP		0xFF	/* easy standard progr. (tda9874a) *//* Subaddresses for TDA9874H and TDA9874A (slave tx) */#define TDA9874A_DSR		0x00	/* device status */#define TDA9874A_NSR		0x01	/* NICAM status */#define TDA9874A_NECR		0x02	/* NICAM error count */#define TDA9874A_DR1		0x03	/* add. data LSB */#define TDA9874A_DR2		0x04	/* add. data MSB */#define TDA9874A_LLRA		0x05	/* monitor level read-out LSB */#define TDA9874A_LLRB		0x06	/* monitor level read-out MSB */#define TDA9874A_SIFLR		0x07	/* SIF level */#define TDA9874A_TR2		252	/* test reg. 2 */#define TDA9874A_TR1		253	/* test reg. 1 */#define TDA9874A_DIC		254	/* device id. code */#define TDA9874A_SIC		255	/* software id. code */static int tda9874a_mode = 1;		/* 0: A2, 1: NICAM */static int tda9874a_GCONR = 0xc0;	/* default config. input pin: SIFSEL=0 */static int tda9874a_NCONR = 0x01;	/* default NICAM config.: AMSEL=0,AMUTE=1 */static int tda9874a_ESP = 0x07;		/* default standard: NICAM D/K */static int tda9874a_dic = -1;		/* device id. code *//* insmod options for tda9874a */static unsigned int tda9874a_SIF   = UNSET;static unsigned int tda9874a_AMSEL = UNSET;static unsigned int tda9874a_STD   = UNSET;MODULE_PARM(tda9874a_SIF,"i");MODULE_PARM(tda9874a_AMSEL,"i");MODULE_PARM(tda9874a_STD,"i");/* * initialization table for tda9874 decoder: *  - carrier 1 freq. registers (3 bytes) *  - carrier 2 freq. registers (3 bytes) *  - demudulator config register *  - FM de-emphasis register (slow identification mode) * Note: frequency registers must be written in single i2c transfer. */static struct tda9874a_MODES {	char *name;	audiocmd cmd;} tda9874a_modelist[9] = {  {	"A2, B/G",	{ 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} },  {	"A2, M (Korea)",	{ 9, { TDA9874A_C1FRA, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} },  {	"A2, D/K (1)",	{ 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x82,0x60,0x00, 0x00,0x00 }} },  {	"A2, D/K (2)",	{ 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x8C,0x75,0x55, 0x00,0x00 }} },  {	"A2, D/K (3)",	{ 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x77,0xA0,0x00, 0x00,0x00 }} },  {	"NICAM, I",	{ 9, { TDA9874A_C1FRA, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} },  {	"NICAM, B/G",	{ 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} },  {	"NICAM, D/K", /* default */	{ 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} },  {	"NICAM, L",	{ 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} }};static int tda9874a_setup(struct CHIPSTATE *chip){	chip_write(chip, TDA9874A_AGCGR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_GCONR, tda9874a_GCONR);	chip_write(chip, TDA9874A_MSR, (tda9874a_mode) ? 0x03:0x02);	if(tda9874a_dic == 0x11) {		chip_write(chip, TDA9874A_FMMR, 0x80);	} else { /* dic == 0x07 */		chip_cmd(chip,"tda9874_modelist",&tda9874a_modelist[tda9874a_STD].cmd);		chip_write(chip, TDA9874A_FMMR, 0x00);	}	chip_write(chip, TDA9874A_C1OLAR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_C2OLAR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_NCONR, tda9874a_NCONR);	chip_write(chip, TDA9874A_NOLAR, 0x00); /* 0 dB */	/* Note: If signal quality is poor you may want to change NICAM */	/* error limit registers (NLELR and NUELR) to some greater values. */	/* Then the sound would remain stereo, but won't be so clear. */	chip_write(chip, TDA9874A_NLELR, 0x14); /* default */	chip_write(chip, TDA9874A_NUELR, 0x50); /* default */	if(tda9874a_dic == 0x11) {		chip_write(chip, TDA9874A_AMCONR, 0xf9);		chip_write(chip, TDA9874A_SDACOSR, (tda9874a_mode) ? 0x81:0x80);		chip_write(chip, TDA9874A_AOSR, 0x80);		chip_write(chip, TDA9874A_MDACOSR, (tda9874a_mode) ? 0x82:0x80);		chip_write(chip, TDA9874A_ESP, tda9874a_ESP);	} else { /* dic == 0x07 */		chip_write(chip, TDA9874A_AMCONR, 0xfb);		chip_write(chip, TDA9874A_SDACOSR, (tda9874a_mode) ? 0x81:0x80);		chip_write(chip, TDA9874A_AOSR, 0x00); // or 0x10	}	dprintk("tda9874a_setup(): %s [0x%02X].\n",		tda9874a_modelist[tda9874a_STD].name,tda9874a_STD);	return 1;}static int tda9874a_getmode(struct CHIPSTATE *chip){	int dsr,nsr,mode;	int necr; /* just for debugging */

⌨️ 快捷键说明

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