ID_MAX,
};
+static char *AUDIO_NAME[] = {
+ "I", "M", "DK", "BG"
+};
+
static unsigned int mix1_freq;
int snr_val;
int broad_std_except_pal_m;
/*atv_dmd_wr_byte(APB_BLOCK_ADDR_DAC_UPS, 0x01, 0x28);//pwd-out gain*/
/*atv_dmd_wr_byte(APB_BLOCK_ADDR_DAC_UPS, 0x04, 0xc0);//pwd-out offset*/
- aml_audio_valume_gain_set(audio_gain_val);
+ /* for audio non-standard signal, first set gain 0 to mute,
+ * then unmute in detection.
+ */
+ if (audio_atv_ov || atv_audio_overmodulated_en)
+ aml_audio_valume_gain_set(0);
+ else
+ aml_audio_valume_gain_set(audio_gain_val);
+
/* 20160121 fix audio demodulation over */
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2, 0x00, 0x1030501);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2, 0x04, 0x1900000);
carrier_amplif_val);
}
- if (audio_atv_ov) {
+ if (audio_atv_ov || atv_audio_overmodulated_en) {
+ reg = atv_dmd_rd_long(APB_BLOCK_ADDR_SIF_STG_2, 0);
+ reg = (reg & 0xffffff) | (1 << 24);
+ atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2, 0, reg);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x14, 0x8000015);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x18, 0x7ffff);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x1c, 0x0f000);
- atvaudio_ctrl_read(®);
- if (is_meson_tl1_cpu() || is_meson_tm2_cpu())
- atvaudio_ctrl_write(reg & (~0x100000));/* bit20 */
+
+ audio_source_select(0);
+
+ if (atv_audio_overmodulated_en)
+ audio_atv_ov_flag = 0;
else
- atvaudio_ctrl_write(reg & (~0x3));/* bit[1-0] */
- audio_atv_ov_flag = 1;
+ audio_atv_ov_flag = 1;
} else {
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x14, 0xf400000);
0x18, 0xc000);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x1c, 0x1f000);
- atvaudio_ctrl_read(®);
- if (is_meson_tl1_cpu() || is_meson_tm2_cpu())
- atvaudio_ctrl_write(reg | 0x100000);/* bit20 */
- else
- atvaudio_ctrl_write(reg | 0x3);/* bit[1-0] */
+
+ audio_source_select(1);
+
audio_atv_ov_flag = 0;
}
int lock = 0, line_lock = 0;
int broad_std_final = 0;
int num = 0, i = 0, final_id = 0;
- int delay_ms = 10, delay_ms_default = 10;
+ int delay_ms = 20, delay_ms_default = 20;
int cur_std = ID_PAL_DK;
bool secam_signal = false;
bool ntsc_signal = false;
atv_dmd_wr_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02, temp_data);
return broad_std;
}
+
/* ----------------read carrier_power--------------------- */
/* SIF_STG_2[0x09],address 0x03 */
- while (1) {
- if (num >= 4) {
- temp_data =
- atv_dmd_rd_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02);
- temp_data = temp_data & (~0x80);
- atv_dmd_wr_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02,
- temp_data);
- carrier_power_max = carrier_power_average[0];
- for (i = 0; i < ID_MAX; i++) {
- if (carrier_power_max
- < carrier_power_average[i]) {
- carrier_power_max =
- carrier_power_average[i];
- final_id = i;
- }
- }
-
- switch (final_id) {
- case ID_PAL_I:
- broad_std_final =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I;
- break;
- case ID_PAL_BG:
- broad_std_final =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG;
- break;
- case ID_PAL_M:
- broad_std_final =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M;
- break;
- case ID_PAL_DK:
- broad_std_final =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
- break;
- }
-
- carrier_power_average_max = carrier_power_max;
- broad_std = broad_std_final;
- pr_err("%s:broad_std:%d,carrier_power_average_max:%lu\n",
- __func__, broad_std, carrier_power_average_max);
-
- if (carrier_power_average_max < 150) {
- pr_err("%s,carrier too low error\n", __func__);
- if (secam_signal) {
- broad_std =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_L;
- pr_err("%s,set broad_std to SECAM_L\n",
- __func__);
- }
- }
-
- if (broad_std == AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M
- && pal_signal) {
- /*the max except palm*/
- carrier_power_average[final_id] = 0;
- final_id = 0;
- carrier_power_max = carrier_power_average[0];
- for (i = 0; i < ID_MAX; i++) {
- if (carrier_power_max
- < carrier_power_average[i]) {
- carrier_power_max =
- carrier_power_average[i];
- final_id = i;
- }
- }
-
- switch (final_id) {
- case ID_PAL_I:
- broad_std_except_pal_m =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I;
- break;
- case ID_PAL_BG:
- broad_std_except_pal_m =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG;
- break;
- case ID_PAL_DK:
- broad_std_except_pal_m =
- AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
- break;
- }
- /* pal signal and pal-m power max,
- * so set to second max std.
- */
- broad_std = broad_std_except_pal_m;
- pr_err("%s:pal signal and pal-m power max, set broad_std:%d\n",
- __func__, broad_std);
- }
-
- p->std = V4L2_COLOR_STD_PAL;
- switch (broad_std) {
- case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK:
- p->std |= V4L2_STD_PAL_DK;
- p->audmode = V4L2_STD_PAL_DK;
- break;
- case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I:
- p->std |= V4L2_STD_PAL_I;
- p->audmode = V4L2_STD_PAL_I;
- break;
- case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG:
- p->std |= V4L2_STD_PAL_BG;
- p->audmode = V4L2_STD_PAL_BG;
- break;
- case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M:
- p->std |= V4L2_STD_PAL_M;
- p->audmode = V4L2_STD_PAL_M;
- break;
- default:
- p->std |= V4L2_STD_PAL_DK;
- p->audmode = V4L2_STD_PAL_DK;
- }
-
- p->frequency += 1;
- params.frequency = p->frequency;
- params.mode = p->afc_range;
- params.audmode = p->audmode;
- params.std = p->std;
-
- fe->ops.analog_ops.set_params(fe, ¶ms);
-
- return broad_std;
- }
-
+ num = 0;
+ while (num < 4) {
switch (broad_std) {
case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK:
broad_std = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I;
delay_ms = delay_ms_default;
break;
-
default:
pr_err("unsupport broadcast_standard!!!\n");
break;
params.mode = p->afc_range;
params.audmode = p->audmode;
params.std = p->std;
- fe->ops.analog_ops.set_params(fe, ¶ms);
+ if (fe->ops.analog_ops.set_params)
+ fe->ops.analog_ops.set_params(fe, ¶ms);
/* enable audio detect function */
temp_data = atv_dmd_rd_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02);
}
carrier_power_max = 0;
- pr_err("[%s] [num:%d] [broad_std:%d] audio carrier power: %lu. @@@@@@@@@@\n",
- __func__, num, broad_std, carrier_power);
+ pr_err("[%s] [num:%d] [broad_std:%d] [%s] audio carrier power: %lu. @@@@@@@@@@\n",
+ __func__, num, broad_std, AUDIO_NAME[cur_std],
+ carrier_power);
carrier_power_average[cur_std] += carrier_power;
num++;
}
+ /* disable audio detect function */
+ temp_data = atv_dmd_rd_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02);
+ atv_dmd_wr_reg(APB_BLOCK_ADDR_SIF_STG_2, 0x02, temp_data & (~0x80));
+
+ carrier_power_max = carrier_power_average[0];
+ for (i = 0; i < ID_MAX; i++) {
+ if (carrier_power_max < carrier_power_average[i]) {
+ carrier_power_max = carrier_power_average[i];
+ final_id = i;
+ }
+ }
+
+ switch (final_id) {
+ case ID_PAL_I:
+ broad_std_final = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I;
+ break;
+ case ID_PAL_BG:
+ broad_std_final = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG;
+ break;
+ case ID_PAL_M:
+ broad_std_final = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M;
+ break;
+ case ID_PAL_DK:
+ broad_std_final = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
+ break;
+ }
+
+ carrier_power_average_max = carrier_power_max;
+ broad_std = broad_std_final;
+ pr_err("%s:broad_std:%d,carrier_power_average_max:%lu\n",
+ __func__, broad_std, carrier_power_average_max);
+
+ if (carrier_power_average_max < 150) {
+ pr_err("%s,carrier too low error\n", __func__);
+ if (secam_signal) {
+ broad_std =
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_L;
+ pr_err("%s,set broad_std to SECAM_L\n",
+ __func__);
+ }
+ }
+
+ if (broad_std == AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M && pal_signal) {
+ /*the max except palm*/
+ carrier_power_average[final_id] = 0;
+ final_id = 0;
+ carrier_power_max = carrier_power_average[0];
+ for (i = 0; i < ID_MAX; i++) {
+ if (carrier_power_max < carrier_power_average[i]) {
+ carrier_power_max = carrier_power_average[i];
+ final_id = i;
+ }
+ }
+
+ switch (final_id) {
+ case ID_PAL_I:
+ broad_std_except_pal_m =
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I;
+ break;
+ case ID_PAL_BG:
+ broad_std_except_pal_m =
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG;
+ break;
+ case ID_PAL_DK:
+ broad_std_except_pal_m =
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
+ break;
+ }
+
+ /* for non-standard signal */
+ if (broad_std_except_pal_m ==
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG &&
+ abs(carrier_power_average[ID_PAL_DK] -
+ carrier_power_average[ID_PAL_BG]) < 25)
+ broad_std_except_pal_m =
+ AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
+
+ /* pal signal and pal-m power max, so set to second max std. */
+ broad_std = broad_std_except_pal_m;
+ pr_err("%s:pal signal and pal-m power max, set broad_std:%d\n",
+ __func__, broad_std);
+ } else {
+ /* for non-standard signal */
+ if (carrier_power_average[ID_PAL_I] < 30 &&
+ carrier_power_average[ID_PAL_M] < 30 &&
+ carrier_power_average[ID_PAL_DK] < 30 &&
+ carrier_power_average[ID_PAL_BG] < 30 &&
+ pal_signal) {
+ broad_std = AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK;
+ pr_err("%s:power all < 30, set broad_std: PAL_DK\n",
+ __func__);
+ }
+ }
+
+ if (secam_signal)
+ p->std = V4L2_COLOR_STD_SECAM;
+ else if (ntsc_signal)
+ p->std = V4L2_COLOR_STD_NTSC;
+ else
+ p->std = V4L2_COLOR_STD_PAL;
+
+ switch (broad_std) {
+ case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK:
+ p->std |= V4L2_STD_PAL_DK;
+ p->audmode = V4L2_STD_PAL_DK;
+ break;
+ case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I:
+ p->std |= V4L2_STD_PAL_I;
+ p->audmode = V4L2_STD_PAL_I;
+ break;
+ case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG:
+ p->std |= V4L2_STD_PAL_BG;
+ p->audmode = V4L2_STD_PAL_BG;
+ break;
+ case AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M:
+ p->std |= V4L2_STD_PAL_M;
+ p->audmode = V4L2_STD_PAL_M;
+ break;
+ default:
+ p->std |= V4L2_STD_PAL_DK;
+ p->audmode = V4L2_STD_PAL_DK;
+ }
+
+ p->frequency += 1;
+ params.frequency = p->frequency;
+ params.mode = p->afc_range;
+ params.audmode = p->audmode;
+ params.std = p->std;
+ if (fe->ops.analog_ops.set_params)
+ fe->ops.analog_ops.set_params(fe, ¶ms);
+
return broad_std;
}
{
unsigned long tmp_v = 0;
unsigned long tmp_v1 = 0;
- unsigned int reg = 0;
u32 Broadcast_Standard = broad_std;
/* False entry on weak signal */
0x18, 0x7ffff);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x1c, 0x0f000);
- atvaudio_ctrl_read(®);
- if (is_meson_tl1_cpu() || is_meson_tm2_cpu()) {
- /* bit20 */
- atvaudio_ctrl_write(reg & (~0x100000));
- } else {
- /* bit[1-0] */
- atvaudio_ctrl_write(reg & (~0x3));
- }
- /* audio_atv_ov_flag = 1;*/ /* Enter and hold */
+
+ audio_source_select(0);
+
+ aml_audio_valume_gain_set(audio_gain_val);
+
+ audio_atv_ov_flag = 1;
pr_info("tmp_v[0x%lx] > 0x10 && audio_atv_ov_flag == 0.\n",
tmp_v);
- } else if (tmp_v <= 0x10 && audio_atv_ov_flag == 1) {
+ }
+#if 0 /* No need, Enter and hold */
+ else if (tmp_v <= 0x10 && audio_atv_ov_flag == 1) {
tmp_v1 = atv_dmd_rd_long(APB_BLOCK_ADDR_SIF_STG_2, 0);
tmp_v1 = (tmp_v1&0xffffff)|(0<<24);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2, 0, tmp_v1);
0x18, 0xc000);
atv_dmd_wr_long(APB_BLOCK_ADDR_SIF_STG_2,
0x1c, 0x1f000);
- atvaudio_ctrl_read(®);
- if (is_meson_tl1_cpu() || is_meson_tm2_cpu()) {
- /* bit20 */
- atvaudio_ctrl_write(reg | 0x100000);
- } else {
- /* bit[1-0] */
- atvaudio_ctrl_write(reg | 0x3);
- }
+
+ audio_source_select(1);
+
audio_atv_ov_flag = 0;
pr_info("tmp_v[0x%lx] <= 0x10 && audio_atv_ov_flag == 1.\n",
tmp_v);
}
+#endif
}
}