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

📄 xllp_ci.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/****************************************************************************** 
** Copyright 2000-2003 Intel Corporation All Rights Reserved.
**
** Portions of the source code contained or described herein and all documents
** related to such source code (Material) are owned by Intel Corporation
** or its suppliers or licensors and is licensed by Microsoft Corporation for distribution.  
** Title to the Material remains with Intel Corporation or its suppliers and licensors. 
** Use of the Materials is subject to the terms of the Microsoft license agreement which accompanied the Materials.  
** No other license under any patent, copyright, trade secret or other intellectual
** property right is granted to or conferred upon you by disclosure or
** delivery of the Materials, either expressly, by implication, inducement,
** estoppel or otherwise 
** Some portion of the Materials may be copyrighted by Microsoft Corporation.
********************************************************************************/
#include "xllp_defs.h"
#include "xllp_serialization.h"
#include "xllp_ost.h"
#include "xllp_ci.h"
#include "xllp_clkmgr.h"
#include <stdlib.h>

//-------------------------------------------------------------------------------------------------------
//      Declarations
//-------------------------------------------------------------------------------------------------------
#define READ_REG(offset)         (*(unsigned int*)((unsigned)ci_reg_base + (offset)))
#define WRITE_REG(offset, value) *(unsigned int*)((unsigned)ci_reg_base + (offset)) = (value)

//-------------------------------------------------------------------------------------------------------
//      Configuration APIs
//-------------------------------------------------------------------------------------------------------
void XllpCISetFrameRate(unsigned int ci_reg_base, XLLP_CI_FRAME_CAPTURE_RATE frate)
{
    unsigned int value;
    
    // write cicr4
    value = READ_REG(XLLP_CICR4);
    value &= ~(XLLP_CI_CICR4_FR_RATE_SMASK << XLLP_CI_CICR4_FR_RATE_SHIFT);
    value |= (unsigned)frate << XLLP_CI_CICR4_FR_RATE_SHIFT;
    WRITE_REG(XLLP_CICR4, value);   
}

XLLP_CI_FRAME_CAPTURE_RATE XllpCIGetFrameRate(unsigned int ci_reg_base)
{
    unsigned int value;
    value = READ_REG(XLLP_CICR4);
    return (XLLP_CI_FRAME_CAPTURE_RATE)((value >> XLLP_CI_CICR4_FR_RATE_SHIFT) & XLLP_CI_CICR4_FR_RATE_SMASK);
}

void XllpCISetImageFormat(unsigned int ci_reg_base, XLLP_CI_IMAGE_FORMAT input_format, XLLP_CI_IMAGE_FORMAT output_format)
{
    unsigned int value, tbit, rgbt_conv, rgb_conv, rgb_f, ycbcr_f, rgb_bpp, raw_bpp, cspace;

    // write cicr1: preserve ppl value and data width value
    value = READ_REG(XLLP_CICR1);
    value &= ( (XLLP_CI_CICR1_PPL_SMASK << XLLP_CI_CICR1_PPL_SHIFT) | ((XLLP_CI_CICR1_DW_SMASK) << XLLP_CI_CICR1_DW_SHIFT));
    tbit = rgbt_conv = rgb_conv = rgb_f = ycbcr_f = rgb_bpp = raw_bpp = cspace = 0;
    switch(input_format) {
    case XLLP_CI_RAW8:
        cspace = 0;
        raw_bpp = 0;
        break;
    case XLLP_CI_RAW9:
        cspace = 0;
        raw_bpp = 1;
        break;
    case XLLP_CI_RAW10:
        cspace = 0;
        raw_bpp = 2;
        break;
    case XLLP_CI_YCBCR422:
    case XLLP_CI_YCBCR422_PLANAR:
        cspace = 2;
        if (output_format == XLLP_CI_YCBCR422_PLANAR) {
            ycbcr_f = 1;
        }
        break;
    case XLLP_CI_RGB444:
        cspace = 1;
        rgb_bpp = 0;
        break;  
    case XLLP_CI_RGB555:
        cspace = 1;
        rgb_bpp = 1;
        if (output_format == XLLP_CI_RGBT555_0) {
            rgbt_conv = 2;
            tbit = 0;
        } 
        else if (output_format == XLLP_CI_RGBT555_1) {
            rgbt_conv = 2;
            tbit = 1;
        }
        break;  
    case XLLP_CI_RGB565:
        cspace = 1;
        rgb_bpp = 2;
        rgb_f = 1;
        break;  
    case XLLP_CI_RGB666:
        cspace = 1;
        rgb_bpp = 3;
        if (output_format == XLLP_CI_RGB666_PACKED) {
            rgb_f = 1;
        }
        break;  
    case XLLP_CI_RGB888:
    case XLLP_CI_RGB888_PACKED:
        cspace = 1;
        rgb_bpp = 4;
        switch(output_format) {
        case XLLP_CI_RGB888_PACKED:
            rgb_f = 1;
            break;
        case XLLP_CI_RGBT888_0:
            rgbt_conv = 1;
            tbit = 0;
            break;
        case XLLP_CI_RGBT888_1:
            rgbt_conv = 1;
            tbit = 1;
            break;
        case XLLP_CI_RGB666:
            rgb_conv = 1;
            break;
        case XLLP_CI_RGB565:
            rgb_conv = 2;
            break;
        case XLLP_CI_RGB555:
            rgb_conv = 3;
            break;
        case XLLP_CI_RGB444:
            rgb_conv = 4;
            break;
        default:
            break;
        }
        break;  
    default:
        break;
    }
    value |= (tbit==1) ? XLLP_CI_CICR1_TBIT : 0;
    value |= rgbt_conv << XLLP_CI_CICR1_RGBT_CONV_SHIFT;
    value |= rgb_conv << XLLP_CI_CICR1_RGB_CONV_SHIFT;
    value |= (rgb_f==1) ? XLLP_CI_CICR1_RBG_F : 0;
    value |= (ycbcr_f==1) ? XLLP_CI_CICR1_YCBCR_F : 0;
    value |= rgb_bpp << XLLP_CI_CICR1_RGB_BPP_SHIFT;
    value |= raw_bpp << XLLP_CI_CICR1_RAW_BPP_SHIFT;
    value |= cspace << XLLP_CI_CICR1_COLOR_SP_SHIFT;
    WRITE_REG(XLLP_CICR1, value);   

    return; 
}

void XllpCISetMode(unsigned int ci_reg_base, XLLP_CI_MODE mode, XLLP_CI_DATA_WIDTH data_width)
{
    unsigned int value;

    // write mode field in cicr0    
    value = READ_REG(XLLP_CICR0);
    value &= ~(XLLP_CI_CICR0_SIM_SMASK << XLLP_CI_CICR0_SIM_SHIFT);
    value |= (unsigned int)mode << XLLP_CI_CICR0_SIM_SHIFT;
    WRITE_REG(XLLP_CICR0, value);   
    
    // write data width cicr1
    value = READ_REG(XLLP_CICR1);
    value &= ~(XLLP_CI_CICR1_DW_SMASK << XLLP_CI_CICR1_DW_SHIFT);
    value |= ((unsigned)data_width) << XLLP_CI_CICR1_DW_SHIFT;
    WRITE_REG(XLLP_CICR1, value);   
    return; 
}

void XllpCIConfigureMP(unsigned int ci_reg_base, unsigned int PPL, unsigned int LPF, XLLP_CI_MP_TIMING* timing)
{
    unsigned int value;
    
    // write ppl field in cicr1
    value = READ_REG(XLLP_CICR1);
    value &= ~(XLLP_CI_CICR1_PPL_SMASK << XLLP_CI_CICR1_PPL_SHIFT);
    value |= (PPL & XLLP_CI_CICR1_PPL_SMASK) << XLLP_CI_CICR1_PPL_SHIFT;
    WRITE_REG(XLLP_CICR1, value);   

    // write BLW, ELW in cicr2  
    value = READ_REG(XLLP_CICR2);
    value &= ~(XLLP_CI_CICR2_BLW_SMASK << XLLP_CI_CICR2_BLW_SHIFT | XLLP_CI_CICR2_ELW_SMASK << XLLP_CI_CICR2_ELW_SHIFT );
    value |= (timing->BLW & XLLP_CI_CICR2_BLW_SMASK) << XLLP_CI_CICR2_BLW_SHIFT;
    WRITE_REG(XLLP_CICR2, value);   
    
    // write BFW, LPF in cicr3
    value = READ_REG(XLLP_CICR3);
    value &= ~(XLLP_CI_CICR3_BFW_SMASK << XLLP_CI_CICR3_BFW_SHIFT | XLLP_CI_CICR3_LPF_SMASK << XLLP_CI_CICR3_LPF_SHIFT );
    value |= (timing->BFW & XLLP_CI_CICR3_BFW_SMASK) << XLLP_CI_CICR3_BFW_SHIFT;
    value |= (LPF & XLLP_CI_CICR3_LPF_SMASK) << XLLP_CI_CICR3_LPF_SHIFT;
    WRITE_REG(XLLP_CICR3, value);   
    return;
}

void XllpCIConfigureSP(unsigned int ci_reg_base, unsigned int PPL, unsigned int LPF, XLLP_CI_SP_TIMING* timing)
{
    unsigned int value;
    
    // write ppl field in cicr1
    value = READ_REG(XLLP_CICR1);
    value &= ~(XLLP_CI_CICR1_PPL_SMASK << XLLP_CI_CICR1_PPL_SHIFT);
    value |= (PPL & XLLP_CI_CICR1_PPL_SMASK) << XLLP_CI_CICR1_PPL_SHIFT;
    WRITE_REG(XLLP_CICR1, value);   

    // write cicr2
    value |= (timing->BLW & XLLP_CI_CICR2_BLW_SMASK) << XLLP_CI_CICR2_BLW_SHIFT;
    value |= (timing->ELW & XLLP_CI_CICR2_ELW_SMASK) << XLLP_CI_CICR2_ELW_SHIFT;
    value |= (timing->HSW & XLLP_CI_CICR2_HSW_SMASK) << XLLP_CI_CICR2_HSW_SHIFT;
    value |= (timing->BFPW & XLLP_CI_CICR2_BFPW_SMASK) << XLLP_CI_CICR2_BFPW_SHIFT;
    value |= (timing->FSW & XLLP_CI_CICR2_FSW_SMASK) << XLLP_CI_CICR2_FSW_SHIFT;
    WRITE_REG(XLLP_CICR2, value);   
    
    // write cicr3
    value |= (timing->BFW & XLLP_CI_CICR3_BFW_SMASK) << XLLP_CI_CICR3_BFW_SHIFT;
    value |= (timing->EFW & XLLP_CI_CICR3_EFW_SMASK) << XLLP_CI_CICR3_EFW_SHIFT;
    value |= (timing->VSW & XLLP_CI_CICR3_VSW_SMASK) << XLLP_CI_CICR3_VSW_SHIFT;
    value |= (LPF & XLLP_CI_CICR3_LPF_SMASK) << XLLP_CI_CICR3_LPF_SHIFT;
    WRITE_REG(XLLP_CICR3, value);   
    return;
}

void XllpCIConfigureMS(unsigned int ci_reg_base, unsigned int PPL, unsigned int LPF, XLLP_CI_MS_TIMING* timing)
{
    // the operation is same as Master-Parallel
    XllpCIConfigureMP(ci_reg_base, PPL, LPF, (XLLP_CI_MP_TIMING*)timing);
}
    
void XllpCIConfigureEP(unsigned int ci_reg_base, int parity_check)
{
    unsigned int value;

    // write parity_enable field in cicr0   
    value = READ_REG(XLLP_CICR0);

⌨️ 快捷键说明

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