⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resizer.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
*  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 + -