Samsung6410下OV5642摄像头驱动程序

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++; }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值