/*
* Copyright (C) Hisilicon Technologies Co., Ltd. 2012-2019. All rights reserved.
* Description:
* Author: Hisilicon multimedia software group
* Create: 2011/06/28
*/
#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 imx334_i2c_addr = 0x34; /* I2C Address of Imx334 */
const unsigned int imx334_addr_byte = 2;
const unsigned int imx334_data_byte = 1;
static int g_fd[ISP_MAX_PIPE_NUM] = {[0 ...(ISP_MAX_PIPE_NUM - 1)] = -1};
extern ISP_SNS_STATE_S *g_pastImx334[ISP_MAX_PIPE_NUM];
extern ISP_SNS_COMMBUS_U g_aunImx334BusInfo[];
typedef enum {
IMX334_8M_30FPS_12BIT_LINEAR_MODE,
IMX334_8M_30FPS_12BIT_2t1_DOL_MODE,
IMX334_8M_60FPS_12BIT_LINEAR_MODE,
IMX334_8M_60FPS_10BIT_CROPPING_LINEAR_MODE,
IMX334_2M_60FPS_12BIT_LINEAR_MODE,
IMX334_2M_60FPS_10BIT_LINEAR_MODE,
IMX334_2M_120FPS_12BIT_LINEAR_MODE,
}IMX334_TYPE;
int imx334_i2c_init(VI_PIPE ViPipe)
{
char acDevFile[16] = {0};
HI_U8 u8DevNum;
if (g_fd[ViPipe] >= 0) {
return HI_SUCCESS;
}
#ifdef HI_GPIO_I2C
int ret;
g_fd[ViPipe] = open("/dev/gpioi2c_ex", O_RDONLY, S_IRUSR);
if (g_fd[ViPipe] < 0) {
ISP_ERR_TRACE("Open gpioi2c_ex error!\n");
return HI_FAILURE;
}
#else
int ret;
u8DevNum = g_aunImx334BusInfo[ViPipe].s8I2cDev;
snprintf(acDevFile, sizeof(acDevFile), "/dev/i2c-%u", u8DevNum);
g_fd[ViPipe] = open(acDevFile, O_RDWR, S_IRUSR | S_IWUSR);
if (g_fd[ViPipe] < 0) {
ISP_ERR_TRACE("Open /dev/hi_i2c_drv-%u error!\n", u8DevNum);
return HI_FAILURE;
}
ret = ioctl(g_fd[ViPipe], I2C_SLAVE_FORCE, (imx334_i2c_addr >> 1));
if (ret < 0) {
ISP_ERR_TRACE("I2C_SLAVE_FORCE error!\n");
close(g_fd[ViPipe]);
g_fd[ViPipe] = -1;
return ret;
}
#endif
return HI_SUCCESS;
}
int imx334_i2c_exit(VI_PIPE ViPipe)
{
if (g_fd[ViPipe] >= 0) {
close(g_fd[ViPipe]);
g_fd[ViPipe] = -1;
return HI_SUCCESS;
}
return HI_FAILURE;
}
int imx334_read_register(VI_PIPE ViPipe, int addr)
{
return HI_SUCCESS;
}
int imx334_write_register(VI_PIPE ViPipe, int addr, int data)
{
if (g_fd[ViPipe] < 0) {
return HI_SUCCESS;
}
#ifdef HI_GPIO_I2C
i2c_data.dev_addr = imx334_i2c_addr;
i2c_data.reg_addr = addr;
i2c_data.addr_byte_num = imx334_addr_byte;
i2c_data.data = data;
i2c_data.data_byte_num = imx334_data_byte;
ret = ioctl(g_fd[ViPipe], GPIO_I2C_WRITE, &i2c_data);
if (ret) {
ISP_ERR_TRACE("GPIO-I2C write faild!\n");
return ret;
}
#else
int idx = 0;
int ret;
char buf[8];
if (imx334_addr_byte == 2) {
buf[idx] = (addr >> 8) & 0xff;
idx++;
buf[idx] = addr & 0xff;
idx++;
} else {
buf[idx] = addr & 0xff;
idx++;
}
if (imx334_data_byte == 2) {
buf[idx] = (data >> 8) & 0xff;
idx++;
buf[idx] = data & 0xff;
idx++;
} else {
buf[idx] = data & 0xff;
idx++;
}
ret = write(g_fd[ViPipe], buf, (imx334_addr_byte + imx334_data_byte));
if (ret < 0) {
ISP_ERR_TRACE("I2C_WRITE DATA error!\n");
return HI_FAILURE;
}
#endif
return HI_SUCCESS;
}
void imx334_standby(VI_PIPE ViPipe)
{
return;
}
void imx334_restart(VI_PIPE ViPipe)
{
return;
}
static void delay_ms(int ms)
{
usleep(ms * 1000);
}
void imx334_linear_8M30_12bit_init(VI_PIPE ViPipe);
void imx334_DOL_2t1_8M30_12bit_init(VI_PIPE ViPipe);
void imx334_linear_8M30_12bit_8lane_init(VI_PIPE ViPipe);
void imx334_linear_8M60_12bit_init(VI_PIPE ViPipe);
void imx334_linear_8M60_12bit_8lane_init(VI_PIPE ViPipe);
void imx334_linear_8M60_cropping_10bit_init(VI_PIPE ViPipe);
void imx334_linear_8M60_cropping_10bit_8lane_init(VI_PIPE ViPipe);
void imx334_linear_2M60_12bit_init(VI_PIPE ViPipe);
void imx334_linear_2M60_12bit_8lane_init(VI_PIPE ViPipe);
void imx334_linear_2M60_10bit_init(VI_PIPE ViPipe);
void imx334_linear_2M60_10bit_8lane_init(VI_PIPE ViPipe);
void imx334_linear_2M120_12bit_init(VI_PIPE ViPipe);
extern int lane_mode; //0:4lane; 1:8lane
void imx334_default_reg_init(VI_PIPE ViPipe)
{
HI_U32 i = 0;
for (i = 0; i < g_pastImx334[ViPipe]->astRegsInfo[0].u32RegNum; i++) {
imx334_write_register(ViPipe, g_pastImx334[ViPipe]->astRegsInfo[0].astI2cData[i].u32RegAddr, g_pastImx334[ViPipe]->astRegsInfo[0].astI2cData[i].u32Data);
}
}
void imx334_init(VI_PIPE ViPipe)
{
HI_U8 u8ImgMode;
HI_BOOL bInit;
bInit = g_pastImx334[ViPipe]->bInit;
u8ImgMode = g_pastImx334[ViPipe]->u8ImgMode;
/* 1. sensor i2c init */
imx334_i2c_init(ViPipe);
if (bInit == HI_FALSE) {
/* 2. sensor registers init */
if (u8ImgMode == IMX334_8M_30FPS_12BIT_LINEAR_MODE) { /* 4K@30fps Linear */
if(lane_mode == 0) {
imx334_linear_8M30_12bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_8M30_12bit_8lane_init(ViPipe);
}
} else if (IMX334_8M_30FPS_12BIT_2t1_DOL_MODE == u8ImgMode) { /* 4K@30fps DOL2 */
imx334_DOL_2t1_8M30_12bit_init(ViPipe);
} else if (IMX334_8M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_8M60_12bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_8M60_12bit_8lane_init(ViPipe);
}
} else if (IMX334_8M_60FPS_10BIT_CROPPING_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_8M60_cropping_10bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_8M60_cropping_10bit_8lane_init(ViPipe);
}
} else if (IMX334_2M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /*2K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_2M60_12bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_2M60_12bit_8lane_init(ViPipe);
}
} else if (IMX334_2M_60FPS_10BIT_LINEAR_MODE == u8ImgMode) { /*2K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_2M60_10bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_2M60_10bit_8lane_init(ViPipe);
}
} else if (IMX334_2M_120FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 2K@120fps Linear */
imx334_linear_2M120_12bit_init(ViPipe);
}
} else {
/* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) */
/* 2. sensor registers init */
if (u8ImgMode == IMX334_8M_30FPS_12BIT_LINEAR_MODE) { /* 4K@30fps Linear */
if(lane_mode == 0) {
imx334_linear_8M30_12bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_8M30_12bit_8lane_init(ViPipe);
}
} else if (IMX334_8M_30FPS_12BIT_2t1_DOL_MODE == u8ImgMode) { /* 4K@30fps DOL2 */
imx334_DOL_2t1_8M30_12bit_init(ViPipe);
} else if (IMX334_8M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_8M60_12bit_init(ViPipe);
}
else if(lane_mode == 1) {
imx334_linear_8M60_12bit_8lane_init(ViPipe);
}
} else if (IMX334_8M_60FPS_10BIT_CROPPING_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */
if(lane_mode == 0) {
imx334_linear_8M60_cropping_10bit_init(ViPipe);
}
else if(lane_mode == 1) {
sony_imx334.zip
需积分: 48 50 浏览量
2020-04-03
14:45:04
上传
评论 5
收藏 225KB ZIP 举报
HerrPhy
- 粉丝: 1
- 资源: 4
最新资源
- 基于ThinkPHP的轻量级PHP开发框架设计源码
- 基于CSS的响应式鲜花网站全屏效果设计源码
- 基于JavaScript的访客预约系统设计源码
- 基于Vue和ECharts的工作租房数据可视化系统设计源码
- 1040g0cg310ravpiu6ibg5pg00tsipsln3ju2d0g 2
- 基于Python的SAR图像去噪CNN-NLM设计源码
- redhat6升级到redhat7,过程redhat6.x-> redhat6.10->rehat7.9 主版本最高版本
- 基于Django的流程引擎设计源码
- 基于Node.js的Express框架与MySQL的后台管理系统设计源码
- 基于Java的Flink流批一体数据处理快速集成开发框架设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