Пример #1
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;
}
Пример #2
0
static int jpeg_dec_ioctl(unsigned int cmd, unsigned long arg, struct file *file)
{
    int retValue;
    unsigned int decResult, i;
    long timeout_jiff;
    JPEG_DEC_DRV_IN inParams;
    JPEG_DEC_DRV_OUT outParams;

    unsigned int *pStatus;
    unsigned int samplingFormat;
    unsigned int check_dec_addr = 0;
    unsigned int check_end_addr = 0;	
    
    pStatus = (unsigned int*)file->private_data;

    if(NULL == pStatus)
    {
        JPEG_WRN("Private data is null in flush operation. HOW COULD THIS HAPPEN ??\n");
        return -EFAULT;
    }
    
    switch(cmd)
    {
        case JPEG_DEC_IOCTL_INIT:
            JPEG_MSG("JPEG Decoder Initial and Lock\n");

            retValue = jpeg_drv_dec_init();
            if(retValue != 0)
            {
                return -EBUSY;   
            }  

            dec_src_va = 0;
            dec_src_pa = 0;
            table_buffer_va = 0;
            table_buffer_pa = 0;

            *pStatus = JPEG_DEC_PROCESS;
            
            break;
            
        case JPEG_DEC_IOCTL_CONFIG:
            JPEG_MSG("JPEG Decoder Configure Hardware\n");

            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;
            }
            // copy input parameters
            if(copy_from_user(&inParams, (void *)arg, sizeof(JPEG_DEC_DRV_IN)))
            {
                JPEG_WRN("JPEG Decoder : Copy from user error\n");
                return -EFAULT;
            }

            JPEG_MSG("JPEG Decoder src addr : 0x%x\n", inParams.srcStreamAddr);
            JPEG_MSG("JPEG Decoder src Size : %d\n", inParams.srcStreamSize); 
            JPEG_MSG("JPEG Decoder src format : %d\n", inParams.samplingFormat);
            JPEG_MSG("JPEG Decoder mcu row : %d\n", inParams.mcuRow);
            JPEG_MSG("JPEG Decoder mcu column : %d\n", inParams.mcuColumn);
            
            dec_src_size = inParams.srcStreamSize;
            //now_size = inParams.srcStreamSize;

            dec_src_va = 0;
            dec_src_pa = inParams.srcStreamAddr;
                       
            // 0. reset    
            jpeg_drv_dec_reset();

            // 1. set source address
            jpeg_drv_dec_set_file_buffer(dec_src_pa , dec_src_size);

            // 2. set table address
#ifdef USE_SYSRAM
            //table_buffer_pa = alloc_internal_sram(INTERNAL_SRAM_JPEG_DECODER, 4096, 2048);
            //table_buffer_pa = MTxxx_SYSRAM_ALLOC(ESysramUser_JPEG_CODEC, TABLE_SIZE, 2048);
            table_buffer_pa = inParams.table_addr;
#else
            table_buffer_va = dma_alloc_coherent(0, TABLE_SIZE, &table_buffer_pa, GFP_KERNEL);
#endif

            if(table_buffer_pa == 0)
            {
                JPEG_WRN("JPEG Decoder : table pa == 0!!!\n");
                return -EFAULT;
            }
            jpeg_drv_dec_set_table_address(table_buffer_pa);

            // 3. set sampling factor
            samplingFormat = inParams.samplingFormat;
            if(samplingFormat == 422 && inParams.vSamplingFactor[0] == 2)
            {
                samplingFormat = 421;
            }
            if(1 != jpeg_drv_dec_set_sampling_factor_related(samplingFormat))
            {
                JPEG_WRN("JPEG Decoder : Sampling Factor Unsupported!!!\n");
                return -EFAULT;
            }

            // 4. set component id
            if(inParams.componentNum == 1)
            {
                jpeg_drv_dec_set_component_id(inParams.componentID[0], 0, 0);
            }
            else
            {
                jpeg_drv_dec_set_component_id(inParams.componentID[0], inParams.componentID[1], inParams.componentID[2]);
            }
            
            // 5. set tatal mcu number
            jpeg_drv_dec_set_total_mcu(inParams.mcuRow * inParams.mcuColumn);

            // set mcu number per row
            //jpeg_drv_dec_set_mcu_per_row();

            // 6. set each DU
            for(i = 0 ; i < inParams.componentNum ; i++)
            {
                jpeg_drv_dec_set_du(i, inParams.totalDU[i], inParams.dummyDU[i], inParams.duPerMCURow[i]);
            }
            
            // 7. set file size
            jpeg_drv_dec_set_file_size(dec_src_size + 16);

            // 8. set Q-table id
            if(inParams.componentNum == 1)
            {
                jpeg_drv_dec_set_q_table_id(inParams.qTableSelector[0], 0, 0);
            }
            else
            {
                jpeg_drv_dec_set_q_table_id(inParams.qTableSelector[0], inParams.qTableSelector[1], inParams.qTableSelector[2]);
            }

            break;
        
        case JPEG_DEC_IOCTL_START:
            // copy input parameters
            JPEG_MSG("JPEG Decoder : JPEG_DEC_IOCTL_START\n");

            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;
            }
//            jpeg_reg_dump();
            jpeg_drv_dec_start();

            return 0;
            
            
        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("JPEG Decoder Time Jiffies : %ld\n", timeout_jiff);   
#ifdef FPGA_VERSION
            JPEG_MSG("Polling JPEG Status");

            do
            {
                _jpeg_dec_int_status = REG_JPEG_DEC_INTERRUPT_STATUS;
            } while(_jpeg_dec_int_status == 0);
#else
            wait_event_interruptible_timeout(dec_wait_queue, _jpeg_dec_int_status, timeout_jiff);
#endif
            
            decResult = jpeg_drv_dec_get_result();
            _jpeg_dec_int_status = 0;

#ifndef USE_SYSRAM    
            if(table_buffer_va != 0)
            {
                dma_free_coherent(0, TABLE_SIZE, table_buffer_va, table_buffer_pa);
                table_buffer_va = 0;
            }
#endif


#if 1
            check_dec_addr = ioread32(JPG_CODEC_BASE + 0x00);
            check_end_addr = ioread32(JPG_CODEC_BASE + 0x4C);
#endif

            JPEG_MSG("Decode Result : %d, dec_addr %x, f_s %x!\n", decResult, check_dec_addr, check_end_addr);
            if(decResult != 0)
            {
                jpeg_reg_dump();
            }
            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_DEINIT:
            // copy input parameters
            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;
            }
            jpeg_drv_dec_deinit();
            *pStatus = 0;
            
            break;
    }
    return 0;
}