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

📄 s3c6410_camera.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            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 + -