📄 hw_vip.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 + -