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 }
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; }
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"); }
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]; // } } }
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 }
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; }
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; }
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) {
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"); }
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)); }
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; }
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; }
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 }