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

📄 bspcsi.cpp

📁 Freescale ARM11系列CPU MX31的WINCE 5.0下的BSP
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Function: BSPGetSensorResolution
//
// This function returns the sensor data format.
//
// Parameters:
//      pSensorFormat
//          [out] Pointer to DWORD to hold return value of sensor resolution.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void BSPGetSensorResolution(DWORD *pSensorResolution)
{
    BSP_CSI_FUNCTION_ENTRY();

    switch (gSensorInUse)
    {
     case csiSensorId_Magna521DA:
          *pSensorResolution = csiSensorOutputResolution_VGA; //Currently only support XGA,VGA 
          break;

     case csiSensorId_Imagic8803:
     case csiSensorId_Imagic8201:
     default:
          *pSensorResolution = csiSensorOutputResolution_VGA; //640*480 for imagic sensor
          break;
    }	

    BSP_CSI_FUNCTION_EXIT();	

}

//------------------------------------------------------------------------------
//
// Function: BSPSetDigitalZoom
//
// This function sets the zoom value on the camera sensor.
//
// Parameters:
//      zoom
//          [in] If 2, zoom set to 2x; if 1, zoom set to 1x
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void BSPSetDigitalZoom (DWORD zoom)
{
    BSP_CSI_FUNCTION_ENTRY();
//    csiSensorOutputResolution sensorOutputResolution;
//    DWORD sensorResolution;

//    BSPGetSensorResolution(&sensorResolution);
//    sensorOutputResolution = (csiSensorOutputResolution) sensorResolution;

    switch (gSensorInUse)
    {
     case csiSensorId_Magna521DA:
//Currently,we don't support this feature. jacky reserved it.
//        CameraMagnaSetDigitalZoom(sensorOutputResolution,zoom); 
           break;

     case csiSensorId_Imagic8803:
     case csiSensorId_Imagic8201:
     default:
           // Call Imagic method to set zoom
           CameraImagicSetDigitalZoom(zoom);
           break;
    }        
    BSP_CSI_FUNCTION_EXIT();
}

//------------------------------------------------------------------------------
//
// Function: BSPCameraSetOutputResolution
//
// This function sets the output resolution on the camera sensor.
//
// Parameters:
//      outputMode
//          [in] Resolution type.
//
// Returns:
//      TRUE if success
//      FALSE if failure
//
//------------------------------------------------------------------------------
BOOL BSPCameraSetOutputResolution(csiSensorOutputResolution outputResolution)
{
    BSP_CSI_FUNCTION_ENTRY();

    switch (gSensorInUse)
    {
     case csiSensorId_Magna521DA:
           CameraMagnaSetOutputResolution(outputResolution);
           break;

     case csiSensorId_Imagic8803:
     case csiSensorId_Imagic8201:
     default:
           // Call Imagic method to set output mode
           CameraImagicSetOutputResolution(outputResolution);
           break;
    }        

    BSP_CSI_FUNCTION_EXIT();

    return TRUE;
}

//------------------------------------------------------------------------------
//
// Function: BSPCameraSetOutputFormat
//
// This function sets the output format on the camera sensor.
//
// Parameters:
//      outputFormat
//          [in] Format specified to output sensor data.
//
// Returns:
//      TRUE if success
//      FALSE if failure
//
//------------------------------------------------------------------------------
BOOL BSPCameraSetOutputFormat(csiSensorOutputFormat outputFormat)
{
    cameraOutputFormat cameraOutputFormat;
    
    BSP_CSI_FUNCTION_ENTRY();

    switch (outputFormat)
    {
      case csiSensorOutputFormat_Bayer:
           return FALSE;

      case csiSensorOutputFormat_YUV422:
           cameraOutputFormat = cameraOutputFormat_CCIR656;
           break;

      case csiSensorOutputFormat_YUV444:
           return FALSE;

      case csiSensorOutputFormat_RGB:
           cameraOutputFormat = cameraOutputFormat_RGB565;
           break;

      default:
           cameraOutputFormat = cameraOutputFormat_RGB565;
           break;
    }

    switch (gSensorInUse)
    {
     case csiSensorId_Magna521DA:
           CameraMagnaSetOutputFormat(cameraOutputFormat);
           break;

     case csiSensorId_Imagic8803:
     case csiSensorId_Imagic8201:
     default:
           // Call Imagic method to set output format
           CameraImagicSetOutputFormat(cameraOutputFormat);
           break;
    }        
    
    BSP_CSI_FUNCTION_EXIT();

    return TRUE;
}

//------------------------------------------------------------------------------
//
// Function: BSPSensorSetClockGatingMode
//
// This function calls to the CRM module to
// set the clock gating mode, turning on or off
// clocks to the Camera Sesnor.
//
// Parameters:
//      startClocks
//          [in] If TRUE, turn clocks to GPT on.
//                If FALSE, turn clocks to GPT off
//
// Returns:
//      TRUE if success.
//      FALSE if failure.
//
//------------------------------------------------------------------------------
BOOL BSPSensorSetClockGatingMode(BOOL startClocks)
{
    BSP_CSI_FUNCTION_ENTRY();

    if (startClocks)
    {
        // Turn CSI and sensor clocks on
        if (!DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_CSI,
            DDK_CLOCK_GATE_MODE_ENABLED_ALL))
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("%s: Failed to set clock gating mode!\r\n"), __WFUNCTION__));
            return FALSE;
        }
    }
    else
    {
        // Turn CSI and sensor clocks off
        if (!DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_CSI,
            DDK_CLOCK_GATE_MODE_DISABLED))
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("%s: Failed to set clock gating mode!\r\n"), __WFUNCTION__));
            return FALSE;
        }
    }

    BSP_CSI_FUNCTION_EXIT();

    return TRUE;
}

//-----------------------------------------------------------------------------
//
// Function: I2CWriteOneByte
//
// This function writes a single byte byData to the register stated in byReg.
//
// Parameters:
//      hI2C
//          [in] File handle to I2C Bus Interface.
//
//      byAddr
//          [in] I2C Slave device address.
//
//      byReg
//          [in] Register Index.
//
//      byData
//          [in] Data to write to byReg.
//
//      lpiResult
//          [in] Pointer of the result. The I2C Bus will store the
//            result of the operation in location pointed to by
//            lpiResult.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID I2CWriteOneByte(HANDLE hI2C, BYTE byAddr, BYTE byReg, BYTE byData, LPINT lpiResult)
{
    I2C_TRANSFER_BLOCK I2CXferBlock;
    I2C_PACKET I2CPacket;
    BYTE byOutData[2];

    BSP_CSI_FUNCTION_ENTRY();

    byOutData[0] = byReg;
    byOutData[1] = byData;
    I2CPacket.wLen = sizeof(byOutData);
    I2CPacket.pbyBuf = (PBYTE) &byOutData;

    I2CPacket.byRW = I2C_RW_WRITE;
    I2CPacket.byAddr = byAddr;
    I2CPacket.lpiResult = lpiResult;

    I2CXferBlock.pI2CPackets = &I2CPacket;
    I2CXferBlock.iNumPackets = 1;

    I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);

    BSP_CSI_FUNCTION_EXIT();
}

//-----------------------------------------------------------------------------
//
// Function: I2CReadOneByte
//
// This function read a single byte data from the register stated in byReg.
//
// Parameters:
//      hI2C
//          [in] File handle to I2C Bus Interface.
//
//      byAddr
//          [in] I2C Slave device address.
//
//      byReg
//          [in] Register Index.
//
//      lpiResult
//          [in] Pointer of the result. The I2C Bus will store the
//            result of the operation in location pointed to by
//            lpiResult.
//
// Returns:
//      The single byte content stored in byReg.
//
//-----------------------------------------------------------------------------
BYTE I2CReadOneByte(HANDLE hI2C, BYTE byAddr, BYTE byReg, LPINT lpiResult)
{
    I2C_TRANSFER_BLOCK I2CXferBlock;
    I2C_PACKET I2CPacket[2];
    BYTE byOutData;
    BYTE byInData;

    BSP_CSI_FUNCTION_ENTRY();

    byOutData = byReg;

    I2CPacket[0].pbyBuf = (PBYTE) &byOutData;
    I2CPacket[0].wLen = sizeof(byOutData);

    I2CPacket[0].byRW = I2C_RW_WRITE;
    I2CPacket[0].byAddr = byAddr;
    I2CPacket[0].lpiResult = lpiResult;


    I2CPacket[1].pbyBuf = (PBYTE) &byInData;
    I2CPacket[1].wLen = sizeof(byInData);

    I2CPacket[1].byRW = I2C_RW_READ;
    I2CPacket[1].byAddr = byAddr;
    I2CPacket[1].lpiResult = lpiResult;

    I2CXferBlock.pI2CPackets = I2CPacket;
    I2CXferBlock.iNumPackets = 2;

    I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);

    BSP_CSI_FUNCTION_EXIT();

    return byInData;
}

