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

📄 csiclass.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT, 
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_YUV444);

            // Set timing and data protocol to Progressive CCIR mode.
            INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL, 
                IPU_CSI_SENS_CONF_SENS_PRTCL_CCIR_PROGRESSIVE_MODE);

            // Set up CCIR code registers
            INSREG32BF(&m_pIPU->CSI_CCIR_CODE_3, 
                IPU_CSI_CCIR_CODE_3_CCIR_PRECOM, 0xFF0000);

            INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1, 
                IPU_CSI_CCIR_CODE_1_STRT_FLD0_BLNK_1ST, 6);

            INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1, 
                IPU_CSI_CCIR_CODE_1_END_FLD0_ACTV, 4);

            INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1, 
                IPU_CSI_CCIR_CODE_1_STRT_FLD0_ACTV, 0);

            INSREG32BF(&m_pIPU->CSI_OUT_FRM_CTRL, 
                IPU_CSI_OUT_FRM_CTRL_HSC, 9);

            INSREG32BF(&m_pIPU->CSI_OUT_FRM_CTRL, 
                IPU_CSI_OUT_FRM_CTRL_VSC, 0x64);

            break;
        case csiSensorOutputFormat_RGB:

            // Set data format from the sensor.
            INSREG32BF(&m_pIPU->CSI_SENS_CONF, 
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT, 
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_RGB);

            // Set timing and data protocol to non-CCIR non-gated mode.
            INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL, 
                IPU_CSI_SENS_CONF_SENS_PRTCL_NONGATED_CLOCK_MODE);
//                IPU_CSI_SENS_CONF_SENS_PRTCL_GATED_CLOCK_MODE);

            break;
        case csiSensorOutputFormat_Bayer:

            // Set data format from the sensor.
            INSREG32BF(&m_pIPU->CSI_SENS_CONF, 
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT, 
                IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_BAYER);

            // Set timing and data protocol to non-CCIR non-gated mode.
            INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL,
                IPU_CSI_SENS_CONF_SENS_PRTCL_GATED_CLOCK_MODE);

            break;
    }

    // Data width should be 8 bits per color, regardless of the format
    INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_DATA_WIDTH, 
//                IPU_CSI_SENS_CONF_DATA_WIDTH_4BIT);
                IPU_CSI_SENS_CONF_DATA_WIDTH_8BIT);


    // Set up IC width and height configuration parameters and 
    // CSI sensor and actual frame size from the output resolution.
    // Note: Subtract one from frame height and width values 
    // before writing to CSI registers.
    switch (outResolution)
    {
        case csiSensorOutputResolution_SXGA:

            // Set up CSI sensor frame and actual frame for SXGA resolution.
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 1279);
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 959);

            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 1279);
            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 959);

            break;

        case csiSensorOutputResolution_VGA:

            // Set up CSI sensor frame and actual frame for VGA resolution
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 639);
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 479);

            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 639);
            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 479);

            break;

        case csiSensorOutputResolution_QVGA:

            // Set up CSI sensor frame and actual frame for QVGA resolution
            INSREG32(&m_pIPU->CSI_SENS_FRM_SIZE, 
                CSP_BITFMASK(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH),  
                CSP_BITFVAL(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 239));
            INSREG32(&m_pIPU->CSI_SENS_FRM_SIZE, 
                CSP_BITFMASK(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT),  
                CSP_BITFVAL(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 319));

            INSREG32(&m_pIPU->CSI_ACT_FRM_SIZE, 
                CSP_BITFMASK(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH),  
                CSP_BITFVAL(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 239));
            INSREG32(&m_pIPU->CSI_ACT_FRM_SIZE, 
                CSP_BITFMASK(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT),  
                CSP_BITFVAL(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 319));
            break;

        case csiSensorOutputResolution_CIF:

            // Set up CSI sensor frame and actual frame for CIF resolution
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 351);
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 287);

            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 351);
            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 287);

            break;

        case csiSensorOutputResolution_QCIF:

            // Set up CSI sensor frame and actual frame for QCIF resolution
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 175);
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 143);

            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 175);
            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 143);

            break;

        case csiSensorOutputResolution_QQVGA:

            // Set up CSI sensor frame and actual frame for QQVGA resolution
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 159);
            INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE, 
                IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 119);

            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE, 
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 159);
            INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
                IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 119);

            break;

        default:
            break;
    }

    CSI_FUNCTION_EXIT();

    return TRUE;
}

//-----------------------------------------------------------------------------
//
// Function: CsiZoom
//
// This function sets the camera zoom value.
//
// Parameters:
//      zoomVal
//          [in] zoom value.  
//                If 2, zoom by 2x.  If 1, zoom by 1x.  
//                All other values are invalid.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiZoom(DWORD zoomVal)
{
    CSI_FUNCTION_ENTRY();

    if (zoomVal == 2)
        BSPSetDigitalZoom(TRUE);
    else if (zoomVal == 1)
        BSPSetDigitalZoom(FALSE);
    else
        DEBUGMSG(ZONE_ERROR, (_T("%s: Invalid zoom value.  Must be 1 or 2.\r\n"), __WFUNCTION__));

    CSI_FUNCTION_EXIT();
}

//-----------------------------------------------------------------------------
//
// Function: CsiEnable
//
// Enable the Camera Sensor Interface.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiEnable(void)
{
    UINT32 oldVal, newVal, iMask, iBitval;

    CSI_FUNCTION_ENTRY();

    // Protect access to IPU_CONF register.
    // Set the bit to enable the CSI.

    // Compute bitmask and shifted bit value for IPU_CONF register
    iMask = CSP_BITFMASK(IPU_IPU_CONF_CSI_EN);
    iBitval = CSP_BITFVAL(IPU_IPU_CONF_CSI_EN, IPU_IPU_CONF_CSI_EN_ENABLE);

    // Use interlocked function to enable CSI.
    do
    {
        oldVal = INREG32(&m_pIPU->IPU_CONF);
        newVal = (oldVal & (~iMask)) | iBitval;
    } while (InterlockedTestExchange((LPLONG)&m_pIPU->IPU_CONF, 
                oldVal, newVal) != oldVal);

    CSI_FUNCTION_EXIT();
}

//-----------------------------------------------------------------------------
//
// Function: CsiDisable
//
// Disable the Camera Sensor Interface.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiDisable(void)
{
    UINT32 oldVal, newVal, iMask, iBitval;

    CSI_FUNCTION_ENTRY();

    // Protect access to IPU_CONF register.
    // Set the bit to disable the CSI.

    // Compute bitmask and shifted bit value for IPU_CONF register
    iMask = CSP_BITFMASK(IPU_IPU_CONF_CSI_EN);
    iBitval = CSP_BITFVAL(IPU_IPU_CONF_CSI_EN, IPU_IPU_CONF_CSI_EN_DISABLE);

    // Use interlocked function to disable CSI.
    do
    {
        oldVal = INREG32(&m_pIPU->IPU_CONF);
        newVal = (oldVal & (~iMask)) | iBitval;
    } while (InterlockedTestExchange((LPLONG)&m_pIPU->IPU_CONF, 
                oldVal, newVal) != oldVal);

    CSI_FUNCTION_EXIT();
}

⌨️ 快捷键说明

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