Ejemplo n.º 1
0
static void hdmi_tx_construct_aud_packet(
	struct hdmitx_audpara *audio_param, unsigned char *AUD_DB,
	unsigned char *CHAN_STAT_BUF, int hdmi_ch)
{
#ifndef PCM_USE_INFOFRAME
	if (audio_param->type == CT_PCM) {
		hdmi_print(INF, AUD "Audio Type: PCM\n");
		if (AUD_DB) {
			/*Note: HDMI Spec V1.4 Page 154*/
			if ((audio_param->channel_num == CC_2CH) ||
				(audio_param->channel_num ==
				CC_REFER_TO_STREAM))
				AUD_DB[0] = 0;
			else
				AUD_DB[0] = (0<<4)|(audio_param->channel_num);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[2] = 0x0;
			if (audio_param->channel_num == CC_6CH)
				AUD_DB[3] = 0xb;
			else if (audio_param->channel_num == CC_8CH) {
				if (hdmi_ch == CC_6CH)
					AUD_DB[3] = 0x0b;
				else
					AUD_DB[3] = 0x13;
			} else
				AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
		if (CHAN_STAT_BUF) {
			CHAN_STAT_BUF[2] = 0x10|(audio_param->channel_num+1);
			CHAN_STAT_BUF[24+2] = 0x20|(audio_param->channel_num+1);
			CHAN_STAT_BUF[3] = CHAN_STAT_BUF[24+3] =
				channel_status_freq[audio_param->sample_rate];
			CHAN_STAT_BUF[4] = CHAN_STAT_BUF[24+4] =
				channel_status_sample_word_length[
				audio_param->sample_size]|
				((~channel_status_freq[
				audio_param->sample_rate])<<4);
		}
	} else if (audio_param->type == CT_AC_3) {
		hdmi_print(INF, AUD "Audio Type: AC3\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_AC_3<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_MPEG1) {
		hdmi_print(INF, AUD "Audio Type: MPEG1\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_MPEG1<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_MP3) {
		hdmi_print(INF, AUD "Audio Type: MP3\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_MP3<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_MPEG2) {
		hdmi_print(INF, AUD "Audio Type: MPEG2\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_MPEG2<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_AAC) {
		hdmi_print(INF, AUD "Audio Type: AAC\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_AAC<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_DTS) {
		hdmi_print(INF, AUD "Audio Type: DTS\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_DTS<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_ATRAC) {
		hdmi_print(INF, AUD "Audio Type: ATRAC\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_ATRAC<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_ONE_BIT_AUDIO) {
		hdmi_print(INF, AUD "Audio Type: One Bit Audio\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_ONE_BIT_AUDIO<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_DOLBY_D) {
		hdmi_print(INF, AUD "Audio Type: Dobly Digital +\n");
		if (AUD_DB) {
			AUD_DB[0] =
				(FS_REFER_TO_STREAM<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
		if (CHAN_STAT_BUF) {
			CHAN_STAT_BUF[0] = CHAN_STAT_BUF[24+0] = 0x2;
			CHAN_STAT_BUF[3] = CHAN_STAT_BUF[24+3] = 0x1e;
			CHAN_STAT_BUF[4] = CHAN_STAT_BUF[24+4] = 0x1;
		}
	} else if (audio_param->type == CT_DTS_HD) {
		hdmi_print(INF, AUD "Audio Type: DTS-HD\n");
		if (AUD_DB) {
			AUD_DB[0] =
				(FS_REFER_TO_STREAM<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_MAT) {
		hdmi_print(INF, AUD "Audio Type: MAT(MLP)\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_MAT<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_DST) {
		hdmi_print(INF, AUD "Audio Type: DST\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_DST<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else if (audio_param->type == CT_WMA) {
		hdmi_print(INF, AUD "Audio Type: WMA Pro\n");
		if (AUD_DB) {
			AUD_DB[0] = (CT_WMA<<4)|(CC_REFER_TO_STREAM);
			AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
			AUD_DB[3] = 0;
			AUD_DB[4] = 0;
		}
	} else {
		;
	}
	AUD_DB[0] = AUD_DB[0] & 0xf;/*bit[7:4] always set to 0 in HDMI*/
	AUD_DB[1] = 0;		/*always set to 0 in HDMI*/
#endif
}
Ejemplo n.º 2
0
void mt8193_log_enable(unsigned short enable)
{
	MT8193_DRV_FUNC();

	if (enable == 0) {
		hdmi_print("hdmi_pll_log =   0x1\n");
		hdmi_print("hdmi_dgi_log =   0x2\n");
		hdmi_print("hdmi_plug_log =  0x4\n");
		hdmi_print("hdmi_video_log = 0x8\n");
		hdmi_print("hdmi_audio_log = 0x10\n");
		hdmi_print("hdmi_hdcp_log =  0x20\n");
		hdmi_print("hdmi_cec_log =   0x40\n");
		hdmi_print("hdmi_ddc_log =   0x80\n");
		hdmi_print("hdmi_edid_log =  0x100\n");
		hdmi_print("hdmi_drv_log =   0x200\n");

		hdmi_print("hdmi_all_log =   0xffff\n");

	}

	mt8193_log_on = enable;

}
Ejemplo n.º 3
0
void HDMI_power_on()
{
        set_gpio_mode(GPIOD_bank_bit0_9(6), GPIOD_bit_bit0_9(6), GPIO_OUTPUT_MODE);
        set_gpio_val(GPIOD_bank_bit0_9(6), GPIOD_bit_bit0_9(6), 1);
		 hdmi_print(1, "HDMI power on...\n");
}
Ejemplo n.º 4
0
static void hdmi_tx_construct_aud_packet(Hdmi_tx_audio_para_t* audio_param, unsigned char* AUD_DB, unsigned char* CHAN_STAT_BUF, int hdmi_ch)
{
#ifndef PCM_USE_INFOFRAME
    if(audio_param->type == CT_PCM){
        hdmi_print(INF, AUD "Audio Type: PCM\n");
        if(AUD_DB){
//Note: HDMI Spec V1.4 Page 154
            AUD_DB[0] = (CT_PCM<<4)|(audio_param->channel_num) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[2] = 0x0;
            if(audio_param->channel_num == CC_6CH)
                AUD_DB[3] = 0xb; //CA, 6 channel
            else if(audio_param->channel_num == CC_8CH){
                if(hdmi_ch == CC_6CH){
                    AUD_DB[3] = 0x0b; //CA, 6 channel
                }
                else{
                    AUD_DB[3] = 0x13; //CA, 8 channel
               }
            }
            else
                AUD_DB[3] = 0; //CA, 2 channel, default
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
        if(CHAN_STAT_BUF){
            CHAN_STAT_BUF[2]=0x10|(audio_param->channel_num+1);  CHAN_STAT_BUF[24+2]=0x20|(audio_param->channel_num+1);
            CHAN_STAT_BUF[3]=CHAN_STAT_BUF[24+3]=channel_status_freq[audio_param->sample_rate];
            CHAN_STAT_BUF[4]=CHAN_STAT_BUF[24+4]=channel_status_sample_word_length[audio_param->sample_size]|
                    ((~channel_status_freq[audio_param->sample_rate])<<4);
        }
    }
    else if(audio_param->type == CT_AC_3){
        hdmi_print(INF, AUD "Audio Type: AC3\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_AC_3<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_MPEG1){
        hdmi_print(INF, AUD "Audio Type: MPEG1\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_MPEG1<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_MP3){
        hdmi_print(INF, AUD "Audio Type: MP3\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_MP3<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_MPEG2){
        hdmi_print(INF, AUD "Audio Type: MPEG2\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_MPEG2<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_AAC){
        hdmi_print(INF, AUD "Audio Type: AAC\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_AAC<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_DTS){
        hdmi_print(INF, AUD "Audio Type: DTS\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_DTS<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_ATRAC){
        hdmi_print(INF, AUD "Audio Type: ATRAC\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_ATRAC<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_ONE_BIT_AUDIO){
        hdmi_print(INF, AUD "Audio Type: One Bit Audio\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_ONE_BIT_AUDIO<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_DOLBY_D){
        hdmi_print(INF, AUD "Audio Type: Dobly Digital +\n");
        if(AUD_DB){
            AUD_DB[0] = (FS_REFER_TO_STREAM<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
        if(CHAN_STAT_BUF){
            CHAN_STAT_BUF[0] = CHAN_STAT_BUF[24+0]= 0x2;
            CHAN_STAT_BUF[3] = CHAN_STAT_BUF[24+3]= 0x1e;
            CHAN_STAT_BUF[4] = CHAN_STAT_BUF[24+4]= 0x1;
        }
    }
    else if(audio_param->type == CT_DTS_HD){
        hdmi_print(INF, AUD "Audio Type: DTS-HD\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_DTS_HD<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_MAT){
        hdmi_print(INF, AUD "Audio Type: MAT(MLP)\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_MAT<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_DST){
        hdmi_print(INF, AUD "Audio Type: DST\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_DST<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else if(audio_param->type == CT_WMA){
        hdmi_print(INF, AUD "Audio Type: WMA Pro\n");
        if(AUD_DB){
            AUD_DB[0] = (CT_WMA<<4)|(CC_REFER_TO_STREAM) ;
            AUD_DB[1] = (FS_REFER_TO_STREAM<<2)|SS_REFER_TO_STREAM;
            AUD_DB[3] = 0; //CA, 2 channel
            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
        }
    }
    else
#endif
    {
//        if(AUD_DB){
//            AUD_DB[0] = (audio_param->type<<4)|audio_param->channel_num ;
//            AUD_DB[1] = (audio_param->sample_rate<<2)|audio_param->sample_size;
//            AUD_DB[3] = 0; //CA, 2 channel
//            AUD_DB[4] = 0;//DM_INH<<7|LSV<<3
//        }
//        if(CHAN_STAT_BUF){
//            CHAN_STAT_BUF[3]=CHAN_STAT_BUF[24+3]=channel_status_freq[audio_param->sample_rate];
//        }
    }
}
Ejemplo n.º 5
0
static int 
#else
static void
#endif
hdmi_task_handle(void *data) 
{
    extern void hdmitx_edid_ram_buffer_clear(hdmitx_dev_t*);
    hdmitx_dev_t* hdmitx_device = (hdmitx_dev_t*)data;
    hdmitx_init_parameters(&hdmitx_device->hdmi_info);

    HDMITX_M1B_Init(hdmitx_device);

    //When init hdmi, clear the hdmitx module edid ram and edid buffer.
    hdmitx_edid_ram_buffer_clear(hdmitx_device);

    hdmitx_device->HWOp.SetupIRQ(hdmitx_device);

    if(hdmitx_device->HWOp.Cntl){
        if(init_flag&INIT_FLAG_VDACOFF){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_VDAC_OFF, 0);    
        }
        if(init_powermode&0x80){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_POWERMODE_SWITCH, init_powermode&0x1f);    
        }
    }
    if(init_flag&INIT_FLAG_POWERDOWN){
        hdmitx_device->HWOp.SetDispMode(NULL); //power down
        hdmitx_device->unplug_powerdown=1;
        if(hdmitx_device->HWOp.Cntl){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_TURNOFF_HDMIHW, (hpdmode!=0)?1:0);    
        }
    }
    else{
        if(hdmitx_device->HWOp.Cntl){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_MUX_HPD, 0);    
        }
    }
    
    HDMI_DEBUG();

    while (hdmitx_device->hpd_event != 0xff)
    {
        if((hdmitx_device->vic_count == 0)&&(hdmitx_device->mux_hpd_if_pin_high_flag)){
            if(hdmitx_device->HWOp.Cntl){
                hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_MUX_HPD_IF_PIN_HIGH, 0);
            }
        }
        
        if((!hdmi_audio_off_flag)&&(hdmitx_device->audio_param_update_flag)&&
            ((hdmitx_device->cur_VIC != HDMI_Unkown)||(hdmitx_device->force_audio_flag))){
            hdmitx_set_audio(hdmitx_device, &(hdmitx_device->cur_audio_param));
            hdmitx_device->audio_param_update_flag = 0;
            hdmi_print(1, "HDMI: set audio param\n");
        }

        if (hdmitx_device->hpd_event == 1)
        {
            if(hdmitx_device->HWOp.GetEDIDData(hdmitx_device)){
                hdmi_print(1,"HDMI: EDID Ready\n");
                hdmitx_edid_clear(hdmitx_device);
                hdmitx_edid_parse(hdmitx_device);
                cec_node_init(hdmitx_device);
                set_disp_mode_auto();
				
				switch_set_state(&sdev, 1);
                hdmitx_device->hpd_event = 0;
            }  
            hdmitx_device->hpd_state = 1;  
        }
        else if(hdmitx_device->hpd_event == 2)
        {
            //When unplug hdmi, clear the hdmitx module edid ram and edid buffer.
            hdmitx_edid_ram_buffer_clear(hdmitx_device);
            hdmitx_edid_clear(hdmitx_device);
            cec_node_uninit(hdmitx_device);

            if(hdmitx_device->unplug_powerdown){
                hdmitx_set_display(hdmitx_device, HDMI_Unkown);
                if(hdmitx_device->HWOp.Cntl){
                    hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_TURNOFF_HDMIHW, (hpdmode!=0)?1:0);    
                }
            }
            hdmitx_device->cur_VIC = HDMI_Unkown;
            hdmi_authenticated = -1;
			switch_set_state(&sdev, 0);
            hdmitx_device->hpd_event = 0;
            hdmitx_device->hpd_state = 0;
        }    
        else{
        }  
        /* authentication process */
#ifdef CONFIG_AML_HDMI_TX_HDCP
        if(hdmitx_device->cur_VIC != HDMI_Unkown){
            if(hdmitx_device->auth_process_timer>0){
                hdmitx_device->auth_process_timer--;
            }
            else{
                hdmi_authenticated = hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_GET_AUTHENTICATE_STATE, NULL);
                if(auth_output_auto_off){
                    if(hdmi_authenticated){
                        hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_OUTPUT_ENABLE, 1);
                    }
                    else{
                        hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_OUTPUT_ENABLE, 0);
                    }
                }
                else{
                    hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_OUTPUT_ENABLE, hdmi_output_on);
                }
            }
        }
#endif
        /**/    
        HDMI_PROCESS_DELAY;            
    }
#ifndef AVOS
    return 0;
#endif    

}
Ejemplo n.º 6
0
int cec_ll_tx_polling(const unsigned char *msg, unsigned char len)
{
	int i;
	unsigned int ret = 0xf;
	unsigned int n;
	unsigned int j = 30;
	int pos;

	while ((TX_BUSY == aocec_rd_reg(CEC_TX_MSG_STATUS))
		|| (RX_BUSY == aocec_rd_reg(CEC_RX_MSG_STATUS))) {
		if (TX_ERROR == aocec_rd_reg(CEC_TX_MSG_STATUS)) {
			if (cec_msg_dbg_en  == 1)
				hdmi_print(INF, CEC "tx polling:tx error!.\n");
			/* aocec_wr_reg(CEC_TX_MSG_CMD, TX_ABORT); */
			aocec_wr_reg(CEC_TX_MSG_CMD, TX_NO_OP);
			/* cec_hw_reset(); */
			break;
		}
		if (!(j--)) {
			if (cec_msg_dbg_en  == 1)
				hdmi_print(INF, CEC "tx busy time out.\n");
			aocec_wr_reg(CEC_TX_MSG_CMD, TX_ABORT);
			aocec_wr_reg(CEC_TX_MSG_CMD, TX_NO_OP);
			break;
		}
		mdelay(5);
	}

	hd_set_reg_bits(P_AO_CEC_INTR_MASKN, 0x0, 1, 1);
	for (i = 0; i < len; i++)
		aocec_wr_reg(CEC_TX_MSG_0_HEADER + i, msg[i]);

	aocec_wr_reg(CEC_TX_MSG_LENGTH, len-1);
	aocec_wr_reg(CEC_TX_MSG_CMD, RX_ACK_CURRENT);

	j = 30;
	while ((TX_DONE != aocec_rd_reg(CEC_TX_MSG_STATUS)) && (j--)) {
		if (TX_ERROR == aocec_rd_reg(CEC_TX_MSG_STATUS))
			break;
		mdelay(5);
	}

	ret = aocec_rd_reg(CEC_TX_MSG_STATUS);

	if (ret == TX_DONE)
		ret = 1;
	else
		ret = 0;
	aocec_wr_reg(CEC_TX_MSG_CMD, TX_NO_OP);
	hd_set_reg_bits(P_AO_CEC_INTR_MASKN, 1, 1, 1);

	if (cec_msg_dbg_en == 1) {
		pos = 0;
		pos += sprintf(msg_log_buf + pos,
			"CEC: tx msg len: %d   dat: ", len);
		for (n = 0; n < len; n++)
			pos += sprintf(msg_log_buf + pos, "%02x ", msg[n]);

		pos += sprintf(msg_log_buf + pos, "\nCEC: tx state: %d\n", ret);
		msg_log_buf[pos] = '\0';
		pr_info("%s", msg_log_buf);
	}
	return ret;
}
Ejemplo n.º 7
0
static int hdmitx_notify_callback_a(struct notifier_block *block, unsigned long cmd , void *para)
{
    struct snd_pcm_substream *substream =(struct snd_pcm_substream*)para;
    Hdmi_tx_audio_para_t* audio_param = &(hdmitx_device.cur_audio_param);

    switch (substream->runtime->rate) {
        case 192000:
            audio_param->sample_rate = FS_192K;
            break;
        case 176400:
            audio_param->sample_rate = FS_176K4;
            break;
        case 96000:
            audio_param->sample_rate = FS_96K;
            break;
        case 88200:
            audio_param->sample_rate = FS_88K2;
            break;
        case 48000:
            audio_param->sample_rate = FS_48K;
            break;
        case 44100:
            audio_param->sample_rate = FS_44K1;
            break;
        case 32000:
            audio_param->sample_rate = FS_32K;
            break;
        default:
            printk("HDMI: unknown audio frequence\n");
            break;
    }

    switch (cmd){
    case AOUT_EVENT_IEC_60958_PCM:
        audio_param->type = CT_PCM;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;

        hdmi_print(1, "HDMI: aout notify rate %d\n", substream->runtime->rate);
        hdmi_print(1, "HDMI: aout notify format PCM\n");
        break;
    case AOUT_EVENT_RAWDATA_AC_3:
        audio_param->type = CT_AC_3;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format AC-3\n");
        break;
    case AOUT_EVENT_RAWDATA_MPEG1:
        audio_param->type = CT_MPEG1;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format MPEG1(Layer1 2)\n");
        break;
    case AOUT_EVENT_RAWDATA_MP3:
        audio_param->type = CT_MP3;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format MP3(MPEG1 Layer3)\n");
        break;
    case AOUT_EVENT_RAWDATA_MPEG2:
        audio_param->type = CT_MPEG2;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format MPEG2\n");
        break;
    case AOUT_EVENT_RAWDATA_AAC:
        audio_param->type = CT_AAC;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format AAC\n");
        break;
    case AOUT_EVENT_RAWDATA_DTS:
        audio_param->type = CT_DTS;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format DTS\n");
        break;
    case AOUT_EVENT_RAWDATA_ATRAC:
        audio_param->type = CT_ATRAC;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format ATRAC\n");
        break;
    case AOUT_EVENT_RAWDATA_ONE_BIT_AUDIO:
        audio_param->type = CT_ONE_BIT_AUDIO;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format One Bit Audio\n");
        break;
    case AOUT_EVENT_RAWDATA_DOBLY_DIGITAL_PLUS:
        audio_param->type = CT_DOLBY_D;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        //audio_param->sample_rate = FS_48K;//192K;      // FS_48K;       //
        hdmi_print(1, "HDMI: aout notify format Dobly Digital +\n");
        printk("audio sample_rate: %d\n", substream->runtime->rate);
        break;
    case AOUT_EVENT_RAWDATA_DTS_HD:
        audio_param->type = CT_DTS_HD;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format DTS-HD\n");
        break;
    case AOUT_EVENT_RAWDATA_MAT_MLP:
        audio_param->type = CT_MAT;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format MAT(MLP)\n");
        break;
    case AOUT_EVENT_RAWDATA_DST:
        audio_param->type = CT_DST;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format DST\n");
        break;
    case AOUT_EVENT_RAWDATA_WMA_PRO:
        audio_param->type = CT_WMA;
        audio_param->channel_num = CC_2CH;
        audio_param->sample_size = SS_16BITS;
        hdmi_print(1, "HDMI: aout notify format WMA Pro\n");
        break;
    default:
        break;
    }
    hdmitx_device.audio_param_update_flag = 1;
    return 0;
}
Ejemplo n.º 8
0
int hdmitx_set_display(hdmitx_dev_t* hdmitx_device, HDMI_Video_Codes_t VideoCode)
{
    Hdmi_tx_video_para_t *param;
    int i,ret=-1;
    unsigned char AVI_DB[32];
    unsigned char AVI_HB[32];
    AVI_HB[0] = TYPE_AVI_INFOFRAMES ; 
    AVI_HB[1] = AVI_INFOFRAMES_VERSION ; 
    AVI_HB[2] = AVI_INFOFRAMES_LENGTH ; 
    for(i=0;i<32;i++){
        AVI_DB[i]=0;
    }

    param = hdmi_get_video_param(VideoCode);
    if(param){
        param->color = param->color_prefer;
		if(hdmi_output_rgb){
 	       param->color = COLOR_SPACE_RGB444;        
        }
        else{
//HDMI CT 7-24 Pixel Encoding - YCbCr to YCbCr Sink
	        switch(hdmitx_device->RXCap.native_Mode & 0x30)
	        {
	            case 0x20:    //bit5==1, then support YCBCR444 + RGB
	            case 0x30:
	                param->color = COLOR_SPACE_YUV444;
	                break;
	            case 0x10:    //bit4==1, then support YCBCR422 + RGB
	                param->color = COLOR_SPACE_YUV422;
	                break;
	            default:
	                param->color = COLOR_SPACE_RGB444;
	        }
        }  
        if(hdmitx_device->HWOp.SetDispMode(hdmitx_device, param)>=0){
//HDMI CT 7-33 DVI Sink, no HDMI VSDB nor any other VSDB, No GB or DI expected
//TMDS_MODE[hdmi_config]
//0: DVI Mode       1: HDMI Mode
            //if(hdmitx_device->hdmi_info.output_state==CABLE_PLUGIN_DVI_OUT)
            if(is_dvi_device(&hdmitx_device->RXCap))
            {
                hdmi_print(1,"Sink is DVI device\n");
                hdmi_wr_reg(TX_TMDS_MODE, hdmi_rd_reg(TX_TMDS_MODE) & ~(1<<6));
            }
            else
            {
                hdmi_print(1,"Sink is HDMI device\n");
                hdmi_wr_reg(TX_TMDS_MODE, hdmi_rd_reg(TX_TMDS_MODE) |  (3<<6));
            }

//check system status by reading EDID_STATUS
            switch(hdmi_rd_reg(TX_HDCP_ST_EDID_STATUS) >> 6)
            {
                case 0:
                    hdmi_print(1,"No sink attached\n");
                    break;
                case 1:
                    hdmi_print(1,"Source reading EDID\n");
                    break;
                case 2:
                    hdmi_print(1,"Source in DVI Mode\n");
                    break;
                case 3:
                    hdmi_print(1,"Source in HDMI Mode\n");
                    break;
                default:
                    hdmi_print(1,"EDID Status error\n");
            }

            hdmi_tx_construct_avi_packet(param, (char*)AVI_DB);
    
            hdmitx_device->HWOp.SetPacket(HDMI_PACKET_AVI, AVI_DB, AVI_HB);
            ret = 0;
        }
    }
    else{
        if(hdmitx_device->HWOp.SetDispMode) {
Ejemplo n.º 9
0
void pwm_out_rtc_32k(void){
    gpiox_10_pin_mux_mask(); //enable PWM_E pin mux
    pwm_e_config();  //PWM E config   
    hdmi_print(INF, CEC "Set PWM_E out put RTC 32K!\n");
}
Ejemplo n.º 10
0
void cec_enable_irq(void)
{
    aml_set_reg32_bits(P_AO_CEC_INTR_MASKN, 0x6, 0, 3);
    cec_int_disable_flag = 0;
    hdmi_print(INF, CEC "enable:int mask:0x%x\n", aml_read_reg32(P_AO_CEC_INTR_MASKN));
}
Ejemplo n.º 11
0
int hdmitx_edid_parse(hdmitx_dev_t* hdmitx_device)
{
    unsigned char CheckSum ;
    unsigned char BlockCount ;
    unsigned char* EDID_buf = hdmitx_device->EDID_buf;
    int i, j, ret_val ;
    hdmi_print(0, "EDID Parser:\n");

    ret_val = Edid_DecodeHeader(&hdmitx_device->hdmi_info, &EDID_buf[0]);
//    if(ret_val == -1)
//        return -1;

    for( i = 0, CheckSum = 0 ; i < 128 ; i++ )
    {
        CheckSum += EDID_buf[i] ;
        CheckSum &= 0xFF ;
    }
    
    if( CheckSum != 0 )
    {
        hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT;
        hdmi_print(0, "PLUGIN_DVI_OUT\n");
//        return -1 ;
    }
	
    Edid_DecodeStandardTiming(&hdmitx_device->hdmi_info, &EDID_buf[26], 8);
    Edid_ParseCEADetailedTimingDescriptors(&hdmitx_device->hdmi_info, 4, 0x36, &EDID_buf[0]);

    BlockCount = EDID_buf[0x7E] ;

    if( BlockCount == 0 ){
        hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT;
        hdmi_print(0, "EDID BlockCount=0\n");
        return 0 ; // do nothing.
    }

    else if ( BlockCount > EDID_MAX_BLOCK )
    {
        BlockCount = EDID_MAX_BLOCK ;
    }
        	
    for( i = 1 ; i <= BlockCount ; i++ )
    {

        if((BlockCount > 1) && (i == 1))
        {
                CheckSum = 0;       //ignore the block1 data
        }
        else
        {
            if(((BlockCount == 1) && (i == 1)) || ((BlockCount > 1) && (i == 2)))
                Edid_Parse_check_HDMI_VSDB( &hdmitx_device->hdmi_info,  &EDID_buf[i * 128]);

            for( j = 0, CheckSum = 0 ; j < 128 ; j++ )
            {
                CheckSum += EDID_buf[i*128 + j] ;
                CheckSum &= 0xFF ;
            }
            if( CheckSum != 0 )
            {
                    hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_DVI_OUT;
            }
            else
            {
                Edid_MonitorCapable861(&hdmitx_device->hdmi_info, EDID_buf[i * 128 + 3]);
                ret_val = Edid_ParsingCEADataBlockCollection(&hdmitx_device->hdmi_info, &EDID_buf[i * 128]);
                Edid_ParseCEADetailedTimingDescriptors(&hdmitx_device->hdmi_info, 5, EDID_buf[i * 128 + 2], &EDID_buf[i * 128]);
                if(hdmitx_device->hdmi_info.output_state != CABLE_PLUGIN_DVI_OUT)
                    hdmitx_device->hdmi_info.output_state = CABLE_PLUGIN_HDMI_OUT;

            }

        }

        if( EDID_buf[i*128+0] == 0x2  )
        {
            if(hdmitx_edid_block_parse(hdmitx_device, &(EDID_buf[i*128]))>=0){
                if(hdmitx_device->RXCap.IEEEOUI==0x0c03){
                    break;
                }
            }
        }
    }
#if 1    
    i=hdmitx_edid_dump(hdmitx_device, hdmitx_device->tmp_buf, HDMI_TMP_BUF_SIZE);
    hdmitx_device->tmp_buf[i]=0;
    hdmi_print_buf(hdmitx_device->tmp_buf, strlen(hdmitx_device->tmp_buf));
    hdmi_print(0,"\n");
#endif    
    return 0;

}
Ejemplo n.º 12
0
int hdmitx_set_display(struct hdmitx_dev *hdmitx_device,
	enum hdmi_vic VideoCode)
{
	struct hdmitx_vidpara *param;
	enum hdmi_vic vic;
	int i, ret = -1;
	unsigned char AVI_DB[32];
	unsigned char AVI_HB[32];
	AVI_HB[0] = TYPE_AVI_INFOFRAMES;
	AVI_HB[1] = AVI_INFOFRAMES_VERSION;
	AVI_HB[2] = AVI_INFOFRAMES_LENGTH;
	for (i = 0; i < 32; i++)
		AVI_DB[i] = 0;

	vic = hdmitx_device->HWOp.GetState(hdmitx_device,
		STAT_VIDEO_VIC, 0);
	hdmi_print(IMP, SYS "already init VIC = %d  Now VIC = %d\n",
		vic, VideoCode);
	if ((vic != HDMI_Unkown) && (vic == VideoCode)) {
		hdmitx_device->cur_VIC = vic;
		return 1;
	}

	param = hdmi_get_video_param(VideoCode);
	hdmitx_device->cur_video_param = param;
	if (param) {
		param->color = param->color_prefer;
		if (hdmi_output_rgb) {
			param->color = COLOR_SPACE_RGB444;
		} else {
			/* HDMI CT 7-24 Pixel Encoding
			 * YCbCr to YCbCr Sink
			 */
			switch (hdmitx_device->RXCap.native_Mode & 0x30) {
			case 0x20:/*bit5==1, then support YCBCR444 + RGB*/
			case 0x30:
				param->color = COLOR_SPACE_YUV444;
				break;
			case 0x10:/*bit4==1, then support YCBCR422 + RGB*/
				param->color = COLOR_SPACE_YUV422;
				break;
			default:
				param->color = COLOR_SPACE_RGB444;
			}
		}
		if (hdmitx_device->HWOp.SetDispMode(hdmitx_device,
			param) >= 0) {
			/* HDMI CT 7-33 DVI Sink, no HDMI VSDB nor any
			 * other VSDB, No GB or DI expected
			 * TMDS_MODE[hdmi_config]
			 * 0: DVI Mode	   1: HDMI Mode
			 */
			if (is_dvi_device(&hdmitx_device->RXCap)) {
				hdmi_print(1, "Sink is DVI device\n");
				hdmitx_device->HWOp.CntlConfig(hdmitx_device,
					CONF_HDMI_DVI_MODE, DVI_MODE);
			} else {
				hdmi_print(1, "Sink is HDMI device\n");
				hdmitx_device->HWOp.CntlConfig(hdmitx_device,
					CONF_HDMI_DVI_MODE, HDMI_MODE);
			}
			/*check system status by reading EDID_STATUS*/
			switch (hdmitx_device->HWOp.CntlConfig(
				hdmitx_device, CONF_SYSTEM_ST, 0)) {
			case 0:
				hdmi_print(1, "No sink attached\n");
				break;
			case 1:
				hdmi_print(1, "Source reading EDID\n");
				break;
			case 2:
				hdmi_print(1, "Source in DVI Mode\n");
				break;
			case 3:
				hdmi_print(1, "Source in HDMI Mode\n");
				break;
			default:
				hdmi_print(1, "EDID Status error\n");
			}

			hdmi_tx_construct_avi_packet(param, (char *)AVI_DB);

			if ((VideoCode == HDMI_4k2k_30) ||
				(VideoCode == HDMI_4k2k_25) ||
				(VideoCode == HDMI_4k2k_24) ||
				(VideoCode == HDMI_4k2k_smpte_24))
				hdmi_set_vend_spec_infofram(hdmitx_device,
					VideoCode);
			else
				hdmi_set_vend_spec_infofram(hdmitx_device, 0);

			hdmitx_device->HWOp.SetPacket(HDMI_PACKET_AVI,
				AVI_DB, AVI_HB);
			ret = 0;
		}
	} else {
		if (hdmitx_device->HWOp.SetDispMode)
			/*Disable HDMITX*/
			hdmitx_device->HWOp.SetDispMode(hdmitx_device, NULL);
	}
	hdmitx_set_spd_info(hdmitx_device);
	hdmitx_special_handler_video(hdmitx_device);
	return ret;
}
Ejemplo n.º 13
0
static int 
#else
static void
#endif
hdmi_task_handle(void *data) 
{
    extern void hdmitx_edid_ram_buffer_clear(hdmitx_dev_t*);
    hdmitx_dev_t* hdmitx_device = (hdmitx_dev_t*)data;

    hdmitx_init_parameters(&hdmitx_device->hdmi_info);

    HDMITX_M1B_Init(hdmitx_device);

    //When init hdmi, clear the hdmitx module edid ram and edid buffer.
    hdmitx_edid_ram_buffer_clear(hdmitx_device);

    hdmitx_device->HWOp.SetupIRQ(hdmitx_device);

    if(hdmitx_device->HWOp.Cntl){
        if(init_flag&INIT_FLAG_VDACOFF){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_VDAC_OFF, 0);    
        }
        if(init_powermode&0x80){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_POWERMODE_SWITCH, init_powermode&0x1f);    
        }
    }
    if(init_flag&INIT_FLAG_POWERDOWN){
        hdmitx_device->HWOp.SetDispMode(NULL); //power down
        hdmitx_device->unplug_powerdown=1;
        if(hdmitx_device->HWOp.Cntl){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_TURNOFF_HDMIHW, (hpdmode!=0)?1:0);    
        }
    }
    else{
        if(hdmitx_device->HWOp.Cntl){
            hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_MUX_HPD, 0);    
        }
    }
    
    HDMI_DEBUG();

    while (hdmitx_device->hpd_event != 0xff)
    {
        if((hdmitx_device->vic_count == 0)&&(hdmitx_device->mux_hpd_if_pin_high_flag)){
            if(hdmitx_device->HWOp.Cntl){
                hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_MUX_HPD_IF_PIN_HIGH, 0);
            }
        }
        
        if((!hdmi_audio_off_flag)&&(hdmitx_device->audio_param_update_flag)&&(hdmitx_device->cur_VIC != HDMI_Unkown)){
            hdmitx_set_audio(hdmitx_device, &(hdmitx_device->cur_audio_param));
            hdmitx_device->audio_param_update_flag = 0;
            hdmi_print(1, "HDMI: set audio param\n");
        }

        if (hdmitx_device->hpd_event == 1)
        {
            if(hdmitx_device->HWOp.GetEDIDData(hdmitx_device)){
                hdmitx_edid_clear(hdmitx_device);
                hdmitx_edid_parse(hdmitx_device);
                set_disp_mode_auto();

                hdmitx_device->hpd_event = 0;
            }    
        }
        else if(hdmitx_device->hpd_event == 2)
        {
            //When unplug hdmi, clear the hdmitx module edid ram and edid buffer.
            hdmitx_edid_ram_buffer_clear(hdmitx_device);
            hdmitx_edid_clear(hdmitx_device);

            if(hdmitx_device->unplug_powerdown){
                hdmitx_set_display(hdmitx_device, HDMI_Unkown);
                if(hdmitx_device->HWOp.Cntl){
                    hdmitx_device->HWOp.Cntl(hdmitx_device, HDMITX_HWCMD_TURNOFF_HDMIHW, (hpdmode!=0)?1:0);    
                }
            }
            hdmitx_device->cur_VIC = HDMI_Unkown;

            hdmitx_device->hpd_event = 0;
        }    
        else{
        }            
#ifdef AVOS
        AVTimeDly(500);
#else
        msleep(500);
#endif        
    }
#ifndef AVOS
    return 0;
#endif    

}