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

📄 tvaudio.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 3 页
字号:
                              * 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 */int tda9855_volume(int val) { return val/0x2e8+0x27; }int tda9855_bass(int val)   { return val/0xccc+0x06; }int tda9855_treble(int val) { return (val/0x1c71+0x3)<<1; }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;}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       */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;}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);}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 tda9874a                *//* Dariusz Kowalewski <darekk@automex.pl>                                 *//* Subaddresses for 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 */#define TDA9874A_ESP		0xFF	/* easy standard progr. *//* Subaddresses for 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_ESP = 0x07;		/* default standard: NICAM D/K *//* insmod options for tda9874a */static int tda9874a_SIF = -1;static int tda9874a_STD = -1;MODULE_PARM(tda9874a_SIF,"i");MODULE_PARM(tda9874a_STD,"i");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);	chip_write(chip, TDA9874A_FMMR, 0x80);	chip_write(chip, TDA9874A_C1OLAR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_C2OLAR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_NCONR, 0x00); /* not 0x04 as doc. table 10 says! */	chip_write(chip, TDA9874A_NOLAR, 0x00); /* 0 dB */	chip_write(chip, TDA9874A_AMCONR, 0xf9);	chip_write(chip, TDA9874A_SDACOSR, (tda9874a_mode) ? 0x81:0x80); /* 0x81 */	chip_write(chip, TDA9874A_AOSR, 0x80);	chip_write(chip, TDA9874A_MDACOSR, (tda9874a_mode) ? 0x82:0x80);	chip_write(chip, TDA9874A_ESP, tda9874a_ESP);	return 1;}int tda9874a_getmode(struct CHIPSTATE *chip){	int dsr,nsr,mode;	mode = VIDEO_SOUND_MONO;	if(-1 == (dsr = chip_read2(chip,TDA9874A_DSR)))		return mode;	if(-1 == (nsr = chip_read2(chip,TDA9874A_NSR)))		return mode;	if(tda9874a_mode) {		/* check also DSR.RSSF and DSR.AMSTAT bits? */		if(nsr & 0x02) /* NSR.S/MB */			mode |= VIDEO_SOUND_STEREO;		if(nsr & 0x01) /* NSR.D/SB */ 			mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;	} else {		if(dsr & 0x02) /* DSR.IDSTE */			mode |= VIDEO_SOUND_STEREO;		if(dsr & 0x04) /* DSR.IDDUA */			mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;	}	dprintk("tda9874a_getmode(): DSR=0x%X, NSR=0x%X, return: %d.\n",		 dsr, nsr, mode);	return mode;}void tda9874a_setmode(struct CHIPSTATE *chip, int mode){	int aosr=0x80,mdacosr=0x82;	/* note: TDA9874A has auto-select function for audio output */	switch(mode) {	case VIDEO_SOUND_MONO:	case VIDEO_SOUND_STEREO:		break;	case VIDEO_SOUND_LANG1:		aosr = 0x80; /* dual A/A */		mdacosr = (tda9874a_mode) ? 0x82:0x80;		break;	case VIDEO_SOUND_LANG2:		aosr = 0xa0; /* dual B/B */		mdacosr = (tda9874a_mode) ? 0x83:0x81;		break;	default:		chip->mode = 0;		return;	}	chip_write(chip, TDA9874A_AOSR, aosr);	chip_write(chip, TDA9874A_MDACOSR, mdacosr);	dprintk("tda9874a_setmode(): req. mode %d; AOSR=0x%X, MDACOSR=0x%X.\n",		mode, aosr, mdacosr);}int tda9874a_checkit(struct CHIPSTATE *chip){	int dic,sic;	/* device id. and software id. codes */	if(-1 == (dic = chip_read2(chip,TDA9874A_DIC)))		return 0;	if(-1 == (sic = chip_read2(chip,TDA9874A_SIC)))		return 0;	dprintk("tda9874a_checkit(): DIC=0x%X, SIC=0x%X.\n", dic, sic);	return((dic & 0xff) == 0x11);}int tda9874a_initialize(struct CHIPSTATE *chip){	if(tda9874a_SIF != -1) {		if(tda9874a_SIF == 1)			tda9874a_GCONR = 0xc0;	/* sound IF input 1 */		else if(tda9874a_SIF == 2)			tda9874a_GCONR = 0xc1;	/* sound IF input 2 */		else			printk(KERN_WARNING "tda9874a: SIF parameter must be 1 or 2.\n");	}	if(tda9874a_STD != -1) {		if((tda9874a_STD >= 0)&&(tda9874a_STD <= 8)) {			tda9874a_ESP = tda9874a_STD;			tda9874a_mode = (tda9874a_STD < 5) ? 0 : 1;		} else {			printk(KERN_WARNING "tda9874a: STD parameter must be between 0 and 8.\n");		}	}	tda9874a_setup(chip);	return 0;}/* ---------------------------------------------------------------------- *//* audio chip descriptions - defines+functions for tea6420                */#define TEA6300_VL         0x00  /* volume left */#define TEA6300_VR         0x01  /* volume right */#define TEA6300_BA         0x02  /* bass */#define TEA6300_TR         0x03  /* treble */#define TEA6300_FA         0x04  /* fader control */#define TEA6300_S          0x05  /* switch register */                                 /* values for those registers: */#define TEA6300_S_SA       0x01  /* stereo A input */#define TEA6300_S_SB       0x02  /* stereo B */#define TEA6300_S_SC       0x04  /* stereo C */#define TEA6300_S_GMU      0x80  /* general mute */#define TEA6420_S_SA       0x00  /* stereo A input */#define TEA6420_S_SB       0x01  /* stereo B */#define TEA6420_S_SC       0x02  /* stereo C */#define TEA6420_S_SD       0x03  /* stereo D */#define TEA6420_S_SE       0x04  /* stereo E */#define TEA6420_S_GMU      0x05  /* general mute */int tea6300_shift10(int val) { return val >> 10; }int tea6300_shift12(int val) { return val >> 12; }

⌨️ 快捷键说明

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