int jpeg_drv_dec_wait_one_row(JPEG_DEC_DRV_IN *config)
{
	unsigned int timeout = 0x2FFFFF;
	unsigned int irq_status;

	unsigned int tri_cnt = ++config->pauseRowCnt;	/* 1; */
	unsigned int MCU_cnt = 0;
	unsigned int base_Y = config->buffer_Y_PA;	/* 0x89080000; */
	unsigned int base_CB = config->buffer_Cb_PA;	/* 0x89040000; */
	unsigned int base_CR = config->buffer_Cr_PA;	/* 0x89100000; */
	unsigned int ring_row_index = tri_cnt % config->tileBufRowNum;

	/* for( tri_cnt = 1 ; tri_cnt <= 60 ; tri_cnt++) */
	{
		/* wait done */
		if (config->decodeMode == JPEG_DEC_MODE_MCU_ROW) {
			while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
				timeout--;
				if (timeout == 0)
					break;
			}
		} else {
			while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
				timeout--;
				if (timeout == 0)
					break;
			}

		}
		irq_status = REG_JPGDEC_INTERRUPT_STATUS;

		MCU_cnt = config->mcuPerRow * (tri_cnt + 1);
		/* MCU_cnt = config->u4McuNumInRow * (tri_cnt+1) ; */

		JPEG_MSG
		    ("JPEG_DEC_WAIT_DONE: tri_cnt %d, irq %x, MCUinRow %d, p_idx %d, %x %x %x!!\n",
		     tri_cnt, irq_status, config->mcuPerRow, MCU_cnt,
		     base_Y + ring_row_index * (config->buffer_Y_row_size),
		     base_CB + ring_row_index * (config->buffer_C_row_size),
		     base_CR + ring_row_index * (config->buffer_C_row_size));

		jpeg_drv_dec_set_dst_bank0(base_Y + ring_row_index * (config->buffer_Y_row_size),
					   base_CB + ring_row_index * (config->buffer_C_row_size),
					   base_CR + ring_row_index * (config->buffer_C_row_size));

		jpeg_drv_dec_set_pause_mcu_idx(MCU_cnt - 1);

		IMG_REG_WRITE((irq_status), REG_ADDR_JPGDEC_INTERRUPT_STATUS);

		    /* Debug: jpeg_drv_dec_dump_reg(); */
		    if (timeout == 0) {
			JPEG_ERR("Error! Decode Timeout.\n");
			jpeg_drv_dec_dump_reg();
			return 0;
		}

		JPEG_ERR("JPEG Decode Success, st %x!!\n", irq_status);
	}
	return 1;
}
Esempio n. 2
0
static int jpeg_dec_ioctl(unsigned int cmd, unsigned long arg, struct file *file)
{
    unsigned int*       pStatus;
    unsigned int        decResult;
    long timeout_jiff;
    JPEG_DEC_DRV_IN dec_params;
    JPEG_DEC_CONFIG_ROW dec_row_params ;
    unsigned int irq_st = 0;
    //unsigned int timeout = 0x1FFFFF;


    JPEG_DEC_DRV_OUT outParams;

    pStatus = (unsigned int*)file->private_data;

    if (NULL == pStatus)
    {
        JPEG_MSG("[JPEGDRV]JPEG Decoder: Private data is null in flush operation. SOME THING WRONG??\n");
        return -EFAULT;
    }
    switch(cmd)
    {
    // initial and reset JPEG encoder
    case JPEG_DEC_IOCTL_INIT:   /* OT:OK */
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Init!!\n");
        if(jpeg_drv_dec_init() == 0)
        {
            *pStatus = JPEG_DEC_PROCESS;
        }
        break;

    case JPEG_DEC_IOCTL_RESET:  /* OT:OK */
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Reset!!\n");
        jpeg_drv_dec_reset();
        break;

    case JPEG_DEC_IOCTL_CONFIG:
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Configration!!\n");
        if(*pStatus != JPEG_DEC_PROCESS)
        {
            JPEG_MSG("[JPEGDRV]Permission Denied! This process can not access decoder\n");
            return -EFAULT;
        }
        if(dec_status == 0)
        {
            JPEG_MSG("[JPEGDRV]JPEG Decoder is unlocked!!");
            *pStatus = 0;
            return -EFAULT;
        }
        if(copy_from_user(&dec_params, (void *)arg, sizeof(JPEG_DEC_DRV_IN)))
        {
            JPEG_MSG("[JPEGDRV]JPEG Decoder : Copy from user error\n");
            return -EFAULT;
        }
        //_jpeg_dec_dump_reg_en = dec_params.regDecDumpEn;
        if(dec_params.decodeMode == JPEG_DEC_MODE_MCU_ROW)
            _jpeg_dec_mode = 1;
        else
            _jpeg_dec_mode = 0;

        if (jpeg_drv_dec_set_config_data(&dec_params) < 0)
            return -EFAULT;

        break;

    case JPEG_DEC_IOCTL_RESUME:
        if(*pStatus != JPEG_DEC_PROCESS)
        {
            JPEG_MSG("[JPEGDRV]Permission Denied! This process can not access decoder\n");
            return -EFAULT;
        }
        if(dec_status == 0)
        {
            JPEG_MSG("[JPEGDRV]JPEG Decoder is unlocked!!");
            *pStatus = 0;
            return -EFAULT;
        }
        if(copy_from_user(&dec_row_params, (void *)arg, sizeof(JPEG_DEC_CONFIG_ROW)))
        {
            JPEG_MSG("[JPEGDRV]JPEG Decoder : Copy from user error\n");
            return -EFAULT;
        }

        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Resume, [%d] %x %x %x !!\n", dec_row_params.pauseMCU -1,dec_row_params.decRowBuf[0], dec_row_params.decRowBuf[1], dec_row_params.decRowBuf[2]);

        jpeg_drv_dec_set_dst_bank0( dec_row_params.decRowBuf[0], dec_row_params.decRowBuf[1], dec_row_params.decRowBuf[2]);

        jpeg_drv_dec_set_pause_mcu_idx(dec_row_params.pauseMCU -1) ;

        jpeg_drv_dec_resume(BIT_INQST_MASK_PAUSE);

        break;



    case JPEG_DEC_IOCTL_START:    /* OT:OK */
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Start!!\n");

        //Debug: printk("0xF0: 0x%08x\n", *(volatile unsigned int*)(JPEG_DEC_BASE + 0xF0));

        jpeg_drv_dec_start();
        break;

    case JPEG_DEC_IOCTL_WAIT:



        if(*pStatus != JPEG_DEC_PROCESS)
        {
            JPEG_WRN("Permission Denied! This process can not access decoder");
            return -EFAULT;
        }
        if(dec_status == 0)
        {
            JPEG_WRN("Decoder status is available, HOW COULD THIS HAPPEN ??");
            *pStatus = 0;
            return -EFAULT;
        }
        if(copy_from_user(&outParams, (void *)arg, sizeof(JPEG_DEC_DRV_OUT)))
        {
            JPEG_WRN("JPEG Decoder : Copy from user error\n");
            return -EFAULT;
        }

        //set timeout
        timeout_jiff = outParams.timeout* HZ / 1000;
        //JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Wait Resume Time Jiffies : %ld\n", timeout_jiff);
#ifdef FPGA_VERSION
//#if 1

        JPEG_MSG("[JPEGDRV]Polling JPEG Status");

        do
        {
            _jpeg_dec_int_status = REG_JPGDEC_INTERRUPT_STATUS;
        } while(_jpeg_dec_int_status == 0);
#else

        //if(outParams.timeout >= 5000){
        //
        //  JPEG_MSG("Polling JPEG Status");
        //  do
        //  {
        //      _jpeg_dec_int_status = REG_JPGDEC_INTERRUPT_STATUS;
        //     timeout--;
        //  } while(_jpeg_dec_int_status == 0 && timeout != 0);
        //  if(timeout == 0) JPEG_MSG("Polling JPEG Status TIMEOUT!!\n");
        //}else
        if(jpeg_isr_dec_lisr()<0) {
            //JPEG_MSG("wait JPEG irq\n");
            wait_event_interruptible_timeout(dec_wait_queue, _jpeg_dec_int_status, timeout_jiff);
            JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Enter IRQ Wait Done!!\n");
            //printk("[JPEGDRV]wait JPEG irq done\n");
        } else {
            JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Enter IRQ Wait Already Done!!\n");
            //printk("[JPEGDRV]JPEG decoder already done\n");
        }
#endif

        decResult = jpeg_drv_dec_get_result();

        //jpeg_drv_dec_dump_key_reg();

        if(decResult >= 2)
        {
            JPEG_MSG("[JPEGDRV]Decode Result : %d, status %x!\n", decResult, _jpeg_dec_int_status );
            jpeg_drv_dec_dump_key_reg();
            //jpeg_drv_dec_dump_reg();
            jpeg_drv_dec_reset();
        }
        irq_st = _jpeg_dec_int_status ;
        decResult = decResult | (irq_st<<8) ;
        _jpeg_dec_int_status = 0;
        if(copy_to_user(outParams.result, &decResult, sizeof(unsigned int)))
        {
            JPEG_WRN("JPEG Decoder : Copy to user error (result)\n");
            return -EFAULT;
        }

        break;


    case JPEG_DEC_IOCTL_BREAK:
        if (jpeg_drv_dec_break() < 0)
            return -EFAULT;
        break;

    case JPEG_DEC_IOCTL_DUMP_REG:
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder DUMP REGISTER !!\n");
        jpeg_drv_dec_dump_reg();
        break;


    case JPEG_DEC_IOCTL_DEINIT:
        JPEG_MSG("[JPEGDRV][IOCTL] JPEG Decoder Deinit !!\n");
        // copy input parameters
        if(*pStatus != JPEG_DEC_PROCESS)
        {
            JPEG_ERR("Permission Denied! This process can not access encoder");
            return -EFAULT;
        }

        if(dec_status == 0)
        {
            JPEG_ERR("Encoder status is available, HOW COULD THIS HAPPEN ??");
            *pStatus = 0;
            return -EFAULT;
        }
        jpeg_drv_dec_deinit();
        *pStatus = 0;
        break;
#ifdef FOR_COMPILE
    case JPEG_DEC_IOCTL_RW_REG: /* OT:OK */
        jpeg_drv_dec_rw_reg();
        break;
#endif
    default:
        JPEG_ERR("JPEG DEC IOCTL NO THIS COMMAND\n");
        break;
    }
    return 0;
}
Esempio n. 3
0
int jpeg_drv_dec_set_config_data(JPEG_DEC_DRV_IN* config)
{
  
    
    jpeg_drv_dec_set_sampling_factor( config->componentNum,
                                      config->hSamplingFactor[0], config->vSamplingFactor[0],
                                      config->hSamplingFactor[1], config->vSamplingFactor[1],
                                      config->hSamplingFactor[2], config->vSamplingFactor[2]);

    /* set BRZ factor */    
    jpeg_drv_dec_set_brz_factor(config->lumaHorDecimate, config->lumaVerDecimate, config->cbcrHorDecimate, config->cbcrVerDecimate);

    /* set group DMA */ 
    jpeg_drv_dec_set_dma_group(config->dma_McuInGroup, config->dma_GroupNum, config->dma_LastMcuNum);
    
    /* set componet ID */
    jpeg_drv_dec_set_comp_id(config->componentID[0], config->componentID[1], config->componentID[2]);
    

    /* set BLK membership */    
    //printk("[JPEGDRV] Membership List = 0x%08x\n", config->membershipList);    
    jpeg_drv_dec_set_du_membership(config->membershipList, config->gmcEn, (config->componentNum==1)?1:0 );

    /* set q table id */    
    jpeg_drv_dec_set_q_table(config->qTableSelector[0], config->qTableSelector[1], config->qTableSelector[2]);
    
    /* set dst image stride  */        
    jpeg_drv_dec_set_imgStride(config->compImgStride[0], config->compImgStride[1]);

    /* set dst Memory stride  */        
    //if( config->pauseRow_en ){      
    //   jpeg_drv_dec_set_memStride(config->compTileBufStride[0], config->compTileBufStride[1]);
    //}else{
       jpeg_drv_dec_set_memStride(config->compMemStride[0], config->compMemStride[1]);
    //}
    
    /* set total MCU number */
    jpeg_drv_dec_set_total_mcu(config->totalMCU);
    
    /* set Gray DU number */
    jpeg_drv_dec_set_comp0_du(config->comp0_DU);
    
    /* set pause MCU index */
    jpeg_drv_dec_set_pause_mcu_idx(config->pauseMCU - 1);
    
    /* set bitstream base, size */    
    JPEG_MSG("[JPEGDRV] mode %d, Buf Base 0x%08x, Limit 0x%08x, Size 0x%08x!!\n", config->reg_OpMode,config->srcStreamAddrBase, config->srcStreamAddrWritePtr ,config->srcStreamSize );
    jpeg_drv_dec_set_bs_info(config->srcStreamAddrBase, config->srcStreamSize);
    
    /* set bitstream write pointer */
    jpeg_drv_dec_set_bs_writePtr(config->srcStreamAddrWritePtr);
    
    /* set Decode Operation Mode */
    //printk("[JPEGDRV]SET OPMODE %d, DecMODE %d!!", config->reg_OpMode, config->decodeMode);
    jpeg_drv_dec_set_dec_mode(config->reg_OpMode);    // set full frame or pause/resume


    // output bank 0
    jpeg_drv_dec_set_dst_bank0(config->outputBuffer0[0], config->outputBuffer0[1], config->outputBuffer0[2] );

    // output bank 1
    jpeg_drv_dec_set_dst_bank1(config->outputBuffer1[0], config->outputBuffer1[1], config->outputBuffer1[2] );


#ifdef TEST_JPEG_DEBUG_EN    
    jpeg_drv_dec_set_debug_mode();
#endif     


    return (int)E_HWJPG_OK;
}