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 }
static unsigned int detect_key(unsigned int suspend_from) { int exit_reason = 0; unsigned int time_out = readl(AO_DEBUG_REG2); unsigned time_out_ms = time_out*100; unsigned *irq = (unsigned *)SECURE_TASK_SHARE_IRQ; /* unsigned *wakeup_en = (unsigned *)SECURE_TASK_RESPONSE_WAKEUP_EN; */ /* setup wakeup resources*/ /*auto suspend: timerA 10ms resolution*/ if (time_out_ms != 0) wakeup_timer_setup(); init_remote(); #ifdef CONFIG_CEC_WAKEUP if (hdmi_cec_func_config & 0x1) { remote_cec_hw_reset(); cec_node_init(); } #endif /* *wakeup_en = 1;*/ do { switch (*irq) { #ifdef CONFIG_CEC_WAKEUP case IRQ_AO_CEC_NUM: if (suspend_from == SYS_POWEROFF) break; if (cec_msg.log_addr) { if (hdmi_cec_func_config & 0x1) { cec_handler(); if (cec_msg.cec_power == 0x1) { /*cec power key*/ exit_reason = CEC_WAKEUP; break; } } } else if (hdmi_cec_func_config & 0x1) cec_node_init(); break; #endif case IRQ_TIMERA_NUM: if (time_out_ms != 0) time_out_ms--; if (time_out_ms == 0) { wakeup_timer_clear(); exit_reason = AUTO_WAKEUP; } break; case IRQ_AO_IR_DEC_NUM: if (remote_detect_key()) exit_reason = REMOTE_WAKEUP; break; default: break; } *irq = 0xffffffff; if (exit_reason) break; else asm volatile("wfi"); } while (1); return exit_reason; }
static unsigned int detect_key(unsigned int suspend_from) { int exit_reason = 0; unsigned int time_out = readl(AO_DEBUG_REG2); unsigned time_out_ms = time_out*100; unsigned char adc_key_cnt = 0; unsigned *irq = (unsigned *)WAKEUP_SRC_IRQ_ADDR_BASE; /* unsigned *wakeup_en = (unsigned *)SECURE_TASK_RESPONSE_WAKEUP_EN; */ /* start timer and enable adc*/ reset_ao_timera(); saradc_enable(); /* setup wakeup resources*/ /*auto suspend: timerA 10ms resolution*/ if (time_out_ms != 0) wakeup_timer_setup(); saradc_enable(); reset_ao_timera(); init_remote(); #ifdef CONFIG_CEC_WAKEUP if (hdmi_cec_func_config & 0x1) { remote_cec_hw_reset(); cec_node_init(); } #endif /* *wakeup_en = 1;*/ do { #ifdef CONFIG_CEC_WAKEUP if (irq[IRQ_AO_CEC] == IRQ_AO_CEC_NUM) { irq[IRQ_AO_CEC] = 0xFFFFFFFF; // if (suspend_from == SYS_POWEROFF) // continue; if (cec_msg.log_addr) { if (hdmi_cec_func_config & 0x1) { cec_handler(); if (cec_msg.cec_power == 0x1) { /*cec power key*/ exit_reason = CEC_WAKEUP; break; } } } else if (hdmi_cec_func_config & 0x1) cec_node_init(); } #endif if (irq[IRQ_TIMERA] == IRQ_TIMERA_NUM) { irq[IRQ_TIMERA] = 0xFFFFFFFF; /*uart_puts("timera ...\n");*/ if (time_out_ms != 0) time_out_ms--; if (time_out_ms == 0) { wakeup_timer_clear(); exit_reason = AUTO_WAKEUP; } } if (irq[IRQ_AO_TIMERA] == IRQ_AO_TIMERA_NUM) { irq[IRQ_AO_TIMERA] = 0xFFFFFFFF; if (check_adc_key_resume()) { adc_key_cnt++; /*using variable 'adc_key_cnt' to eliminate the dithering of the key*/ if (2 == adc_key_cnt) exit_reason = POWER_KEY_WAKEUP; } else { adc_key_cnt = 0; } } if (irq[IRQ_AO_IR_DEC] == IRQ_AO_IR_DEC_NUM) { irq[IRQ_AO_IR_DEC] = 0xFFFFFFFF; if (remote_detect_key()) exit_reason = REMOTE_WAKEUP; } if (irq[IRQ_ETH_PHY] == IRQ_ETH_PHY_NUM) { irq[IRQ_ETH_PHY] = 0xFFFFFFFF; exit_reason = ETH_PHY_WAKEUP; } if (exit_reason) break; else asm volatile("wfi"); } while (1); restore_ao_timer(); saradc_disable(); return exit_reason; }