#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include "hi_comm_video.h"
#include "hi_sns_ctrl.h"
#ifdef HI_GPIO_I2C
#include "gpioi2c_ex.h"
#else
#include "hi_i2c.h"
#endif
const unsigned char imx377_i2c_addr = 0x34; /* I2C Address of imx377 */
const unsigned int imx377_addr_byte = 2;
const unsigned int imx377_data_byte = 1;
static int g_fd[ISP_MAX_DEV_NUM] = {-1, -1};
static HI_BOOL g_bStandBy[ISP_MAX_DEV_NUM] = {0,0};
extern ISP_SNS_STATE_S g_astImx377[ISP_MAX_DEV_NUM];
extern ISP_SNS_COMMBUS_U g_aunImx377BusInfo[];
#define IMX377_8M_30FPS_10BIT_LINEAR_MODE (1)
#define IMX377_8M_60FPS_10BIT_LINEAR_MODE (2)
#define IMX377_1080P_120FPS_12BIT_LINEAR_MODE (3)
#define IMX377_720P_240FPS_10BIT_LINEAR_MODE (4)
#define IMX377_12M_30FPS_12BIT_LINEAR_MODE (5)
#define IMX377_8M_30FPS_12BIT_LINEAR_MODE (6)
#define IMX377_12M_20FPS_10BIT_LINEAR_MODE (7)
int imx377_i2c_init(ISP_DEV IspDev)
{
char acDevFile[16] = {0};
HI_U8 u8DevNum;
if(g_fd[IspDev] >= 0)
{
return 0;
}
#ifdef HI_GPIO_I2C
int ret;
g_fd[IspDev] = open("/dev/gpioi2c_ex", 0);
if(g_fd[IspDev] < 0)
{
printf("Open gpioi2c_ex error!\n");
return -1;
}
#else
int ret;
u8DevNum = g_aunImx377BusInfo[IspDev].s8I2cDev;
snprintf_s(acDevFile, sizeof(acDevFile), sizeof(acDevFile)-1, "/dev/i2c-%d", u8DevNum);
g_fd[IspDev] = open(acDevFile, O_RDWR);
if(g_fd[IspDev] < 0)
{
printf("Open /dev/i2c-%d error!\n", IspDev);
return -1;
}
ret = ioctl(g_fd[IspDev], I2C_SLAVE_FORCE, (imx377_i2c_addr>>1));
if (ret < 0)
{
printf("CMD_SET_DEV error!\n");
return ret;
}
#endif
return 0;
}
int imx377_i2c_exit(ISP_DEV IspDev)
{
if (g_fd[IspDev] >= 0)
{
close(g_fd[IspDev]);
g_fd[IspDev] = -1;
return 0;
}
return -1;
}
int imx377_read_register(ISP_DEV IspDev,int addr)
{
// TODO:
return 0;
}
#ifdef __HuaweiLite__
int imx377_write_register(ISP_DEV IspDev,int addr, int data)
{
if (0 > g_fd[IspDev])
{
return 0;
}
#ifdef HI_GPIO_I2C
i2c_data.dev_addr = imx377_i2c_addr;
i2c_data.reg_addr = addr;
i2c_data.addr_byte_num = imx377_addr_byte;
i2c_data.data = data;
i2c_data.data_byte_num = imx377_data_byte;
ret = ioctl(g_fd[IspDev], GPIO_I2C_WRITE, &i2c_data);
if (ret)
{
printf("GPIO-I2C write faild!\n");
return ret;
}
#else
int idx = 0;
int ret;
char buf[8];
buf[idx++] = addr & 0xff;
if (imx377_addr_byte == 2)
{
ret = ioctl(g_fd[IspDev], I2C_16BIT_REG, 1);
buf[idx++] = (addr >> 8) & 0xff;
}
else
{
//ret = ioctl(g_fd[IspDev], I2C_16BIT_REG, 0);
}
buf[idx++] = data & 0xff;
if (imx377_data_byte == 2)
{
//ret = ioctl(g_fd[IspDev], I2C_16BIT_DATA, 1);
//buf[idx++] = (data >> 8) & 0xff;
}
else
{
ret = ioctl(g_fd[IspDev], I2C_16BIT_DATA, 0);
}
ret = write(g_fd[IspDev], buf, imx377_addr_byte + imx377_data_byte);
if(ret < 0)
{
printf("I2C_WRITE error!\n");
return -1;
}
#endif
return 0;
}
#else
int imx377_write_register(ISP_DEV IspDev,int addr, int data)
{
if (0 > g_fd[IspDev])
{
return 0;
}
#ifdef HI_GPIO_I2C
i2c_data.dev_addr = imx377_i2c_addr;
i2c_data.reg_addr = addr;
i2c_data.addr_byte_num = imx377_addr_byte;
i2c_data.data = data;
i2c_data.data_byte_num = imx377_data_byte;
ret = ioctl(g_fd[IspDev], GPIO_I2C_WRITE, &i2c_data);
if (ret)
{
printf("GPIO-I2C write faild!\n");
return ret;
}
#else
int idx = 0;
int ret;
char buf[8];
if (imx377_addr_byte == 2)
{
buf[idx] = (addr >> 8) & 0xff;
idx++;
buf[idx] = addr & 0xff;
idx++;
}
else
{
//buf[idx] = addr & 0xff;
//idx++;
}
if (imx377_data_byte == 2)
{
//buf[idx] = (data >> 8) & 0xff;
//idx++;
//buf[idx] = data & 0xff;
//idx++;
}
else
{
buf[idx] = data & 0xff;
idx++;
}
ret = write(g_fd[IspDev], buf, imx377_addr_byte + imx377_data_byte);
if(ret < 0)
{
printf("I2C_WRITE error!\n");
return -1;
}
#endif
return 0;
}
#endif
static void delay_ms(int ms) {
hi_usleep(ms*1000);
}
void imx377_standby(ISP_DEV IspDev)
{
g_bStandBy[IspDev] = HI_TRUE;
printf("imx377 standby\n");
return;
}
void imx377_restart(ISP_DEV IspDev)
{
imx377_write_register (IspDev,0x30f4,0x00);
g_bStandBy[IspDev] = HI_FALSE;
printf("imx377 to normal\n");
return;
}
void imx377_linear_8M30_10bit_init(ISP_DEV IspDev);
void imx377_linear_8M60_10bit_init(ISP_DEV IspDev);
void imx377_linear_1080P120_12bit_init(ISP_DEV IspDev);
void imx377_linear_720P240_10bit_init(ISP_DEV IspDev);
void imx377_linear_12M30_12bit_init(ISP_DEV IspDev);
void imx377_linear_8M30_12bit_init(ISP_DEV IspDev);
void imx377_linear_12M20_10bit_init(ISP_DEV IspDev);
void imx377_init(ISP_DEV IspDev)
{
HI_U8 u8ImgMode;
HI_U32 i;
u8ImgMode = g_astImx377[IspDev].u8ImgMode;
/* 2. sensor i2c init */
imx377_i2c_init(IspDev);
if (IMX377_8M_30FPS_10BIT_LINEAR_MODE == u8ImgMode) /* 4k * 2k * 30P * 10bit */
{
imx377_linear_8M30_10bit_init(IspDev);
}
else if (IMX377_8M_60FPS_10BIT_LINEAR_MODE == u8ImgMode) /* 4k * 2k * 60P * 12bit */
{
imx377_linear_8M60_10bit_init(IspDev);
}
else if (IMX377_1080P_120FPS_12BIT_LINEAR_MODE == u8ImgMode) /* 2k * 1k * 120P * 12bit */
{
imx377_linear_1080P120_12bit_init(IspDev);
}
else if (IMX377_720P_240FPS_10BIT_LINEAR_MODE == u8ImgMode) /* 1280 * 720 * 240P * 10bit */
{
imx377_linear_720P240_10bit_init(IspDev);
}
else if (IMX377_12M_30FPS_12BIT_LINEAR_MODE == u8ImgMode) /* 4000 * 3000 * 30P * 12bit */
{
imx377_linear_12M30_12bit_init(IspDev);
}
else if (IMX377_8M_30FPS_12BIT_LINEAR_MODE == u8ImgMode) /* 4k * 2k * 30P * 12bit */
{
imx377_linear_8M30_12bit_init(IspDev);
}
else if (IMX377_12M_20FPS_10BIT_LINEAR_MODE == u8ImgMode) /* 4000 * 3000 * 20P * 10bit */
{
imx377_linear_12M20_10bit_init(IspDev);
}
for (i=0; i<g_astImx377[IspDev].astRegsInfo[0].u32RegNum; i++)
{
imx377_write_register(IspDev, g_astImx377[IspDev].astRegsInfo[0].astI2cData[i].u32RegAddr, g_astImx377[IspDev].astRegsInfo[0].astI2cData[i].u32Data);
}
g_astImx377[IspDev].bInit = HI_TRUE;
g_bStandBy[IspDev] = HI_FALSE;
return ;
}
void imx377_exit(ISP_DEV IspDev)
{
imx377_i2c_exit(IspDev);
g_bStandBy[IspDev] = HI_FALSE;
return;
}
void imx377_linear_8M30_10bit_init(ISP_DEV IspDev)
{
imx377_write_register (IspDev,0x3120,0xf0);
imx377_write_register (IspDev,0x3121,0x00);
imx377_write_register (IspDev,0x3122,0x02);
imx377_write_register (IspDev,0x3123,0x01);
imx377_write_register (IspDev,0x3124,0x00);
imx377_write_register (IspDev,0x3125,0x01);
imx377_write_register (IspDev,0x3127,0x02);
imx377_write_register (IspDev,0x3129,0x90);
imx377_write_register (IspDev,0x312a,0x02);
imx377_write_register (IspDev,0x312d,0x02);
imx377_write_register (IspDev,0x3003,0x20);
imx377_write_register (IspDev,0x3045,0x32);
imx377_write_register (IspDev,0x304e,0x02);
imx377_write_register (IspDev,0x3057,0x4a);
imx377_write_register (IspDev,0x3058,0xf6);
imx377_write_register (IspDev,0x3059,0x00);
imx377_write_register (IspDev,0x306b,0x04);
imx377_write_register (IspDev,0x3145,0x00);
imx377_write_