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;
}
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 );  //REG_JPGDEC_INTERRUPT_STATUS = irq_status ; /*write clear*/
      
      // 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;
}
Ejemplo n.º 3
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;
}