Audio standards on tm6000
Subsystems (3)
RFC PATCH 1/1 Audio standards on tm6000
Hi Dmitri,
IMO, the better is to remove the audio init from tm6000-core and add a separate per-standard set of tables.
I'm enclosing the patch for it. Please check if this won't break for your device.
On all tests I did here with a tm6010 device (HVR 900H), I was only able to listen to white noise.
I'm suspecting that this device uses XC3028 MTS mode (e. g. uses xc3028 to decode audio, and just inputs the audio stream from some line IN. As the driver is not able yet to handle an audio mux, this may explain why I'm not able to receive any audio at all.
Maybe tm5600 devices may also require (or use) line input entries, instead of I2S.
Could you please check those issues?
PS.: the PAL/M hunk will probably fail, as I likely applied some patches before this one, in order to try to fix it. It should be trivial to solve the conflicts.
---
tm6000: Implement audio standard tables
Implement separate tables for audio standards, associating them with the video standards.
drivers/staging/tm6000/tm6000-core.c +5 -39
@@ -200,6 +200,10 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) val &= ~0x40 ;tm6000_set_reg (dev,TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE , val); +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); + +#if 0 /* FIXME: VBI is standard-dependent */ +/* Init teletext */ tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 );tm6000_set_reg (dev,TM6010_REQ07_R41_TELETEXT_VBI_CODE1 ,0x27 );
@@ -249,44 +253,7 @@ int tm6000_init_analog_mode(struct tm6000_core *dev)tm6000_set_reg (dev,TM6010_REQ07_R5B_VBI_TELETEXT_DTO0 ,0x4c );tm6000_set_reg (dev,TM6010_REQ07_R40_TELETEXT_VBI_CODE0 ,0x01 );tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x00 ); - - -/* Init audio */ -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0xa0 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R07_A_LEFT_VOL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R08_A_RIGHT_VOL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0B_A_ASD_THRES1 ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x12 ); -tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); -tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R12_A_AGC_U ,0x12 ); -tm6000_set_reg (dev,TM6010_REQ08_R13_A_AGC_ERR_T ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R14_A_AGC_GAIN_INIT ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R15_A_AGC_STEP_THR ,0x14 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R18_A_TR_CTRL ,0xa0 ); -tm6000_set_reg (dev,TM6010_REQ08_R19_A_FH_2FH_GAIN ,0x32 ); -tm6000_set_reg (dev,TM6010_REQ08_R1A_A_NICAM_SER_MAX ,0x64 ); -tm6000_set_reg (dev,TM6010_REQ08_R1B_A_NICAM_SER_MIN ,0x20 ); -tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1c ,0x00 ); -tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1d ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); -tm6000_set_reg (dev,TM6010_REQ08_R1F_A_TEST_INTF_SEL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R20_A_TEST_PIN_SEL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); - +#endif }else {/* Enables soft reset */ tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 );
@@ -360,7 +327,6 @@ int tm6000_init_digital_mode(struct tm6000_core *dev)tm6000_set_reg (dev,TM6010_REQ07_RFE_POWER_DOWN ,0x28 );tm6000_set_reg (dev,TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xfc );tm6000_set_reg (dev,TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0xff ); -tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe );tm6000_read_write_usb (dev,0xc0 ,0x0e ,0x00c2 ,0x0008 , buf,2 );printk (KERN_INFO "buf %#x %#x\n" , buf[0 ], buf[1 ]); }else {
drivers/staging/tm6000/tm6000-stds.c +167 -1
301 lines not on this page · raw message
drivers/staging/tm6000/tm6000-video.c +7 -5
@@ -1015,7 +1015,8 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm)struct tm6000_fh *fh=priv;struct tm6000_core *dev = fh->dev; - rc=tm6000_set_standard (dev, norm); + rc =tm6000_set_standard (dev, norm); + rc =tm6000_init_analog_mode (dev); fh->width = dev->width; fh->height = dev->height;
@@ -1292,9 +1293,10 @@ static int tm6000_open(struct file *file) "active=%d\n",list_empty(&dev->vidq.active));/* initialize hardware on analog mode */ -if (dev->mode!=TM6000_MODE_ANALOG ) { - rc=tm6000_init_analog_mode (dev); -if (rc<0 ) +// if (dev->mode!=TM6000_MODE_ANALOG) { +// rc = tm6000_set_standard(dev, dev->norm); + rc +=tm6000_init_analog_mode (dev); +if (rc <0 )return rc;/* Put all controls at a sane state */
@@ -1302,7 +1304,7 @@ static int tm6000_open(struct file *file) qctl_regs[i] =tm6000_qctrl[i].default_value; dev->mode=TM6000_MODE_ANALOG ; - } +// } videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops, NULL, &dev->slock,
Hi Mauro
Not so good. Audio with this patch has bad white noise sometimes and bad quality. I try found better configuration for SECAM-DK.
With my best regards, Dmitry.
Quoted 582 lines
Hi Dmitri,
IMO, the better is to remove the audio init from tm6000-core and add a separate per-standard set of tables.
I'm enclosing the patch for it. Please check if this won't break for your device.
On all tests I did here with a tm6010 device (HVR 900H), I was only able to listen to white noise.
I'm suspecting that this device uses XC3028 MTS mode (e. g. uses xc3028 to decode audio, and just inputs the audio stream from some line IN. As the driver is not able yet to handle an audio mux, this may explain why I'm not able to receive any audio at all.
Maybe tm5600 devices may also require (or use) line input entries, instead of I2S.
Could you please check those issues?
PS.: the PAL/M hunk will probably fail, as I likely applied some patches before this one, in order to try to fix it. It should be trivial to solve the conflicts.
---
tm6000: Implement audio standard tables
Implement separate tables for audio standards, associating them with the video standards.
Signed-off-by Mauro Carvalho Chehab <[email protected]>(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-core.cindex 57cb69e..9cb2901 100644drivers/staging/tm6000/tm6000-core.c +1
-0@@ -200,6 +200,10 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) val &= ~0x40;tm6000_set_reg (dev,TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE , val); + tm6000_set_reg(dev,
TM6010_REQ08_RF1_AADC_POWER_DOWN,0xfc); +drivers/staging/tm6000/tm6000-core.c +2
-0+#if 0 /* FIXME: VBI is standard-dependent */ +/* Init teletext */ tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 ); tm6000_set_reg(dev,
TM6010_REQ07_R41_TELETEXT_VBI_CODE1,0x27); @@ -249,44 +253,7 @@ inttm6000_init_analog_mode(struct tm6000_core *dev)tm6000_set_reg(dev, TM6010_REQ07_R5B_VBI_TELETEXT_DTO0, 0x4c);tm6000_set_reg(dev, TM6010_REQ07_R40_TELETEXT_VBI_CODE0, 0x01);tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x00); -drivers/staging/tm6000/tm6000-core.c +0
-4- -/* Init audio */ -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); - tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R04_A_SIF_AMP_CTRL,
0xa0);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R07_A_LEFT_VOL,
0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R08_A_RIGHT_VOL,
0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0B_A_ASD_THRES1,
0x20);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0C_A_ASD_THRES2,
0x12);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0D_A_AMD_THRES,
0x20);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0E_A_MONO_THRES1,
0xf0);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R0F_A_MONO_THRES2,
0x80);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R10_A_MUTE_THRES1,
0xc0);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R11_A_MUTE_THRES2,
0x80);drivers/staging/tm6000/tm6000-core.c +0
-2-tm6000_set_reg (dev,TM6010_REQ08_R12_A_AGC_U ,0x12 ); - tm6000_set_reg(dev, TM6010_REQ08_R13_A_AGC_ERR_T,
0xfe);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R14_A_AGC_GAIN_INIT,0x20);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R15_A_AGC_STEP_THR,
0x14);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R18_A_TR_CTRL,
0xa0);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R19_A_FH_2FH_GAIN,
0x32);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R1A_A_NICAM_SER_MAX,0x64);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R1B_A_NICAM_SER_MIN,0x20);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, REQ_08_SET_GET_AVREG_BIT, 0x1c,
0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, REQ_08_SET_GET_AVREG_BIT, 0x1d,
0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT,0x13);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev,
TM6010_REQ08_R1F_A_TEST_INTF_SEL,0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R20_A_TEST_PIN_SEL,
0x00);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL,
0xf3);drivers/staging/tm6000/tm6000-core.c +0
-1- tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x00);drivers/staging/tm6000/tm6000-core.c +1
-3-tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); - +#endif }else {/* Enables soft reset */ tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 );@@ -360,7 +327,6 @@ int tm6000_init_digital_mode(struct tm6000_core *dev) tm6000_set_reg(dev, TM6010_REQ07_RFE_POWER_DOWN, 0x28);tm6000_set_reg (dev,TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xfc );tm6000_set_reg (dev,TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0xff ); -tm6000_set_reg (dev, TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe); tm6000_read_write_usb(dev, 0xc0, 0x0e, 0x00c2, 0x0008, buf, 2); printk(KERN_INFO"buf %#x %#x\n",buf[0], buf[1]); } else {
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-stds.cindex 33adf6c..e79a72e 100644drivers/staging/tm6000/tm6000-stds.c +27
-1@@ -28,8 +28,22 @@ struct tm6000_reg_settings {unsigned char value; }; +enum tm6000_audio_std { +BG_NICAM , +BTSC , +BG_A2 , +DK_NICAM , +EIAJ , +FM_RADIO , +I_NICAM , +KOREA_A2 , +L_NICAM , +}; +struct tm6000_std_tv_settings {v4l2_std_id id; +enum tm6000_audio_std audio_default_std; +struct tm6000_reg_settings sif[12 ];struct tm6000_reg_settings nosif[12 ];struct tm6000_reg_settings common[26 ];@@ -37,12 +51,14 @@ struct tm6000_std_tv_settings {struct tm6000_std_settings {v4l2_std_id id; +enum tm6000_audio_std audio_default_std;struct tm6000_reg_settings common[37 ]; };static struct tm6000_std_tv_settings tv_stds[] = { { .id =V4L2_STD_PAL_M , + .audio_default_std =BTSC , .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 },@@ -96,12 +112,14 @@ static struct tm6000_std_tv_settings tv_stds[] = { {TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc}, {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, - {TM6010_REQ08_R05_A_STANDARD_MOD, 0x22}, + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, }, }, { .id = V4L2_STD_PAL_Nc, + .audio_default_std = BTSC, .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},@@ -161,6 +179,7 @@ static struct tm6000_std_tv_settings tv_stds[] = { }, }, { .id = V4L2_STD_PAL, + .audio_default_std = BG_A2, .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},@@ -220,6 +239,7 @@ static struct tm6000_std_tv_settings tv_stds[] = { }, }, { .id = V4L2_STD_SECAM, + .audio_default_std = BG_NICAM, .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},@@ -278,6 +298,7 @@ static struct tm6000_std_tv_settings tv_stds[] = { }, }, { .id = V4L2_STD_NTSC, + .audio_default_std = BTSC, .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},@@ -341,6 +362,7 @@ static struct tm6000_std_tv_settings tv_stds[] = {static struct tm6000_std_settings composite_stds[] = { { .id =V4L2_STD_PAL_M , + .audio_default_std =BTSC , .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 },@@ -383,6 +405,7 @@ static struct tm6000_std_settings composite_stds[] = { }, }, { .id = V4L2_STD_PAL_Nc, + .audio_default_std = BTSC, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},@@ -425,6 +448,7 @@ static struct tm6000_std_settings composite_stds[] = { }, }, { .id = V4L2_STD_PAL, + .audio_default_std = BG_A2, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},@@ -467,6 +491,7 @@ static struct tm6000_std_settings composite_stds[] = { }, }, { .id = V4L2_STD_SECAM, + .audio_default_std = BG_NICAM, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},@@ -508,6 +533,7 @@ static struct tm6000_std_settings composite_stds[] = { }, }, { .id = V4L2_STD_NTSC, + .audio_default_std = BTSC, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},@@ -554,6 +580,7 @@ static struct tm6000_std_settingscomposite_stds[] = { static struct
tm6000_std_settingssvideo_stds[] = { {drivers/staging/tm6000/tm6000-stds.c +16
-0.id = V4L2_STD_PAL_M, + .audio_default_std = BTSC, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},@@ -596,6 +623,7 @@ static struct tm6000_std_settings svideo_stds[] = { }, }, { .id = V4L2_STD_PAL_Nc, + .audio_default_std = BTSC, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},@@ -638,6 +666,7 @@ static struct tm6000_std_settings svideo_stds[] = { }, }, { .id = V4L2_STD_PAL, + .audio_default_std = BG_A2, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},@@ -680,6 +709,7 @@ static struct tm6000_std_settings svideo_stds[] = { }, }, { .id = V4L2_STD_SECAM, + .audio_default_std = BG_NICAM, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},@@ -721,6 +751,7 @@ static struct tm6000_std_settings svideo_stds[] = { }, }, { .id = V4L2_STD_NTSC, + .audio_default_std = BTSC, .common = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},@@ -765,6 +796,136 @@ static struct tm6000_std_settings svideo_stds[] = { }, }; + +static int tm6000_set_audio_std (struct tm6000_core *dev, +enum tm6000_audio_std std) +{ +switch (std) { +case BG_NICAM : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x11 ); +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x01 ); + tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case BTSC : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x02);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0E_A_MONO_THRES1,
0xf0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0F_A_MONO_THRES2,
0x80);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R10_A_MUTE_THRES1,
0xc0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R11_A_MUTE_THRES2,
0x80);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case BG_A2 : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x05);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0E_A_MONO_THRES1,
0xf0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0F_A_MONO_THRES2,
0x80);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R10_A_MUTE_THRES1,
0xc0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R11_A_MUTE_THRES2,
0x80);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case DK_NICAM : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0C_A_ASD_THRES2,
0x0a);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case EIAJ : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x03);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case FM_RADIO : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x01);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x0c);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x10);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case I_NICAM : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x01);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0C_A_ASD_THRES2,
0x0a);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case KOREA_A2 : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x04);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0E_A_MONO_THRES1,
0xf0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0F_A_MONO_THRES2,
0x80);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R10_A_MUTE_THRES1,
0xc0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R11_A_MUTE_THRES2,
0xf0);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +5
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; +case L_NICAM : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); + tm6000_set_reg(dev,
TM6010_REQ08_R02_A_FIX_GAIN_CTRL,0x02);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev,
TM6010_REQ08_R03_A_AUTO_GAIN_CTRL,0x00);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD,
0x0a);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD,
0x06);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL,
0x08);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD,
0x91);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX,
0xfe);drivers/staging/tm6000/tm6000-stds.c +1
-0+ tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN,
0x01);drivers/staging/tm6000/tm6000-stds.c +9
-0+tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +break ; + } +return 0 ; +} +void tm6000_get_std_res (struct tm6000_core *dev) {/* Currently, those are the only supported resoltions */ @@ -825,6 +986,8 @@ static int tm6000_set_tv(struct tm6000_core *dev, int pos) rc = tm6000_load_std(dev, tv_stds[pos].common,sizeof (tv_stds[pos].common)); +tm6000_set_audio_std (dev, tv_stds[pos].audio_default_std); +return rc; }@@ -850,6 +1013,8 @@ int tm6000_set_standard(struct tm6000_core *dev, v4l2_std_id * norm) rc = tm6000_load_std(dev, svideo_stds[i].common,sizeof (svideo_stds[i]. common)); + tm6000_set_audio_std(dev,svideo_stds[i].audio_default_std); +
drivers/staging/tm6000/tm6000-stds.c +1
-0goto ret; } }@@ -861,6 +1026,7 @@ int tm6000_set_standard(struct tm6000_core *dev, v4l2_std_id * norm) composite_stds[i].common, sizeof(composite_stds[i]. common)); +tm6000_set_audio_std (dev, composite_stds[i].audio_default_std); goto ret; } }(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-video.cindex a45b012..9304158 100644drivers/staging/tm6000/tm6000-video.c +7
-5@@ -1015,7 +1015,8 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm) struct tm6000_fh *fh=priv;struct tm6000_core *dev = fh->dev; - rc=tm6000_set_standard (dev, norm); + rc =tm6000_set_standard (dev, norm); + rc =tm6000_init_analog_mode (dev); fh->width = dev->width; fh->height = dev->height;@@ -1292,9 +1293,10 @@ static int tm6000_open(struct file *file) "active=%d\n",list_empty(&dev->vidq.active));/* initialize hardware on analog mode */ -if (dev->mode!=TM6000_MODE_ANALOG ) { - rc=tm6000_init_analog_mode (dev); -if (rc<0 ) +// if (dev->mode!=TM6000_MODE_ANALOG) { +// rc = tm6000_set_standard(dev, dev->norm); + rc +=tm6000_init_analog_mode (dev); +if (rc <0 )return rc;/* Put all controls at a sane state */ @@ -1302,7 +1304,7 @@ static int tm6000_open(struct file *file) qctl_regs[i] =tm6000_qctrl[i].default_value; dev->mode=TM6000_MODE_ANALOG ; - } +// } videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops, NULL, &dev->slock,
Em 08-10-2010 16:03, Dmitri Belimov escreveu:
Quoted 4 lines
Hi Mauro
Not so good. Audio with this patch has bad white noise sometimes and bad quality. I try found better configuration for SECAM-DK.
Ok. Well, feel free to modify it. I think that this approach may be better, especially if we need to add later some sort of code to detect and change audio standard for some standards that have more than one audio standard associated (we needed do to it on other drivers, in order to work in Russia and other Countries that use different variants of the audio standard).
The association between video and audio standard is not complete. For example, it misses NTSC-Kr and NTSC-Jp.
Cheers,
Mauro.
Hi
Quoted 13 lines
Em 08-10-2010 16:03, Dmitri Belimov escreveu:
Quoted 4 lines
Hi Mauro
Not so good. Audio with this patch has bad white noise sometimes and bad quality. I try found better configuration for SECAM-DK.
Ok. Well, feel free to modify it. I think that this approach may be better, especially if we need to add later some sort of code to detect and change audio standard for some standards that have more than one audio standard associated (we needed do to it on other drivers, in order to work in Russia and other Countries that use different variants of the audio standard).
Quoted 2 lines
The association between video and audio standard is not complete. For example, it misses NTSC-Kr and NTSC-Jp.
Rework audio. Add SECAM-DK, move SECAM to SECAM-B | SECAM-G.
Add some new audio standards and tricks for future, see tm6000_set_audio_std For SECAM-DK it works. Try on your standards.
Two files in attach. Patch after latest patch from Mauro and full file tm6000-std.c
Quoted 3 lines
Cheers,
Mauro.
With my best regards, Dmitry.
/*
tm6000-stds.c - driver for TM5600/TM6000/TM6010 USB video capture devices
Copyright (C) 2007 Mauro Carvalho Chehab <[email protected]>
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include "tm6000.h"
#include "tm6000-regs.h"
struct tm6000_reg_settings {
unsigned char req;
unsigned char reg;
unsigned char value;
};enum tm6000_audio_std {
BG_NICAM,
BTSC,
BG_A2,
DK_NICAM,
EIAJ,
FM_RADIO,
I_NICAM,
KOREA_A2,
L_NICAM,
};struct tm6000_std_tv_settings {
v4l2_std_id id;
enum tm6000_audio_std audio_default_std;
struct tm6000_reg_settings sif[12];
struct tm6000_reg_settings nosif[12];
struct tm6000_reg_settings common[26];
};struct tm6000_std_settings {
v4l2_std_id id;
enum tm6000_audio_std audio_default_std;
struct tm6000_reg_settings common[37];
};static struct tm6000_std_tv_settings tv_stds[] = {
{
.id = V4L2_STD_PAL_M,
.audio_default_std = BTSC,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0},
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x04},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x00},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x83},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x0a},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe0},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x20},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL_Nc,
.audio_default_std = BTSC,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0},
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x36},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x91},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x1f},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x0c},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL,
.audio_default_std = BG_A2,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0}
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x32},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x25},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0xd5},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x63},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x50},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G,
.audio_default_std = BG_NICAM,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0},
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM_DK,
.audio_default_std = DK_NICAM,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0},
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_NTSC,
.audio_default_std = BTSC,
.sif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe},
{TM6010_REQ07_RFE_POWER_DOWN, 0xcb},
{0, 0, 0},
},
.nosif = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{0, 0, 0},
},
.common = {
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x00},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0f},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x00},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x8b},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xa2},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe9},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x1c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdd},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
},
};static struct tm6000_std_settings composite_stds[] = {
{
.id = V4L2_STD_PAL_M,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x04},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x00},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x83},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x0a},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe0},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x20},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL_Nc,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x36},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x91},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x1f},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x0c},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL,
.audio_default_std = BG_A2,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x32},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x25},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0xd5},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x63},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x50},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM,
.audio_default_std = BG_NICAM,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM_DK,
.audio_default_std = DK_NICAM,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_NTSC,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe8},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8b},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x00},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0f},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x00},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x8b},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xa2},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe9},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x1c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdd},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
},
};static struct tm6000_std_settings svideo_stds[] = {
{
.id = V4L2_STD_PAL_M,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x05},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x04},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x83},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x0a},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe0},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL_Nc,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x37},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x04},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x91},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x1f},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x0c},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_PAL,
.audio_default_std = BG_A2,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x33},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x04},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x30},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x25},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0xd5},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0x63},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0x50},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2a},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x0c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x52},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM,
.audio_default_std = BG_NICAM,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x39},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x03},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2a},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_SECAM_DK,
.audio_default_std = DK_NICAM,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x39},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x03},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2a},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
}, {
.id = V4L2_STD_NTSC,
.audio_default_std = BTSC,
.common = {
{TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0},
{TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc},
{TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8},
{TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00},
{TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2},
{TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0},
{TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2},
{TM6010_REQ08_RED_GAIN_SEL, 0xe0},
{TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68},
{TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc},
{TM6010_REQ07_RFE_POWER_DOWN, 0x8a},
{TM6010_REQ07_R3F_RESET, 0x01},
{TM6010_REQ07_R00_VIDEO_CONTROL0, 0x01},
{TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0f},
{TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f},
{TM6010_REQ07_R03_YC_SEP_CONTROL, 0x03},
{TM6010_REQ07_R07_OUTPUT_CONTROL, 0x30},
{TM6010_REQ07_R17_HLOOP_MAXSTATE, 0x8b},
{TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x1e},
{TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x8b},
{TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xa2},
{TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xe9},
{TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c},
{TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc},
{TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc},
{TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd},
{TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88},
{TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22},
{TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0x61},
{TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x1c},
{TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x1c},
{TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42},
{TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0x6F},
{TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdd},
{TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07},
{TM6010_REQ07_R3F_RESET, 0x00},
{0, 0, 0},
},
},
};static int tm6000_set_audio_std(struct tm6000_core *dev,
enum tm6000_audio_std std)
{
uint8_t areg_02 = 0x04; /* GC1 Fixed gain 0dB */
uint8_t areg_05 = 0x09; /* Auto 4.5 = M Japan, Auto 6.5 = DK */
uint8_t areg_06 = 0x02; /* Auto de-emphasis, mannual channel mode */
uint8_t mono_flag = 0; /* No mono */
uint8_t nicam_flag = 0; /* No NICAM */
switch (std) {
#if 0
case DK_MONO:
mono_flag = 1;
break;
case DK_A2_1:
break;
case DK_A2_3:
areg_05 = 0x0b;
break;
case BG_MONO:
mono_flag = 1;
areg_05 = 0x05;
break;
#endif
case BG_NICAM:
areg_05 = 0x07;
nicam_flag = 1;
break;
case BTSC:
areg_05 = 0x02;
break;
case BG_A2:
areg_05 = 0x05;
break;
case DK_NICAM:
areg_05 = 0x06;
nicam_flag = 1;
break;
case EIAJ:
areg_05 = 0x02;
break;
case FM_RADIO:
tm6000_set_reg(dev, TM6010_REQ08_R01_A_INIT, 0x00);
tm6000_set_reg(dev, TM6010_REQ08_R02_A_FIX_GAIN_CTRL, 0x04);
tm6000_set_reg(dev, TM6010_REQ08_R03_A_AUTO_GAIN_CTRL, 0x00);
tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD, 0x0c);
tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD, 0x00);
tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL, 0x18);
tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD, 0x91);
tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX, 0xfe);
tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN, 0x01);
tm6000_set_reg(dev, TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT, 0x13);
tm6000_set_reg(dev, TM6010_REQ08_R01_A_INIT, 0x80);
return 0;
break;
case I_NICAM:
areg_05 = 0x08;
nicam_flag = 1;
break;
case KOREA_A2:
areg_05 = 0x04;
break;
case L_NICAM:
areg_02 = 0x02; /* GC1 Fixed gain +12dB */
areg_05 = 0x0a;
nicam_flag = 1;
break;
}#if 0
switch (tv_audio_mode) {
case TV_MONO:
areg_06 = (nicam_flag) ? 0x03 : 0x00;
break;
case TV_LANG_A:
areg_06 = 0x00;
break;
case TV_LANG_B:
areg_06 = 0x01;
break;
}#endif
if (mono_flag) areg_06 = 0x00; tm6000_set_reg(dev, TM6010_REQ08_R01_A_INIT, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R02_A_FIX_GAIN_CTRL, areg_02); tm6000_set_reg(dev, TM6010_REQ08_R03_A_AUTO_GAIN_CTRL, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R04_A_SIF_AMP_CTRL, 0xa0); tm6000_set_reg(dev, TM6010_REQ08_R05_A_STANDARD_MOD, areg_05); tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD, areg_06); tm6000_set_reg(dev, TM6010_REQ08_R07_A_LEFT_VOL, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R08_A_RIGHT_VOL, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R09_A_MAIN_VOL, 0x08); tm6000_set_reg(dev, TM6010_REQ08_R0A_A_I2S_MOD, 0x91); tm6000_set_reg(dev, TM6010_REQ08_R0B_A_ASD_THRES1, 0x20); tm6000_set_reg(dev, TM6010_REQ08_R0C_A_ASD_THRES2, 0x12); tm6000_set_reg(dev, TM6010_REQ08_R0D_A_AMD_THRES, 0x20); tm6000_set_reg(dev, TM6010_REQ08_R0E_A_MONO_THRES1, 0xf0); tm6000_set_reg(dev, TM6010_REQ08_R0F_A_MONO_THRES2, 0x80); tm6000_set_reg(dev, TM6010_REQ08_R10_A_MUTE_THRES1, 0xc0); tm6000_set_reg(dev, TM6010_REQ08_R11_A_MUTE_THRES2, 0x80); tm6000_set_reg(dev, TM6010_REQ08_R12_A_AGC_U, 0x12); tm6000_set_reg(dev, TM6010_REQ08_R13_A_AGC_ERR_T, 0xfe); tm6000_set_reg(dev, TM6010_REQ08_R14_A_AGC_GAIN_INIT, 0x20); tm6000_set_reg(dev, TM6010_REQ08_R15_A_AGC_STEP_THR, 0x14); tm6000_set_reg(dev, TM6010_REQ08_R16_A_AGC_GAIN_MAX, 0xfe); tm6000_set_reg(dev, TM6010_REQ08_R17_A_AGC_GAIN_MIN, 0x01); tm6000_set_reg(dev, TM6010_REQ08_R18_A_TR_CTRL, 0xa0); tm6000_set_reg(dev, TM6010_REQ08_R19_A_FH_2FH_GAIN, 0x32); tm6000_set_reg(dev, TM6010_REQ08_R1A_A_NICAM_SER_MAX, 0x64); tm6000_set_reg(dev, TM6010_REQ08_R1B_A_NICAM_SER_MIN, 0x20); tm6000_set_reg(dev, REQ_08_SET_GET_AVREG_BIT, 0x1c, 0x00); tm6000_set_reg(dev, REQ_08_SET_GET_AVREG_BIT, 0x1d, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT, 0x13); tm6000_set_reg(dev, TM6010_REQ08_R1F_A_TEST_INTF_SEL, 0x00); tm6000_set_reg(dev, TM6010_REQ08_R20_A_TEST_PIN_SEL, 0x00); tm6000_set_reg(dev, TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3); tm6000_set_reg(dev, TM6010_REQ08_R06_A_SOUND_MOD, 0x00); tm6000_set_reg(dev, TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc); tm6000_set_reg(dev, TM6010_REQ08_R01_A_INIT, 0x80); return 0; }
void tm6000_get_std_res(struct tm6000_core *dev)
{
/* Currently, those are the only supported resoltions */
if (dev->norm & V4L2_STD_525_60)
dev->height = 480;
else
dev->height = 576;
dev->width = 720;
}static int tm6000_load_std(struct tm6000_core *dev,
struct tm6000_reg_settings *set, int max_size)
{
int i, rc;
/* Load board's initialization table */
for (i = 0; max_size; i++) {
if (!set[i].req)
return 0;
if ((dev->dev_type != TM6010) &&
(set[i].req == REQ_08_SET_GET_AVREG_BIT))
continue;
rc = tm6000_set_reg(dev, set[i].req, set[i].reg, set[i].value);
if (rc < 0) {
printk(KERN_ERR "Error %i while setting "
"req %d, reg %d to value %d\n",
rc, set[i].req, set[i].reg, set[i].value);
return rc;
}
}
return 0;
}static int tm6000_set_tv(struct tm6000_core *dev, int pos)
{
int rc;
/* FIXME: This code is for tm6010 - not tested yet - doesn't work with
tm5600
*/
/* FIXME: This is tuner-dependent */
int nosif = 0;
if (nosif) {
rc = tm6000_load_std(dev, tv_stds[pos].nosif,
sizeof(tv_stds[pos].nosif));
} else {
rc = tm6000_load_std(dev, tv_stds[pos].sif,
sizeof(tv_stds[pos].sif));
}
if (rc < 0)
return rc;
rc = tm6000_load_std(dev, tv_stds[pos].common,
sizeof(tv_stds[pos].common));
tm6000_set_audio_std(dev, tv_stds[pos].audio_default_std);
return rc;
}int tm6000_set_standard(struct tm6000_core *dev, v4l2_std_id * norm)
{
int i, rc = 0;
dev->norm = *norm;
tm6000_get_std_res(dev);
switch (dev->input) {
case TM6000_INPUT_TV:
for (i = 0; i < ARRAY_SIZE(tv_stds); i++) {
if (*norm & tv_stds[i].id) {
rc = tm6000_set_tv(dev, i);
goto ret;
}
}
return -EINVAL;
case TM6000_INPUT_SVIDEO:
for (i = 0; i < ARRAY_SIZE(svideo_stds); i++) {
if (*norm & svideo_stds[i].id) {
rc = tm6000_load_std(dev, svideo_stds[i].common,
sizeof(svideo_stds[i].
common));
tm6000_set_audio_std(dev, svideo_stds[i].audio_default_std);
goto ret;
}
}
return -EINVAL;
case TM6000_INPUT_COMPOSITE:
for (i = 0; i < ARRAY_SIZE(composite_stds); i++) {
if (*norm & composite_stds[i].id) {
rc = tm6000_load_std(dev,
composite_stds[i].common,
sizeof(composite_stds[i].
common));
tm6000_set_audio_std(dev, composite_stds[i].audio_default_std);
goto ret;
}
}
return -EINVAL;
}ret:
if (rc < 0) return rc; msleep(40); return 0; }
drivers/staging/tm6000/tm6000-stds.c +243 -100
@@ -173,8 +173,9 @@ static struct tm6000_std_tv_settings tv_stds[] = { {TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc}, {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, - {TM6010_REQ08_R05_A_STANDARD_MOD, 0x21}, /* FIXME */ + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, }, }, {
@@ -233,12 +234,13 @@ static struct tm6000_std_tv_settings tv_stds[] = { {TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdc}, {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, - {TM6010_REQ08_R05_A_STANDARD_MOD, 0x76}, /* FIXME */ + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, }, }, { - .id =V4L2_STD_SECAM , + .id =V4L2_STD_SECAM_B |V4L2_STD_SECAM_G , .audio_default_std = BG_NICAM, .sif = { {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2},
@@ -292,7 +294,66 @@ static struct tm6000_std_tv_settings tv_stds[] = { {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF}, {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, - {TM6010_REQ08_R05_A_STANDARD_MOD, 0x79}, + + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, + }, + }, { + .id =V4L2_STD_SECAM_DK , + .audio_default_std = DK_NICAM, + .sif = { + {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf2}, + {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8}, + {TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3}, + {TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x08}, + {TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1}, + {TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0}, + {TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2}, + {TM6010_REQ08_RED_GAIN_SEL, 0xe8}, + {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x62}, + {TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfe}, + {TM6010_REQ07_RFE_POWER_DOWN, 0xcb}, + {0, 0, 0}, + }, + .nosif = { + {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, + {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf8}, + {TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3}, + {TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f}, + {TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1}, + {TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0}, + {TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2}, + {TM6010_REQ08_RED_GAIN_SEL, 0xe8}, + {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60}, + {TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc}, + {TM6010_REQ07_RFE_POWER_DOWN, 0x8b}, + {0, 0, 0}, + }, + .common = { + {TM6010_REQ07_R3F_RESET, 0x01}, + {TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38}, + {TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e}, + {TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f}, + {TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02}, + {TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31}, + {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24}, + {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92}, + {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8}, + {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed}, + {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c}, + {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc}, + {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc}, + {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd}, + {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c}, + {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c}, + {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1}, + {TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c}, + {TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18}, + {TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42}, + {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF}, + + {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, + {TM6010_REQ07_R3F_RESET, 0x00}, {0, 0, 0}, },
@@ -352,8 +413,9 @@ static struct tm6000_std_tv_settings tv_stds[] = { {TM6010_REQ07_R04_LUMA_HAGC_CONTROL, 0xdd}, {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, - {TM6010_REQ08_R05_A_STANDARD_MOD, 0x22}, /* FIXME */ + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, }, },
@@ -532,6 +594,48 @@ static struct tm6000_std_settings composite_stds[] = { {0, 0, 0}, }, }, { + .id =V4L2_STD_SECAM_DK , + .audio_default_std = DK_NICAM, + .common = { + {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, + {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xf4}, + {TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf3}, + {TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x0f}, + {TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf1}, + {TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xe0}, + {TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2}, + {TM6010_REQ08_RED_GAIN_SEL, 0xe8}, + {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68}, + {TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc}, + {TM6010_REQ07_RFE_POWER_DOWN, 0x8b}, + + {TM6010_REQ07_R3F_RESET, 0x01}, + {TM6010_REQ07_R00_VIDEO_CONTROL0, 0x38}, + {TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e}, + {TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f}, + {TM6010_REQ07_R03_YC_SEP_CONTROL, 0x02}, + {TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31}, + {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24}, + {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92}, + {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8}, + {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed}, + {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c}, + {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc}, + {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc}, + {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd}, + {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c}, + {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2c}, + {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1}, + {TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c}, + {TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18}, + {TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42}, + {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF}, + + {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, + }, + }, { .id =V4L2_STD_NTSC , .audio_default_std = BTSC, .common = {
@@ -750,6 +854,48 @@ static struct tm6000_std_settings svideo_stds[] = { {0, 0, 0}, }, }, { + .id =V4L2_STD_SECAM_DK , + .audio_default_std = DK_NICAM, + .common = { + {TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xf0}, + {TM6010_REQ08_RE3_ADC_IN1_SEL, 0xfc}, + {TM6010_REQ08_RE4_ADC_IN2_SEL, 0xf8}, + {TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0x00}, + {TM6010_REQ08_REA_BUFF_DRV_CTRL, 0xf2}, + {TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0}, + {TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2}, + {TM6010_REQ08_RED_GAIN_SEL, 0xe0}, + {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x68}, + {TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc}, + {TM6010_REQ07_RFE_POWER_DOWN, 0x8a}, + + {TM6010_REQ07_R3F_RESET, 0x01}, + {TM6010_REQ07_R00_VIDEO_CONTROL0, 0x39}, + {TM6010_REQ07_R01_VIDEO_CONTROL1, 0x0e}, + {TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f}, + {TM6010_REQ07_R03_YC_SEP_CONTROL, 0x03}, + {TM6010_REQ07_R07_OUTPUT_CONTROL, 0x31}, + {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3, 0x24}, + {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2, 0x92}, + {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1, 0xe8}, + {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0, 0xed}, + {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3, 0x1c}, + {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc}, + {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc}, + {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd}, + {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x8c}, + {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x2a}, + {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT, 0xc1}, + {TM6010_REQ07_R33_VSYNC_HLOCK_MAX, 0x2c}, + {TM6010_REQ07_R35_VSYNC_AGC_MAX, 0x18}, + {TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42}, + {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xFF}, + + {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x07}, + {TM6010_REQ07_R3F_RESET, 0x00}, + {0, 0, 0}, + }, + }, { .id =V4L2_STD_NTSC , .audio_default_std = BTSC, .common = {
@@ -800,129 +946,126 @@ static struct tm6000_std_settings svideo_stds[] = {static int tm6000_set_audio_std (struct tm6000_core *dev,enum tm6000_audio_std std) { +uint8_t areg_02 =0x04 ;/* GC1 Fixed gain 0dB */ +uint8_t areg_05 =0x09 ;/* Auto 4.5 = M Japan, Auto 6.5 = DK */ +uint8_t areg_06 =0x02 ;/* Auto de-emphasis, mannual channel mode */ +uint8_t mono_flag =0 ;/* No mono */ +uint8_t nicam_flag =0 ;/* No NICAM */ +switch (std) { +#if 0 +case DK_MONO : + mono_flag =1 ; +break ; +case DK_A2_1 : +break ; +case DK_A2_3 : + areg_05 =0x0b ; +break ; +case BG_MONO : + mono_flag =1 ; + areg_05 =0x05 ; +break ; +#endif case BG_NICAM : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x11 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x07 ; + nicam_flag =1 ;break ;case BTSC : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x02 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); -tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x02 ;break ;case BG_A2 : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x05 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); -tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x05 ;break ;case DK_NICAM : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x06 ; + nicam_flag =1 ;break ;case EIAJ : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x03 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x02 ;break ;case FM_RADIO :tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x01 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 );tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 );tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c );tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x10 ); +tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 );tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 );tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe );tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); +tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 );tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +return 0 ;break ;case I_NICAM : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x08 ; + nicam_flag =1 ;break ;case KOREA_A2 : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); -tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_05 =0x04 ;break ;case L_NICAM : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x02 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0a ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x06 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); + areg_02 =0x02 ;/* GC1 Fixed gain +12dB */ + areg_05 =0x0a ; + nicam_flag =1 ;break ; } + +#if 0 +switch (tv_audio_mode) { +case TV_MONO : + areg_06 = (nicam_flag) ?0x03 :0x00 ; +break ; +case TV_LANG_A : + areg_06 =0x00 ; +break ; +case TV_LANG_B : + areg_06 =0x01 ; +break ; + } +#endif + +if (mono_flag) + areg_06 =0x00 ; + +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL , areg_02); +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0xa0 ); +tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD , areg_05); +tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD , areg_06); +tm6000_set_reg (dev,TM6010_REQ08_R07_A_LEFT_VOL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R08_A_RIGHT_VOL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); +tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); +tm6000_set_reg (dev,TM6010_REQ08_R0B_A_ASD_THRES1 ,0x20 ); +tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x12 ); +tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x20 ); +tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); +tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); +tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); +tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0x80 ); +tm6000_set_reg (dev,TM6010_REQ08_R12_A_AGC_U ,0x12 ); +tm6000_set_reg (dev,TM6010_REQ08_R13_A_AGC_ERR_T ,0xfe ); +tm6000_set_reg (dev,TM6010_REQ08_R14_A_AGC_GAIN_INIT ,0x20 ); +tm6000_set_reg (dev,TM6010_REQ08_R15_A_AGC_STEP_THR ,0x14 ); +tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); +tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); +tm6000_set_reg (dev,TM6010_REQ08_R18_A_TR_CTRL ,0xa0 ); +tm6000_set_reg (dev,TM6010_REQ08_R19_A_FH_2FH_GAIN ,0x32 ); +tm6000_set_reg (dev,TM6010_REQ08_R1A_A_NICAM_SER_MAX ,0x64 ); +tm6000_set_reg (dev,TM6010_REQ08_R1B_A_NICAM_SER_MIN ,0x20 ); +tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1c ,0x00 ); +tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1d ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); +tm6000_set_reg (dev,TM6010_REQ08_R1F_A_TEST_INTF_SEL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R20_A_TEST_PIN_SEL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 ); +tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +return 0 ; }
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Am 12.10.2010 20:28, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 14 lines
Em 08-10-2010 16:03, Dmitri Belimov escreveu:
Quoted 5 lines
Hi Mauro
Not so good. Audio with this patch has bad white noise sometimes and bad quality. I try found better configuration for SECAM-DK.
Ok. Well, feel free to modify it. I think that this approach may be better, especially if we need to add later some sort of code to detect and change audio standard for some standards that have more than one audio standard associated (we needed do to it on other drivers, in order to work in Russia and other Countries that use different variants of the audio standard).
Quoted 2 lines
The association between video and audio standard is not complete. For example, it misses NTSC-Kr and NTSC-Jp.
Rework audio. Add SECAM-DK, move SECAM to SECAM-B | SECAM-G. Add some new audio standards and tricks for future, see
tm6000_set_audio_stdFor SECAM-DK it works. Try on your standards.
Quoted 7 lines
Two files in attach. Patch after latest patch from Mauro and full file
tm6000-std.cQuoted 2 lines
Cheers, Mauro.
With my best regards, Dmitry.
Where is defined "tv_audio_mode"?
Stefan Ringel
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iQEcBAEBAgAGBQJMtJLTAAoJEAWtPFjxMvFGnFAH/Rrk274byzL8IvQd6fjAIl4D izk31/k4CY1Y2EdHvygef4ZQxIGE4PGDaOogWEIBLtlHTx6XHUASpiZ8aJW1z7oF YQk9rtfC3ZChmaGQDBzwLI+EUg9t7TzeQ8BpC11WxiOapyKLXFv0SdMNs2Y0WHOz BNlQkL+9kZ+Hq6nSdJJxOihu+tiwbmvvSd7b/Cz9kdLpSNGr99F+ELbM0g3oU2Ts ue7r3FnvHFnpNlV7Ceiuj7jF5ozeo3jSdWJI3S8ph4Wdi3CkPxTnTQXJAU09JU1k we8+/TdplP+3Rdf206r/SL4RlI5wiZr/jm4IdLcwLOm/9yHthb89qyuW5upvV6k= =LQiB
-----END PGP SIGNATURE-----
Hi Stefan
Quoted 29 lines
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1Am 12.10.2010 20:28, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 14 lines
Em 08-10-2010 16:03, Dmitri Belimov escreveu:
Quoted 5 lines
Hi Mauro
Not so good. Audio with this patch has bad white noise sometimes and bad quality. I try found better configuration for SECAM-DK.
Ok. Well, feel free to modify it. I think that this approach may be better, especially if we need to add later some sort of code to detect and change audio standard for some standards that have more than one audio standard associated (we needed do to it on other drivers, in order to work in Russia and other Countries that use different variants of the audio standard).
Quoted 2 lines
The association between video and audio standard is not complete. For example, it misses NTSC-Kr and NTSC-Jp.
Rework audio. Add SECAM-DK, move SECAM to SECAM-B | SECAM-G. Add some new audio standards and tricks for future, see
tm6000_set_audio_stdFor SECAM-DK it works. Try on your standards.
Quoted 8 lines
Quoted 7 lines
Two files in attach. Patch after latest patch from Mauro and full file
tm6000-std.cQuoted 2 lines
Cheers, Mauro.
With my best regards, Dmitry.
Where is defined "
tv_audio_mode"?
This is concept only for future. I didn't understand how to do it. When audio was working use this for set MONO or audio languige channel.
With my best regards, Dmitry.
Quoted 14 lines
Stefan Ringel
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/iQEcBAEBAgAGBQJMtJLTAAoJEAWtPFjxMvFGnFAH/Rrk274byzL8IvQd6fjAIl4D izk31/k4CY1Y2EdHvygef4ZQxIGE4PGDaOogWEIBLtlHTx6XHUASpiZ8aJW1z7oF YQk9rtfC3ZChmaGQDBzwLI+EUg9t7TzeQ8BpC11WxiOapyKLXFv0SdMNs2Y0WHOz BNlQkL+9kZ+Hq6nSdJJxOihu+tiwbmvvSd7b/Cz9kdLpSNGr99F+ELbM0g3oU2Ts ue7r3FnvHFnpNlV7Ceiuj7jF5ozeo3jSdWJI3S8ph4Wdi3CkPxTnTQXJAU09JU1k we8+/TdplP+3Rdf206r/SL4RlI5wiZr/jm4IdLcwLOm/9yHthb89qyuW5upvV6k= =LQiB
-----END PGP SIGNATURE-----
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: tm6000 and IR
Hi
What about my last patch?? This is OK or bad?
Our customers kick me every day with IR remotes.
With my best regards, Dmitry.
Re: tm6000 and IR
Am 14.12.2010 04:23, schrieb Dmitri Belimov:
Quoted 6 lines
Hi
What about my last patch?? This is OK or bad?
Our customers kick me every day with IR remotes.With my best regards, Dmitry.
I think, you use the second variant, Dmitry.
Why you doesn't use this key map - RCMAP_BEHOLD.
The power led we can change to a separate function, right. The nec initiation looks right and must adding code for tm5600/6000 (going over message pipe). rc5 need some code for tm6010 (for tm5600/6000 are the hack). And the logic for your remote control is unused for the second variant, but ir->rc_type = rc_type are o.k.. Then the function call usb_set_interface in tm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipe
I will adding vbi_buffer and device in the next, and isoc calculating without video_buffer size.
Stefan Ringel
Re: tm6000 and IR
Hi Stefan
Quoted 9 lines
Am 14.12.2010 04:23, schrieb Dmitri Belimov:
Quoted 6 lines
Hi
What about my last patch?? This is OK or bad?
Our customers kick me every day with IR remotes.With my best regards, Dmitry.
I think, you use the second variant, Dmitry.
Why you doesn't use this key map -RCMAP_BEHOLD.
No this remotes is different. RCMAP_BEHOLD has more buttons and some other scancodes. People from linux community who was made this keymap and function for reading data from IR decoder has error with scancode.
Our true address of scancode is0x86 0x6B
They wrote0x6B 0x86
Need fix some code of the saa7134-input and RCMAP_BEHOLD keytable.
RCMAP_BEHOLD_WANDER same as RCMAP_BEHOLD_COLUMBUS but
from IR decoder the saa7134 received only one byte of scancode.
Need rework saa7134-input too for get address and restore full scancodes for extended NEC full scancodes.
I'll make it after some time.
Quoted 1 line
The power led we can change to a separate function, right.
Ok
Quoted 2 lines
The nec initiation looks right and must adding code for tm5600/6000 (going over message pipe).
I haven't USB stick with tm5600/6000 for test. Need people with this TV cards.
Quoted 1 line
rc5 need some code for tm6010 (for tm5600/6000 are the hack).
I didn't touch this code because I haven't RC5 remotes and tm5600/6000
Quoted 2 lines
And the logic for your remote control is unused for the second variant, but
ir->rc_type=rc_typeare o.k..
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
If we use second variant I can't use RCMAP_BEHOLD because it has full 3 bytes scancodes. As you wrote.
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipe
Ok, I'll try.
Quoted 2 lines
I will adding
vbi_bufferand device in the next, and isoc calculating withoutvideo_buffersize.
I try add radio.
With my best regards, Dmitry.
Re: tm6000 and IR
Am 15.12.2010 08:46, schrieb Dmitri Belimov:
Quoted 25 lines
Hi Stefan
Quoted 9 lines
Am 14.12.2010 04:23, schrieb Dmitri Belimov:
Quoted 6 lines
Hi
What about my last patch?? This is OK or bad?
Our customers kick me every day with IR remotes.With my best regards, Dmitry.
I think, you use the second variant, Dmitry.
Why you doesn't use this key map -RCMAP_BEHOLD.No this remotes is different.
RCMAP_BEHOLDhas more buttons and some other scancodes. People from linux community who was made this keymap and function for reading data from IR decoder has error with scancode.
Our true address of scancode is0x860x6B
They wrote0x6B0x86
Need fix some code of the saa7134-input andRCMAP_BEHOLDkeytable.
RCMAP_BEHOLD_WANDERsame asRCMAP_BEHOLD_COLUMBUSbut
from IR decoder the saa7134 received only one byte of scancode.
Need rework saa7134-input too for get address and restore full scancodes for extended NEC full scancodes.
Quoted 9 lines
I'll make it after some time.
Quoted 1 line
The power led we can change to a separate function, right.
Ok
Quoted 2 lines
The nec initiation looks right and must adding code for tm5600/6000 (going over message pipe).
I haven't USB stick with tm5600/6000 for test. Need people with this TV cards.
then add a todo line.
Quoted 5 lines
Quoted 1 line
rc5 need some code for tm6010 (for tm5600/6000 are the hack).
I didn't touch this code because I haven't RC5 remotes and tm5600/6000
Quoted 2 lines
And the logic for your remote control is unused for the second variant, but
ir->rc_type=rc_typeare o.k.
but the line ir->rc_type = rc_type; are o.k.
Quoted 5 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
Quoted 3 lines
If we use second variant I can't use
RCMAP_BEHOLDbecause it has full 3 bytes scancodes. As you wrote.
And if you use two bytes rc map table. We have add filter for address and commands to pass all. With an external tool can change the map ( ir_keytable). Why you will use more than two bytes.
Quoted 17 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
Quoted 2 lines
I will adding
vbi_bufferand device in the next, and isoc calculating withoutvideo_buffersize.I try add radio.
With my best regards, Dmitry.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: tm6000 and IR
Hi Stefan
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
The nec initiation looks right and must adding code for tm5600/6000 (going over message pipe).
I haven't USB stick with tm5600/6000 for test. Need people with this TV cards.
then add a todo line.
I'll do it.
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
rc5 need some code for tm6010 (for tm5600/6000 are the hack).
I didn't touch this code because I haven't RC5 remotes and tm5600/6000
Quoted 2 lines
And the logic for your remote control is unused for the second variant, but
ir->rc_type=rc_typeare o.k.but the line
ir->rc_type=rc_type; are o.k.
Quoted 7 lines
Quoted 6 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I'll try solve this problem don't worry.
Quoted 6 lines
Quoted 3 lines
If we use second variant I can't use
RCMAP_BEHOLDbecause it has full 3 bytes scancodes. As you wrote.And if you use two bytes rc map table. We have add filter for address and commands to pass all. With an external tool can change the map (
ir_keytable). Why you will use more than two bytes.
With my last code this tool is working. When you call change_protocol new value of address stored. But if a keytable of remotes hasn't full scancodes it doesn't work
How to main IR core search scancodes in RCMAP keytable?
I think it search full equal scancode value with returned from tm6000.
Example:
defined keytable:0x86 0x6B 0x00
tm6000 read IR data0x86 0x00
When return 0x86 0x00 to IR core a key is unknown because 0x86 0x6B 0x00 != 0x86 0x00
I think we can have two different solutions:
1. My variant. When init IR tm6000, get full address from a keytable, store it. After key filtering restore full scancode and return it to IR core -> 0x86 0x6B 0x00. A keytable must has really full scancodes.
2. More simple. A keytable has only data byte. Get IR data and return only data byte without filtering because a keytable hasn't this information. This is bad the TV card can do some task by other IR remotes. Or add some place where stored filter information and update filter when keytable replaced.
With my best regards, Dmitry.
Re: tm6000 and IR
In reply to Stefan RingelHi
Quoted 7 lines
Quoted 6 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC
(adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.
I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
See dmesg. I was add function for start/stop interrupt urbs All works well.
With my best regards, Dmitry.
/* behold-wander.h - Keytable for behold_wander Remote Controller
*
* keymap imported from ir-keymaps.c
*
* Copyright (c) 2010 by Mauro Carvalho Chehab <[email protected]> *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include <media/rc-map.h>
/* Beholder Intl. Ltd. 2010
* Dmitry Belimov [email protected]
* Keytable is used by BeholdTV Wander/Voyage
* The "ascii-art picture" below (in comments, first row
* is the keycode in hex, and subsequent row(s) shows
* the button labels (several variants when appropriate)
* helps to descide which keycodes to assign to the buttons. */
static struct rc_map_table behold_wander[] = {
/* 0x13 0x11 0x1C 0x12 *
* Mute Source TV/FM Power *
* */
{ 0x866b13, KEY_MUTE },
{ 0x866b11, KEY_PROPS },
{ 0x866b1C, KEY_TUNER }, /* KEY_TV/KEY_RADIO */
{ 0x866b12, KEY_POWER },
/* 0x01 0x02 0x03 0x0D *
* 1 2 3 Stereo *
* *
* 0x04 0x05 0x06 0x19 *
* 4 5 6 Snapshot *
* *
* 0x07 0x08 0x09 0x10 *
* 7 8 9 Zoom *
* */
{ 0x866b01, KEY_1 },
{ 0x866b02, KEY_2 },
{ 0x866b03, KEY_3 },
{ 0x866b0D, KEY_SETUP }, /* Setup key */
{ 0x866b04, KEY_4 },
{ 0x866b05, KEY_5 },
{ 0x866b06, KEY_6 },
{ 0x866b19, KEY_CAMERA }, /* Snapshot key */
{ 0x866b07, KEY_7 },
{ 0x866b08, KEY_8 },
{ 0x866b09, KEY_9 },
{ 0x866b10, KEY_ZOOM },
/* 0x0A 0x00 0x0B 0x0C *
* RECALL 0 ChannelUp VolumeUp *
* */
{ 0x866b0A, KEY_AGAIN },
{ 0x866b00, KEY_0 },
{ 0x866b0B, KEY_CHANNELUP },
{ 0x866b0C, KEY_VOLUMEUP },
/* 0x1B 0x1D 0x15 0x18 *
* Timeshift Record ChannelDown VolumeDown *
* */
{ 0x866b1B, KEY_TIME },
{ 0x866b1D, KEY_RECORD },
{ 0x866b15, KEY_CHANNELDOWN },
{ 0x866b18, KEY_VOLUMEDOWN },
/* 0x0E 0x1E 0x0F 0x1A *
* Stop Pause Previouse Next *
* */
{ 0x866b0E, KEY_STOP },
{ 0x866b1E, KEY_PAUSE },
{ 0x866b0F, KEY_PREVIOUS },
{ 0x866b1A, KEY_NEXT },};
static struct rc_map_list behold_wander_map = {
.map = {
.scan = behold_wander,
.size = ARRAY_SIZE(behold_wander),
.rc_type = RC_TYPE_NEC, /* Legacy IR type */
.name = RC_MAP_BEHOLD_WANDER,
}
};
static int __init init_rc_map_behold_wander(void)
{
return rc_map_register(&behold_wander_map);
}static void __exit exit_rc_map_behold_wander(void)
{
rc_map_unregister(&behold_wander_map);
}module_init(init_rc_map_behold_wander)module_exit(exit_rc_map_behold_wander)
MODULE_LICENSE("GPL");MODULE_AUTHOR("Mauro Carvalho Chehab <[email protected]>");
drivers/media/rc/keymaps/Makefile +1 -0
@@ -15,6 +15,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \ rc-azurewave-ad-tu700.o \ rc-behold.o \ rc-behold-columbus.o \ + rc-behold-wander.o \ rc-budget-ci-old.o \ rc-cinergy-1400.o \ rc-cinergy.o \
drivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.c +67 -60
136 lines not on this page · raw message
drivers/staging/tm6000/TODO +2 -0
@@ -1,4 +1,6 @@ There a few things to do before putting this driver in production: + - IR NEC with tm5600/6000 TV cards + - IR RC5 with tm5600/6000/6010 TV cards - CodingStyle; - Fix audio; - Fix some panic/OOPS conditions.
drivers/staging/tm6000/tm6000-cards.c +43 -0
61 lines not on this page · raw message
drivers/staging/tm6000/tm6000-input.c +146 -54
285 lines not on this page · raw message
drivers/staging/tm6000/tm6000-video.c +5 -0
@@ -545,11 +545,16 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)/* De-allocates all pending stuff */ tm6000_uninit_isoc (dev); +/* Stop interrupt USB pipe */ +tm6000_ir_int_stop (dev);usb_set_interface (dev->udev, dev->isoc_in.bInterfaceNumber, dev->isoc_in.bAlternateSetting); +/* Start interrupt USB pipe */ +tm6000_ir_int_start (dev); + pipe =usb_rcvisocpipe (dev->udev, dev->isoc_in.endp->desc.bEndpointAddress &USB_ENDPOINT_NUMBER_MASK );
drivers/staging/tm6000/tm6000.h +3 -0
@@ -266,6 +266,7 @@ struct tm6000_fh {int tm6000_tuner_callback (void *ptr,int component,int command,int arg);int tm6000_xc5000_callback (void *ptr,int component,int command,int arg);int tm6000_cards_setup (struct tm6000_core *dev); +void tm6000_flash_led (struct tm6000_core *dev,u8 state);/* In tm6000-core.c */
@@ -332,6 +333,8 @@ int tm6000_queue_init(struct tm6000_core *dev);int tm6000_ir_init (struct tm6000_core *dev);int tm6000_ir_fini (struct tm6000_core *dev);void tm6000_ir_wait (struct tm6000_core *dev,u8 state); +int tm6000_ir_int_start (struct tm6000_core *dev); +void tm6000_ir_int_stop (struct tm6000_core *dev);/* Debug stuff */
include/media/rc-map.h +1 -0
@@ -70,6 +70,7 @@ void rc_map_init(void);#define RC_MAP_AVERTV_303 "rc-avertv-303"#define RC_MAP_AZUREWAVE_AD_TU700 "rc-azurewave-ad-tu700"#define RC_MAP_BEHOLD_COLUMBUS "rc-behold-columbus" +#define RC_MAP_BEHOLD_WANDER "rc-behold-wander"#define RC_MAP_BEHOLD "rc-behold"#define RC_MAP_BUDGET_CI_OLD "rc-budget-ci-old"#define RC_MAP_CINERGY_1400 "rc-cinergy-1400"
Re: tm6000 and IR
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 17 lines
Hi
Quoted 7 lines
Quoted 6 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC
(adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.
Quoted 4 lines
I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices. The best are only the received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.
Quoted 11 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
See dmesg. I was add function for start/stop interrupt urbs All works well.
With my best regards, Dmitry.
Re: tm6000 and IR
Hi Stefan
Quoted 19 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 18 lines
Hi
Quoted 7 lines
Quoted 6 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.
Quoted 7 lines
Quoted 5 lines
I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
The RC_MAP_NEC_TERRATEC_CINERGY_XS used only in tm6000 module. My patch didn't kill support any other devices.
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.
You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers.
And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
2. With your variant we have some keytables for one remote for different IR recevers.
Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.
I think my variant much better.
With my best regards, Dmitry.
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
See dmesg. I was add function for start/stop interrupt urbs All works well.
With my best regards, Dmitry.
Re: tm6000 and IR
Am 17.12.2010 02:46, schrieb Dmitri Belimov:
Quoted 26 lines
Hi Stefan
Quoted 24 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 23 lines
Hi
Quoted 7 lines
Quoted 6 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 5 lines
Quoted 2 lines
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
TheRC_MAP_NEC_TERRATEC_CINERGY_XSused only in tm6000 module. My patch didn't kill support any other devices.
That is not true.
Quoted 10 lines
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers.
And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
Quoted 7 lines
2. With your variant we have some keytables for one remote for different IR recevers.
Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.I think my variant much better.
With my best regards, Dmitry.
I think your variant is bad.
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
See dmesg. I was add function for start/stop interrupt urbs All works well.
With my best regards, Dmitry.
Re: tm6000 and IR
Quoted 28 lines · On Fri, 17 Dec 2010 06:18:31 +0100 Stefan Ringel <[email protected]> wrote:
Am 17.12.2010 02:46, schrieb Dmitri Belimov:
Quoted 27 lines
Hi Stefan
Quoted 25 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 8 lines
Quoted 7 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
TheRC_MAP_NEC_TERRATEC_CINERGY_XSused only in tm6000 module. My patch didn't kill support any other devices.That is not true.
I search "RC_MAP_NEC_TERRATEC_CINERGY_XS" on FULL linux kernel sources. And found this string in:include/media/rc-map.h drivers/staging//tm6000/tm6000-cards.c drivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.c
No any other devices didn't use this keymap.
Quoted 17 lines
Quoted 17 lines
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers. And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
2. With your variant we have some keytables for one remote for different IR recevers. Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.
Quoted 5 lines
Quoted 4 lines
I think my variant much better.
With my best regards, Dmitry.
I think your variant is bad.
Mauro we need your opinion about this question.
With my best regards, Dmitry.
Quoted 12 lines
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Then the function call
usb_set_interfaceintm6000_video, can write for example:
stop_ir_pipeusb_set_interfacestart_ir_pipeOk, I'll try.
See dmesg. I was add function for start/stop interrupt urbs All works well.
With my best regards, Dmitry.
Re: tm6000 and IR
Hi Dmitri/Stefan,
Em 17-12-2010 05:08, Dmitri Belimov escreveu:
Quoted 63 lines
Quoted 28 lines · On Fri, 17 Dec 2010 06:18:31 +0100 Stefan Ringel <[email protected]> wrote:
Am 17.12.2010 02:46, schrieb Dmitri Belimov:
Quoted 27 lines
Hi Stefan
Quoted 25 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 8 lines
Quoted 7 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
TheRC_MAP_NEC_TERRATEC_CINERGY_XSused only in tm6000 module. My patch didn't kill support any other devices.That is not true.
I search "
RC_MAP_NEC_TERRATEC_CINERGY_XS" on FULL linux kernel sources. And found this string in:include/media/rc-map.hdrivers/staging//tm6000/tm6000-cards.cdrivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.cNo any other devices didn't use this keymap.
Quoted 17 lines
Quoted 17 lines
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers. And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
2. With your variant we have some keytables for one remote for different IR recevers. Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
I think my variant much better.
With my best regards, Dmitry.
I think your variant is bad.
Mauro we need your opinion about this question.
I'm c/c Jarod, as he has a similar issue with some NEC-based boards (Apple "variant").
I also have experienced some cases where the NEC protocol in-hardware decoder can provide only part of the NEC "extended" range.
I don't have a clear opinion about this issue, but I think that putting all our brains to think about that, we may have a solution for it.
Let me summarize the issues. Please complete/correct me if is there anything else.
1) NEC original format is 16 bits. However, some variants use 24 bits for it (it is called, currently, NEC extended). A few other manufacturers, like Apple, defines NEC protocol with 32 bits, removing both address and command checksums.
2) NEC raw decoder is capable of decoding the entire NEC code, but it only accepts 16 or 24 bits, returning the scan code as:
scancode = address << 8 | command;
for 16 bits, and:
scancode = address << 16 | not_address << 8 | command;
for 24 bits. There were some proposals to extend it to something like:
scancode = address << 24 | not_address << 16 | not_command << 8 | command; (or some other bit order)
Or just return the complete 32 bits even for the original NEC protocol. However, changing it will break the existing userspace decoding tables.
Another way would be to store the length of the scancode, using it as well during the scancode->keycode translation.
But no patches were merged yet.
3) Some hardware decoders can't return the complete NEC address. There are variants that returns 8 bits, others that returns 16 bits, and others that return the complete code.
For hardware that returns only 8 bits, we currently address the issue by using a scancode mask. When "scanmask" is set at the rc structs, the scancode->keycode logic will consider only the bits that are in the mask.
4) Some hardware filters the NEC address, returning only the codes for some specific vendors.
Despite all discussions, we didn't reach an agreement yet.
There are some points to consider whatever solution we do:
1) A keycode table should be able to work with a generic raw decoder. So, on all drivers, the bit order and the number of bits for a given protocol should be the same;
2) we should avoid to cause regressions on the existing definitions.
That's said, suggestions to meet the needs are welcome.
Thanks,
Mauro
Re: tm6000 and IR
Quoted 10 lines · Mauro Carvalho Chehab
Despite all discussions, we didn't reach an agreement yet.
There are some points to consider whatever solution we do:
1) A keycode table should be able to work with a generic raw decoder. So, on all drivers, the bit order and the number of bits for a given protocol should be the same;
2) we should avoid to cause regressions on the existing definitions.
That's said, suggestions to meet the needs are welcome.
Just to throw out some ideas:
It appears to me that what you are looking at are communications protocols with
a. a common Physical layer (PHY): a pulse distance protocol with a common carrier freq, bit symbol encoding, leader pulse, trailer pulse, and repeat sequence. The number of bits (and the leader pulse length?) is allowed to vary.
b. differing Data Link layers (LL): the data link address can be different lengths and in different places; so can the data payload, so can the checks on address and data payload.
For the end user, I would present each PHY/LL combination a different protocol. How the kernel implements it internally doesn't matter much. It could be one raw decoder handling all the PHY/LL combinations that it can, or one PHY decoder and several LL decoders.
The keytables should probably be working on cooked LL output from the raw decoder. I think that will handle a lot of the issues you mention. The output from a LL could include
destination address (from the transmitted code), source address (useful if different remotes can be detected), payload length,
payload, and
maybe button up/down.
The LL could swallow the automatic repeats, since they are just part of the button up/down scheme.
Aside from backward compatibility with existing keytables, I don't see much point in a decoder trying to flip bits from the PHY layer around to present a pseudo-PHY layer output. Don't keytables get updated with the kernel release anyway, or did they all move to userspace utils?
Anyway, just some thoughts.
Regards,
Andy
Quoted 2 lines
Thanks,
Mauro
Re: tm6000 and IR
Am 18.12.2010 14:56, schrieb Andy Walls:
Quoted 51 lines · Mauro Carvalho Chehab
Quoted 4 lines
Despite all discussions, we didn't reach an agreement yet.
Quoted 8 lines
There are some points to consider whatever solution we do:
1) A keycode table should be able to work with a generic raw decoder. So, on all drivers, the bit order and the number of bits for a given protocol should be the same;
2) we should avoid to cause regressions on the existing definitions.
That's said, suggestions to meet the needs are welcome.
Just to throw out some ideas:
It appears to me that what you are looking at are communications protocols with
a. a common Physical layer (PHY): a pulse distance protocol with a common carrier freq, bit symbol encoding, leader pulse, trailer pulse, and repeat sequence. The number of bits (and the leader pulse length?) is allowed to vary.
b. differing Data Link layers (LL): the data link address can be different lengths and in different places; so can the data payload, so can the checks on address and data payload.
For the end user, I would present each PHY/LL combination a different protocol. How the kernel implements it internally doesn't matter much. It could be one raw decoder handling all the PHY/LL combinations that it can, or one PHY decoder and several LL decoders.
The keytables should probably be working on cooked LL output from the raw decoder. I think that will handle a lot of the issues you mention. The output from a LL could include
destination address (from the transmitted code), source address (useful if different remotes can be detected), payload length,
payload, and
maybe button up/down.The LL could swallow the automatic repeats, since they are just part of the button up/down scheme.
Aside from backward compatibility with existing keytables, I don't see much point in a decoder trying to flip bits from the PHY layer around to present a pseudo-PHY layer output. Don't keytables get updated with the kernel release anyway, or did they all move to userspace utils?
Quoted 9 lines
Anyway, just some thoughts.
Regards,
AndyQuoted 2 lines
Thanks,
Mauro
TM5600, TM6000 and TM6010 IR
==========================
It give two ways to receive data
1. over the control pipe (ep0)
- polling must stop if it loads firmware
- data length are a byte (command)
2. over interrupt pipe (only TM6010)
- data length are two bytes (address << 8 | command)
It has any control registers to configure IR (protocol ...)
TM6010_REQ07_RD8_IR
??, we use 0x2f
TM6010_REQ07_RD8_IR_BSIZE
??
TM6010_REQ07_RD8_IR_WAKEUP_SEL
command mask, I think, we use here 0xff
TM6010_REQ07_RD8_IR_WAKEUP_ADD
address mask, we use 0xff
TM6010_REQ07_RD8_IR_LEADER1TM6010_REQ07_RD8_IR_LEADER0
is a 16bit register
for NEC 0xaa30
TM6010_REQ07_RD8_IR_PULSE_CNT1TM6010_REQ07_RD8_IR_PULSE_CNT0
is a 16bit register
for NEC 0x20d0
Stefan Ringel
Re: tm6000 and IR
In reply to Mauro Carvalho ChehabHi
If Apple use full 32-bit scancode we need full raw 32-bit keytable for compatibility.
For this need rework all keytables and all keyread function for add scanmask configuration and rework single byte scancode code -> key << 8.
Use scanmask and return IR reading bytes on real place.
For tm6000 don't need restore full scancode
Only address filter
scanmask = 0xff00ff00;
return byte[1] << 24 | byte[0] <<8
With my best regards, Dmitry.
Quoted 142 lines
Hi Dmitri/Stefan,
Em 17-12-2010 05:08, Dmitri Belimov escreveu:
Quoted 64 lines
Quoted 28 lines · On Fri, 17 Dec 2010 06:18:31 +0100 Stefan Ringel <[email protected]> wrote:
Am 17.12.2010 02:46, schrieb Dmitri Belimov:
Quoted 27 lines
Hi Stefan
Quoted 25 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 8 lines
Quoted 7 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
TheRC_MAP_NEC_TERRATEC_CINERGY_XSused only in tm6000 module. My patch didn't kill support any other devices.That is not true.
I search "
RC_MAP_NEC_TERRATEC_CINERGY_XS" on FULL linux kernel sources. And found this string in:include/media/rc-map.hdrivers/staging//tm6000/tm6000-cards.cdrivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.cNo any other devices didn't use this keymap.
Quoted 18 lines
Quoted 18 lines
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers. And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
2. With your variant we have some keytables for one remote for different IR recevers. Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
I think my variant much better.
With my best regards, Dmitry.
I think your variant is bad.
Mauro we need your opinion about this question.
I'm c/c Jarod, as he has a similar issue with some NEC-based boards (Apple "variant").
I also have experienced some cases where the NEC protocol in-hardware decoder can provide only part of the NEC "extended" range.
I don't have a clear opinion about this issue, but I think that putting all our brains to think about that, we may have a solution for it.
Let me summarize the issues. Please complete/correct me if is there anything else.
1) NEC original format is 16 bits. However, some variants use 24 bits for it (it is called, currently, NEC extended). A few other manufacturers, like Apple, defines NEC protocol with 32 bits, removing both address and command checksums.
2) NEC raw decoder is capable of decoding the entire NEC code, but it only accepts 16 or 24 bits, returning the scan code as:
scancode = address << 8 | command;for 16 bits, and:
scancode = address << 16 | not_address << 8 | command;for 24 bits. There were some proposals to extend it to something like:
scancode = address << 24 |
not_address<< 16 |not_command<<
8 | command; (or some other bit order)Or just return the complete 32 bits even for the original NEC protocol. However, changing it will break the existing userspace decoding tables.
Another way would be to store the length of the scancode, using it as well during the
scancode->keycodetranslation.But no patches were merged yet.
3) Some hardware decoders can't return the complete NEC address. There are variants that returns 8 bits, others that returns 16 bits, and others that return the complete code.
For hardware that returns only 8 bits, we currently address the issue by using a scancode mask. When "scanmask" is set at the rc structs, the
scancode->keycodelogic will consider only the bits that are in the mask.4) Some hardware filters the NEC address, returning only the codes for some specific vendors.
Despite all discussions, we didn't reach an agreement yet.
There are some points to consider whatever solution we do:
1) A keycode table should be able to work with a generic raw decoder. So, on all drivers, the bit order and the number of bits for a given protocol should be the same;
2) we should avoid to cause regressions on the existing definitions.
That's said, suggestions to meet the needs are welcome.
Thanks,
Mauro
Re: tm6000 and IR
Quoted 3 lines · Dmitri Belimov
Hi
If Apple use full 32-bit scancode we need full raw 32-bit keytable for compatibility.
The Apple format is two bytes for what I guess is vendor ID, one byte for pairing ID and one byte for the actual command. The actual keytable *could* get by with just one byte if you didn't care about pairing, two bytes if you do. But it can also use the full four bytes no problem.
I hacked together a proof-of-concept thing that *does* work for me, but its not the prettiest thing around:
http://git.kernel.org/?p=linux/kernel/git/jarod/linux-2.6-ir.git;a=shortlog;h=refs/heads/staging
Basically, while loading keys, keep track of the largest one in the table, and use that knowledge to figure out how to decode the signal. Doesn't take key removal into account at all though, and has other issues I'm probably forgetting right now. :)
Quoted 155 lines
For this need rework all keytables and all keyread function for add scanmask configuration and rework single byte scancode code -> key << 8.
Use scanmask and return IR reading bytes on real place.
For tm6000 don't need restore full scancode
Only address filterscanmask =
0xff00ff00;
return byte[1] << 24 | byte[0] <<8With my best regards, Dmitry.
Quoted 142 lines
Hi Dmitri/Stefan,
Em 17-12-2010 05:08, Dmitri Belimov escreveu:
Quoted 64 lines
Quoted 28 lines · On Fri, 17 Dec 2010 06:18:31 +0100 Stefan Ringel <[email protected]> wrote:
Am 17.12.2010 02:46, schrieb Dmitri Belimov:
Quoted 27 lines
Hi Stefan
Quoted 25 lines
Am 16.12.2010 10:38, schrieb Dmitri Belimov:
Quoted 24 lines
Hi
Quoted 8 lines
Quoted 7 lines
I think your mean is wrong. Our IR remotes send extended NEC it is 4 bytes. We removed inverted 4 byte and now we have 3 bytes from remotes. I think we must have full RCMAP with this 3 bytes from remotes. And use this remotes with some different IR recievers like some TV cards and LIRC-hardware and other. No need different RCMAP for the same remotes to different IR recievers like now.
Your change doesn't work with my terratec remote control !!
I found what happens. Try my new patch.
What about NEC. Original NEC send
address (inverted address) key (inverted key)
this is realy old standart now all remotes use extended NEC (adress high) (address low) key (inverted key)
The trident 5600/6000/6010 use old protocol but didn't test inverted address byte.I think much better discover really address value and write it to keytable. For your remotes I add low address byte. This value is incorrent but usefull for tm6000. When you found correct value update keytable.
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
That is not acceptable. Have you forgotten what Mauro have written? The Terratec rc map are use from other devices.
NO
TheRC_MAP_NEC_TERRATEC_CINERGY_XSused only in tm6000 module. My patch didn't kill support any other devices.That is not true.
I search "
RC_MAP_NEC_TERRATEC_CINERGY_XS" on FULL linux kernel sources. And found this string in:include/media/rc-map.hdrivers/staging//tm6000/tm6000-cards.cdrivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.cNo any other devices didn't use this keymap.
Quoted 18 lines
Quoted 18 lines
Quoted 4 lines
The best are only the
received data without additional data. And I think the Trident chip send only compatibly data (send all extended data like standard data). The device decoded the protocols not the driver.You can't use this remotes with normal working IR receivers because this receivers returned FULL scancodes. Need add one more keytable.
1. With my variant we have one keytable of remote and some workaround in device drivers. And can switch keytable and remotes on the fly (of course when keytable has really value and device driver has workaround)
2. With your variant we have some keytables for one remote for different IR recevers. Can't use incompatible keytable with other IR recievers. It is black magic for understanding what remotes is working with this hardware.
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
I think my variant much better.
With my best regards, Dmitry.
I think your variant is bad.
Mauro we need your opinion about this question.
I'm c/c Jarod, as he has a similar issue with some NEC-based boards (Apple "variant").
I also have experienced some cases where the NEC protocol in-hardware decoder can provide only part of the NEC "extended" range.
I don't have a clear opinion about this issue, but I think that putting all our brains to think about that, we may have a solution for it.
Let me summarize the issues. Please complete/correct me if is there anything else.
1) NEC original format is 16 bits. However, some variants use 24 bits for it (it is called, currently, NEC extended). A few other manufacturers, like Apple, defines NEC protocol with 32 bits, removing both address and command checksums.
2) NEC raw decoder is capable of decoding the entire NEC code, but it only accepts 16 or 24 bits, returning the scan code as:
scancode = address << 8 | command;for 16 bits, and:
scancode = address << 16 | not_address << 8 | command;for 24 bits. There were some proposals to extend it to something like:
scancode = address << 24 |
not_address<< 16 |not_command<<
8 | command; (or some other bit order)Or just return the complete 32 bits even for the original NEC protocol. However, changing it will break the existing userspace decoding tables.
Another way would be to store the length of the scancode, using it as well during the
scancode->keycodetranslation.But no patches were merged yet.
3) Some hardware decoders can't return the complete NEC address. There are variants that returns 8 bits, others that returns 16 bits, and others that return the complete code.
For hardware that returns only 8 bits, we currently address the issue by using a scancode mask. When "scanmask" is set at the rc structs, the
scancode->keycodelogic will consider only the bits that are in the mask.4) Some hardware filters the NEC address, returning only the codes for some specific vendors.
Despite all discussions, we didn't reach an agreement yet.
There are some points to consider whatever solution we do:
1) A keycode table should be able to work with a generic raw decoder. So, on all drivers, the bit order and the number of bits for a given protocol should be the same;
2) we should avoid to cause regressions on the existing definitions.
That's said, suggestions to meet the needs are welcome.
Thanks,
Mauro
Signature · 2 lines
Jarod Wilson [email protected]
PATCH 1/1 Rework and fix IR
Hi
This patch didn't kill Stefan's remotes and just for upload my good part of code.
1. Add some code for show IR activity
2. Add filter for IR remotes
3. Split remotes to different types.
4. Fix stop interrupt pipe when isoc pipe started.
When we decide general way of IR I'll add support our remotes. For our customers I'll made custom temporary patch without this part.
drivers/staging/tm6000/TODO +2 -0
@@ -1,4 +1,6 @@ There a few things to do before putting this driver in production: + - IR NEC with tm5600/6000 TV cards + - IR RC5 with tm5600/6000/6010 TV cards - CodingStyle; - Fix audio; - Fix some panic/OOPS conditions.
drivers/staging/tm6000/tm6000-cards.c +41 -0
47 lines not on this page · raw message
drivers/staging/tm6000/tm6000-input.c +144 -53
276 lines not on this page · raw message
drivers/staging/tm6000/tm6000-video.c +5 -0
@@ -545,11 +545,16 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)/* De-allocates all pending stuff */ tm6000_uninit_isoc (dev); +/* Stop interrupt USB pipe */ +tm6000_ir_int_stop (dev);usb_set_interface (dev->udev, dev->isoc_in.bInterfaceNumber, dev->isoc_in.bAlternateSetting); +/* Start interrupt USB pipe */ +tm6000_ir_int_start (dev); + pipe =usb_rcvisocpipe (dev->udev, dev->isoc_in.endp->desc.bEndpointAddress &USB_ENDPOINT_NUMBER_MASK );
drivers/staging/tm6000/tm6000.h +3 -0
@@ -266,6 +266,7 @@ struct tm6000_fh {int tm6000_tuner_callback (void *ptr,int component,int command,int arg);int tm6000_xc5000_callback (void *ptr,int component,int command,int arg);int tm6000_cards_setup (struct tm6000_core *dev); +void tm6000_flash_led (struct tm6000_core *dev,u8 state);/* In tm6000-core.c */
@@ -332,6 +333,8 @@ int tm6000_queue_init(struct tm6000_core *dev);int tm6000_ir_init (struct tm6000_core *dev);int tm6000_ir_fini (struct tm6000_core *dev);void tm6000_ir_wait (struct tm6000_core *dev,u8 state); +int tm6000_ir_int_start (struct tm6000_core *dev); +void tm6000_ir_int_stop (struct tm6000_core *dev);/* Debug stuff */
With my best regards, Dmitry.
drivers/staging/tm6000/TODO +2 -0
@@ -1,4 +1,6 @@ There a few things to do before putting this driver in production: + - IR NEC with tm5600/6000 TV cards + - IR RC5 with tm5600/6000/6010 TV cards - CodingStyle; - Fix audio; - Fix some panic/OOPS conditions.
drivers/staging/tm6000/tm6000-cards.c +41 -0
47 lines not on this page · raw message
drivers/staging/tm6000/tm6000-input.c +144 -53
276 lines not on this page · raw message
drivers/staging/tm6000/tm6000-video.c +5 -0
@@ -545,11 +545,16 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)/* De-allocates all pending stuff */ tm6000_uninit_isoc (dev); +/* Stop interrupt USB pipe */ +tm6000_ir_int_stop (dev);usb_set_interface (dev->udev, dev->isoc_in.bInterfaceNumber, dev->isoc_in.bAlternateSetting); +/* Start interrupt USB pipe */ +tm6000_ir_int_start (dev); + pipe =usb_rcvisocpipe (dev->udev, dev->isoc_in.endp->desc.bEndpointAddress &USB_ENDPOINT_NUMBER_MASK );
drivers/staging/tm6000/tm6000.h +3 -0
@@ -266,6 +266,7 @@ struct tm6000_fh {int tm6000_tuner_callback (void *ptr,int component,int command,int arg);int tm6000_xc5000_callback (void *ptr,int component,int command,int arg);int tm6000_cards_setup (struct tm6000_core *dev); +void tm6000_flash_led (struct tm6000_core *dev,u8 state);/* In tm6000-core.c */
@@ -332,6 +333,8 @@ int tm6000_queue_init(struct tm6000_core *dev);int tm6000_ir_init (struct tm6000_core *dev);int tm6000_ir_fini (struct tm6000_core *dev);void tm6000_ir_wait (struct tm6000_core *dev,u8 state); +int tm6000_ir_int_start (struct tm6000_core *dev); +void tm6000_ir_int_stop (struct tm6000_core *dev);/* Debug stuff */
PATCH 1/1 tm6000: rework init code
In reply to Mauro Carvalho ChehabHi
Rework device init part. Move common code part to a function. Usefull for register multiple devices like video, radio, vbi etc.
drivers/staging/tm6000/tm6000-video.c +36 -10
@@ -1450,29 +1450,55 @@ static struct video_device tm6000_template = {* ------------------------------------------------------------------ */ -int tm6000_v4l2_register (struct tm6000_core *dev) +static struct video_device *vdev_init (struct tm6000_core *dev, +const struct video_device + *template,const char *type_name) { -int ret =-1 ;struct video_device *vfd; vfd =video_device_alloc (); -if (!vfd) { +if (NULL == vfd) +return NULL ; + + *vfd = *template; + vfd->v4l2_dev = &dev->v4l2_dev; + vfd->release = video_device_release; + vfd->debug = tm6000_debug; + vfd->lock = &dev->lock; + +snprintf (vfd->name,sizeof (vfd->name),"%s %s" , dev->name, type_name); + +video_set_drvdata (vfd, dev); +return vfd; +} + +int tm6000_v4l2_register (struct tm6000_core *dev) +{ +int ret =-1 ; + + dev->vfd =vdev_init (dev, &tm6000_template,"video" ); + +if (!dev->vfd) { +printk (KERN_INFO "%s: can't register video device\n" , + dev->name);return -ENOMEM ; } - dev->vfd = vfd;/* init video dma queues */ INIT_LIST_HEAD (&dev->vidq.active);INIT_LIST_HEAD (&dev->vidq.queued); -memcpy (dev->vfd, &tm6000_template,sizeof (*(dev->vfd))); - dev->vfd->debug = tm6000_debug; - dev->vfd->lock = &dev->lock; + ret =video_register_device (dev->vfd,VFL_TYPE_GRABBER , video_nr); - vfd->v4l2_dev = &dev->v4l2_dev; -video_set_drvdata (vfd, dev); +if (ret <0 ) { +printk (KERN_INFO "%s: can't register video device\n" , + dev->name); +return ret; + } + +printk (KERN_INFO "%s: registered device %s\n" , + dev->name,video_device_node_name (dev->vfd)); - ret =video_register_device (dev->vfd,VFL_TYPE_GRABBER , video_nr);printk (KERN_INFO "Trident TVMaster TM5600/TM6000/TM6010 USB2 board (Load status: %d)\n" , ret);return ret; }
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-video.c +36 -10
65 lines not on this page · raw message
PATCH 1/1 tm6000: add/rework reg.defines
In reply to Mauro Carvalho ChehabHi
Rework registers defines. Add TM6000 specific registers defines. Add marks and comments for TM6010 specific registers.
drivers/staging/tm6000/tm6000-regs.h +60 -3
@@ -97,6 +97,34 @@ enum { TM6000_URB_MSG_ERR, }; +/* Define specific TM6000 Video decoder registers */ +#define TM6000_REQ07_RD8_TEST_SEL 0x07, 0xd8 +#define TM6000_REQ07_RD9_A_SIM_SEL 0x07, 0xd9 +#define TM6000_REQ07_RDA_CLK_SEL 0x07, 0xda +#define TM6000_REQ07_RDB_OUT_SEL 0x07, 0xdb +#define TM6000_REQ07_RDC_NSEL_I2S 0x07, 0xdc +#define TM6000_REQ07_RDD_GPIO2_MDRV 0x07, 0xdd +#define TM6000_REQ07_RDE_GPIO1_MDRV 0x07, 0xde +#define TM6000_REQ07_RDF_PWDOWN_ACLK 0x07, 0xdf +#define TM6000_REQ07_RE0_VADC_REF_CTL 0x07, 0xe0 +#define TM6000_REQ07_RE1_VADC_DACLIMP 0x07, 0xe1 +#define TM6000_REQ07_RE2_VADC_STATUS_CTL 0x07, 0xe2 +#define TM6000_REQ07_RE3_VADC_INP_LPF_SEL1 0x07, 0xe3 +#define TM6000_REQ07_RE4_VADC_TARGET1 0x07, 0xe4 +#define TM6000_REQ07_RE5_VADC_INP_LPF_SEL2 0x07, 0xe5 +#define TM6000_REQ07_RE6_VADC_TARGET2 0x07, 0xe6 +#define TM6000_REQ07_RE7_VADC_AGAIN_CTL 0x07, 0xe7 +#define TM6000_REQ07_RE8_VADC_PWDOWN_CTL 0x07, 0xe8 +#define TM6000_REQ07_RE9_VADC_INPUT_CTL1 0x07, 0xe9 +#define TM6000_REQ07_REA_VADC_INPUT_CTL2 0x07, 0xea +#define TM6000_REQ07_REB_VADC_AADC_MODE 0x07, 0xeb +#define TM6000_REQ07_REC_VADC_AADC_LVOL 0x07, 0xec +#define TM6000_REQ07_RED_VADC_AADC_RVOL 0x07, 0xed +#define TM6000_REQ07_REE_VADC_CTRL_SEL_CONTROL 0x07, 0xee +#define TM6000_REQ07_REF_VADC_GAIN_MAP_CTL 0x07, 0xef +#define TM6000_REQ07_RFD_BIST_ERR_VST_LOW 0x07, 0xfd +#define TM6000_REQ07_RFE_BIST_ERR_VST_HIGH 0x07, 0xfe +/* Define TM6000/TM6010 Video decoder registers */ #define TM6010_REQ07_R00_VIDEO_CONTROL0 0x07, 0x00#define TM6010_REQ07_R01_VIDEO_CONTROL1 0x07, 0x01
@@ -241,6 +269,7 @@ enum {#define TM6010_REQ07_RC9_VEND1 0x07, 0xc9#define TM6010_REQ07_RCA_VEND0 0x07, 0xca#define TM6010_REQ07_RCB_DELAY 0x07, 0xcb +/* ONLY for TM6010 */ #define TM6010_REQ07_RCC_ACTIVE_VIDEO_IF 0x07, 0xcc#define TM6010_REQ07_RD0_USB_PERIPHERY_CONTROL 0x07, 0xd0#define TM6010_REQ07_RD1_ADDR_FOR_REQ1 0x07, 0xd1
@@ -250,32 +279,59 @@ enum {#define TM6010_REQ07_RD5_POWERSAVE 0x07, 0xd5#define TM6010_REQ07_RD6_ENDP_REQ1_REQ2 0x07, 0xd6#define TM6010_REQ07_RD7_ENDP_REQ3_REQ4 0x07, 0xd7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR 0x07, 0xd8 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_BSIZE 0x07, 0xd9 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_WAKEUP_SEL 0x07, 0xda +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_WAKEUP_ADD 0x07, 0xdb +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_LEADER1 0x07, 0xdc +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_LEADER0 0x07, 0xdd +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_PULSE_CNT1 0x07, 0xde +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_PULSE_CNT0 0x07, 0xdf +/* ONLY for TM6010 */ #define TM6010_REQ07_RE0_DVIDEO_SOURCE 0x07, 0xe0 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE0_DVIDEO_SOURCE_IF 0x07, 0xe1 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE2_OUT_SEL2 0x07, 0xe2 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE3_OUT_SEL1 0x07, 0xe3 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE4_OUT_SEL0 0x07, 0xe4 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE5_REMOTE_WAKEUP 0x07, 0xe5 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE7_PUB_GPIO 0x07, 0xe7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE8_TYPESEL_MOS_I2S 0x07, 0xe8 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE9_TYPESEL_MOS_TS 0x07, 0xe9 +/* ONLY for TM6010 */ #define TM6010_REQ07_REA_TYPESEL_MOS_CCIR 0x07, 0xea +/* ONLY for TM6010 */ #define TM6010_REQ07_RF0_BIST_CRC_RESULT0 0x07, 0xf0 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF1_BIST_CRC_RESULT1 0x07, 0xf1 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF2_BIST_CRC_RESULT2 0x07, 0xf2 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF3_BIST_CRC_RESULT3 0x07, 0xf3 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF4_BIST_ERR_VST2 0x07, 0xf4 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF5_BIST_ERR_VST1 0x07, 0xf5 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF6_BIST_ERR_VST0 0x07, 0xf6 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF7_BIST 0x07, 0xf7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RFE_POWER_DOWN 0x07, 0xfe#define TM6010_REQ07_RFF_SOFT_RESET 0x07, 0xff
@@ -477,7 +533,8 @@ enum {#define TM6010_REQ05_RC4_DATA_FIFO14 0x05, 0xf8#define TM6010_REQ05_RC4_DATA_FIFO15 0x05, 0xfc -/* Define TM6000/TM6010 Audio decoder registers */ +/* Define TM6010 Audio decoder registers */ +/* This core available only in TM6010 */ #define TM6010_REQ08_R00_A_VERSION 0x08, 0x00#define TM6010_REQ08_R01_A_INIT 0x08, 0x01#define TM6010_REQ08_R02_A_FIX_GAIN_CTRL 0x08, 0x02
@@ -518,7 +575,7 @@ enum {#define TM6010_REQ08_R27_A_NOISE_AMP 0x08, 0x27#define TM6010_REQ08_R28_A_AUDIO_MODE_RES 0x08, 0x28 -/* Define TM6000/TM6010 Video ADC registers */ +/* Define TM6010 Video ADC registers */ #define TM6010_REQ08_RE0_ADC_REF 0x08, 0xe0#define TM6010_REQ08_RE1_DAC_CLMP 0x08, 0xe1#define TM6010_REQ08_RE2_POWER_DOWN_CTRL1 0x08, 0xe2
@@ -534,7 +591,7 @@ enum {#define TM6010_REQ08_REC_REVERSE_YC_CTRL 0x08, 0xec#define TM6010_REQ08_RED_GAIN_SEL 0x08, 0xed -/* Define TM6000/TM6010 Audio ADC registers */ +/* Define TM6010 Audio ADC registers */ #define TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG 0x08, 0xf0#define TM6010_REQ08_RF1_AADC_POWER_DOWN 0x08, 0xf1#define TM6010_REQ08_RF2_LEFT_CHANNEL_VOL 0x08, 0xf2
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-regs.h +60 -3
125 lines not on this page · raw message
Re: [PATCH] tm6000: add/rework reg.defines
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Am 20.01.2011 07:05, schrieb Dmitri Belimov:
Review
Quoted 6 lines
Hi
Rework registers defines. Add TM6000 specific registers defines. Add marks and comments for TM6010 specific registers.
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-regs.h
Quoted 135 lines
index 1f0ced8..5375a83 100644
drivers/staging/tm6000/tm6000-regs.h +60
-3@@ -97,6 +97,34 @@ enum { TM6000_URB_MSG_ERR, }; +/* Define specific TM6000 Video decoder registers */ +#define TM6000_REQ07_RD8_TEST_SEL 0x07, 0xd8 +#define TM6000_REQ07_RD9_A_SIM_SEL 0x07, 0xd9 +#define TM6000_REQ07_RDA_CLK_SEL 0x07, 0xda +#define TM6000_REQ07_RDB_OUT_SEL 0x07, 0xdb +#define TM6000_REQ07_RDC_NSEL_I2S 0x07, 0xdc +#define TM6000_REQ07_RDD_GPIO2_MDRV 0x07, 0xdd +#define TM6000_REQ07_RDE_GPIO1_MDRV 0x07, 0xde +#define TM6000_REQ07_RDF_PWDOWN_ACLK 0x07, 0xdf +#define TM6000_REQ07_RE0_VADC_REF_CTL 0x07, 0xe0 +#define TM6000_REQ07_RE1_VADC_DACLIMP 0x07, 0xe1 +#define TM6000_REQ07_RE2_VADC_STATUS_CTL 0x07, 0xe2 +#define TM6000_REQ07_RE3_VADC_INP_LPF_SEL1 0x07, 0xe3 +#define TM6000_REQ07_RE4_VADC_TARGET1 0x07, 0xe4 +#define TM6000_REQ07_RE5_VADC_INP_LPF_SEL2 0x07, 0xe5 +#define TM6000_REQ07_RE6_VADC_TARGET2 0x07, 0xe6 +#define TM6000_REQ07_RE7_VADC_AGAIN_CTL 0x07, 0xe7 +#define TM6000_REQ07_RE8_VADC_PWDOWN_CTL 0x07, 0xe8 +#define TM6000_REQ07_RE9_VADC_INPUT_CTL1 0x07, 0xe9 +#define TM6000_REQ07_REA_VADC_INPUT_CTL2 0x07, 0xea +#define TM6000_REQ07_REB_VADC_AADC_MODE 0x07, 0xeb +#define TM6000_REQ07_REC_VADC_AADC_LVOL 0x07, 0xec +#define TM6000_REQ07_RED_VADC_AADC_RVOL 0x07, 0xed +#define TM6000_REQ07_REE_VADC_CTRL_SEL_CONTROL 0x07, 0xee +#define TM6000_REQ07_REF_VADC_GAIN_MAP_CTL 0x07, 0xef +#define TM6000_REQ07_RFD_BIST_ERR_VST_LOW 0x07, 0xfd +#define TM6000_REQ07_RFE_BIST_ERR_VST_HIGH 0x07, 0xfe +/* Define TM6000/TM6010 Video decoder registers */ #define TM6010_REQ07_R00_VIDEO_CONTROL0 0x07, 0x00#define TM6010_REQ07_R01_VIDEO_CONTROL1 0x07, 0x01@@ -241,6 +269,7 @@ enum {#define TM6010_REQ07_RC9_VEND1 0x07, 0xc9#define TM6010_REQ07_RCA_VEND0 0x07, 0xca#define TM6010_REQ07_RCB_DELAY 0x07, 0xcb +/* ONLY for TM6010 */ #define TM6010_REQ07_RCC_ACTIVE_VIDEO_IF 0x07, 0xcc#define TM6010_REQ07_RD0_USB_PERIPHERY_CONTROL 0x07, 0xd0#define TM6010_REQ07_RD1_ADDR_FOR_REQ1 0x07, 0xd1@@ -250,32 +279,59 @@ enum {#define TM6010_REQ07_RD5_POWERSAVE 0x07, 0xd5#define TM6010_REQ07_RD6_ENDP_REQ1_REQ2 0x07, 0xd6#define TM6010_REQ07_RD7_ENDP_REQ3_REQ4 0x07, 0xd7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR 0x07, 0xd8 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_BSIZE 0x07, 0xd9 +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_WAKEUP_SEL 0x07, 0xda +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_WAKEUP_ADD 0x07, 0xdb +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_LEADER1 0x07, 0xdc +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_LEADER0 0x07, 0xdd +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_PULSE_CNT1 0x07, 0xde +/* ONLY for TM6010 */ #define TM6010_REQ07_RD8_IR_PULSE_CNT0 0x07, 0xdf +/* ONLY for TM6010 */ #define TM6010_REQ07_RE0_DVIDEO_SOURCE 0x07, 0xe0 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE0_DVIDEO_SOURCE_IF 0x07, 0xe1 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE2_OUT_SEL2 0x07, 0xe2 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE3_OUT_SEL1 0x07, 0xe3 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE4_OUT_SEL0 0x07, 0xe4 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE5_REMOTE_WAKEUP 0x07, 0xe5 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE7_PUB_GPIO 0x07, 0xe7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE8_TYPESEL_MOS_I2S 0x07, 0xe8 +/* ONLY for TM6010 */ #define TM6010_REQ07_RE9_TYPESEL_MOS_TS 0x07, 0xe9 +/* ONLY for TM6010 */ #define TM6010_REQ07_REA_TYPESEL_MOS_CCIR 0x07, 0xea +/* ONLY for TM6010 */ #define TM6010_REQ07_RF0_BIST_CRC_RESULT0 0x07, 0xf0 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF1_BIST_CRC_RESULT1 0x07, 0xf1 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF2_BIST_CRC_RESULT2 0x07, 0xf2 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF3_BIST_CRC_RESULT3 0x07, 0xf3 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF4_BIST_ERR_VST2 0x07, 0xf4 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF5_BIST_ERR_VST1 0x07, 0xf5 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF6_BIST_ERR_VST0 0x07, 0xf6 +/* ONLY for TM6010 */ #define TM6010_REQ07_RF7_BIST 0x07, 0xf7 +/* ONLY for TM6010 */ #define TM6010_REQ07_RFE_POWER_DOWN 0x07, 0xfe#define TM6010_REQ07_RFF_SOFT_RESET 0x07, 0xff@@ -477,7 +533,8 @@ enum {#define TM6010_REQ05_RC4_DATA_FIFO14 0x05, 0xf8#define TM6010_REQ05_RC4_DATA_FIFO15 0x05, 0xfc -/* Define TM6000/TM6010 Audio decoder registers */ +/* Define TM6010 Audio decoder registers */ +/* This core available only in TM6010 */ #define TM6010_REQ08_R00_A_VERSION 0x08, 0x00#define TM6010_REQ08_R01_A_INIT 0x08, 0x01#define TM6010_REQ08_R02_A_FIX_GAIN_CTRL 0x08, 0x02@@ -518,7 +575,7 @@ enum {#define TM6010_REQ08_R27_A_NOISE_AMP 0x08, 0x27#define TM6010_REQ08_R28_A_AUDIO_MODE_RES 0x08, 0x28 -/* Define TM6000/TM6010 Video ADC registers */ +/* Define TM6010 Video ADC registers */ #define TM6010_REQ08_RE0_ADC_REF 0x08, 0xe0#define TM6010_REQ08_RE1_DAC_CLMP 0x08, 0xe1#define TM6010_REQ08_RE2_POWER_DOWN_CTRL1 0x08, 0xe2@@ -534,7 +591,7 @@ enum {#define TM6010_REQ08_REC_REVERSE_YC_CTRL 0x08, 0xec#define TM6010_REQ08_RED_GAIN_SEL 0x08, 0xed -/* Define TM6000/TM6010 Audio ADC registers */ +/* Define TM6010 Audio ADC registers */ #define TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG 0x08, 0xf0#define TM6010_REQ08_RF1_AADC_POWER_DOWN 0x08, 0xf1#define TM6010_REQ08_RF2_LEFT_CHANNEL_VOL 0x08, 0xf2
Quoted 4 lines
Signed-off-by Beholder Intl. Ltd. Dmitry Belimov <[email protected]>With my best regards, Dmitry.
Dmitry, that are good news! And that anwers my questions. Now I think we must separate the both chipsets in any points:
* audio standards
* video standards
* in tm6000-alsa the functions " _tm6000_start_audio_dma" and "_tm6000_stop_audio_dma"
* in tm6000-input "tm6000_ir_config"
* in tm6000-core ?? "init_analog_mode" and "init_digital_mode"
* in tm6000-core "tm6000_set_audio_bitrate"
My rework in tm6000-video, isoc usb buffer and vbi device, I move this into summer 2011!!
Stefan Ringel
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iQEcBAEBAgAGBQJNOIxEAAoJEAWtPFjxMvFG3LQIAKlIMVWYTTPA5RD45Sw4QBQH I+yqhs89Qe7bKl+JjDrSiCG/ttRDtTy0+ksUFmicglntLmmtPVQnv59tIU9evQmn Yt7n1XWHcq442+ySbQ/3fVLay1WG1eJ3UEsC7bkpT2hSUhmUf6zjSZ3ockIJfxEJ geqFOy630vfwcKcS7KWgAJO8LKYQXcW8TLmkb3/D4W1G8o7zCKIH624Q5u+k1IGk mmm5CiqO17FS/oK0pxTZAY8uqWr3DH3UUqiMR3GdGoivaOR+1QCdrrYZXkQxklai zPQ6AYx/zPStZK8iUSSOHpVkfqHTgB3f6BSpsWhNGT3mgW8tTxnAz/MyECUiEms= =Cxjk
-----END PGP SIGNATURE-----
Re: [PATCH] tm6000: add/rework reg.defines
Hi Stefan
Quoted 3 lines
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
snip
Quoted 18 lines
Quoted 7 lines
#define
TM6010_REQ08_RF2_LEFT_CHANNEL_VOL0x08,0xf2Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov
<[email protected]>With my best regards, Dmitry.
Dmitry, that are good news! And that anwers my questions. Now I think we must separate the both chipsets in any points:
* audio standards
* video standards
* in tm6000-alsa the functions "_tm6000_start_audio_dma" and "_tm6000_stop_audio_dma"
* in tm6000-input "tm6000_ir_config"
* in tm6000-core ?? "init_analog_mode" and "init_digital_mode"
* in tm6000-core "tm6000_set_audio_bitrate"
Quoted 2 lines
My rework in tm6000-video, isoc usb buffer and vbi device, I move this into summer 2011!!
Ok. I work too. :)
I have Software Programmers Guide from Trident for TM6000 and TM6010 under NDA. If you have any question about any registers you can ask me.
With my best regards, Dmitry.
Quoted 14 lines
Stefan Ringel
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/iQEcBAEBAgAGBQJNOIxEAAoJEAWtPFjxMvFG3LQIAKlIMVWYTTPA5RD45Sw4QBQH I+yqhs89Qe7bKl+JjDrSiCG/ttRDtTy0+ksUFmicglntLmmtPVQnv59tIU9evQmn Yt7n1XWHcq442+ySbQ/3fVLay1WG1eJ3UEsC7bkpT2hSUhmUf6zjSZ3ockIJfxEJ geqFOy630vfwcKcS7KWgAJO8LKYQXcW8TLmkb3/D4W1G8o7zCKIH624Q5u+k1IGk mmm5CiqO17FS/oK0pxTZAY8uqWr3DH3UUqiMR3GdGoivaOR+1QCdrrYZXkQxklai zPQ6AYx/zPStZK8iUSSOHpVkfqHTgB3f6BSpsWhNGT3mgW8tTxnAz/MyECUiEms= =Cxjk
-----END PGP SIGNATURE-----
tm6000 and radio
In reply to Stefan RingelHi All
Now I have working radio for our TV cards based on tm6000 and xc5000. TV works too.
After some time I'll send my changes for discuss here.
With my best regards, Dmitry.
Re: tm6000 and radio
Em 17-02-2011 03:12, Dmitri Belimov escreveu:
Quoted 4 lines
Hi All
Now I have working radio for our TV cards based on tm6000 and xc5000. TV works too.
Great news! I think that the only remaining issue is audio that still doesn't work with some audio standards. The last time I tested here, PAL/M didn't work.
Quoted 8 lines
After some time I'll send my changes for discuss here.
With my best regards, Dmitry.
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/1 tm6000: add radio
Hi
Changes:
Add function tm6000_set_reg_mask for change some bits in regs. Very usefull, simplify some code with this function. Add control mute
Add control volume
Add control audio input MUX
Add support radio
Radio works well. TV works too
Known bugs:
The programm gnomeradio can't set freq for radio, it use old v4l API. Audio over USB works via arecord. The programm mplayer can set freq but no any audio
mplayer -v -rawaudio rate=48000 radio://105.2/capture driver=v4l2:alsa:adevice=hw.1,0:amode=1:audiorate=48000:forceaudio:immediatemode=0
When start watch TV very shortly after radio the kernel crashed hardly. Didn't stop all USB URBs, need some time for stop.
drivers/staging/tm6000/tm6000-alsa.c +4 -9
@@ -76,14 +76,11 @@ MODULE_PARM_DESC(debug, "enable debug messages");static int _tm6000_start_audio_dma (struct snd_tm6000_card *chip) {struct tm6000_core *core = chip->core; -int val;dprintk (1 ,"Starting audio DMA\n" );/* Enables audio */ - val =tm6000_get_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x0 ); - val |=0x20 ; -tm6000_set_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF , val); +tm6000_set_reg_mask (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x40 ,0x40 );tm6000_set_audio_bitrate (core,48000 );
@@ -98,13 +95,11 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip)static int _tm6000_stop_audio_dma (struct snd_tm6000_card *chip) {struct tm6000_core *core = chip->core; -int val; +dprintk (1 ,"Stopping audio DMA\n" ); -/* Enables audio */ - val =tm6000_get_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x0 ); - val &= ~0x20 ; -tm6000_set_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF , val); +/* Disables audio */ +tm6000_set_reg_mask (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x00 ,0x40 );tm6000_set_reg (core,TM6010_REQ08_R01_A_INIT ,0 );
drivers/staging/tm6000/tm6000-cards.c +9 -2
@@ -63,6 +63,8 @@ struct tm6000_board {char *name;struct tm6000_capabilities caps; +enum tm6000_inaudio aradio; +enum tm6000_inaudio avideo;enum tm6000_devtype type;/* variant of the chipset */ int tuner_type;/* type of the tuner */
@@ -227,6 +229,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -245,6 +249,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -644,13 +650,12 @@ static void tm6000_config_tuner(struct tm6000_core *dev)struct xc5000_config ctl = { .i2c_address = dev->tuner_addr, .if_khz =4570 , - .radio_input =XC5000_RADIO_FM1 , + .radio_input =XC5000_RADIO_FM1_MONO , }; xc5000_cfg.tuner =TUNER_XC5000 ; xc5000_cfg.priv = &ctl; -v4l2_device_call_all (&dev->v4l2_dev,0 , tuner, s_config, &xc5000_cfg); }
@@ -683,6 +688,8 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->caps = tm6000_boards[dev->model].caps; + dev->avideo = tm6000_boards[dev->model].avideo; + dev->aradio = tm6000_boards[dev->model].aradio;/* initialize hardware */ rc =tm6000_init (dev);if (rc <0 )
drivers/staging/tm6000/tm6000-core.c +228 -27
295 lines not on this page · raw message
drivers/staging/tm6000/tm6000-stds.c +19 -14
@@ -952,6 +952,22 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,uint8_t mono_flag =0 ;/* No mono */ uint8_t nicam_flag =0 ;/* No NICAM */ +if (dev->radio) { +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0x80 ); +tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); +tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); +tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); +tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x40 ); +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); +tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +return 0 ; + } +switch (std) {#if 0 case DK_MONO :
@@ -984,20 +1000,6 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,case EIAJ : areg_05 =0x02 ;break ; -case FM_RADIO : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); -return 0 ; -break ;case I_NICAM : areg_05 =0x08 ; nicam_flag =1 ;
@@ -1010,6 +1012,9 @@ static int tm6000_set_audio_std(struct tm6000_core *dev, areg_05 =0x0a ; nicam_flag =1 ;break ; +default : +/* do nothink */ +break ; }#if 0
drivers/staging/tm6000/tm6000-video.c +288 -39
463 lines not on this page · raw message
drivers/staging/tm6000/tm6000.h +22 -1
@@ -53,6 +53,14 @@ enum tm6000_devtype { TM6010, }; +enum tm6000_inaudio { +TM6000_AIP_UNK =0 , +TM6000_AIP_SIF1 , +TM6000_AIP_SIF2 , +TM6000_AIP_LINE1 , +TM6000_AIP_LINE2 , +}; +/* ------------------------------------------------------------------ * Basic structures * ------------------------------------------------------------------
@@ -174,6 +182,8 @@ struct tm6000_core {char *ir_codes; +__u8 radio; +/* Demodulator configuration */ int demod_addr;/* demodulator address */
@@ -194,6 +204,7 @@ struct tm6000_core {bool is_res_read;struct video_device *vfd; +struct video_device *radio_dev;struct tm6000_dmaqueue vidq;struct v4l2_device v4l2_dev;
@@ -203,6 +214,9 @@ struct tm6000_core {enum tm6000_mode mode; +int ctl_mute;/* audio */ +int ctl_volume; +/* DVB-T support */ struct tm6000_dvb *dvb;
@@ -210,7 +224,8 @@ struct tm6000_core {struct snd_tm6000_card *adev;struct work_struct wq_trigger;/* Trigger to start/stop audio for alsa module */ atomic_t stream_started;/* stream should be running if true */ - +enum tm6000_inaudio avideo; +enum tm6000_inaudio aradio;struct tm6000_IR *ir;
@@ -248,6 +263,7 @@ struct tm6000_ops {struct tm6000_fh {struct tm6000_core *dev; +unsigned int radio;/* video capture */ struct tm6000_fmt *fmt;
@@ -276,12 +292,17 @@ int tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);int tm6000_get_reg16 (struct tm6000_core *dev,u8 req,u16 value,u16 index);int tm6000_get_reg32 (struct tm6000_core *dev,u8 req,u16 value,u16 index);int tm6000_set_reg (struct tm6000_core *dev,u8 req,u16 value,u16 index); +int tm6000_set_reg_mask (struct tm6000_core *dev,u8 req,u16 value, +u16 index,u16 mask);int tm6000_i2c_reset (struct tm6000_core *dev,u16 tsleep);int tm6000_init (struct tm6000_core *dev);int tm6000_init_analog_mode (struct tm6000_core *dev);int tm6000_init_digital_mode (struct tm6000_core *dev);int tm6000_set_audio_bitrate (struct tm6000_core *dev,int bitrate); +int tm6000_set_audio_input (struct tm6000_core *dev,enum tm6000_inaudio ainp); +int tm6000_tvaudio_set_mute (struct tm6000_core *dev,u8 mute); +void tm6000_set_volume (struct tm6000_core *dev,int vol);int tm6000_v4l2_register (struct tm6000_core *dev);int tm6000_v4l2_unregister (struct tm6000_core *dev);
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-alsa.c +4 -9
@@ -76,14 +76,11 @@ MODULE_PARM_DESC(debug, "enable debug messages");static int _tm6000_start_audio_dma (struct snd_tm6000_card *chip) {struct tm6000_core *core = chip->core; -int val;dprintk (1 ,"Starting audio DMA\n" );/* Enables audio */ - val =tm6000_get_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x0 ); - val |=0x20 ; -tm6000_set_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF , val); +tm6000_set_reg_mask (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x40 ,0x40 );tm6000_set_audio_bitrate (core,48000 );
@@ -98,13 +95,11 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip)static int _tm6000_stop_audio_dma (struct snd_tm6000_card *chip) {struct tm6000_core *core = chip->core; -int val; +dprintk (1 ,"Stopping audio DMA\n" ); -/* Enables audio */ - val =tm6000_get_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x0 ); - val &= ~0x20 ; -tm6000_set_reg (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF , val); +/* Disables audio */ +tm6000_set_reg_mask (core,TM6010_REQ07_RCC_ACTIVE_VIDEO_IF ,0x00 ,0x40 );tm6000_set_reg (core,TM6010_REQ08_R01_A_INIT ,0 );
drivers/staging/tm6000/tm6000-cards.c +9 -2
@@ -63,6 +63,8 @@ struct tm6000_board {char *name;struct tm6000_capabilities caps; +enum tm6000_inaudio aradio; +enum tm6000_inaudio avideo;enum tm6000_devtype type;/* variant of the chipset */ int tuner_type;/* type of the tuner */
@@ -227,6 +229,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -245,6 +249,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -644,13 +650,12 @@ static void tm6000_config_tuner(struct tm6000_core *dev)struct xc5000_config ctl = { .i2c_address = dev->tuner_addr, .if_khz =4570 , - .radio_input =XC5000_RADIO_FM1 , + .radio_input =XC5000_RADIO_FM1_MONO , }; xc5000_cfg.tuner =TUNER_XC5000 ; xc5000_cfg.priv = &ctl; -v4l2_device_call_all (&dev->v4l2_dev,0 , tuner, s_config, &xc5000_cfg); }
@@ -683,6 +688,8 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->caps = tm6000_boards[dev->model].caps; + dev->avideo = tm6000_boards[dev->model].avideo; + dev->aradio = tm6000_boards[dev->model].aradio;/* initialize hardware */ rc =tm6000_init (dev);if (rc <0 )
drivers/staging/tm6000/tm6000-core.c +228 -27
295 lines not on this page · raw message
drivers/staging/tm6000/tm6000-stds.c +19 -14
@@ -952,6 +952,22 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,uint8_t mono_flag =0 ;/* No mono */ uint8_t nicam_flag =0 ;/* No NICAM */ +if (dev->radio) { +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0x80 ); +tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); +tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); +tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); +tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x40 ); +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); +tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +return 0 ; + } +switch (std) {#if 0 case DK_MONO :
@@ -984,20 +1000,6 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,case EIAJ : areg_05 =0x02 ;break ; -case FM_RADIO : -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); -return 0 ; -break ;case I_NICAM : areg_05 =0x08 ; nicam_flag =1 ;
@@ -1010,6 +1012,9 @@ static int tm6000_set_audio_std(struct tm6000_core *dev, areg_05 =0x0a ; nicam_flag =1 ;break ; +default : +/* do nothink */ +break ; }#if 0
drivers/staging/tm6000/tm6000-video.c +288 -39
463 lines not on this page · raw message
drivers/staging/tm6000/tm6000.h +22 -1
@@ -53,6 +53,14 @@ enum tm6000_devtype { TM6010, }; +enum tm6000_inaudio { +TM6000_AIP_UNK =0 , +TM6000_AIP_SIF1 , +TM6000_AIP_SIF2 , +TM6000_AIP_LINE1 , +TM6000_AIP_LINE2 , +}; +/* ------------------------------------------------------------------ * Basic structures * ------------------------------------------------------------------
@@ -174,6 +182,8 @@ struct tm6000_core {char *ir_codes; +__u8 radio; +/* Demodulator configuration */ int demod_addr;/* demodulator address */
@@ -194,6 +204,7 @@ struct tm6000_core {bool is_res_read;struct video_device *vfd; +struct video_device *radio_dev;struct tm6000_dmaqueue vidq;struct v4l2_device v4l2_dev;
@@ -203,6 +214,9 @@ struct tm6000_core {enum tm6000_mode mode; +int ctl_mute;/* audio */ +int ctl_volume; +/* DVB-T support */ struct tm6000_dvb *dvb;
@@ -210,7 +224,8 @@ struct tm6000_core {struct snd_tm6000_card *adev;struct work_struct wq_trigger;/* Trigger to start/stop audio for alsa module */ atomic_t stream_started;/* stream should be running if true */ - +enum tm6000_inaudio avideo; +enum tm6000_inaudio aradio;struct tm6000_IR *ir;
@@ -248,6 +263,7 @@ struct tm6000_ops {struct tm6000_fh {struct tm6000_core *dev; +unsigned int radio;/* video capture */ struct tm6000_fmt *fmt;
@@ -276,12 +292,17 @@ int tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);int tm6000_get_reg16 (struct tm6000_core *dev,u8 req,u16 value,u16 index);int tm6000_get_reg32 (struct tm6000_core *dev,u8 req,u16 value,u16 index);int tm6000_set_reg (struct tm6000_core *dev,u8 req,u16 value,u16 index); +int tm6000_set_reg_mask (struct tm6000_core *dev,u8 req,u16 value, +u16 index,u16 mask);int tm6000_i2c_reset (struct tm6000_core *dev,u16 tsleep);int tm6000_init (struct tm6000_core *dev);int tm6000_init_analog_mode (struct tm6000_core *dev);int tm6000_init_digital_mode (struct tm6000_core *dev);int tm6000_set_audio_bitrate (struct tm6000_core *dev,int bitrate); +int tm6000_set_audio_input (struct tm6000_core *dev,enum tm6000_inaudio ainp); +int tm6000_tvaudio_set_mute (struct tm6000_core *dev,u8 mute); +void tm6000_set_volume (struct tm6000_core *dev,int vol);int tm6000_v4l2_register (struct tm6000_core *dev);int tm6000_v4l2_unregister (struct tm6000_core *dev);
PATCH 1/1 tm6000: add audio conf for new cards
In reply to Mauro Carvalho ChehabHi
Add configuration of an audio for our new TV cards.
drivers/staging/tm6000/tm6000-cards.c +4 -0
@@ -324,6 +324,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -341,6 +343,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0,
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-cards.c +4 -0
@@ -324,6 +324,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -341,6 +343,8 @@ struct tm6000_board tm6000_boards[] = { .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, + .avideo = TM6000_AIP_SIF1, + .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0,
PATCH 1/1 tm6000: fix s-video input
In reply to Mauro Carvalho ChehabHi
Add compatibility for composite and s-video inputs. Some TV cards hasn't it.
Fix S-Video input, the s-video cable has only video signals no audio. Call the function of audio configure kill chroma in signal. only b/w video.
Known bugs:
after s-video the audio for radio didn't work, TV crashed hardly after composite TV crashed hardly too.
P.S. After this patch I'll want to rework the procedure of configure video. Now it has a lot of junk and dubles.
drivers/staging/tm6000/tm6000-cards.c +28 -18
@@ -235,11 +235,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,
@@ -255,11 +257,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,
@@ -327,10 +331,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,
@@ -346,10 +353,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,
drivers/staging/tm6000/tm6000-stds.c +0 -2
@@ -1161,8 +1161,6 @@ int tm6000_set_standard(struct tm6000_core *dev, v4l2_std_id * norm) rc =tm6000_load_std (dev, svideo_stds[i].common,sizeof (svideo_stds[i]. common)); -tm6000_set_audio_std (dev, svideo_stds[i].audio_default_std); - goto ret; } }
drivers/staging/tm6000/tm6000-video.c +13 -4
@@ -1080,18 +1080,27 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm)static int vidioc_enum_input (struct file *file,void *priv,struct v4l2_input *inp) { +struct tm6000_fh *fh = priv; +struct tm6000_core *dev = fh->dev; +switch (inp->index) {case TM6000_INPUT_TV : inp->type =V4L2_INPUT_TYPE_TUNER ;strcpy (inp->name,"Television" );break ;case TM6000_INPUT_COMPOSITE : - inp->type =V4L2_INPUT_TYPE_CAMERA ; -strcpy (inp->name,"Composite" ); +if (dev->caps.has_input_comp) { + inp->type =V4L2_INPUT_TYPE_CAMERA ; +strcpy (inp->name,"Composite" ); + }else +return -EINVAL ;break ;case TM6000_INPUT_SVIDEO : - inp->type =V4L2_INPUT_TYPE_CAMERA ; -strcpy (inp->name,"S-Video" ); +if (dev->caps.has_input_svid) { + inp->type =V4L2_INPUT_TYPE_CAMERA ; +strcpy (inp->name,"S-Video" ); + }else +return -EINVAL ;break ;default :return -EINVAL ;
drivers/staging/tm6000/tm6000.h +2 -0
@@ -129,6 +129,8 @@ struct tm6000_capabilities { unsigned int has_zl10353:1; unsigned int has_eeprom:1; unsigned int has_remote:1; + unsigned int has_input_comp:1; + unsigned int has_input_svid:1; };struct tm6000_dvb {
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-cards.c +28 -18
70 lines not on this page · raw message
drivers/staging/tm6000/tm6000-stds.c +0 -2
@@ -1161,8 +1161,6 @@ int tm6000_set_standard(struct tm6000_core *dev, v4l2_std_id * norm) rc =tm6000_load_std (dev, svideo_stds[i].common,sizeof (svideo_stds[i]. common)); -tm6000_set_audio_std (dev, svideo_stds[i].audio_default_std); - goto ret; } }
drivers/staging/tm6000/tm6000-video.c +13 -4
@@ -1080,18 +1080,27 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm)static int vidioc_enum_input (struct file *file,void *priv,struct v4l2_input *inp) { +struct tm6000_fh *fh = priv; +struct tm6000_core *dev = fh->dev; +switch (inp->index) {case TM6000_INPUT_TV : inp->type =V4L2_INPUT_TYPE_TUNER ;strcpy (inp->name,"Television" );break ;case TM6000_INPUT_COMPOSITE : - inp->type =V4L2_INPUT_TYPE_CAMERA ; -strcpy (inp->name,"Composite" ); +if (dev->caps.has_input_comp) { + inp->type =V4L2_INPUT_TYPE_CAMERA ; +strcpy (inp->name,"Composite" ); + }else +return -EINVAL ;break ;case TM6000_INPUT_SVIDEO : - inp->type =V4L2_INPUT_TYPE_CAMERA ; -strcpy (inp->name,"S-Video" ); +if (dev->caps.has_input_svid) { + inp->type =V4L2_INPUT_TYPE_CAMERA ; +strcpy (inp->name,"S-Video" ); + }else +return -EINVAL ;break ;default :return -EINVAL ;
drivers/staging/tm6000/tm6000.h +2 -0
@@ -129,6 +129,8 @@ struct tm6000_capabilities { unsigned int has_zl10353:1; unsigned int has_eeprom:1; unsigned int has_remote:1; + unsigned int has_input_comp:1; + unsigned int has_input_svid:1; };struct tm6000_dvb {
Re: [PATCH] tm6000: fix s-video input
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Am 18.03.2011 01:08, schrieb Dmitri Belimov:
Quoted 3 lines
Hi
Add compatibility for composite and s-video inputs. Some TV cards
hasn't it.
Quoted 1 line
Fix S-Video input, the s-video cable has only video signals no audio.
Call the function of audio configure kill chroma in signal. only b/w video.
Quoted 6 lines
Known bugs:
after s-video the audio for radio didn't work, TV crashed hardly after composite TV crashed hardly too.
P.S. After this patch I'll want to rework the procedure of configure
video. Now it has a lot of junk and dubles.
Quoted 1 line
Why you use caps to define video input and audio with avideo and/or aradio as flags? Better is , I think, we use a struct for edge virtual input (Video type (s-vhs, composite, tuner), video input pin (video port a, video port b or both), video mode gpio, audio type , audio input pin (adc 1, adc 2 or sif)). If we are called vidioc_s_input or radio_g_input setting input number. In tm6000_std.c we can use this input number and the input struct with the same number and can use all setting from here to set it.
Stefan Ringel
Review
Quoted 1 line
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-cards.c
Review
Quoted 78 lines
index 88144a1..146c7e8 100644
drivers/staging/tm6000/tm6000-cards.c +28
-18@@ -235,11 +235,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -255,11 +257,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -327,10 +331,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -346,10 +353,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-stds.c
drivers/staging/tm6000/tm6000-stds.c int tm6000_set_standard(struct tm6000_core *dev,
Quoted 4 lines
index a4c07e5..da3e51b 100644
drivers/staging/tm6000/tm6000-stds.c +0
-0@@ -1161,8 +1161,6 @@ int tm6000_set_standard(struct tm6000_core *dev,
v4l2_std_id * norm)
Review
Quoted 9 lines
drivers/staging/tm6000/tm6000-stds.c +0
-0rc = tm6000_load_std(dev, svideo_stds[i].common,sizeof(svideo_stds[i].
common));
-tm6000_set_audio_std(dev, svideo_stds[i].audio_default_std); -
goto ret;
}
}(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-video.c
drivers/staging/tm6000/tm6000-video.c static int vidioc_s_std (struct file *file,
Quoted 4 lines
index b550340..c80a316 100644
drivers/staging/tm6000/tm6000-video.c +0
-0@@ -1080,18 +1080,27 @@ static int vidioc_s_std (struct file *file,
void *priv, v4l2_std_id *norm)
Quoted 31 lines
drivers/staging/tm6000/tm6000-video.c +3
-0static int vidioc_enum_input (struct file *file,void *priv,struct v4l2_input *inp) { +struct tm6000_fh *fh = priv; +struct tm6000_core *dev = fh->dev; +switch (inp->index) {case
TM6000_INPUT_TV:inp->type=V4L2_INPUT_TYPE_TUNER;strcpy(inp->name, "Television");
break;
caseTM6000_INPUT_COMPOSITE:
-inp->type=V4L2_INPUT_TYPE_CAMERA;
-strcpy(inp->name, "Composite");
+ if (dev->caps.has_input_comp) {
+inp->type=V4L2_INPUT_TYPE_CAMERA;
+strcpy(inp->name, "Composite");
+ } else
+ return-EINVAL;
break;
caseTM6000_INPUT_SVIDEO:
-inp->type=V4L2_INPUT_TYPE_CAMERA;
-strcpy(inp->name, "S-Video");
+ if (dev->caps.has_input_svid) {
+inp->type=V4L2_INPUT_TYPE_CAMERA;
+strcpy(inp->name, "S-Video");
+ } else
+ return-EINVAL;
break;
default:
return-EINVAL;
Review
Quoted 1 line
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000.h
Quoted 13 lines
index ccd120f..99ae50e 100644
drivers/staging/tm6000/tm6000.h +2
-0@@ -129,6 +129,8 @@ struct tm6000_capabilities { unsigned int has_zl10353:1; unsigned int has_eeprom:1; unsigned int has_remote:1; + unsigned int has_input_comp:1; + unsigned int has_input_svid:1; };struct tm6000_dvb {
Quoted 3 lines
Signed-off-by Beholder Intl. Ltd. Dmitry Belimov <[email protected]>With my best regards, Dmitry.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iQEcBAEBAgAGBQJNhFFgAAoJEAWtPFjxMvFGATAH/RZnxOBnRF7bvpInTVcvDr3f siYCB6O+JKKLwA8dWzh5ejOi+cBcYWPqcgJcZ2s/0dedqEQ8/RVxGflrnYk66/vT KP3JkysbH3Nme9mE9AlSXSrCpGg6AG9u99SgyHkCJQKASkQX7dHg/prz4iMySIgi Ii05FHR2f5P5FmaH96eKjgzd8J8WSHe2excr07gKg2FL2bX8icnqt0Lz7S1/V0rQ ewdL9cOh+IBsIG8dOLBetB3rxlfEtheph7bHtBqJ2s9+yo9KVj8tynpGghgoNrAw ntDttbSrnCjcXaALKFfXBvAnv349jwbBLnyZU3PWjK560sdjg9bhLi515xYXwhM= =eldX
-----END PGP SIGNATURE-----
Re: [PATCH] tm6000: fix s-video input
Hi Stefan
Quoted 22 lines
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1Am 18.03.2011 01:08, schrieb Dmitri Belimov:
Quoted 3 lines
Hi
Add compatibility for composite and s-video inputs. Some TV cards
hasn't it.
Quoted 2 lines
Fix S-Video input, the s-video cable has only video signals no audio.
Call the function of audio configure kill chroma in signal. only b/w video.
Quoted 6 lines
Known bugs:
after s-video the audio for radio didn't work, TV crashed hardly after composite TV crashed hardly too.
P.S. After this patch I'll want to rework the procedure of configurevideo. Now it has a lot of junk and dubles.
Quoted 1 line
Quoted 8 lines
Why you use caps to define video input and audio with avideo and/or aradio as flags? Better is , I think, we use a struct for edge virtual input (Video type (s-vhs, composite, tuner), video input pin (video port a, video port b or both), video mode gpio, audio type , audio input pin (adc 1, adc 2 or sif)). If we are called
vidioc_s_inputorradio_g_inputsetting input number. Intm6000_std.cwe can use this input number and the input struct with the same number and can use all setting from here to set it.
It's very intresting but right now much better for me make full-working TV cards. You can rework this part of code as you want. Or we can do it togehter.
With my best regards, Dmitry.
Quoted 169 lines
Stefan Ringel
Review
Quoted 1 line
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-cards.cReview
Quoted 78 lines
index 88144a1..146c7e8 100644
drivers/staging/tm6000/tm6000-cards.c +28
-18@@ -235,11 +235,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -255,11 +257,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, - .has_remote = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 1, + .has_input_comp = 1, + .has_input_svid = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -327,10 +331,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 1, - .has_zl10353 = 1, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,@@ -346,10 +353,13 @@ struct tm6000_board tm6000_boards[] = { .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, .caps = { - .has_tuner = 1, - .has_dvb = 0, - .has_zl10353 = 0, - .has_eeprom = 1, + .has_tuner = 1, + .has_dvb = 0, + .has_zl10353 = 0, + .has_eeprom = 1, + .has_remote = 0, + .has_input_comp = 0, + .has_input_svid = 0, }, .gpio = { .tuner_reset = TM6010_GPIO_0,(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-stds.cdrivers/staging/tm6000/tm6000-stds.c int tm6000_set_standard(struct tm6000_core · line 1161
Quoted 5 lines
index a4c07e5..da3e51b 100644
drivers/staging/tm6000/tm6000-stds.c +0
-0@@ -1161,8 +1161,6 @@ int tm6000_set_standard(struct tm6000_core *dev,
v4l2_std_id* norm)Review
Quoted 9 lines
drivers/staging/tm6000/tm6000-stds.c +0
-0rc = tm6000_load_std(dev, svideo_stds[i].common,sizeof(svideo_stds[i].
common));
-tm6000_set_audio_std(dev, svideo_stds[i].audio_default_std); -
goto ret;
}
}(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000-video.cdrivers/staging/tm6000/tm6000-video.c static int vidioc_s_std (struct file *file,
Quoted 4 lines
index b550340..c80a316 100644
drivers/staging/tm6000/tm6000-video.c +0
-0@@ -1080,18 +1080,27 @@ static int vidioc_s_std (struct file *file,void *priv,
v4l2_std_id*norm)Quoted 31 lines
drivers/staging/tm6000/tm6000-video.c +3
-0static int vidioc_enum_input (struct file *file,void *priv,struct v4l2_input *inp) { +struct tm6000_fh *fh = priv; +struct tm6000_core *dev = fh->dev; +switch (inp->index) {case
TM6000_INPUT_TV:inp->type=V4L2_INPUT_TYPE_TUNER;strcpy(inp->name, "Television");
break;
caseTM6000_INPUT_COMPOSITE:
-inp->type=V4L2_INPUT_TYPE_CAMERA;
-strcpy(inp->name, "Composite");
+ if (dev->caps.has_input_comp) {
+inp->type=V4L2_INPUT_TYPE_CAMERA;
+strcpy(inp->name, "Composite");
+ } else
+ return-EINVAL;
break;
caseTM6000_INPUT_SVIDEO:
-inp->type=V4L2_INPUT_TYPE_CAMERA;
-strcpy(inp->name, "S-Video");
+ if (dev->caps.has_input_svid) {
+inp->type=V4L2_INPUT_TYPE_CAMERA;
+strcpy(inp->name, "S-Video");
+ } else
+ return-EINVAL;
break;
default:
return-EINVAL;Review
Quoted 1 line
(quoted diff) +0
-0
b/drivers/staging/tm6000/tm6000.hQuoted 13 lines
index ccd120f..99ae50e 100644
drivers/staging/tm6000/tm6000.h +2
-0@@ -129,6 +129,8 @@ struct tm6000_capabilities { unsigned int has_zl10353:1; unsigned int has_eeprom:1; unsigned int has_remote:1; + unsigned int has_input_comp:1; + unsigned int has_input_svid:1; };struct tm6000_dvb {Quoted 4 lines
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov
<[email protected]>With my best regards, Dmitry.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/iQEcBAEBAgAGBQJNhFFgAAoJEAWtPFjxMvFGATAH/RZnxOBnRF7bvpInTVcvDr3f siYCB6O+JKKLwA8dWzh5ejOi+cBcYWPqcgJcZ2s/0dedqEQ8/RVxGflrnYk66/vT KP3JkysbH3Nme9mE9AlSXSrCpGg6AG9u99SgyHkCJQKASkQX7dHg/prz4iMySIgi Ii05FHR2f5P5FmaH96eKjgzd8J8WSHe2excr07gKg2FL2bX8icnqt0Lz7S1/V0rQ ewdL9cOh+IBsIG8dOLBetB3rxlfEtheph7bHtBqJ2s9+yo9KVj8tynpGghgoNrAw ntDttbSrnCjcXaALKFfXBvAnv349jwbBLnyZU3PWjK560sdjg9bhLi515xYXwhM= =eldX
-----END PGP SIGNATURE-----
PATCH 1/1 tm6000: rework standards
In reply to Mauro Carvalho ChehabHi
Add audio configuration for composite input. Rework init process of the tm6010. Rework configure video standards.
drivers/staging/tm6000/tm6000-cards.c +6 -0
@@ -68,6 +68,7 @@ struct tm6000_board {struct tm6000_capabilities caps;enum tm6000_inaudio aradio;enum tm6000_inaudio avideo; +enum tm6000_inaudio acomposite;enum tm6000_devtype type;/* variant of the chipset */ int tuner_type;/* type of the tuner */
@@ -234,6 +235,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -256,6 +258,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -330,6 +333,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -352,6 +356,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -753,6 +758,7 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->avideo = tm6000_boards[dev->model].avideo; dev->aradio = tm6000_boards[dev->model].aradio; + dev->acomposite = tm6000_boards[dev->model].acomposite;/* initialize hardware */ rc =tm6000_init (dev);if (rc <0 )
drivers/staging/tm6000/tm6000-core.c +52 -69
197 lines not on this page · raw message
drivers/staging/tm6000/tm6000-stds.c +402 -1028
1,496 lines not on this page · raw message
drivers/staging/tm6000/tm6000-video.c +1 -0
@@ -1510,6 +1510,7 @@ static int tm6000_open(struct file *file)V4L2_FIELD_INTERLACED , sizeof(struct tm6000_buffer), fh, &dev->lock); +tm6000_init_demdec (dev);if (fh->radio) {dprintk (dev,V4L2_DEBUG_OPEN ,"video_open: setting radio device\n" );tm6000_set_audio_input (dev, dev->aradio);
drivers/staging/tm6000/tm6000.h +3 -0
@@ -228,6 +228,7 @@ struct tm6000_core {atomic_t stream_started;/* stream should be running if true */ enum tm6000_inaudio avideo;enum tm6000_inaudio aradio; +enum tm6000_inaudio acomposite;struct tm6000_IR *ir;
@@ -305,6 +306,8 @@ int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate);int tm6000_set_audio_input (struct tm6000_core *dev,enum tm6000_inaudio ainp);int tm6000_tvaudio_set_mute (struct tm6000_core *dev,u8 mute);void tm6000_set_volume (struct tm6000_core *dev,int vol); +void tm6000_init_demdec (struct tm6000_core *dev); +void tm6000_reset_demdec (struct tm6000_core *dev);int tm6000_v4l2_register (struct tm6000_core *dev);int tm6000_v4l2_unregister (struct tm6000_core *dev);
With my best regards, Dmitry.
drivers/staging/tm6000/tm6000-cards.c +6 -0
@@ -68,6 +68,7 @@ struct tm6000_board {struct tm6000_capabilities caps;enum tm6000_inaudio aradio;enum tm6000_inaudio avideo; +enum tm6000_inaudio acomposite;enum tm6000_devtype type;/* variant of the chipset */ int tuner_type;/* type of the tuner */
@@ -234,6 +235,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -256,6 +258,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -330,6 +333,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,
@@ -352,6 +356,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,
@@ -753,6 +758,7 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->avideo = tm6000_boards[dev->model].avideo; dev->aradio = tm6000_boards[dev->model].aradio; + dev->acomposite = tm6000_boards[dev->model].acomposite;/* initialize hardware */ rc =tm6000_init (dev);if (rc <0 )
drivers/staging/tm6000/tm6000-core.c +52 -69
197 lines not on this page · raw message
drivers/staging/tm6000/tm6000-stds.c +402 -1028
1,004 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.
Re: [PATCH v1] tm6000: rework standards
Am 19.04.2011 07:29, schrieb Dmitri Belimov:
Quoted 1,809 lines
Hi
Add audio configuration for composite input.
Rework init process of the tm6010.
Rework configure video standards.drivers/staging/tm6000/tm6000-cards.c +6
-0@@ -68,6 +68,7 @@ struct tm6000_board {struct tm6000_capabilities caps;enum tm6000_inaudio aradio;enum tm6000_inaudio avideo; +enum tm6000_inaudio acomposite;enum tm6000_devtype type;/* variant of the chipset */ int tuner_type;/* type of the tuner */ @@ -234,6 +235,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,@@ -256,6 +258,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,@@ -330,6 +333,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 1,@@ -352,6 +356,7 @@ struct tm6000_board tm6000_boards[] = { .type = TM6010, .avideo = TM6000_AIP_SIF1, .aradio = TM6000_AIP_LINE1, + .acomposite = TM6000_AIP_LINE2, .caps = { .has_tuner = 1, .has_dvb = 0,@@ -753,6 +758,7 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->avideo = tm6000_boards[dev->model].avideo; dev->aradio = tm6000_boards[dev->model].aradio; + dev->acomposite = tm6000_boards[dev->model].acomposite;/* initialize hardware */ rc =tm6000_init (dev);if (rc<0 )drivers/staging/tm6000/tm6000-core.c +52
-69@@ -201,68 +201,6 @@ void tm6000_set_fourcc_format(struct tm6000_core *dev) } } -static void tm6000_set_vbi (struct tm6000_core *dev) -{ -/* -* FIXME: -* VBI lines and start/end are different between 60Hz and 50Hz -* So, it is very likely that we need to change the config to -* something that takes it into account, doing something different -* if (dev->norm& V4L2_STD_525_60) -*/ - -if (dev->dev_type ==TM6010 ) { -tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ07_R41_TELETEXT_VBI_CODE1 ,0x27 ); -tm6000_set_reg (dev,TM6010_REQ07_R42_VBI_DATA_HIGH_LEVEL ,0x55 ); -tm6000_set_reg (dev,TM6010_REQ07_R43_VBI_DATA_TYPE_LINE7 ,0x66 ); -tm6000_set_reg (dev,TM6010_REQ07_R44_VBI_DATA_TYPE_LINE8 ,0x66 ); -tm6000_set_reg (dev,TM6010_REQ07_R45_VBI_DATA_TYPE_LINE9 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R46_VBI_DATA_TYPE_LINE10 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R47_VBI_DATA_TYPE_LINE11 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R48_VBI_DATA_TYPE_LINE12 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R49_VBI_DATA_TYPE_LINE13 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4A_VBI_DATA_TYPE_LINE14 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4B_VBI_DATA_TYPE_LINE15 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4C_VBI_DATA_TYPE_LINE16 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4D_VBI_DATA_TYPE_LINE17 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4E_VBI_DATA_TYPE_LINE18 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R4F_VBI_DATA_TYPE_LINE19 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R50_VBI_DATA_TYPE_LINE20 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R51_VBI_DATA_TYPE_LINE21 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R52_VBI_DATA_TYPE_LINE22 ,0x66 ); -tm6000_set_reg (dev, -TM6010_REQ07_R53_VBI_DATA_TYPE_LINE23 ,0x00 ); -tm6000_set_reg (dev, -TM6010_REQ07_R54_VBI_DATA_TYPE_RLINES ,0x00 ); -tm6000_set_reg (dev, -TM6010_REQ07_R55_VBI_LOOP_FILTER_GAIN ,0x01 ); -tm6000_set_reg (dev, -TM6010_REQ07_R56_VBI_LOOP_FILTER_I_GAIN ,0x00 ); -tm6000_set_reg (dev, -TM6010_REQ07_R57_VBI_LOOP_FILTER_P_GAIN ,0x02 ); -tm6000_set_reg (dev,TM6010_REQ07_R58_VBI_CAPTION_DTO1 ,0x35 ); -tm6000_set_reg (dev,TM6010_REQ07_R59_VBI_CAPTION_DTO0 ,0xa0 ); -tm6000_set_reg (dev,TM6010_REQ07_R5A_VBI_TELETEXT_DTO1 ,0x11 ); -tm6000_set_reg (dev,TM6010_REQ07_R5B_VBI_TELETEXT_DTO0 ,0x4c ); -tm6000_set_reg (dev,TM6010_REQ07_R40_TELETEXT_VBI_CODE0 ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x00 ); - } -} -int tm6000_init_analog_mode (struct tm6000_core *dev) {struct v4l2_frequency f;@@ -275,7 +213,6 @@ int tm6000_init_analog_mode(struct tm6000_core *dev)tm6000_set_reg_mask (dev,TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE ,0x00 ,0x40 );tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); - }else {/* Enables soft reset */ tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 );@@ -328,7 +265,6 @@ int tm6000_init_analog_mode(struct tm6000_core *dev)msleep (100 );tm6000_set_standard (dev,&dev->norm); -tm6000_set_vbi (dev);tm6000_set_audio_bitrate (dev,48000 );/* switch dvb led off */ @@ -504,12 +440,13 @@ struct reg_init tm6010_init_tab[] = { { TM6010_REQ07_R01_VIDEO_CONTROL1, 0x07 }, { TM6010_REQ07_R02_VIDEO_CONTROL2, 0x5f }, { TM6010_REQ07_R03_YC_SEP_CONTROL, 0x00 }, - { TM6010_REQ07_R05_NOISE_THRESHOLD, 0x64 }, + { TM6010_REQ07_R05_NOISE_THRESHOLD, 0x50 }, { TM6010_REQ07_R07_OUTPUT_CONTROL, 0x01 }, { TM6010_REQ07_R08_LUMA_CONTRAST_ADJ, 0x82 }, { TM6010_REQ07_R09_LUMA_BRIGHTNESS_ADJ, 0x36 }, { TM6010_REQ07_R0A_CHROMA_SATURATION_ADJ, 0x50 }, { TM6010_REQ07_R0C_CHROMA_AGC_CONTROL, 0x6a }, + { TM6010_REQ07_R0D_CHROMA_KILL_LEVEL, 0x17}, { TM6010_REQ07_R11_AGC_PEAK_CONTROL, 0xc9 }, { TM6010_REQ07_R12_AGC_GATE_STARTH, 0x07 }, { TM6010_REQ07_R13_AGC_GATE_STARTL, 0x3b },@@ -524,8 +461,8 @@ struct reg_init tm6010_init_tab[] = { { TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2, 0xcc }, { TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1, 0xcc }, { TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0, 0xcd }, - { TM6010_REQ07_R20_HSYNC_RISING_EDGE_TIME, 0x3c }, - { TM6010_REQ07_R21_HSYNC_PHASE_OFFSET, 0x3c }, + { TM6010_REQ07_R20_HSYNC_RISING_EDGE_TIME, 0x3e }, + { TM6010_REQ07_R21_HSYNC_PHASE_OFFSET, 0x3e }, { TM6010_REQ07_R2D_CHROMA_BURST_END, 0x48 }, { TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART, 0x88 }, { TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART, 0x22 },@@ -544,12 +481,18 @@ struct reg_init tm6010_init_tab[] = { { TM6010_REQ07_R57_VBI_LOOP_FILTER_P_GAIN, 0x02 }, { TM6010_REQ07_R58_VBI_CAPTION_DTO1, 0x35 }, { TM6010_REQ07_R59_VBI_CAPTION_DTO0, 0xa0 }, + { TM6010_REQ07_R5A_VBI_TELETEXT_DTO1, 0x11}, + { TM6010_REQ07_R5B_VBI_TELETEXT_DTO0, 0x4c}, + { TM6010_REQ07_R60_TELETEXT_FRAME_START, 0x52}, + { TM6010_REQ07_R68_VBI_TELETEXT_START, 0x32}, { TM6010_REQ07_R80_COMB_FILTER_TRESHOLD, 0x15 }, { TM6010_REQ07_R82_COMB_FILTER_CONFIG, 0x42 }, + { TM6010_REQ07_R83_CHROMA_LOCK_CONFIG, 0xa9}, { TM6010_REQ07_RC1_TRESHOLD, 0xd0 }, { TM6010_REQ07_RC3_HSTART1, 0x88 }, { TM6010_REQ07_R3F_RESET, 0x00 }, + { TM6010_REQ07_R3F_RESET, 0x00 }, { TM6010_REQ05_R18_IMASK7, 0x00 }, { TM6010_REQ07_RD8_IR_LEADER1, 0xaa },@@ -615,6 +558,38 @@ int tm6000_init(struct tm6000_core *dev)return rc; } +void tm6000_init_demdec (struct tm6000_core *dev) +{ +/* Set GCD2 to autogain */ +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +/* Reduce SIF amplitude */ +tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0x80 ); +/* Set autodetect threshold */ +tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); +/* Set auto-dematrix threshold */ +tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x40 ); +/* Set NICAM error limits max */ +tm6000_set_reg (dev,TM6010_REQ08_R1A_A_NICAM_SER_MAX ,0x64 ); +/* Set NICAM error limits min */ +tm6000_set_reg (dev,TM6010_REQ08_R1B_A_NICAM_SER_MIN ,0x20 ); +/* Set gain max +6dB */ +tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); +/* Set gain min -6dB */ +tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); +/* Enable ADC (always use) */ +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); +} +EXPORT_SYMBOL_GPL (tm6000_init_demdec); + +void tm6000_reset_demdec (struct tm6000_core *dev) +{ +/* Set DemDec to IDLE */ +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +/* Set DemDec to Restart */ +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +} +EXPORT_SYMBOL_GPL (tm6000_reset_demdec); +int tm6000_set_audio_bitrate (struct tm6000_core *dev,int bitrate) {int val =0 ;@@ -662,11 +637,13 @@ int tm6000_set_audio_input(struct tm6000_core *dev, enum tm6000_inaudio ainp)if (dev->dev_type ==TM6010 ) {/* Audio crossbar setting, default SIF1 */ u8 areg_f0 =0x03 ; +u8 areg_07 =0x10 ;switch (ainp) {case TM6000_AIP_SIF1 :case TM6000_AIP_SIF2 : areg_f0 =0x03 ; + areg_07 =0x30 ;break ;case TM6000_AIP_LINE1 : areg_f0 =0x00 ;@@ -681,6 +658,10 @@ int tm6000_set_audio_input(struct tm6000_core *dev, enum tm6000_inaudio ainp)/* Set audio input crossbar */ tm6000_set_reg_mask (dev,TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG , areg_f0,0x0f ); + +/* Mux overflow workaround */ +tm6000_set_reg_mask (dev,TM6010_REQ07_R07_OUTPUT_CONTROL , + areg_07,0xf0 ); }else {/* Audio setting, default LINE1 */ u8 areg_eb =0x00 ;@@ -802,8 +783,10 @@ void tm6000_set_volume(struct tm6000_core *dev, int vol)if (dev->radio) { ainp = dev->aradio; vol +=8 ;/* Offset to 0 dB */ - }else - ainp = dev->avideo; + }else if (dev->input !=TM6000_INPUT_COMPOSITE ) + ainp = dev->avideo; +else + ainp = dev->acomposite;switch (ainp) {case TM6000_AIP_SIF1 :drivers/staging/tm6000/tm6000-stds.c +402
-1028@@ -22,12 +22,6 @@#include "tm6000.h" #include "tm6000-regs.h" -struct tm6000_reg_settings { -unsigned char req; -unsigned char reg; -unsigned char value; -}; -enum tm6000_audio_std {BG_NICAM ,BTSC ,@@ -40,909 +34,6 @@ enum tm6000_audio_std { L_NICAM, }; -struct tm6000_std_tv_settings { -v4l2_std_id id; -enum tm6000_audio_std audio_default_std; - -struct tm6000_reg_settings sif[12 ]; -struct tm6000_reg_settings nosif[12 ]; -struct tm6000_reg_settings common[26 ]; -}; - -struct tm6000_std_settings { -v4l2_std_id id; -enum tm6000_audio_std audio_default_std; -struct tm6000_reg_settings common[37 ]; -}; - -static struct tm6000_std_tv_settings tv_stds[] = { - { - .id =V4L2_STD_PAL_M , - .audio_default_std =BTSC , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 }, - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x04 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x00 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x83 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x0a }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe0 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x20 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - - {0 ,0 ,0 }, - }, - }, { - .id = V4L2_STD_PAL_Nc, - .audio_default_std =BTSC , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 }, - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x36 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x91 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x1f }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x0c }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_PAL , - .audio_default_std =BG_A2 , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 } - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x32 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x25 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0xd5 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x63 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x50 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM_B |V4L2_STD_SECAM_G , - .audio_default_std =BG_NICAM , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 }, - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x38 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM_DK , - .audio_default_std =DK_NICAM , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 }, - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x38 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_NTSC , - .audio_default_std =BTSC , - .sif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x62 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfe }, - {TM6010_REQ07_RFE_POWER_DOWN ,0xcb }, - {0 ,0 ,0 }, - }, - .nosif = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x60 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - {0 ,0 ,0 }, - }, - .common = { - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x00 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0f }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x00 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x8b }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xa2 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe9 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x22 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x1c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdd }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - - {TM6010_REQ07_R3F_RESET ,0x00 }, - - {0 ,0 ,0 }, - }, - }, -}; - -static struct tm6000_std_settings composite_stds[] = { - { - .id =V4L2_STD_PAL_M , - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x04 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x00 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x83 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x0a }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe0 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x20 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id = V4L2_STD_PAL_Nc, - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x36 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x91 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x1f }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x0c }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_PAL , - .audio_default_std =BG_A2 , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x32 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x25 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0xd5 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x63 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x50 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM , - .audio_default_std =BG_NICAM , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x38 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM_DK , - .audio_default_std =DK_NICAM , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x38 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x02 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2c }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_NTSC , - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf1 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe8 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8b }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x00 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0f }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x00 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x8b }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xa2 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe9 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x22 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x1c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdd }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, -}; - -static struct tm6000_std_settings svideo_stds[] = { - { - .id =V4L2_STD_PAL_M , - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x05 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x04 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x83 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x0a }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe0 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x22 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id = V4L2_STD_PAL_Nc, - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x37 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x04 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x91 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x1f }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x0c }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x22 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_PAL , - .audio_default_std =BG_A2 , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x33 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x04 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x30 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x25 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0xd5 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0x63 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0x50 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2a }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x0c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x52 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdc }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM , - .audio_default_std =BG_NICAM , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x39 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x03 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2a }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_SECAM_DK , - .audio_default_std =DK_NICAM , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x39 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0e }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x03 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x31 }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x24 }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x92 }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xe8 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xed }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x8c }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x2a }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0xc1 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x2c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x18 }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0xFF }, - - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, { - .id =V4L2_STD_NTSC , - .audio_default_std =BTSC , - .common = { - {TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 }, - {TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc }, - {TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 }, - {TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 }, - {TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 }, - {TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 }, - {TM6010_REQ08_REC_REVERSE_YC_CTRL ,0xc2 }, - {TM6010_REQ08_RED_GAIN_SEL ,0xe0 }, - {TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG ,0x68 }, - {TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc }, - {TM6010_REQ07_RFE_POWER_DOWN ,0x8a }, - - {TM6010_REQ07_R3F_RESET ,0x01 }, - {TM6010_REQ07_R00_VIDEO_CONTROL0 ,0x01 }, - {TM6010_REQ07_R01_VIDEO_CONTROL1 ,0x0f }, - {TM6010_REQ07_R02_VIDEO_CONTROL2 ,0x5f }, - {TM6010_REQ07_R03_YC_SEP_CONTROL ,0x03 }, - {TM6010_REQ07_R07_OUTPUT_CONTROL ,0x30 }, - {TM6010_REQ07_R17_HLOOP_MAXSTATE ,0x8b }, - {TM6010_REQ07_R18_CHROMA_DTO_INCREMENT3 ,0x1e }, - {TM6010_REQ07_R19_CHROMA_DTO_INCREMENT2 ,0x8b }, - {TM6010_REQ07_R1A_CHROMA_DTO_INCREMENT1 ,0xa2 }, - {TM6010_REQ07_R1B_CHROMA_DTO_INCREMENT0 ,0xe9 }, - {TM6010_REQ07_R1C_HSYNC_DTO_INCREMENT3 ,0x1c }, - {TM6010_REQ07_R1D_HSYNC_DTO_INCREMENT2 ,0xcc }, - {TM6010_REQ07_R1E_HSYNC_DTO_INCREMENT1 ,0xcc }, - {TM6010_REQ07_R1F_HSYNC_DTO_INCREMENT0 ,0xcd }, - {TM6010_REQ07_R2E_ACTIVE_VIDEO_HSTART ,0x88 }, - {TM6010_REQ07_R30_ACTIVE_VIDEO_VSTART ,0x22 }, - {TM6010_REQ07_R31_ACTIVE_VIDEO_VHIGHT ,0x61 }, - {TM6010_REQ07_R33_VSYNC_HLOCK_MAX ,0x1c }, - {TM6010_REQ07_R35_VSYNC_AGC_MAX ,0x1c }, - {TM6010_REQ07_R82_COMB_FILTER_CONFIG ,0x42 }, - {TM6010_REQ07_R83_CHROMA_LOCK_CONFIG ,0x6F }, - - {TM6010_REQ07_R04_LUMA_HAGC_CONTROL ,0xdd }, - {TM6010_REQ07_R0D_CHROMA_KILL_LEVEL ,0x07 }, - {TM6010_REQ07_R3F_RESET ,0x00 }, - {0 ,0 ,0 }, - }, - }, -}; - -static int tm6000_set_audio_std (struct tm6000_core *dev,enum tm6000_audio_std std) {@@ -952,22 +43,6 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,uint8_t mono_flag =0 ;/* No mono */ uint8_t nicam_flag =0 ;/* No NICAM */ -if (dev->radio) { -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); -tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); -tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x40 ); -tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); -tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); -tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); -return 0 ; - } -switch (std) {#if 0 case DK_MONO :@@ -1012,6 +87,21 @@ static int tm6000_set_audio_std(struct tm6000_core *dev, areg_05 =0x0a ; nicam_flag =1 ;break ; +case FM_RADIO : +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL ,0x04 ); +tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0x80 ); +tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD ,0x0c ); +tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); +tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x18 ); +tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x0a ); +tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x40 ); +tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc ); +tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); +tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 ); +return 0 ; +break ;default :/* do nothink */ break ;@@ -1036,39 +126,10 @@ static int tm6000_set_audio_std(struct tm6000_core *dev,tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x00 );tm6000_set_reg (dev,TM6010_REQ08_R02_A_FIX_GAIN_CTRL , areg_02); -tm6000_set_reg (dev,TM6010_REQ08_R03_A_AUTO_GAIN_CTRL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R04_A_SIF_AMP_CTRL ,0xa0 );tm6000_set_reg (dev,TM6010_REQ08_R05_A_STANDARD_MOD , areg_05);tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD , areg_06); -tm6000_set_reg (dev,TM6010_REQ08_R07_A_LEFT_VOL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R08_A_RIGHT_VOL ,0x00 );tm6000_set_reg (dev,TM6010_REQ08_R09_A_MAIN_VOL ,0x08 ); -tm6000_set_reg (dev,TM6010_REQ08_R0A_A_I2S_MOD ,0x91 ); -tm6000_set_reg (dev,TM6010_REQ08_R0B_A_ASD_THRES1 ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R0C_A_ASD_THRES2 ,0x12 ); -tm6000_set_reg (dev,TM6010_REQ08_R0D_A_AMD_THRES ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R0E_A_MONO_THRES1 ,0xf0 ); -tm6000_set_reg (dev,TM6010_REQ08_R0F_A_MONO_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R10_A_MUTE_THRES1 ,0xc0 ); -tm6000_set_reg (dev,TM6010_REQ08_R11_A_MUTE_THRES2 ,0x80 ); -tm6000_set_reg (dev,TM6010_REQ08_R12_A_AGC_U ,0x12 ); -tm6000_set_reg (dev,TM6010_REQ08_R13_A_AGC_ERR_T ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R14_A_AGC_GAIN_INIT ,0x20 ); -tm6000_set_reg (dev,TM6010_REQ08_R15_A_AGC_STEP_THR ,0x14 ); -tm6000_set_reg (dev,TM6010_REQ08_R16_A_AGC_GAIN_MAX ,0xfe ); -tm6000_set_reg (dev,TM6010_REQ08_R17_A_AGC_GAIN_MIN ,0x01 ); -tm6000_set_reg (dev,TM6010_REQ08_R18_A_TR_CTRL ,0xa0 ); -tm6000_set_reg (dev,TM6010_REQ08_R19_A_FH_2FH_GAIN ,0x32 ); -tm6000_set_reg (dev,TM6010_REQ08_R1A_A_NICAM_SER_MAX ,0x64 ); -tm6000_set_reg (dev,TM6010_REQ08_R1B_A_NICAM_SER_MIN ,0x20 ); -tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1c ,0x00 ); -tm6000_set_reg (dev,REQ_08_SET_GET_AVREG_BIT ,0x1d ,0x00 );tm6000_set_reg (dev,TM6010_REQ08_R1E_A_GAIN_DEEMPH_OUT ,0x13 ); -tm6000_set_reg (dev,TM6010_REQ08_R1F_A_TEST_INTF_SEL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_R20_A_TEST_PIN_SEL ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf3 ); -tm6000_set_reg (dev,TM6010_REQ08_R06_A_SOUND_MOD ,0x00 ); -tm6000_set_reg (dev,TM6010_REQ08_RF1_AADC_POWER_DOWN ,0xfc );tm6000_set_reg (dev,TM6010_REQ08_R01_A_INIT ,0x80 );return 0 ;@@ -1085,106 +146,419 @@ void tm6000_get_std_res(struct tm6000_core *dev) dev->width =720 ; } -static int tm6000_load_std (struct tm6000_core *dev, -struct tm6000_reg_settings *set,int max_size) +int tm6000_config_video_input (struct tm6000_core *dev) { -int i, rc; - -/* Load board's initialization table */ -for (i =0 ; max_size; i++) { -if (!set[i].req) -return 0 ; - -if ((dev->dev_type !=TM6010 )&& - (set[i].req ==REQ_08_SET_GET_AVREG_BIT )) -continue ; - - rc =tm6000_set_reg (dev, set[i].req, set[i].reg, set[i].value); -if (rc<0 ) { -printk (KERN_ERR "Error %i while setting " -"req %d, reg %d to value %d\n" , - rc, set[i].req, set[i].reg, set[i].value); -return rc; - } +switch (dev->input) { +case TM6000_INPUT_TV : +/* Enable ADC2 (without clamp?) */ +tm6000_set_reg (dev,TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x08 ); +/* Power Up CLAMP, LPF BW = SIF mode */ +tm6000_set_reg (dev,TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf2 ); +/* Set ADC1 input = CVBS1 */ +tm6000_set_reg (dev,TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf8 ); +/* Set ADC2 input = SIF1 or SIF2 */ +tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL , + (dev->avideo ==TM6000_AIP_SIF1 ) ?0xf7 :0xf3 ); +/* Clamping level control in ADC2 = SIF signal */ +tm6000_set_reg (dev,TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf6 ); +/* SIF gain control enable signal = SIF signal */ +tm6000_set_reg (dev,TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xe0 ); +/* GAIN selection = Y and SIF */ +tm6000_set_reg (dev,TM6010_REQ08_RED_GAIN_SEL ,0xe8 ); +break ; +case TM6000_INPUT_SVIDEO : +/* Enable ADC2 */ +tm6000_set_reg (dev,TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x00 ); +/* Power Up CLAMP, LPF BW<> SIF mode */ +tm6000_set_reg (dev,TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 ); +/* Set ADC1 input = Y */ +tm6000_set_reg (dev,TM6010_REQ08_RE3_ADC_IN1_SEL ,0xfc ); +/* Set ADC2 input = C */ +tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL ,0xf8 ); +/* Clamping level control in ADC2 = C signal */ +tm6000_set_reg (dev,TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 ); +/* SIF gain control enable signal = C signal */ +tm6000_set_reg (dev,TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 ); +/* GAIN selection = Y and C */ +tm6000_set_reg (dev,TM6010_REQ08_RED_GAIN_SEL ,0xe0 ); +break ; +case TM6000_INPUT_COMPOSITE : +/* Set ADC1 input = CVBS2 */ +tm6000_set_reg (dev,TM6010_REQ08_RE3_ADC_IN1_SEL ,0xf4 ); +/* Power Up CLAMP, LPF BW<> SIF mode */ +tm6000_set_reg (dev,TM6010_REQ08_RE2_POWER_DOWN_CTRL1 ,0xf0 ); +/* Set ADC2 input = none */ +tm6000_set_reg (dev,TM6010_REQ08_RE4_ADC_IN2_SEL ,0xfc ); +/* Disable ADC2 */ +tm6000_set_reg (dev,TM6010_REQ08_RE6_POWER_DOWN_CTRL2 ,0x0f ); +/* Clamping level control in ADC2 = C signal */ +tm6000_set_reg (dev,TM6010_REQ08_REA_BUFF_DRV_CTRL ,0xf2 ); +/* SIF gain control enable signal = C signal */ +tm6000_set_reg (dev,TM6010_REQ08_REB_SIF_GAIN_CTRL ,0xf0 ); +/* GAIN selection = Y and C */ +tm6000_set_reg (dev,TM6010_REQ08_RED_GAIN_SEL ,0xe0 ); +/* Set audio input */ +tm6000_set_audio_input (dev, dev->acomposite); +tm6000_set_volume (dev, dev->ctl_volume); +break ; +default : +printk (KERN_ERR "Error video input source - %d\n" , dev->input); +return -EINVAL ; +break ; }return 0 ; } -static int tm6000_set_tv (struct tm6000_core *dev,int pos) +int tm6000_config_video_std (struct tm6000_core *dev,v4l2_std_id *norm) { -int rc; +int rc =0 ; +uint8_t k; +uint8_t areg_D5 =0x4f ; +uint16_t tm_regs[0x90 ]; +bool pal_fl = true; +bool f50hz_fl = true; + +memset (tm_regs,0xffff ,sizeof (tm_regs)); + + dev->norm = *norm; +tm6000_get_std_res (dev); -/* FIXME: This code is for tm6010 - not tested yet - doesn't work with -tm5600 -*/ +/* Chroma AGC target */ + tm_regs[0x0c ] =0x6a ; +/* HSYNC rising-edge occurrence time */ + tm_regs[0x20 ] =0x3e ; +/* backporch start/end */ + tm_regs[0x28 ] =0x22 ; + tm_regs[0x29 ] =0x4e ; +/* Chroma burst start/end */ + tm_regs[0x2c ] =0x2c ; + tm_regs[0x2d ] =0x48 ; +/* VSYNC H lockout start/end */ + tm_regs[0x32 ] =0x74 ; + tm_regs[0x33 ] =0x0c ; +/* VSYNC AGC lockout start/end */ + tm_regs[0x34 ] =0x74 ; + tm_regs[0x35 ] =0x1c ; +/* Comb filter config (PAL off) */ + tm_regs[0x82 ] =0x42 ; + +switch (*norm) { +case V4L2_STD_SECAM : +case V4L2_STD_SECAM_B : +case V4L2_STD_SECAM_G : +case V4L2_STD_SECAM_DK : +/* SECAM */ + tm_regs[0x00 ] =0x08 ; + tm_regs[0x01 ] =0x02 ; +/* Full 2-D adaptive comb */ + tm_regs[0x03 ] =0x00 ; +/* HAGC = 220 */ + tm_regs[0x04 ] =0xdc ; +/* DTO = 17.144 */ + tm_regs[0x18 ] =0x24 ; + tm_regs[0x19 ] =0x92 ; + tm_regs[0x1a ] =0xe8 ; + tm_regs[0x1b ] =0xed ; +/* backporch start/end */ + tm_regs[0x28 ] =0x42 ; + tm_regs[0x29 ] =0x62 ; +/* Chroma burst start/end */ + tm_regs[0x2c ] =0x44 ; + tm_regs[0x2d ] =0x60 ; +/* VSYNC H lockout start/end */ + tm_regs[0x32 ] =0x74 ; + tm_regs[0x33 ] =0x2c ; +/* VSYNC AGC lockout start/end */ + tm_regs[0x34 ] =0x74 ; + tm_regs[0x35 ] =0x18 ; + pal_fl = false; +break ; +case V4L2_STD_PAL : +/* PAL */ + tm_regs[0x00 ] =0x02 ; + tm_regs[0x01 ] =0x02 ; +/* PAL fix (basic luma notch comb filter) */ + tm_regs[0x03 ] =0x03 ; +/* HAGC = 220 */ + tm_regs[0x04 ] =0xdc ; +/* DTO = 17.734475 */ + tm_regs[0x18 ] =0x25 ; + tm_regs[0x19 ] =0xD5 ; + tm_regs[0x1a ] =0x63 ; + tm_regs[0x1b ] =0x50 ; +break ; +case V4L2_STD_PAL_N : +case V4L2_STD_PAL_M : +/* PAL MN */ + tm_regs[0x00 ] =0x04 ; + tm_regs[0x01 ] =0x02 ; +/* PAL fix (basic luma notch comb filter) */ + tm_regs[0x03 ] =0x03 ; +/* HAGC = 221 */ + tm_regs[0x04 ] =0xdd ; +/* DTO = 17.734475 */ + tm_regs[0x18 ] =0x25 ; + tm_regs[0x19 ] =0xD5 ; + tm_regs[0x1a ] =0x63 ; + tm_regs[0x1b ] =0x50 ; +break ; +case V4L2_STD_PAL_Nc: +/* PAL Nc */ + tm_regs[0x00 ] =0x06 ; + tm_regs[0x01 ] =0x02 ; +/* PAL fix (basic luma notch comb filter) */ + tm_regs[0x03 ] =0x03 ; +/* HAGC = 220 */ + tm_regs[0x04 ] =0xdc ; +/* DTO = 14.328225 */ + tm_regs[0x18 ] =0x1e ; + tm_regs[0x19 ] =0x91 ; + tm_regs[0x1a ] =0x1f ; + tm_regs[0x1b ] =0x0c ; +break ; +case V4L2_STD_PAL_60 : +/* PAL */ + tm_regs[0x00 ] =0x02 ; + tm_regs[0x01 ] =0x02 ; +/* PAL fix (basic luma notch comb filter) */ + tm_regs[0x03 ] =0x03 ; +/* HAGC = 220 */ + tm_regs[0x04 ] =0xdc ; +/* DTO = 17.734475 */ + tm_regs[0x18 ] =0x25 ; + tm_regs[0x19 ] =0xd5 ; + tm_regs[0x1a ] =0x63 ; + tm_regs[0x1b ] =0x50 ; +/* HSYNC rising-edge occurrence time */ + tm_regs[0x20 ] =0x4c ; + f50hz_fl = false; +break ; +case V4L2_STD_NTSC_M : +case V4L2_STD_NTSC_M_JP : +case V4L2_STD_NTSC_M_KR : +/* NTSC */ + tm_regs[0x00 ] =0x00 ; +/* Ped = 1 */ + tm_regs[0x01 ] =0x03 ; +/* Full 2-D adaptive comb */ + tm_regs[0x03 ] =0x00 ; +/* HAGC = 221 */ + tm_regs[0x04 ] =0xdd ; +/* Chroma AGC target */ + tm_regs[0x0c ] =0x8a ; +/* DTO = 14.31818182 */ + tm_regs[0x18 ] =0x1e ; + tm_regs[0x19 ] =0x8b ; + tm_regs[0x1a ] =0xa2 ; + tm_regs[0x1b ] =0xe9 ; + tm_regs[0x33 ] =0x1c ; + f50hz_fl = false; + pal_fl = false; +if (*norm ==V4L2_STD_NTSC_M_JP ) { +/* Ped = 0*/ + tm_regs[0x01 ] =0x02 ; +/* HAGC 205 */ + tm_regs[0x04 ] =0xcd ; + } +break ; +case V4L2_STD_NTSC_443 : +/* NTSC */ + tm_regs[0x00 ] =0x00 ; +/* Ped = 1 */ + tm_regs[0x01 ] =0x03 ; +/* Full 2-D adaptive comb */ + tm_regs[0x03 ] =0x00 ; +/* HAGC = 221 */ + tm_regs[0x04 ] =0xdd ; +/* Chroma AGC target */ + tm_regs[0x0c ] =0x8a ; +/* DTO = 17.734475 */ + tm_regs[0x18 ] =0x25 ; + tm_regs[0x19 ] =0xd5 ; + tm_regs[0x1a ] =0x63 ; + tm_regs[0x1b ] =0x50 ; + tm_regs[0x33 ] =0x1c ; + pal_fl = false; +break ; + } -/* FIXME: This is tuner-dependent */ -int nosif =0 ; +if (pal_fl) { +/* UV_FLT_EN = 1 */ + areg_D5 |=0x10 ; +/* comb_wide_band = 1 */ + tm_regs[0x82 ] |=0x10 ; + } -if (nosif) { - rc =tm6000_load_std (dev, tv_stds[pos].nosif, -sizeof (tv_stds[pos].nosif)); +if (f50hz_fl) { +/* vline_625 = 1, hpixel = 864 */ + tm_regs[0x00 ] |=0x30 ; +/* hactive_start = 138 */ + tm_regs[0x2e ] =0x8a ; +/* vactive_start = 42 */ + tm_regs[0x30 ] =0x2a ; +/* vactive_hight = 171 */ + tm_regs[0x31 ] =0xc1 ; +/* VBI FRAME CODE */ + tm_regs[0x41 ] =0x27 ; +/* data high level */ + tm_regs[0x42 ] =0x5e ; +/* vbil7 */ + tm_regs[0x43 ] =0x66 ; +/* vbil8 */ + tm_regs[0x44 ] =0x66 ; +/* vbil9 */ + tm_regs[0x45 ] =0x66 ; +/* vbil10 */ + tm_regs[0x46 ] =0x66 ; +/* vbil11 */ + tm_regs[0x47 ] =0x66 ; +/* vbil12 */ + tm_regs[0x48 ] =0x66 ; +/* vbil13 */ + tm_regs[0x49 ] =0x66 ; +/* vbil14 */ + tm_regs[0x4a ] =0x66 ; +/* vbil15 */ + tm_regs[0x4b ] =0x66 ; +/* vbil16 */ + tm_regs[0x4c ] =0x66 ; +/* vbil17 */ + tm_regs[0x4d ] =0x66 ; +/* vbil18 */ + tm_regs[0x4e ] =0x66 ; +/* vbil19 */ + tm_regs[0x4f ] =0x66 ; +/* vbil20 */ + tm_regs[0x50 ] =0x66 ; +/* vbil21 */ + tm_regs[0x51 ] =0x66 ; +/* vbil22 */ + tm_regs[0x52 ] =0x66 ; +/* vbil23 = WSS */ + tm_regs[0x53 ] =0x00 ; +/* vbil24 */ + tm_regs[0x54 ] =0x00 ; }else { - rc =tm6000_load_std (dev, tv_stds[pos].sif, -sizeof (tv_stds[pos].sif)); +/* vline_625 = 0, hpixel = 858 */ + tm_regs[0x00 ]&=0xcf ; +/* hactive_start = 134 */ + tm_regs[0x2e ] =0x86 ; +/* vactive_start = 34 */ + tm_regs[0x30 ] =0x22 ; +/* vactive_hight = 121 */ + tm_regs[0x31 ] =0x61 ; +/* VBI FRAME CODE */ + tm_regs[0x41 ] =0xe7 ; +/* data high level */ + tm_regs[0x42 ] =0x58 ; +/* vbil7 */ + tm_regs[0x43 ] =0x00 ; +/* vbil8 */ + tm_regs[0x44 ] =0x00 ; +/* vbil9 */ + tm_regs[0x45 ] =0x00 ; +/* vbil10 */ + tm_regs[0x46 ] =0x00 ; +/* vbil11 */ + tm_regs[0x47 ] =0x00 ; +/* vbil12 */ + tm_regs[0x48 ] =0x00 ; +/* vbil13 */ + tm_regs[0x49 ] =0x00 ; +/* vbil14 */ + tm_regs[0x4a ] =0x00 ; +/* vbil15 */ + tm_regs[0x4b ] =0x00 ; +/* vbil16 */ + tm_regs[0x4c ] =0x00 ; +/* vbil17 */ + tm_regs[0x4d ] =0x00 ; +/* vbil18 */ + tm_regs[0x4e ] =0x00 ; +/* vbil19 */ + tm_regs[0x4f ] =0x00 ; +/* vbil20 */ + tm_regs[0x50 ] =0x00 ; +/* vbil21 = CC */ + tm_regs[0x51 ] =0x11 ; +/* vbil22 */ + tm_regs[0x52 ] =0x00 ; +/* vbil23 */ + tm_regs[0x53 ] =0x00 ; +/* vbil24 */ + tm_regs[0x54 ] =0x00 ; + } + +if (dev->input ==TM6000_INPUT_SVIDEO ) { +/* Y_C = ON */ + tm_regs[0x00 ] |=0x01 ; +/* chroma_bw_lo = wide */ + tm_regs[0x01 ] |=0x04 ; +/* basic luma notch filter mode */ + tm_regs[0x03 ] =0x03 ; } -if (rc<0 ) -return rc; - rc =tm6000_load_std (dev, tv_stds[pos].common, -sizeof (tv_stds[pos].common)); -tm6000_set_audio_std (dev, tv_stds[pos].audio_default_std); +/* Set HV filter for PAL */ +tm6000_set_reg (dev,TM6010_REQ07_RD5_POWERSAVE , areg_D5); + +for (k =0 ; k<0x90 ; k++) { +if (tm_regs[k] !=0xffff ) { + rc =tm6000_set_reg (dev,0x07 , k, (uint8_t )tm_regs[k]); +if (rc<0 ) { +printk (KERN_ERR "Error %i while setting " +"req %d, reg %d to value %d\n" , + rc,0x07 , k, (uint8_t )tm_regs[k]); +return rc; + } + } + } -return rc; +/* TCD2 SW Reset ON */ +tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x01 ); +/* TCD2 SW Reset OFF */ +tm6000_set_reg (dev,TM6010_REQ07_R3F_RESET ,0x00 ); + +return 0 ; }int tm6000_set_standard (struct tm6000_core *dev,v4l2_std_id * norm) { -int i, rc =0 ; +int rc =0 ; dev->norm = *norm; -tm6000_get_std_res (dev); -switch (dev->input) { -case TM6000_INPUT_TV : -for (i =0 ; i<ARRAY_SIZE (tv_stds); i++) { -if (*norm& tv_stds[i].id) { - rc =tm6000_set_tv (dev, i); - goto ret; - } - } -return -EINVAL ; -case TM6000_INPUT_SVIDEO : -for (i =0 ; i<ARRAY_SIZE (svideo_stds); i++) { -if (*norm& svideo_stds[i].id) { - rc =tm6000_load_std (dev, svideo_stds[i].common, -sizeof (svideo_stds[i]. - common)); - goto ret; - } - } -return -EINVAL ; -case TM6000_INPUT_COMPOSITE : -for (i =0 ; i<ARRAY_SIZE (composite_stds); i++) { -if (*norm& composite_stds[i].id) { - rc =tm6000_load_std (dev, - composite_stds[i].common, -sizeof (composite_stds[i]. - common)); -tm6000_set_audio_std (dev, composite_stds[i].audio_default_std); - goto ret; - } - } -return -EINVAL ; - } + rc =tm6000_config_video_input (dev); +if (rc<0 ) +return rc; -ret: + rc =tm6000_config_video_std (dev, norm);if (rc<0 )return rc; -msleep (40 ); +if (dev->radio) { +tm6000_set_audio_std (dev,FM_RADIO ); +return 0 ; + } +switch (*norm) { +case V4L2_STD_PAL_M : +case V4L2_STD_PAL_N : +case V4L2_STD_PAL_Nc: +case V4L2_STD_NTSC : +tm6000_set_audio_std (dev,BTSC ); +break ; +case V4L2_STD_PAL : +tm6000_set_audio_std (dev,BG_A2 ); +break ; +case V4L2_STD_SECAM_B : +case V4L2_STD_SECAM_G : +tm6000_set_audio_std (dev,BG_NICAM ); +break ; +case V4L2_STD_SECAM_DK : +tm6000_set_audio_std (dev,DK_NICAM ); +break ; + }return 0 ; }drivers/staging/tm6000/tm6000-video.c +1
-0@@ -1510,6 +1510,7 @@ static int tm6000_open(struct file *file)V4L2_FIELD_INTERLACED , sizeof(struct tm6000_buffer), fh,&dev->lock); +tm6000_init_demdec (dev);if (fh->radio) {dprintk (dev,V4L2_DEBUG_OPEN ,"video_open: setting radio device\n" );tm6000_set_audio_input (dev, dev->aradio);drivers/staging/tm6000/tm6000.h +3
-0@@ -228,6 +228,7 @@ struct tm6000_core {atomic_t stream_started;/* stream should be running if true */ enum tm6000_inaudio avideo;enum tm6000_inaudio aradio; +enum tm6000_inaudio acomposite;struct tm6000_IR *ir;@@ -305,6 +306,8 @@ int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate);int tm6000_set_audio_input (struct tm6000_core *dev,enum tm6000_inaudio ainp);int tm6000_tvaudio_set_mute (struct tm6000_core *dev,u8 mute);void tm6000_set_volume (struct tm6000_core *dev,int vol); +void tm6000_init_demdec (struct tm6000_core *dev); +void tm6000_reset_demdec (struct tm6000_core *dev);int tm6000_v4l2_register (struct tm6000_core *dev);int tm6000_v4l2_unregister (struct tm6000_core *dev);
Quoted 4 lines
Signed-off-by Beholder Intl. Ltd. Dmitry Belimov<[email protected]>With my best regards, Dmitry.
Not bad. But what is if a device use two composite config (see TerraTec Grabstar)? Or Tuner is connected by other video port, or using gpio's to switch external audiodecoder ... Yours doesn't give answers to that. Then the audio standard is not complete the decoder can more
I have:
For video normPAL_BGH, SECAM_BGH -> BG_A2 and BG_NICAM -> mode 5 and 7 PAL_DK1, SECAM_DK1 -> DK1_A2 and DK_NICAM -> mode 9 and 6 PAL_DK3, SECAM_DK3 -> DK3_A2 and DK_NICAM -> mode b PAL_I , SECAM_I -> I_NICAM -> mode 8PAL_L, SECAM_L -> L_NICAM -> mode aNTSC_M, PAL-M, PAL_N -> BTSC -> mode 2 NTSC__M_JP -> EIAJ -> mode 3NTSC_M_KR -> Korea -> mode 4
for PAL_Nc -> only auto with carier (or ...) auto mode -> mode 1:
Re: [PATCH v1] tm6000: rework standards
Dmitri,
I have tested your patch, but is doesn't work (big crash -> long, long, long beep).