📄 resizer.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* resizer.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* Driver of image resizer
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
#include "Drv_comm.h"
#include "reg_base.h"
#include "intrCtrl.h"
#include "visual_comm.h"
#include "imgproc.h"
#include "stack_config.h"
#include "resizer.h"
#include "drvpdn.h"
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
// global variable
static RESZ_DCB_STRUCT resz_dcb;
/*
* FUNCTION
* RESZ_Init
*
* DESCRIPTION
* reset the control block of resizer
*
* CALLS
*
* PARAMETERS
* owner
*
* RETURNS
* status
*
* GLOBALS AFFECTED
* resz_dcb.owner
*/
kal_int32 API RESZ_Init(void)
{
kal_mem_set(&resz_dcb,0,sizeof(RESZ_DCB_STRUCT));
return NO_ERROR;
}
/*
* FUNCTION
* RESZ_Open
*
* DESCRIPTION
* Obtain the ownership of resizer. Only the owner can control it.
*
* CALLS
*
* PARAMETERS
* owner
*
* RETURNS
* status
*
* GLOBALS AFFECTED
* resz_dcb.owner
*/
kal_int32 API RESZ_Open(MMDI_SCENERIO_ID owner)
{
ENTER_CRITICAL();
ASSERT(resz_dcb.owner == SCENARIO_UNKNOW_ID);
resz_dcb.owner = owner;
EXIT_CRITICAL();
DRVPDN_Disable(DRVPDN_CON3,DRVPDN_CON3_RESZ,PDN_RESZ);
return NO_ERROR;
}
/*
* FUNCTION
* RESZ_Close
*
* DESCRIPTION
* Release the ownership of resizer.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
kal_int32 API RESZ_Close(MMDI_SCENERIO_ID owner)
{
ASSERT(resz_dcb.owner == owner);
DRV_WriteReg32(RESZ_CON, 0);
kal_mem_set(&resz_dcb,0,sizeof(RESZ_DCB_STRUCT));
DRVPDN_Enable(DRVPDN_CON3,DRVPDN_CON3_RESZ,PDN_RESZ);
return NO_ERROR;
}
/*
* FUNCTION
* RESZ_Config
*
* DESCRIPTION
* Set RESZ_CFG register about global configuration
*
* CALLS
* None
*
* PARAMETERS
* cfg:
* src1: pixel-based image source
* pcontinue: specify if pixel-based resizing continues
* pixel_sel: determine if pixel-based image or block-based image is serviced
* run2: indicate if twice resizing is enabed
* src2: specify the image source of second run
* s:
* for pixel mode => RESZ_PXL_CFG_STRUCT
* for block mode => RESZ_BLK_CFG_STRUCT
* RETURNS
* NO_ERROR
*
* GLOBALS AFFECTED
* None
*/
kal_int32 API RESZ_Config(RESZ_CFG_STRUCT *cfg, void* s, MMDI_SCENERIO_ID owner)
{
kal_uint32 reg = 0;
ASSERT(owner == resz_dcb.owner);
ASSERT(resz_dcb.state != RESZ_BUSY);
DRV_WriteReg32(RESZ_CON, RESZ_ALL_RST);
DRV_WriteReg32(RESZ_CON, 0);
reg = (cfg->src1)|(cfg->pcontinue << 4)|(cfg->pixel_sel << 5)|
(cfg->run2 << 6)|(cfg->src2 << 8);
DRV_WriteReg32(RESZ_CFG, reg);
resz_dcb.cfg = *cfg;
if(cfg->pixel_sel)
{
RESZ_PXL_CFG_STRUCT *p;
p = (RESZ_PXL_CFG_STRUCT *)s;
RESZ_SetWMSize(p->wmsize,KAL_TRUE);
RESZ_SET_WMBASE_PXL(p->wmbase);
}
else
{
RESZ_BLK_CFG_STRUCT *p;
p = (RESZ_BLK_CFG_STRUCT *)s;
reg = 0;
reg = (p->csf)|(p->hy << 4)|(p->vy << 6)|(p->hu << 8)|
(p->vu << 10)|(p->hv << 12)|(p->vv << 14);
DRV_WriteReg32(RESZ_BLKCSCFG, reg);
RESZ_SetWMSize(p->wmsize,KAL_FALSE);
#if (defined(MT6219))
RESZ_SET_WMBASE_BLK(p->ywmbase,p->uwmbase,p->vwmbase);
RESZ_SET_LMBASE_BLK(p->ylmbase,p->ulmbase,p->vlmbase);
RESZ_SET_LBSIZE_BLK(p->ylbsize,p->ulbsize,p->vlbsize);
#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227))
RESZ_SET_WMBASE_PXL(p->ywmbase);
RESZ_SET_LMBASE_BLK(p->ylmbase,p->ulmbase,p->vlmbase);
RESZ_SET_LBSIZE_BLK(p->ylbsize,p->ulbsize,p->vlbsize);
#endif
}
resz_dcb.state = RESZ_READY;
return NO_ERROR;
}
/*
* FUNCTION
* RESZ_SetWMSize
*
* DESCRIPTION
* Setting the working memory size.It specifies how many lines can be
filled into working memory for each color component in the block-based mode
In pixel based-mode, the register specifies how many lines can be filled into
working memory.
*
* CALLS
*
* PARAMETERS
* size: lines can be filled into working memory
* pixel: is pixel mode
*
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
kal_int32 INTERN RESZ_SetWMSize(kal_uint16 size, kal_bool pixel)
{
if(pixel)
{
ASSERT((size < 17) && (size > 3));
}
else
{
ASSERT((size & 1) == 0); // must be even for block mode
ASSERT(size < 2047); // maximum = 2046
}
DRV_Reg32(RESZ_FRCFG) &= 0xffff;
DRV_Reg32(RESZ_FRCFG) |= (size << 16);
return NO_ERROR;
}
/*
* FUNCTION
* RESZ_SetSize
*
* DESCRIPTION
* setting the source width and height and target ones
*
* CALLS
*
* PARAMETERS
* src_w: width of source image
* src_h: height of source image
* tar_w: width of target image
* tar_h: height of target image
* run: src indicate first or second run(0: first, 1: sencond)
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
kal_int32 API RESZ_SetSize(kal_uint32 src_w, kal_uint32 src_h, kal_uint32 tar_w, kal_uint32 tar_h, MMDI_SCENERIO_ID owner)
{
kal_uint32 reg;
ASSERT(owner == resz_dcb.owner);
ASSERT(resz_dcb.state != RESZ_BUSY);
if( (src_w > 2047)||(src_w > 2047)||(src_w > 2047)||(src_w > 2047))
return RESZ_ERR_INVALID_SIZE;
/* Hardware limitation */
if (resz_dcb.owner==SCENARIO_IMG_EFFECT_ID||resz_dcb.owner==SCENARIO_JPEG_ENCODE_ID)
*((volatile unsigned int *) 0x80610090) &= ~0x200;
else
{
if (src_h==tar_h)
*((volatile unsigned int *) 0x80610090) |= 0x200;
else
*((volatile unsigned int *) 0x80610090) &= ~0x200;
}
reg = ((src_h<<16)|src_w);
DRV_WriteReg32(RESZ_SRCSZ1, reg);
reg = ((tar_h<<16)|tar_w);
DRV_WriteReg32(RESZ_TARSZ1, reg);
// set ratios
reg = (kal_uint32)((src_w<<RESZ_H_RATIO_SHIFT_BITS)/tar_w);
DRV_WriteReg32(RESZ_HRATIO1, reg);
reg = (kal_uint32)((src_h<<RESZ_V_RATIO_SHIFT_BITS)/tar_h);
DRV_WriteReg32(RESZ_VRATIO1, reg);
// set residual
reg = (kal_uint16)(src_w%tar_w);
if(reg > RESZ_HRES1_MAX)
return RESZ_ERR_INVALID_SIZE;
// DRV_WriteReg32(RESZ_HRES1, reg);
DRV_WriteReg32(RESZ_HRES1, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -