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

📄 hw_vip.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*	 Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File	:  HW_VIP.c
Desc	: 视频图象输入接口控制器 驱动
Author	: lingzj
Date	: 2007-06-30
Notes	: 

$Log: HW_VIP.c,v $
Revision 1.4  2008/07/15 11:49:53  DDL
YUV4:2:2 在vip中的支持

Revision 1.3  2008/07/10 02:02:38  DDL
增加对camera模块的支持

dengdl

Revision 1.3  2007/10/08 02:38:51  Lingzhaojun
添加版本自动注释脚本

1, 2008/02/19 dengxj Camera 模块整理修改

*********************************************************************/

#include "hw_include.h"
#include "HW_VIP.H"


#if ROCK_CAMERA

void VipReset(void)
{
	WriteReg32( RegVIP_RESET, 0x76543210 );
	delay_nops(100);
}

void VipInit(void)
{
	IOMUX_SetVipType( VIP_VIP_TYPE );
	IOMUX_SetVipClkType(VIPCLK_VIP_TYPE);
	Scu_ClockSet( VIP_HCLOCK, TRUE );
	Scu_ClockSet( VIP_CLOCK, TRUE );
	VipReset();
}
/*---------------------------------------------------------
Name  :  VipSetSensorSize
Desc  :  设置sensor输入图象的宽高
Params:  宽和高
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipSetSensorSize(VIPIMGSIZE Size)
{
	UINT32 SensorSize;

	SensorSize=(Size.xSize<<16)+Size.ySize;
	WriteReg32(RegVIP_FS,SensorSize);
}

/*---------------------------------------------------------
Name  :  VipSetImageSize
Desc  :  设置图象相对采集图像的起始位置
Params:  宽和高
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipSetImageClip(VIPIMGSIZE Size)
{
	UINT32 ImageSize;

	ImageSize=(Size.xSize<<16)+Size.ySize;
	WriteReg32(RegVIP_CROP,ImageSize);
}

/*---------------------------------------------------------
Name  :  VipSetAddressFrame1
Desc  :  设置VIP数据缓存区的地址(双buffer之一)
Params:  addr:三个地址
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipSetAddressFrame1(VIPIMGADDR addr)
{
	WriteReg32(RegVIP_CAPF1SA_Y, addr.AddrY);
	WriteReg32(RegVIP_CAPF1SA_UV,addr.AddrUV);
	WriteReg32(RegVIP_CAPF1SA_Cr,addr.AddrCr);	//NO USE!!!
}

/*---------------------------------------------------------
Name  :  VipSetAddressFrame2
Desc  :  设置VIP数据缓存区的地址(双buffer之一)
Params:  addr:三个地址
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipSetAddressFrame2(VIPIMGADDR addr)
{
	WriteReg32(RegVIP_CAPF2SA_Y, addr.AddrY);
	WriteReg32(RegVIP_CAPF2SA_UV,addr.AddrUV);
	WriteReg32(RegVIP_CAPF2SA_Cr,addr.AddrCr);	//NO USE!!!
}

/*---------------------------------------------------------
Name  :  VipSetMode
Desc  :  设置VIP控制器运行模式
Params:  Mode: sensor(单帧,乒乓或连续模式) 或 Video
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipSetMode(VIPDATA_FORMAT format, VIPMODE Mode, VIPOUT_FORMAT out_format)
{
	UINT32 VIP_CTRL;
	
	switch (Mode)
		{
		case VipModeSenorOneFrame:
			{
			if( format == eSensor )
				VIP_CTRL = (0x0025 | (out_format << 6));
			else if( format == ePAL )
				VIP_CTRL = (0x0621 | (out_format << 6));
			else				
				VIP_CTRL = (0x0021 | (out_format << 6));;
			}
			break;
		case VipModeSenorContinue:
			{
			if( format == eSensor )
				VIP_CTRL = 0x0005;
			else if( format == ePAL )
				VIP_CTRL = 0x0601;
			else
				VIP_CTRL = 0x0001;
			}
			break;
		case VipModeSenorPinPong:
			{
			if( format == eSensor )
				VIP_CTRL = 0x0105;
			else if( format == ePAL )
				VIP_CTRL = 0x0701;
			else
				VIP_CTRL = 0x0101;
			}
			break;
		default:
			break;
		}

	WriteReg32(RegVIP_AHBRCtrl, 0x0007);
	WriteReg32(RegVIP_INTMASK, 0x0001);
	WriteReg32(RegVIP_CRM,  0x0000);
	WriteReg32(RegVIP_FBSR, 0x0002);

	WriteReg32(RegVIP_CTRL, VIP_CTRL);

}

/*---------------------------------------------------------
Name  :  Vip_GetCurFrameIdx
Desc  :  获取当前ready的贞序号(1, 2)
Params:  无
Author:  dengxj
Date  :  080219
-----------------------------------------------------------*/
INT16U VipGetCurFrameIdx(void)
{
	INT16U frame = ReadReg32(RegVIP_FBSR)&0x03;
/*
	if(frame == 0x1)
		frame = 0;
	else if( frame == 0x2 )
		frame = 1;
	else
		frame = 2;
	
	return (frame+1);*/
	return frame;
}

/* frame: 2 清两frame , 0 清frame0, 1 清frame1 */
void VipClrFbsr(INT16U frame)
{
	if( frame == 2 )
		WriteReg32(RegVIP_FBSR, 0);
	else
		WriteReg32(RegVIP_FBSR, (ReadReg32(RegVIP_FBSR)&(~(0x1<<frame))));
}

INT16U VipIsFrameComplete(void)
{
	//return (ReadReg32(RegVIP_INTSTS)&0x1);	//不准
	return (VipGetCurFrameIdx()==3);				//改用这个0516
}

/*---------------------------------------------------------
Name  :  VipCapture
Desc  :  VIP从sensor拍摄一张图片,存放到指定地址
Params:  addr:单张图象存放地址,sensorSize: 设置sensor图片的大小,imageSize:设置抓取图像相对sensorSize的x,y坐标
Author:  LingZJ
Date  :  070630
Note	: 	format:
-----------------------------------------------------------*/
void VipCapture( VIPDATA_FORMAT format, VIPIMGADDR addr, VIPIMGSIZE sensorSize, VIPIMGSIZE imageSize,VIPOUT_FORMAT out_format )
{
	VipReset( );
		
	WriteReg32(RegVIP_CTRL, 0x64);
	
	VipSetSensorSize(sensorSize);
	VipSetImageClip(imageSize);
	VipSetAddressFrame1(addr);
	VipSetMode(format, VipModeSenorOneFrame,out_format);
}

/*---------------------------------------------------------
Name  :  VipPreview
Desc  :  预览sensor图象,存放到LCD控制器指定地址
Params:  f1Addr: 第一贞地址,f2Addr: 第二贞地址
Author:  LingZJ
Date  :  070630
-----------------------------------------------------------*/
void VipPreview(VIPDATA_FORMAT format, VIPIMGADDR f1Addr, VIPIMGADDR f2Addr, VIPIMGSIZE sensorSize, VIPIMGSIZE imageSize )
{
	VipReset( );	
	
	VipSetSensorSize(sensorSize);
	VipSetImageClip(imageSize);
	
	VipSetAddressFrame1(f1Addr);
	VipSetAddressFrame2(f2Addr);

	VipSetMode(format, VipModeSenorPinPong, eYUV420);
}

void VipStop(void)
{
	WriteReg32(RegVIP_CTRL, 0);
	while(ReadReg32(RegVIP_INTSTS));
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -