static void update_status(unsigned char clear) { static int xcntcnt, xcntsum; if(clear){ is_hdmi_mode = 0; horz_active = 0; vert_active = 0; is_interlace = 0; vfreq = 0; audio_status = 0; audio_sample_freq = 0; audio_channel_alloc = 0; xcntcnt = 0; xcntsum = 0; } else{ ULONG PCLK, HFreq; unsigned char sample_freq_idx, valid_ch; is_hdmi_mode = IsHDMIRXHDMIMode(); horz_active = getHDMIRXHorzActive(); vert_active = getHDMIRXVertActive(); is_interlace = IsHDMIRXInterlace(); xcntcnt ++ ; xcntsum += getHDMIRXxCnt() ; if( xcntcnt > 40 ) { xcntcnt /= 2 ; xcntsum /= 2 ; } PCLK = 27000L * 128; PCLK *= (ULONG) xcntcnt ; PCLK /= (ULONG) xcntsum ; PCLK *= 1000L ; // 100*PCLK ; HFreq = PCLK / (ULONG)getHDMIRXHorzTotal() ; // HFreq vfreq = (HFreq*100) / (ULONG)getHDMIRXVertTotal() ; // VFreq * 100 if(is_hdmi_mode!=0){ audio_status = getHDMIRXAudioStatus(); getHDMIRXAudioInfo(&sample_freq_idx, &valid_ch); audio_channel_alloc = valid_ch; switch(sample_freq_idx){ case 0x0: audio_sample_freq = 44100; break; case 0x2: audio_sample_freq = 48000; break; case 0x3: audio_sample_freq = 32000; break; case 0x8: audio_sample_freq = 88200; break; case 0xa: audio_sample_freq = 96000; break; case 0xc: audio_sample_freq = 176400; break; case 0xe: audio_sample_freq = 192000; break; case 0x9: printk("smaple freq for HBR\n"); audio_sample_freq = 768000; break; } if((audio_sample_freq != hdmirx_device.aud_info.real_sample_rate)|| (hdmirx_device.global_event&0x1)){ hdmirx_device.aud_info.real_sample_rate = audio_sample_freq; #ifdef CONFIG_AML_AUDIO_DSP if(hdmirx_device.vdin_started){ mailbox_send_audiodsp(1, M2B_IRQ0_DSP_AUDIO_EFFECT, DSP_CMD_SET_HDMI_SR, (char *)&hdmirx_device.aud_info.real_sample_rate,sizeof(hdmirx_device.aud_info.real_sample_rate)); hdmirx_device.global_event&=(~0x1); printk("[IT660x]%s: mailbox_send_audiodsp %d\n",__func__, hdmirx_device.aud_info.real_sample_rate); } #endif } } else{ audio_status = 0; audio_sample_freq = 0; audio_channel_alloc = 0; } } }
static void start_vdin(int width, int height, int frame_rate, int field_flag) { tvin_parm_t para; if(hdmirx_device.vdin_enable == 0){ return; } if(hdmirx_device.vdin_started){ if(hdmirx_device.cur_width != width || hdmirx_device.cur_height != height || hdmirx_device.cur_frame_rate != frame_rate){ stop_tvin_service(0); hdmirx_device.vdin_started=0; printk("%s: stop vdin\n", __func__); } } if(hdmirx_device.vdin_started==0 && width>0 && height>0 && frame_rate >0){ hdmirx_device.cur_width = width; hdmirx_device.cur_height = height; hdmirx_device.cur_frame_rate = frame_rate; #ifdef DEBUG_DVIN hs_pol_inv = 0; vs_pol_inv = height>480?0:1; de_pol_inv = 0; field_pol_inv = 0; ext_field_sel = 0; de_mode = 0; data_comp_map = 0; mode_422to444 = 0; dvin_clk_inv = 0; vs_hs_tim_ctrl = 0; hs_lead_vs_odd_min = 0; hs_lead_vs_odd_max = 0; active_start_pix_fe = getHDMIRXHorzBackPorch(); active_start_pix_fo = getHDMIRXHorzBackPorch(); active_start_line_fe = getHDMIRXVertSyncBackPorch(); active_start_line_fo = getHDMIRXVertSyncBackPorch(); line_width = getHDMIRXHorzTotal(); field_height = getHDMIRXVertTotal(); #endif if(field_flag && height <= 480 ){ config_dvin(0, //hs_pol_inv, 1, //vs_pol_inv, 0, //de_pol_inv, 0, //field_pol_inv, 0, //ext_field_sel, 2, //de_mode, 0, //data_comp_map, 0, //mode_422to444, 0, //dvin_clk_inv, 0, //vs_hs_tim_ctrl, 400, //hs_lead_vs_odd_min, 1200, //hs_lead_vs_odd_max, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fe, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fo, getHDMIRXVertSyncBackPorch(), //0x19, //active_start_line_fe, getHDMIRXVertSyncBackPorch(),//0x19, //active_start_line_fo, getHDMIRXHorzTotal(), //0x672, //line_width, getHDMIRXVertTotal() //0x2ee //field_height ); } else{ config_dvin(0, //hs_pol_inv, height>480?0:1, //vs_pol_inv, 0, //de_pol_inv, 0, //field_pol_inv, 0, //ext_field_sel, 0, //de_mode, 0, //data_comp_map, 0, //mode_422to444, 0, //dvin_clk_inv, 0, //vs_hs_tim_ctrl, 0, //hs_lead_vs_odd_min, 0, //hs_lead_vs_odd_max, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fe, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fo, getHDMIRXVertSyncBackPorch(), //0x19, //active_start_line_fe, getHDMIRXVertSyncBackPorch(),//0x19, //active_start_line_fo, getHDMIRXHorzTotal(), //0x672, //line_width, getHDMIRXVertTotal() //0x2ee //field_height ); } para.fmt_info.h_active = hdmirx_device.cur_width; para.fmt_info.v_active = hdmirx_device.cur_height; para.port = TVIN_PORT_DVIN0; if(field_flag){ para.fmt_info.v_active <<= 1; //if(height == 1080){ para.fmt_info.fmt = TVIN_SIG_FMT_HDMI_1920x1080I_60Hz; //} //else{ // para.fmt_info.fmt = TVIN_SIG_FMT_HDMI_1440x480I_60Hz; //} } else{ para.fmt_info.fmt = TVIN_SIG_FMT_MAX+1;//TVIN_SIG_FMT_MAX+1;TVIN_SIG_FMT_CAMERA_1280X720P_30Hz } para.fmt_info.frame_rate = frame_rate; para.fmt_info.hsync_phase = 1; para.fmt_info.vsync_phase = 0; start_tvin_service(0,¶); hdmirx_device.vdin_started = 1; printk("%s: %dx%d %d/s\n", __func__, width, height, frame_rate); hdmirx_device.aud_info.real_sample_rate = audio_sample_freq; #ifdef CONFIG_AML_AUDIO_DSP mailbox_send_audiodsp(1, M2B_IRQ0_DSP_AUDIO_EFFECT, DSP_CMD_SET_HDMI_SR, (char *)&hdmirx_device.aud_info.real_sample_rate,sizeof(hdmirx_device.aud_info.real_sample_rate)); printk("[IT660x]%s: mailbox_send_audiodsp %d\n",__func__, hdmirx_device.aud_info.real_sample_rate); #endif } }
static void start_vdin(int width, int height, int frame_rate, int field_flag) { #ifdef USE_TVIN_CAMERA tvin_parm_t para; #else vdin_parm_t para; #endif if(hdmirx_device.vdin_enable == 0){ return; } if(hdmirx_device.vdin_started){ if(hdmirx_device.cur_width != width || hdmirx_device.cur_height != height || hdmirx_device.cur_frame_rate != frame_rate){ stop_tvin_service(0); hdmirx_device.vdin_started=0; printk("%s: stop vdin\n", __func__); } } if(hdmirx_device.vdin_started==0 && width>0 && height>0 && frame_rate >0){ hdmirx_device.cur_width = width; hdmirx_device.cur_height = height; hdmirx_device.cur_frame_rate = frame_rate; if(field_flag && height <= (576/2) ){ config_dvin(0, //hs_pol_inv, 1, //vs_pol_inv, 0, //de_pol_inv, 0, //field_pol_inv, 0, //ext_field_sel, 3, //de_mode, 0, //data_comp_map, 0, //mode_422to444, 0, //dvin_clk_inv, 0, //vs_hs_tim_ctrl, 400, //hs_lead_vs_odd_min, 1200, //hs_lead_vs_odd_max, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fe, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fo, getHDMIRXVertSyncBackPorch(), //0x19, //active_start_line_fe, getHDMIRXVertSyncBackPorch(),//0x19, //active_start_line_fo, getHDMIRXHorzTotal(), //0x672, //line_width, getHDMIRXVertTotal() //0x2ee //field_height ); } else{ config_dvin(0, //hs_pol_inv, (field_flag && height>=540)?0:(height>576?0:1), //vs_pol_inv, 0, //de_pol_inv, (field_flag && height>=540)?1:0, //field_pol_inv, set to 1 for 1080i 0, //ext_field_sel, 3, //de_mode, 0, //data_comp_map, 0, //mode_422to444, 0, //dvin_clk_inv, 0, //vs_hs_tim_ctrl, 0, //hs_lead_vs_odd_min, 0, //hs_lead_vs_odd_max, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fe, getHDMIRXHorzBackPorch(),//0xdc, //active_start_pix_fo, getHDMIRXVertSyncBackPorch(), //0x19, //active_start_line_fe, getHDMIRXVertSyncBackPorch(),//0x19, //active_start_line_fo, getHDMIRXHorzTotal(), //0x672, //line_width, getHDMIRXVertTotal() //0x2ee //field_height ); } #ifdef USE_TVIN_CAMERA para.fmt_info.h_active = hdmirx_device.cur_width; para.fmt_info.v_active = hdmirx_device.cur_height; para.port = TVIN_PORT_DVIN0; if(field_flag){ para.fmt_info.v_active <<= 1; //if(height == 1080){ para.fmt_info.fmt = TVIN_SIG_FMT_HDMI_1920x1080I_60Hz; //} //else{ // para.fmt_info.fmt = TVIN_SIG_FMT_HDMI_1440x480I_60Hz; //} } else{ para.fmt_info.fmt = TVIN_SIG_FMT_MAX+1;//TVIN_SIG_FMT_MAX+1;TVIN_SIG_FMT_CAMERA_1280X720P_30Hz } para.fmt_info.frame_rate = frame_rate; para.fmt_info.hsync_phase = 1; para.fmt_info.vsync_phase = 0; #else memset( ¶, 0, sizeof(para)); para.port = TVIN_PORT_DVIN0; para.frame_rate = frame_rate; para.h_active = hdmirx_device.cur_width; para.v_active = hdmirx_device.cur_height; if(field_flag){ if(hdmirx_device.cur_width == 1920 && (hdmirx_device.cur_height == 1080 || hdmirx_device.cur_height == 540)){ para.fmt = TVIN_SIG_FMT_HDMI_1920X1080I_60HZ; para.v_active = 1080; } /* else if( hdmirx_device.cur_width == 720 && (hdmirx_device.cur_height == 576 || hdmirx_device.cur_height == 288)){ para.fmt = TVIN_SIG_FMT_HDMI_720X576I_50HZ; para.v_active = 576; set_invert_top_bot(true); } else if(hdmirx_device.cur_width == 1440 && (hdmirx_device.cur_height == 576 || hdmirx_device.cur_height == 288)){ para.fmt = TVIN_SIG_FMT_HDMI_1440X576I_50HZ; para.v_active = 576; set_invert_top_bot(true); } else if( hdmirx_device.cur_width == 720 && (hdmirx_device.cur_height == 480 || hdmirx_device.cur_height == 240)){ para.fmt = TVIN_SIG_FMT_HDMI_720X480I_60HZ; para.v_active = 480; set_invert_top_bot(true); } else if(hdmirx_device.cur_width == 1440 && (hdmirx_device.cur_height == 480 || hdmirx_device.cur_height == 240)){ para.fmt = TVIN_SIG_FMT_HDMI_1440X480I_60HZ; para.v_active = 480; set_invert_top_bot(true); }*/ else{ para.fmt = TVIN_SIG_FMT_MAX+1; set_invert_top_bot(true); } para.scan_mode = TVIN_SCAN_MODE_INTERLACED; } else{ if(hdmirx_device.cur_width == 1920 && hdmirx_device.cur_height == 1080){ para.fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ; } else if(hdmirx_device.cur_width == 1280 && hdmirx_device.cur_height == 720){ para.fmt = TVIN_SIG_FMT_HDMI_1280X720P_60HZ; } else if((hdmirx_device.cur_width == 1440 || hdmirx_device.cur_width == 720) && hdmirx_device.cur_height == 576){ para.fmt = TVIN_SIG_FMT_HDMI_720X576P_50HZ; } else if((hdmirx_device.cur_width == 1440 || hdmirx_device.cur_width == 720) && hdmirx_device.cur_height == 480){ para.fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ; } else{ para.fmt = TVIN_SIG_FMT_MAX+1; } para.scan_mode = TVIN_SCAN_MODE_PROGRESSIVE; } para.hsync_phase = 1; para.vsync_phase = 0; //para.hs_bp = 0; //para.vs_bp = 2; para.cfmt = TVIN_RGB444; para.reserved = 0; //skip_num #endif start_tvin_service(0,¶); hdmirx_device.vdin_started = 1; printk("%s: %dx%d %d/s\n", __func__, width, height, frame_rate); hdmirx_device.aud_info.real_sample_rate = audio_sample_freq; #ifdef CONFIG_AML_AUDIO_DSP mailbox_send_audiodsp(1, M2B_IRQ0_DSP_AUDIO_EFFECT, DSP_CMD_SET_HDMI_SR, (char *)&hdmirx_device.aud_info.real_sample_rate,sizeof(hdmirx_device.aud_info.real_sample_rate)); printk("[IT660x]%s: mailbox_send_audiodsp %d\n",__func__, hdmirx_device.aud_info.real_sample_rate); #endif } }