Samsung6410下OV5642摄像头驱动程序

来源:互联网 发布:成都收银软件 编辑:程序博客网 时间:2024/05/16 12:28

6410:

以OV9650驱动程序为基础更改,后来感觉两个摄像头差别太大,但是在后端基本上是一致的。

需要注意的几个地方:

1. 寄存器地址的不同,5642使用32位地址。所以读写寄存器函数要做相应更改。

DWORD HW_WriteRegisters(PUCHAR pBuff, DWORD nRegs);
DWORD HW_ReadRegisters(PUCHAR pBuff, PUCHAR StartReg, DWORD nRegs);

DWORD
HW_WriteRegisters(
    PUCHAR pBuff,   // Optional buffer
    DWORD nRegs     // number of registers
    )
{
    DWORD dwErr=0;
    DWORD bytes;
    IIC_IO_DESC IIC_Data;
   
    RETAILMSG(OV5642_DEBUG,(TEXT("HW_WriteRegisters++ /r/n")));   
   
    IIC_Data.SlaveAddress = CAMERA_WRITE;
    IIC_Data.Count    = nRegs;
    IIC_Data.Data = pBuff;
   
    // use iocontrol to write
    if ( !DeviceIoControl(hI2C,
                          IOCTL_IIC_WRITE,
                          &IIC_Data, sizeof(IIC_IO_DESC),
                          NULL, 0,
                          &bytes, NULL) )
    {
        dwErr = GetLastError();
        RETAILMSG(OV5642_ERROR,(TEXT("IOCTL_IIC_WRITE ERROR: %u /r/n"), dwErr));
    }  

    if ( dwErr ) {
        RETAILMSG(OV5642_ERROR, (TEXT("I2CWrite ERROR: %u /r/n"), dwErr));
    }           
    RETAILMSG(OV5642_DEBUG,(TEXT("HW_WriteRegisters-- /r/n")));   

    return dwErr;
}

DWORD
HW_ReadRegisters(
    PUCHAR pBuff,       // Optional buffer
    PUCHAR StartReg,     // Start Register
    DWORD nRegs         // Number of Registers
    )
{
    DWORD dwErr=0;
    DWORD bytes;
    IIC_IO_DESC IIC_AddressData, IIC_Data;

    RETAILMSG(OV5642_DEBUG,(TEXT("HW_ReadRegisters++ /r/n")));
   
    IIC_AddressData.SlaveAddress = CAMERA_WRITE;
    IIC_AddressData.Data = StartReg;
    IIC_AddressData.Count = 2;
   
    IIC_Data.SlaveAddress = CAMERA_READ;
    IIC_Data.Data = pBuff;
    IIC_Data.Count = 1;
   
    // use iocontrol to read   
    if ( !DeviceIoControl(hI2C,
                          IOCTL_IIC_READ,
                          &IIC_AddressData, sizeof(IIC_IO_DESC),
                          &IIC_Data, sizeof(IIC_IO_DESC),
                          &bytes, NULL) )
    {
        dwErr = GetLastError();
        RETAILMSG(OV5642_ERROR,(TEXT("IOCTL_IIC_WRITE ERROR: %u /r/n"), dwErr));
    }  

   
    if ( !dwErr ) {


    } else {       
        RETAILMSG(OV5642_ERROR,(TEXT("I2CRead ERROR: %u /r/n"), dwErr));
    }           

    RETAILMSG(OV5642_DEBUG,(TEXT("HW_ReadRegisters-- /r/n")));
   
    return dwErr;
}

2. int ModuleSetImageSize(int imageSize) 函数不能用了。

3. 要注意pclk!!!否则全绿。

4. 在写寄存器的时候先MSB后LSB

UCHAR GetMSB(WORD num)
{
    UCHAR retVal = ( num >> 8 ) & 0xff;
    return retVal;
}

UCHAR GetLSB(WORD num)
{
    UCHAR retVal = ( num & 0xff );
    return retVal;
}

5. 读寄存器操作前最好加上延时

void Delay(UINT32 count)
{
    volatile int i, j = 0;
    volatile static int loop = S3C6410_ACLK / 100000;

    for(; count > 0; count--)
        for(i = 0; i < loop; i++) { j++; }
}

 

原创粉丝点击