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

📄 saa7115.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	R_C5_B_HORIZ_INPUT_WINDOW_START_MSB, 0x00,	/* hsize 0x02d0 = 720 */	R_C6_B_HORIZ_INPUT_WINDOW_LENGTH, 0xd0,	R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB, 0x02,	/* voffset 0x16 = 22 */	R_C8_B_VERT_INPUT_WINDOW_START, 0x16,	R_C9_B_VERT_INPUT_WINDOW_START_MSB, 0x00,	/* vsize 0x0120 = 288 */	R_CA_B_VERT_INPUT_WINDOW_LENGTH, 0x20,	R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB, 0x01,	/* hsize 0x02d0 = 720 */	R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH, 0xd0,	R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x02,	R_F0_LFCO_PER_LINE, 0xb0,		/* Set PLL Register. 50hz 625 lines per frame, 27 MHz */	R_F1_P_I_PARAM_SELECT, 0x05,		/* low bit with 0xF0, (was 0x05) */	R_F5_PULSGEN_LINE_LENGTH, 0xb0,	R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG, 0x01,	0x00, 0x00};/* ============== SAA7715 VIDEO templates (end) =======  */static const unsigned char saa7115_cfg_vbi_on[] = {	R_80_GLOBAL_CNTL_1, 0x00,			/* reset tasks */	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0,		/* reset scaler */	R_80_GLOBAL_CNTL_1, 0x30,			/* Activate both tasks */	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0,		/* activate scaler */	R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01,	/* Enable I-port output */	0x00, 0x00};static const unsigned char saa7115_cfg_vbi_off[] = {	R_80_GLOBAL_CNTL_1, 0x00,			/* reset tasks */	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0,		/* reset scaler */	R_80_GLOBAL_CNTL_1, 0x20,			/* Activate only task "B" */	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0,		/* activate scaler */	R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01,	/* Enable I-port output */	0x00, 0x00};static const unsigned char saa7115_init_misc[] = {	R_81_V_SYNC_FLD_ID_SRC_SEL_AND_RETIMED_V_F, 0x01,	R_83_X_PORT_I_O_ENA_AND_OUT_CLK, 0x01,	R_84_I_PORT_SIGNAL_DEF, 0x20,	R_85_I_PORT_SIGNAL_POLAR, 0x21,	R_86_I_PORT_FIFO_FLAG_CNTL_AND_ARBIT, 0xc5,	R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01,	/* Task A */	R_A0_A_HORIZ_PRESCALING, 0x01,	R_A1_A_ACCUMULATION_LENGTH, 0x00,	R_A2_A_PRESCALER_DC_GAIN_AND_FIR_PREFILTER, 0x00,	/* Configure controls at nominal value*/	R_A4_A_LUMA_BRIGHTNESS_CNTL, 0x80,	R_A5_A_LUMA_CONTRAST_CNTL, 0x40,	R_A6_A_CHROMA_SATURATION_CNTL, 0x40,	/* note: 2 x zoom ensures that VBI lines have same length as video lines. */	R_A8_A_HORIZ_LUMA_SCALING_INC, 0x00,	R_A9_A_HORIZ_LUMA_SCALING_INC_MSB, 0x02,	R_AA_A_HORIZ_LUMA_PHASE_OFF, 0x00,	/* must be horiz lum scaling / 2 */	R_AC_A_HORIZ_CHROMA_SCALING_INC, 0x00,	R_AD_A_HORIZ_CHROMA_SCALING_INC_MSB, 0x01,	/* must be offset luma / 2 */	R_AE_A_HORIZ_CHROMA_PHASE_OFF, 0x00,	R_B0_A_VERT_LUMA_SCALING_INC, 0x00,	R_B1_A_VERT_LUMA_SCALING_INC_MSB, 0x04,	R_B2_A_VERT_CHROMA_SCALING_INC, 0x00,	R_B3_A_VERT_CHROMA_SCALING_INC_MSB, 0x04,	R_B4_A_VERT_SCALING_MODE_CNTL, 0x01,	R_B8_A_VERT_CHROMA_PHASE_OFF_00, 0x00,	R_B9_A_VERT_CHROMA_PHASE_OFF_01, 0x00,	R_BA_A_VERT_CHROMA_PHASE_OFF_10, 0x00,	R_BB_A_VERT_CHROMA_PHASE_OFF_11, 0x00,	R_BC_A_VERT_LUMA_PHASE_OFF_00, 0x00,	R_BD_A_VERT_LUMA_PHASE_OFF_01, 0x00,	R_BE_A_VERT_LUMA_PHASE_OFF_10, 0x00,	R_BF_A_VERT_LUMA_PHASE_OFF_11, 0x00,	/* Task B */	R_D0_B_HORIZ_PRESCALING, 0x01,	R_D1_B_ACCUMULATION_LENGTH, 0x00,	R_D2_B_PRESCALER_DC_GAIN_AND_FIR_PREFILTER, 0x00,	/* Configure controls at nominal value*/	R_D4_B_LUMA_BRIGHTNESS_CNTL, 0x80,	R_D5_B_LUMA_CONTRAST_CNTL, 0x40,	R_D6_B_CHROMA_SATURATION_CNTL, 0x40,	/* hor lum scaling 0x0400 = 1 */	R_D8_B_HORIZ_LUMA_SCALING_INC, 0x00,	R_D9_B_HORIZ_LUMA_SCALING_INC_MSB, 0x04,	R_DA_B_HORIZ_LUMA_PHASE_OFF, 0x00,	/* must be hor lum scaling / 2 */	R_DC_B_HORIZ_CHROMA_SCALING, 0x00,	R_DD_B_HORIZ_CHROMA_SCALING_MSB, 0x02,	/* must be offset luma / 2 */	R_DE_B_HORIZ_PHASE_OFFSET_CRHOMA, 0x00,	R_E0_B_VERT_LUMA_SCALING_INC, 0x00,	R_E1_B_VERT_LUMA_SCALING_INC_MSB, 0x04,	R_E2_B_VERT_CHROMA_SCALING_INC, 0x00,	R_E3_B_VERT_CHROMA_SCALING_INC_MSB, 0x04,	R_E4_B_VERT_SCALING_MODE_CNTL, 0x01,	R_E8_B_VERT_CHROMA_PHASE_OFF_00, 0x00,	R_E9_B_VERT_CHROMA_PHASE_OFF_01, 0x00,	R_EA_B_VERT_CHROMA_PHASE_OFF_10, 0x00,	R_EB_B_VERT_CHROMA_PHASE_OFF_11, 0x00,	R_EC_B_VERT_LUMA_PHASE_OFF_00, 0x00,	R_ED_B_VERT_LUMA_PHASE_OFF_01, 0x00,	R_EE_B_VERT_LUMA_PHASE_OFF_10, 0x00,	R_EF_B_VERT_LUMA_PHASE_OFF_11, 0x00,	R_F2_NOMINAL_PLL2_DTO, 0x50,		/* crystal clock = 24.576 MHz, target = 27MHz */	R_F3_PLL_INCREMENT, 0x46,	R_F4_PLL2_STATUS, 0x00,	R_F7_PULSE_A_POS_MSB, 0x4b,		/* not the recommended settings! */	R_F8_PULSE_B_POS, 0x00,	R_F9_PULSE_B_POS_MSB, 0x4b,	R_FA_PULSE_C_POS, 0x00,	R_FB_PULSE_C_POS_MSB, 0x4b,	/* PLL2 lock detection settings: 71 lines 50% phase error */	R_FF_S_PLL_MAX_PHASE_ERR_THRESH_NUM_LINES, 0x88,	/* Turn off VBI */	R_40_SLICER_CNTL_1, 0x20,             /* No framing code errors allowed. */	R_41_LCR_BASE, 0xff,	R_41_LCR_BASE+1, 0xff,	R_41_LCR_BASE+2, 0xff,	R_41_LCR_BASE+3, 0xff,	R_41_LCR_BASE+4, 0xff,	R_41_LCR_BASE+5, 0xff,	R_41_LCR_BASE+6, 0xff,	R_41_LCR_BASE+7, 0xff,	R_41_LCR_BASE+8, 0xff,	R_41_LCR_BASE+9, 0xff,	R_41_LCR_BASE+10, 0xff,	R_41_LCR_BASE+11, 0xff,	R_41_LCR_BASE+12, 0xff,	R_41_LCR_BASE+13, 0xff,	R_41_LCR_BASE+14, 0xff,	R_41_LCR_BASE+15, 0xff,	R_41_LCR_BASE+16, 0xff,	R_41_LCR_BASE+17, 0xff,	R_41_LCR_BASE+18, 0xff,	R_41_LCR_BASE+19, 0xff,	R_41_LCR_BASE+20, 0xff,	R_41_LCR_BASE+21, 0xff,	R_41_LCR_BASE+22, 0xff,	R_58_PROGRAM_FRAMING_CODE, 0x40,	R_59_H_OFF_FOR_SLICER, 0x47,	R_5B_FLD_OFF_AND_MSB_FOR_H_AND_V_OFF, 0x83,	R_5D_DID, 0xbd,	R_5E_SDID, 0x35,	R_02_INPUT_CNTL_1, 0x84,		/* input tuner -> input 4, amplifier active */	R_80_GLOBAL_CNTL_1, 0x20,		/* enable task B */	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0,	R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0,	0x00, 0x00};static int saa711x_odd_parity(u8 c){	c ^= (c >> 4);	c ^= (c >> 2);	c ^= (c >> 1);	return c & 1;}static int saa711x_decode_vps(u8 * dst, u8 * p){	static const u8 biphase_tbl[] = {		0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,		0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,		0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,		0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,		0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,		0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,		0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,		0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,		0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,		0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,		0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,		0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,		0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,		0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,		0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,		0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,		0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,		0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,		0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,		0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,		0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,		0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,		0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,		0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,		0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,		0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,		0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,		0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,		0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,		0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,		0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,		0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,	};	int i;	u8 c, err = 0;	for (i = 0; i < 2 * 13; i += 2) {		err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];		c = (biphase_tbl[p[i + 1]] & 0xf) | ((biphase_tbl[p[i]] & 0xf) << 4);		dst[i / 2] = c;	}	return err & 0xf0;}static int saa711x_decode_wss(u8 * p){	static const int wss_bits[8] = {		0, 0, 0, 1, 0, 1, 1, 1	};	unsigned char parity;	int wss = 0;	int i;	for (i = 0; i < 16; i++) {		int b1 = wss_bits[p[i] & 7];		int b2 = wss_bits[(p[i] >> 3) & 7];		if (b1 == b2)			return -1;		wss |= b2 << i;	}	parity = wss & 15;	parity ^= parity >> 2;	parity ^= parity >> 1;	if (!(parity & 1))		return -1;	return wss;}static int saa711x_set_audio_clock_freq(struct i2c_client *client, u32 freq){	struct saa711x_state *state = i2c_get_clientdata(client);	u32 acpf;	u32 acni;	u32 hz;	u64 f;	u8 acc = 0; 	/* reg 0x3a, audio clock control */	/* Checks for chips that don't have audio clock (saa7111, saa7113) */	if (!saa711x_has_reg(state->ident,R_30_AUD_MAST_CLK_CYCLES_PER_FIELD))		return 0;	v4l_dbg(1, debug, client, "set audio clock freq: %d\n", freq);	/* sanity check */	if (freq < 32000 || freq > 48000)		return -EINVAL;	/* hz is the refresh rate times 100 */	hz = (state->std & V4L2_STD_525_60) ? 5994 : 5000;	/* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */	acpf = (25600 * freq) / hz;	/* acni = (256 * freq * 2^23) / crystal_frequency =		  (freq * 2^(8+23)) / crystal_frequency =		  (freq << 31) / crystal_frequency */	f = freq;	f = f << 31;	do_div(f, state->crystal_freq);	acni = f;	if (state->ucgc) {		acpf = acpf * state->cgcdiv / 16;		acni = acni * state->cgcdiv / 16;		acc = 0x80;		if (state->cgcdiv == 3)			acc |= 0x40;	}	if (state->apll)		acc |= 0x08;	saa711x_write(client, R_38_CLK_RATIO_AMXCLK_TO_ASCLK, 0x03);	saa711x_write(client, R_39_CLK_RATIO_ASCLK_TO_ALRCLK, 0x10);	saa711x_write(client, R_3A_AUD_CLK_GEN_BASIC_SETUP, acc);	saa711x_write(client, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD, acpf & 0xff);	saa711x_write(client, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+1,							(acpf >> 8) & 0xff);	saa711x_write(client, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+2,							(acpf >> 16) & 0x03);	saa711x_write(client, R_34_AUD_MAST_CLK_NOMINAL_INC, acni & 0xff);	saa711x_write(client, R_34_AUD_MAST_CLK_NOMINAL_INC+1, (acni >> 8) & 0xff);	saa711x_write(client, R_34_AUD_MAST_CLK_NOMINAL_INC+2, (acni >> 16) & 0x3f);	state->audclk_freq = freq;	return 0;}static int saa711x_set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl){	struct saa711x_state *state = i2c_get_clientdata(client);	switch (ctrl->id) {	case V4L2_CID_BRIGHTNESS:		if (ctrl->value < 0 || ctrl->value > 255) {			v4l_err(client, "invalid brightness setting %d\n", ctrl->value);			return -ERANGE;		}		state->bright = ctrl->value;		saa711x_write(client, R_0A_LUMA_BRIGHT_CNTL, state->bright);		break;	case V4L2_CID_CONTRAST:		if (ctrl->value < 0 || ctrl->value > 127) {			v4l_err(client, "invalid contrast setting %d\n", ctrl->value);			return -ERANGE;		}		state->contrast = ctrl->value;		saa711x_write(client, R_0B_LUMA_CONTRAST_CNTL, state->contrast);		break;	case V4L2_CID_SATURATION:		if (ctrl->value < 0 || ctrl->value > 127) {			v4l_err(client, "invalid saturation setting %d\n", ctrl->value);			return -ERANGE;		}		state->sat = ctrl->value;		saa711x_write(client, R_0C_CHROMA_SAT_CNTL, state->sat);		break;	case V4L2_CID_HUE:		if (ctrl->value < -127 || ctrl->value > 127) {			v4l_err(client, "invalid hue setting %d\n", ctrl->value);			return -ERANGE;		}		state->hue = ctrl->value;		saa711x_write(client, R_0D_CHROMA_HUE_CNTL, state->hue);		break;	default:		return -EINVAL;	}	return 0;}static int saa711x_get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl){	struct saa711x_state *state = i2c_get_clientdata(client);	switch (ctrl->id) {	case V4L2_CID_BRIGHTNESS:		ctrl->value = state->bright;		break;	case V4L2_CID_CONTRAST:		ctrl->value = state->contrast;		break;	case V4L2_CID_SATURATION:		ctrl->value = state->sat;		break;	case V4L2_CID_HUE:		ctrl->value = state->hue;		break;	default:		return -EINVAL;	}	return 0;}

⌨️ 快捷键说明

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