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; }
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; }