Beispiel #1
0
/*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;
}