📄 s3c6410_camera.cpp
字号:
sizeY = Video_Buffer.Width*Video_Buffer.Height;
sizeC = Video_Buffer.Width*Video_Buffer.Height/4;
for(i=0;i<MAX_HW_FRAMES;i++)
{
pBufInfo[i].pCb = (DWORD*)((DWORD)pBufInfo[i].pY + sizeY);
pBufInfo[i].pCr = (DWORD*)((DWORD)pBufInfo[i].pCb + sizeC);
}
}
}
else if(BufferType == STILL_CAPTURE_BUFFER)
{
size = CalculateBufferSize(Still_Buffer.Width, Still_Buffer.Height, Still_Buffer.Format);
Still_Buffer.FrameSize = size;
Still_Buffer.Size = size;
RETAILMSG(CAM_MSG,(TEXT("Still_Buffer.Width=%d Still_Buffer.Height=%d Still_Buffer.Size=%d Still_Buffer.Format=%d\n"),Still_Buffer.Width, Still_Buffer.Height, Still_Buffer.Size, Still_Buffer.Format));
if(Still_Buffer.Size > CAPTURE_BUFFER_SIZE)
{
RETAILMSG(CAM_ERR,(TEXT("Still size is larger than buffer size\n")));
return FALSE;
}
pBufInfo[0].VirtAddr = (DWORD)pCodecVirtAddr;
pBufInfo[0].size = size;
pBufInfo[0].pY = (DWORD*)(PhysCodecAddr.LowPart);
if(OUTPUT_CODEC_YCBCR420 == Still_Buffer.Format)
{
sizeY = Still_Buffer.Width*Still_Buffer.Height;
sizeC = Still_Buffer.Width*Still_Buffer.Height/4;
pBufInfo[0].pCb = (DWORD*)((DWORD)pBufInfo[0].pY + sizeY);
pBufInfo[0].pCr = (DWORD*)((DWORD)pBufInfo[0].pCb + sizeC);
}
}
else if(BufferType == PREVIEW_CAPTURE_BUFFER)
{
size = CalculateBufferSize(Preview_Buffer.Width, Preview_Buffer.Height, Preview_Buffer.Format);
Preview_Buffer.FrameSize = size;
Preview_Buffer.Size = size * MAX_HW_FRAMES;
RETAILMSG(CAM_MSG,(TEXT("Preview_Buffer.Width=%d Preview_Buffer.Height=%d Preview_Buffer.Size=%d Preview_Buffer.Format=%d\n"),Preview_Buffer.Width, Preview_Buffer.Height, Preview_Buffer.Size, Preview_Buffer.Format));
if(Preview_Buffer.Size > PREVIEW_BUFFER_SIZE)
{
RETAILMSG(CAM_ERR,(TEXT("Preview size is larger than buffer size\n")));
return FALSE;
}
for(i=0;i<MAX_HW_FRAMES;i++)
{
pBufInfo[i].VirtAddr = (DWORD)pPreviewVirtAddr + size*i;
pBufInfo[i].size = size;
pBufInfo[i].pY = (DWORD*)((DWORD)(PhysPreviewAddr.LowPart) + size*i);
}
if(OUTPUT_CODEC_YCBCR420 == Preview_Buffer.Format)
{
sizeY = Preview_Buffer.Width*Preview_Buffer.Height;
sizeC = Preview_Buffer.Width*Preview_Buffer.Height/4;
for(i=0;i<MAX_HW_FRAMES;i++)
{
pBufInfo[i].pCb = (DWORD*)((DWORD)pBufInfo[i].pY + sizeY);
pBufInfo[i].pCr = (DWORD*)((DWORD)pBufInfo[i].pCb + sizeC);
}
}
}
else
{
return FALSE;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraPrepareBuffer\n")));
return TRUE;
}
int CameraDeallocateBuffer(int BufferType)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraDeallocateBuffer\n")));
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraDeallocateBuffer\n")));
return TRUE;
}
int CameraSetFormat(UINT32 width, UINT32 height, int format, int BufferType)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetFormat\n")));
if(BufferType == VIDEO_CAPTURE_BUFFER)
{
Video_Buffer.Width = width;
Video_Buffer.Height = height;
Video_Buffer.Format = format;
}
else if(BufferType == STILL_CAPTURE_BUFFER)
{
Still_Buffer.Width = width;
Still_Buffer.Height = height;
Still_Buffer.Format = format;
}
else if(BufferType == PREVIEW_CAPTURE_BUFFER)
{
Preview_Buffer.Width = width;
Preview_Buffer.Height = height;
Preview_Buffer.Format = format;
}
else
{
return FALSE;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraSetFormat\n")));
return TRUE;
}
void CameraSetCodecRegister(UINT32 width, UINT32 height, int Format) // set codec register
{
MODULE_DESCRIPTOR value;
BYTE Out422_Co, Cpt_CoDMA_RGBFMT;
UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetCodecRegister Width=%d Height=%d Format=%d\n"),width,height,Format));
ModuleGetFormat(value);
switch(Format)
{
case OUTPUT_CODEC_YCBCR422:
Out422_Co = 2; // we don't support Non-interleave 4:2:2
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeY /= 2;
RemainedBurstSizeY /= 2;
MainBurstSizeC = MainBurstSizeY/2;
RemainedBurstSizeC = RemainedBurstSizeY/2;
//CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
case OUTPUT_CODEC_RGB16:
Out422_Co = 3;
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_RGB24:
Out422_Co = 3;
Cpt_CoDMA_RGBFMT = 2;
CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_YCBCR420:
default:
Out422_Co = 0;
Cpt_CoDMA_RGBFMT = 0;
CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
}
s6410CAM->CICOTRGFMT= (Out422_Co<<29)|(width<<16)|(height);
s6410CAM->CICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4)|(0);
s6410CAM->CICOSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_CoDMA_RGBFMT<<11)|(0<<10);
CameraSetScaler(width,height,CODEC_PATH);
s6410CAM->CICOTAREA=width*height;
//s6410CAM->CIIMGCPT ;
RETAILMSG(CAM_INOUT,(TEXT("------------------SetCodecRegister\n")));
}
void CameraSetPreviewRegister(UINT32 width, UINT32 height, int Format) // set preview register
{
MODULE_DESCRIPTOR value;
BYTE Out422_Pr, Cpt_PrDMA_RGBFMT;
UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetPreviewRegister\n")));
ModuleGetFormat(value);
switch(Format)
{
case OUTPUT_CODEC_YCBCR422:
Out422_Pr = 2; // we don't support Non-interleave 4:2:2
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
case OUTPUT_CODEC_RGB16:
Out422_Pr = 3;
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_RGB24:
Out422_Pr = 3;
Cpt_PrDMA_RGBFMT = 2;
CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);
MainBurstSizeC = 0;
RemainedBurstSizeC = 0;
break;
case OUTPUT_CODEC_YCBCR420:
default:
Out422_Pr = 0;
Cpt_PrDMA_RGBFMT = 0;
CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);
break;
}
s6410CAM->CIPRTRGFMT= (Out422_Pr<<29)|(width<<16)|(height);
s6410CAM->CIPRCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);
s6410CAM->CIPRSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_PrDMA_RGBFMT<<11)|(0<<10);
CameraSetScaler(width,height,PREVIEW_PATH);
s6410CAM->CIPRTAREA= width*height;
s6410CAM->CICPTSEQ = 0xFFFFFFFF;
s6410CAM->CIMSCTRL = 0;
s6410CAM->CIPRSCOSY = 0;
s6410CAM->CIPRSCOSCB = 0;
s6410CAM->CIPRSCOSCR = 0;
RETAILMSG(CAM_INOUT,(TEXT("------------------SetPreviewRegister\n")));
}
/********************************************************
CalculateBurstSize - Calculate the busrt lengths
Description:
- dstHSize: the number of the byte of H Size.
*/
void CalculateBurstSize(unsigned int hSize,unsigned int *mainBurstSize,unsigned int *remainedBurstSize)
{
unsigned int tmp;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBurstSize\n")));
tmp=(hSize/4)%16;
switch(tmp) {
case 0:
*mainBurstSize=16;
*remainedBurstSize=16;
break;
case 4:
*mainBurstSize=16;
*remainedBurstSize=4;
break;
case 8:
*mainBurstSize=16;
*remainedBurstSize=8;
break;
default:
tmp=(hSize/4)%8;
switch(tmp) {
case 0:
*mainBurstSize=8;
*remainedBurstSize=8;
break;
case 4:
*mainBurstSize=8;
*remainedBurstSize=4;
break;
default:
*mainBurstSize=4;
tmp=(hSize/4)%4;
*remainedBurstSize= (tmp) ? tmp: 4;
break;
}
break;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBurstSize\n")));
}
/********************************************************
CalculatePrescalerRatioShift - none
Description:
- none
*/
void CalculatePrescalerRatioShift(unsigned int SrcSize, unsigned int DstSize, unsigned int *ratio,unsigned int *shift)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculatePrescalerRatioShift\n")));
if(SrcSize>=64*DstSize) {
// Uart_Printf("ERROR: out of the prescaler range: SrcSize/DstSize = %d(< 64)\r\n",SrcSize/DstSize);
while(1);
}
else if(SrcSize>=32*DstSize) {
*ratio=32;
*shift=5;
}
else if(SrcSize>=16*DstSize) {
*ratio=16;
*shift=4;
}
else if(SrcSize>=8*DstSize) {
*ratio=8;
*shift=3;
}
else if(SrcSize>=4*DstSize) {
*ratio=4;
*shift=2;
}
else if(SrcSize>=2*DstSize) {
*ratio=2;
*shift=1;
}
else {
*ratio=1;
*shift=0;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculatePrescalerRatioShift\n")));
}
UINT32 CalculateBufferSize(UINT32 width, UINT32 height, int format)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBufferSize\n")));
UINT32 size=0;
switch(format)
{
case OUTPUT_CODEC_YCBCR422:
size = width*height + width*height/2*2;
break;
case OUTPUT_CODEC_YCBCR420:
size = width*height + width*height/4*2;
break;
case OUTPUT_CODEC_RGB24:
size = width*height*4;
break;
case OUTPUT_CODEC_RGB16:
size = width*height*2;
break;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBufferSize\n")));
return size;
}
int CameraGetCurrentFrameNum(int BufferType)
{
int temp;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraGetCurrentFrameNum\n")));
if(VIDEO_CAPTURE_BUFFER == BufferType)
{
temp = (s6410CAM->CICOSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
else if(STILL_CAPTURE_BUFFER == BufferType)
{
temp = (s6410CAM->CICOSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
else if(PREVIEW_CAPTURE_BUFFER == BufferType)
{
temp = (s6410CAM->CIPRSTATUS>>26)&3;
temp = (temp + 2) % 4;
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraGetCurrentFrameNum\n")));
return temp;
}
int CameraCaptureControl(int Format, BOOL on)
{
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraCaptureControl\n")));
if(!bPowerOn)
{
RETAILMSG(CAM_MSG,(TEXT("[CAM] Camera is Power Off state\n")));
return TRUE;
}
s6410CAM->CIIMGCPT &= ~(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);
if(PREVIEW_CAPTURE_BUFFER == Format)
{
if(on)
{
RETAILMSG(CAM_MSG,(TEXT("Preview ON\n")));
PreviewOn = TRUE;
s6410CAM->CIPRSCCTRL |=(CAM_PVIEW_SACLER_START_BIT);
s6410CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
}
else
{
RETAILMSG(CAM_MSG,(TEXT("Preview OFF\n")));
PreviewFrameCnt = 0;
PreviewOn = FALSE;
s6410CAM->CIPRSCCTRL &= ~(CAM_PVIEW_SACLER_START_BIT);
s6410CAM->CIIMGCPT &= ~(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
}
}
else // STILL, VIDEO
{
if(on)
{
RETAILMSG(CAM_MSG,(TEXT("Capture ON\n")));
CodecOn = TRUE;
if(STILL_CAPTURE_BUFFER == Format)
{
StillOn = TRUE;
VideoOn = FALSE;
}
else
{
StillOn = FALSE;
VideoOn = TRUE;
}
s6410CAM->CICOSCCTRL |=(CAM_CODEC_SACLER_START_BIT);
s6410CAM->CIIMGCPT |=(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
}
else
{
RETAILMSG(CAM_MSG,(TEXT("Capture OFF\n")));
CodecOn = FALSE;
StillOn = FALSE;
VideoOn = FALSE;
CodecFrameCnt = 0;
s6410CAM->CICOSCCTRL &= ~(CAM_CODEC_SACLER_START_BIT);
s6410CAM->CIIMGCPT &= ~((CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT));
}
}
if(PreviewOn == FALSE && CodecOn == FALSE) // All Off
{
s6410CAM->CIGCTRL &= ~(1<<20);
}
else // On
{
s6410CAM->CIGCTRL |= (1<<20);
s6410CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);
RETAILMSG(CAM_MSG,(TEXT("s6410CAM->CIPRSCCTRL=0x%08X\n"),s6410CAM->CIPRSCCTRL));
RETAILMSG(CAM_MSG,(TEXT("s6410CAM->CIIMGCPT=0x%08X\n"),s6410CAM->CIIMGCPT));
RETAILMSG(CAM_MSG,(TEXT("s6410CAM->CIPRSTATUS=0x%08X\n"),s6410CAM->CIPRSTATUS));
}
RETAILMSG(CAM_INOUT,(TEXT("------------------CameraCaptureControl\n")));
return TRUE;
}
int CameraSetRegisters(int format)
{
int size;
int sizeY,sizeC;
RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetRegisters\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -