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

📄 tvaudio.c

📁 V4l driver for DVB HD
💻 C
📖 第 1 页 / 共 4 页
字号:
		default:			chip->mode = 0;			return;		}		chip_write(chip, TDA9874A_AOSR, aosr);		chip_write(chip, TDA9874A_MDACOSR, mdacosr);		v4l_dbg(1, debug, &chip->c, "tda9874a_setmode(): req. mode %d; AOSR=0x%X, MDACOSR=0x%X.\n",			mode, aosr, mdacosr);	} else { /* dic == 0x07 */		int fmmr,aosr;		switch(mode) {		case VIDEO_SOUND_MONO:			fmmr = 0x00; /* mono */			aosr = 0x10; /* A/A */			break;		case VIDEO_SOUND_STEREO:			if(tda9874a_mode) {				fmmr = 0x00;				aosr = 0x00; /* handled by NICAM auto-mute */			} else {				fmmr = (tda9874a_ESP == 1) ? 0x05 : 0x04; /* stereo */				aosr = 0x00;			}			break;		case VIDEO_SOUND_LANG1:			fmmr = 0x02; /* dual */			aosr = 0x10; /* dual A/A */			break;		case VIDEO_SOUND_LANG2:			fmmr = 0x02; /* dual */			aosr = 0x20; /* dual B/B */			break;		default:			chip->mode = 0;			return;		}		chip_write(chip, TDA9874A_FMMR, fmmr);		chip_write(chip, TDA9874A_AOSR, aosr);		v4l_dbg(1, debug, &chip->c, "tda9874a_setmode(): req. mode %d; FMMR=0x%X, AOSR=0x%X.\n",			mode, fmmr, aosr);	}}static 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;	v4l_dbg(1, debug, &chip->c, "tda9874a_checkit(): DIC=0x%X, SIC=0x%X.\n", dic, sic);	if((dic == 0x11)||(dic == 0x07)) {		v4l_info(&chip->c, "found tda9874%s.\n", (dic == 0x11) ? "a":"h");		tda9874a_dic = dic;	/* remember device id. */		return 1;	}	return 0;	/* not found */}static int tda9874a_initialize(struct CHIPSTATE *chip){	if (tda9874a_SIF > 2)		tda9874a_SIF = 1;	if (tda9874a_STD > 8)		tda9874a_STD = 0;	if(tda9874a_AMSEL > 1)		tda9874a_AMSEL = 0;	if(tda9874a_SIF == 1)		tda9874a_GCONR = 0xc0;	/* sound IF input 1 */	else		tda9874a_GCONR = 0xc1;	/* sound IF input 2 */	tda9874a_ESP = tda9874a_STD;	tda9874a_mode = (tda9874a_STD < 5) ? 0 : 1;	if(tda9874a_AMSEL == 0)		tda9874a_NCONR = 0x01; /* auto-mute: analog mono input */	else		tda9874a_NCONR = 0x05; /* auto-mute: 1st carrier FM or AM */	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 TEA6320_V          0x00  /* volume (0-5)/loudness off (6)/zero crossing mute(7) */#define TEA6320_FFR        0x01  /* fader front right (0-5) */#define TEA6320_FFL        0x02  /* fader front left (0-5) */#define TEA6320_FRR        0x03  /* fader rear right (0-5) */#define TEA6320_FRL        0x04  /* fader rear left (0-5) */#define TEA6320_BA         0x05  /* bass (0-4) */#define TEA6320_TR         0x06  /* treble (0-4) */#define TEA6320_S          0x07  /* switch register */				 /* values for those registers: */#define TEA6320_S_SA       0x07  /* stereo A input */#define TEA6320_S_SB       0x06  /* stereo B */#define TEA6320_S_SC       0x05  /* stereo C */#define TEA6320_S_SD       0x04  /* stereo D */#define TEA6320_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 */static int tea6300_shift10(int val) { return val >> 10; }static int tea6300_shift12(int val) { return val >> 12; }/* Assumes 16bit input (values 0x3f to 0x0c are unique, values less than *//* 0x0c mirror those immediately higher) */static int tea6320_volume(int val) { return (val / (65535/(63-12)) + 12) & 0x3f; }static int tea6320_shift11(int val) { return val >> 11; }static int tea6320_initialize(struct CHIPSTATE * chip){	chip_write(chip, TEA6320_FFR, 0x3f);	chip_write(chip, TEA6320_FFL, 0x3f);	chip_write(chip, TEA6320_FRR, 0x3f);	chip_write(chip, TEA6320_FRL, 0x3f);	return 0;}/* ---------------------------------------------------------------------- *//* audio chip descriptions - defines+functions for tda8425                */#define TDA8425_VL         0x00  /* volume left */#define TDA8425_VR         0x01  /* volume right */#define TDA8425_BA         0x02  /* bass */#define TDA8425_TR         0x03  /* treble */#define TDA8425_S1         0x08  /* switch functions */				 /* values for those registers: */#define TDA8425_S1_OFF     0xEE  /* audio off (mute on) */#define TDA8425_S1_CH1     0xCE  /* audio channel 1 (mute off) - "linear stereo" mode */#define TDA8425_S1_CH2     0xCF  /* audio channel 2 (mute off) - "linear stereo" mode */#define TDA8425_S1_MU      0x20  /* mute bit */#define TDA8425_S1_STEREO  0x18  /* stereo bits */#define TDA8425_S1_STEREO_SPATIAL 0x18 /* spatial stereo */#define TDA8425_S1_STEREO_LINEAR  0x08 /* linear stereo */#define TDA8425_S1_STEREO_PSEUDO  0x10 /* pseudo stereo */#define TDA8425_S1_STEREO_MONO    0x00 /* forced mono */#define TDA8425_S1_ML      0x06        /* language selector */#define TDA8425_S1_ML_SOUND_A 0x02     /* sound a */#define TDA8425_S1_ML_SOUND_B 0x04     /* sound b */#define TDA8425_S1_ML_STEREO  0x06     /* stereo */#define TDA8425_S1_IS      0x01        /* channel selector */static int tda8425_shift10(int val) { return (val >> 10) | 0xc0; }static int tda8425_shift12(int val) { return (val >> 12) | 0xf0; }static int tda8425_initialize(struct CHIPSTATE *chip){	struct CHIPDESC *desc = chiplist + chip->type;	int inputmap[4] = { /* tuner	*/ TDA8425_S1_CH2, /* radio  */ TDA8425_S1_CH1,			    /* extern	*/ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF};	if (chip->c.adapter->id == I2C_HW_B_RIVA) {		memcpy (desc->inputmap, inputmap, sizeof (inputmap));	}	return 0;}static void tda8425_setmode(struct CHIPSTATE *chip, int mode){	int s1 = chip->shadow.bytes[TDA8425_S1+1] & 0xe1;	if (mode & VIDEO_SOUND_LANG1) {		s1 |= TDA8425_S1_ML_SOUND_A;		s1 |= TDA8425_S1_STEREO_PSEUDO;	} else if (mode & VIDEO_SOUND_LANG2) {		s1 |= TDA8425_S1_ML_SOUND_B;		s1 |= TDA8425_S1_STEREO_PSEUDO;	} else {		s1 |= TDA8425_S1_ML_STEREO;		if (mode & VIDEO_SOUND_MONO)			s1 |= TDA8425_S1_STEREO_MONO;		if (mode & VIDEO_SOUND_STEREO)			s1 |= TDA8425_S1_STEREO_SPATIAL;	}	chip_write(chip,TDA8425_S1,s1);}/* ---------------------------------------------------------------------- *//* audio chip descriptions - defines+functions for pic16c54 (PV951)       *//* the registers of 16C54, I2C sub address. */#define PIC16C54_REG_KEY_CODE     0x01	       /* Not use. */#define PIC16C54_REG_MISC         0x02/* bit definition of the RESET register, I2C data. */#define PIC16C54_MISC_RESET_REMOTE_CTL 0x01 /* bit 0, Reset to receive the key */					    /*        code of remote controller */#define PIC16C54_MISC_MTS_MAIN         0x02 /* bit 1 */#define PIC16C54_MISC_MTS_SAP          0x04 /* bit 2 */#define PIC16C54_MISC_MTS_BOTH         0x08 /* bit 3 */#define PIC16C54_MISC_SND_MUTE         0x10 /* bit 4, Mute Audio(Line-in and Tuner) */#define PIC16C54_MISC_SND_NOTMUTE      0x20 /* bit 5 */#define PIC16C54_MISC_SWITCH_TUNER     0x40 /* bit 6	, Switch to Line-in */#define PIC16C54_MISC_SWITCH_LINE      0x80 /* bit 7	, Switch to Tuner *//* ---------------------------------------------------------------------- *//* audio chip descriptions - defines+functions for TA8874Z                *//* write 1st byte */#define TA8874Z_LED_STE	0x80#define TA8874Z_LED_BIL	0x40#define TA8874Z_LED_EXT	0x20#define TA8874Z_MONO_SET	0x10#define TA8874Z_MUTE	0x08#define TA8874Z_F_MONO	0x04#define TA8874Z_MODE_SUB	0x02#define TA8874Z_MODE_MAIN	0x01/* write 2nd byte *//*#define TA8874Z_TI	0x80  */ /* test mode */#define TA8874Z_SEPARATION	0x3f#define TA8874Z_SEPARATION_DEFAULT	0x10/* read */#define TA8874Z_B1	0x80#define TA8874Z_B0	0x40#define TA8874Z_CHAG_FLAG	0x20/* *        B1 B0 * mono    L  H * stereo  L  L * BIL     H  L */static int ta8874z_getmode(struct CHIPSTATE *chip){	int val, mode;	val = chip_read(chip);	mode = VIDEO_SOUND_MONO;	if (val & TA8874Z_B1){		mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;	}else if (!(val & TA8874Z_B0)){		mode |= VIDEO_SOUND_STEREO;	}	/* v4l_dbg(1, debug, &chip->c, "ta8874z_getmode(): raw chip read: 0x%02x, return: 0x%02x\n", val, mode); */	return mode;}static audiocmd ta8874z_stereo = { 2, {0, TA8874Z_SEPARATION_DEFAULT}};static audiocmd ta8874z_mono = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}};static audiocmd ta8874z_main = {2, { 0, TA8874Z_SEPARATION_DEFAULT}};static audiocmd ta8874z_sub = {2, { TA8874Z_MODE_SUB, TA8874Z_SEPARATION_DEFAULT}};static void ta8874z_setmode(struct CHIPSTATE *chip, int mode){	int update = 1;	audiocmd *t = NULL;	v4l_dbg(1, debug, &chip->c, "ta8874z_setmode(): mode: 0x%02x\n", mode);	switch(mode){	case VIDEO_SOUND_MONO:		t = &ta8874z_mono;		break;	case VIDEO_SOUND_STEREO:		t = &ta8874z_stereo;		break;	case VIDEO_SOUND_LANG1:		t = &ta8874z_main;		break;	case VIDEO_SOUND_LANG2:		t = &ta8874z_sub;		break;	default:		update = 0;	}	if(update)		chip_cmd(chip, "TA8874Z", t);}static int ta8874z_checkit(struct CHIPSTATE *chip){	int rc;	rc = chip_read(chip);	return ((rc & 0x1f) == 0x1f) ? 1 : 0;}/* ---------------------------------------------------------------------- *//* audio chip descriptions - struct CHIPDESC                              *//* insmod options to enable/disable individual audio chips */static int tda8425  = 1;static int tda9840  = 1;static int tda9850  = 1;static int tda9855  = 1;static int tda9873  = 1;static int tda9874a = 1;static int tea6300  = 0;  /* address clash with msp34xx */static int tea6320  = 0;  /* address clash with msp34xx */static int tea6420  = 1;static int pic16c54 = 1;static int ta8874z  = 0;  /* address clash with tda9840 */module_param(tda8425, int, 0444);module_param(tda9840, int, 0444);module_param(tda9850, int, 0444);module_param(tda9855, int, 0444);module_param(tda9873, int, 0444);module_param(tda9874a, int, 0444);module_param(tea6300, int, 0444);module_param(tea6320, int, 0444);module_param(tea6420, int, 0444);module_param(pic16c54, int, 0444);module_param(ta8874z, int, 0444);static struct CHIPDESC chiplist[] = {	{		.name       = "tda9840",		.id         = I2C_DRIVERID_TDA9840,		.insmodopt  = &tda9840,		.addr_lo    = I2C_ADDR_TDA9840 >> 1,		.addr_hi    = I2C_ADDR_TDA9840 >> 1,		.registers  = 5,		.checkit    = tda9840_checkit,		.getmode    = tda9840_getmode,		.setmode    = tda9840_setmode,		.checkmode  = generic_checkmode,		.init       = { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN				/* ,TDA9840_SW, TDA9840_MONO */} }	},	{		.name       = "tda9873h",		.id         = I2C_DRIVERID_TDA9873,		.checkit    = tda9873_checkit,		.insmodopt  = &tda9873,		.addr_lo    = I2C_ADDR_TDA985x_L >> 1,		.addr_hi    = I2C_ADDR_TDA985x_H >> 1,		.registers  = 3,		.flags      = CHIP_HAS_INPUTSEL,		.getmode    = tda9873_getmode,		.setmode    = tda9873_setmode,		.checkmode  = generic_checkmode,		.init       = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } },		.inputreg   = TDA9873_SW,		.inputmute  = TDA9873_MUTE | TDA9873_AUTOMUTE,		.inputmap   = {0xa0, 0xa2, 0xa0, 0xa0},		.inputmask  = TDA9873_INP_MASK|TDA9873_MUTE|TDA9873_AUTOMUTE,	},	{		.name       = "tda9874h/a",		.id         = I2C_DRIVERID_TDA9874,		.checkit    = tda9874a_checkit,		.initialize = tda9874a_initialize,		.insmodopt  = &tda9874a,		.addr_lo    = I2C_ADDR_TDA9874 >> 1,		.addr_hi    = I2C_ADDR_TDA9874 >> 1,		.getmode    = tda9874a_getmode,		.setmode    = tda9874a_setmode,		.checkmode  = generic_checkmode,	},	{		.name       = "tda9850",		.id         = I2C_DRIVERID_TDA9850,		.insmodopt  = &tda9850,		.addr_lo    = I2C_ADDR_TDA985x_L >> 1,		.addr_hi    = I2C_ADDR_TDA985x_H >> 1,		.registers  = 11,		.getmode    = tda985x_getmode,		.setmode    = tda985x_setmode,		.init       = { 8, { TDA9850_C4, 0x08, 0x08, TDA985x_STEREO, 0x07, 0x10, 0x10, 0x03 } }	},	{		.name       = "tda9855",		.id         = I2C_DRIVERID_TDA9855,		.insmodopt  = &tda9855,		.addr_lo    = I2C_ADDR_TDA985x_L >> 1,		.addr_hi    = I2C_ADDR_TDA985x_H >> 1,		.registers  = 11,		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE,		.leftreg    = TDA9855_VL,		.rightreg   = TDA9855_VR,		.bassreg    = TDA9855_BA,		.treblereg  = TDA9855_TR,		.volfunc    = tda9855_volume,		.bassfunc   = tda9855_bass,		.treblefunc = tda9855_treble,		.getmode    = tda985x_getmode,		.setmode    = tda985x_setmode,		.init       = { 12, { 0, 0x6f, 0x6f, 0x0e, 0x07<<1, 0x8<<2,				    TDA9855_MUTE | TDA9855_AVL | TDA9855_LOUD | TDA9855_INT,				    TDA985x_STEREO | TDA9855_LINEAR | TDA9855_TZCM | TDA9855_VZCM,				    0x07, 0x10, 0x10, 0x03 }}	},	{		.name       = "tea6300",		.id         = I2C_DRIVERID_TEA6300,		.insmodopt  = &tea6300,		.addr_lo    = I2C_ADDR_TEA6300 >> 1,		.addr_hi    = I2C_ADDR_TEA6300 >> 1,		.registers  = 6,		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,		.leftreg    = TEA6300_VR,		.rightreg   = TEA6300_VL,		.bassreg    = TEA6300_BA,		.treblereg  = TEA6300_TR,		.volfunc    = tea6300_shift10,		.bassfunc   = tea6300_shift12,		.treblefunc = tea6300_shift12,		.inputreg   = TEA6300_S,		.inputmap   = { TEA6300_S_SA, TEA6300_S_SB, TEA6300_S_SC },		.inputmute  = TEA6300_S_GMU,	},	{		.name       = "tea6320",		.id         = I2C_DRIVERID_TEA6300,		.initialize = tea6320_initialize,		.insmodopt  = &tea6320,		.addr_lo    = I2C_ADDR_TEA6300 >> 1,		.addr_hi    = I2C_ADDR_TEA6300 >> 1,		.registers  = 8,		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,		.leftreg    = TEA6320_V,		.rightreg   = TEA6320_V,		.bassreg    = TEA6320_BA,		.treblereg  = TEA6320_TR,		.volfunc    = tea6320_volume,		.bassfunc   = tea6320_shift11,		.treblefunc = tea6320_shift11,		.inputreg   = TEA6320_S,		.inputmap   = { TEA6320_S_SA, TEA6420_S_SB, TEA6300_S_SC, TEA6320_S_SD },		.inputmute  = TEA6300_S_GMU,

⌨️ 快捷键说明

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