//-----------------------------------------------------------------------------
//
// Function: I2CWriteTwoBytes
//
// This function writes a two byte data to the register stated in byReg. The
// function will write byData1 first, followed by byData2. If byData1 is not
// written properly, the entire function will terminate without attempting to
// write byData2.
//
// Parameters:
//      hI2C
//          [in] File handle to I2C Bus Interface.
//
//      byAddr
//          [in] I2C Slave device address.
//
//      byReg
//          [in] Register Index.
//
//      byData1
//          [in] 1st Data to write to byReg.
//
//      byData2
//          [in] 2nd Data to write to byReg
//
//      lpiResult
//          [in] Pointer of the result. The I2C Bus will store the
//            result of the operation in location pointed to by
//            lpiResult.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID I2CWriteTwoBytes(HANDLE hI2C, BYTE byAddr, BYTE byReg, BYTE byData1, BYTE byData2, LPINT lpiResult)
{
    I2C_TRANSFER_BLOCK I2CXferBlock;
    I2C_PACKET I2CPacket;
    BYTE byOutData[3];

    BSP_CSI_FUNCTION_ENTRY();

    byOutData[0] = byReg;
    byOutData[1] = byData1;
    byOutData[2] = byData2;

    I2CPacket.wLen = sizeof(byOutData);
    I2CPacket.pbyBuf = (PBYTE) &byOutData;

    I2CPacket.byRW = I2C_RW_WRITE;
    I2CPacket.byAddr = byAddr;
    I2CPacket.lpiResult = lpiResult;

    I2CXferBlock.pI2CPackets = &I2CPacket;
    I2CXferBlock.iNumPackets = 1;

    I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);

    BSP_CSI_FUNCTION_EXIT();
}

//-----------------------------------------------------------------------------
//
// Function: I2CReadTwoBytes
//
// This function reads two bytes of data from the register stated in byReg.
//
// Parameters:
//      hI2C
//          [in] File handle to I2C Bus Interface.
//
//      byAddr
//          [in] I2C Slave device address.
//
//      byReg
//          [in] Register Index.
//
//      lpiResult
//          [in] Pointer of the result. The I2C Bus will store the
//          result of the operation in location pointed to by
//          lpiResult.
//
// Returns:
//      The two byte content stored in byReg.
//
//-----------------------------------------------------------------------------
WORD I2CReadTwoBytes(HANDLE hI2C, BYTE byAddr, BYTE byReg, LPINT lpiResult)
{
    I2C_TRANSFER_BLOCK I2CXferBlock;
    I2C_PACKET I2CPacket[2];
    BYTE byOutData;
    BYTE byInData[2];

    BSP_CSI_FUNCTION_ENTRY();

    byOutData = byReg;

    I2CPacket[0].pbyBuf = (PBYTE) &byOutData;
    I2CPacket[0].wLen = sizeof(byOutData);

    I2CPacket[0].byRW = I2C_RW_WRITE;
    I2CPacket[0].byAddr = byAddr;
    I2CPacket[0].lpiResult = lpiResult;


    I2CPacket[1].pbyBuf = (PBYTE) &byInData;
    I2CPacket[1].wLen = sizeof(byInData);

    I2CPacket[1].byRW = I2C_RW_READ;
    I2CPacket[1].byAddr = byAddr;
    I2CPacket[1].lpiResult = lpiResult;

    I2CXferBlock.pI2CPackets = I2CPacket;
    I2CXferBlock.iNumPackets = 2;

    I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);

    BSP_CSI_FUNCTION_EXIT();

    return ((0xFF & byInData[1]) | (((WORD) byInData[0]) << 8));
}

⌨️ 快捷键说明

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