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