📄 tvaudio.c
字号:
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 + -