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