예제 #1
0
/*
 * Search interrupt stack for a valid frame.
 */
struct frame *
checkintstack(fcor)
{
	char stack[NISP*NBPG];
	off_t off = vtophys(intstack);
	struct frame *fp;
	register caddr_t addr;

	if (off == -1 || lseek(fcor, off, L_SET) != off ||
	    read(fcor, stack, sizeof (stack)) != sizeof (stack))
		return ((struct frame *)0);
	addr = eintstack;
	do {
		addr -= sizeof (caddr_t);
		fp = (struct frame *)&stack[addr - intstack];
	} while (addr >= intstack + sizeof (struct frame) &&
	    !checkframe(fp));
	return (addr < intstack+sizeof (struct frame) ? (struct frame *)0 : fp);
}
예제 #2
0
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;
}