/*as use the spin_lock, *1--there is no sleep, *2--it is better to shorter the time, */ int amcsi_isr(struct tvin_frontend_s *fe, unsigned int hcnt) { struct amcsi_dev_s *devp = container_of(fe, amcsi_dev_t, frontend); unsigned data1 = 0; unsigned data2 = 0; am_csi2_frame_t frame; frame.w = aml_get_reg32_bits( P_CSI2_PIC_SIZE_STAT, 0, 16); frame.h = aml_get_reg32_bits( P_CSI2_PIC_SIZE_STAT, 16,16); frame.err = aml_read_reg32( P_CSI2_ERR_STAT0 ); data1 = aml_read_reg32( P_CSI2_DATA_TYPE_IN_MEM); data2 = aml_read_reg32( P_CSI2_GEN_STAT0); if(frame.err){ mipi_error("%s,error---pixel cnt:%d, line cnt:%d. error state:0x%x.mem type:0x%x, status:0x%x\n", __func__, frame.w, frame.h, frame.err, data1, data2); devp->overflow_cnt ++; aml_write_reg32( P_CSI2_ERR_STAT0, 0); } if( devp->overflow_cnt > 4){ DPRINT("should reset mipi\n"); devp->overflow_cnt = 0; return 0; } devp->reset = 0; return 0; }
static void stop_mipi_vdin(vdin_ops_privdata_t * data) { if(data->run_flag == true){ mipi_dbg("stop_mipi_vdin.\n"); am_mipi_csi2_uninit(); data->param.fmt_info.fmt= TVIN_SIG_FMT_NULL; data->run_flag = false; }else{ mipi_error("stop_mipi_vdin is not started yet. \n"); } return; }
static void csi2_vdin_check(vdin_ops_privdata_t* data) { data->watchdog_cnt++; if(data->watchdog_cnt > 20){ am_mipi_csi2_uninit(); data->hw_info.frame = NULL; data->mipi_vdin_skip = MIPI_SKIP_FRAME_NUM; data->reset_flag = 1; wake_up_interruptible(&data->complete); data->done_flag = true; am_mipi_csi2_init(&data->hw_info); data->watchdog_cnt = 0; data->param.status = TVIN_SIG_STATUS_NOSIG; mipi_error("[mipi_vdin]:csi2_vdin_check-- time out !!!!\n"); return ; } if (data->run_flag != true) mipi_error("csi2_vdin_check: mipi still not run. \n"); return ; }
static int mipi_vdin_run(vdin_dev_t* devp,struct vframe_s *vf) { vdin_ops_privdata_t* data = (vdin_ops_privdata_t*)devp->priv_data; data->watchdog_cnt = 0; if (data->wr_canvas_index == 0xff) { mipi_wr_vdin_canvas(data,0); data->wr_canvas_index = 0; return 0; } #ifdef TEST_FRAME_RATE if(time_count==0){ mipi_error("[mipi_vdin]:mipi_vdin_run ---- time start\n"); } time_count++; if(time_count>49){ time_count = 0; } #endif if(data->mipi_vdin_skip>0){ data->mipi_vdin_skip--; vf->type = INVALID_VDIN_INPUT; }else if(checkframe(data->wr_canvas_index,&data->input) == true){ mipi_send_buff_to_display_fifo(data,vf); data->wr_canvas_index++; }else{ vf->type = INVALID_VDIN_INPUT; } if (data->wr_canvas_index >= data->canvas_total_count) data->wr_canvas_index = 0; mipi_wr_vdin_canvas(data,data->wr_canvas_index); //WRITE_CBUS_REG(CSI2_INTERRUPT_CTRL_STAT, (1 << CSI2_CFG_VS_FAIL_INTERRUPT_CLR) | (1 << CSI2_CFG_VS_FAIL_INTERRUPT)); // Clear error flag WRITE_CBUS_REG(CSI2_ERR_STAT0, 0); return 0; }