GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)

This commit is contained in:
lai
2026-09-06 03:52:57 +08:00
commit b1928b41c0
21813 changed files with 4413081 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
ifneq ($(MCU), )
include Makefile.riscv
else
include Makefile.linux
endif
+20
View File
@@ -0,0 +1,20 @@
ISP_DIR := $(shell cd ../.. && /bin/pwd)
SDK_DIR ?= $(shell cd $(ISP_DIR)/../../../.. && /bin/pwd)
include $(SDK_DIR)/build/base.mk
include $(ISP_DIR)/sensor/plat.mk
LIB_NAME := libsns_sc500ai
SRCS := $(wildcard *.c)
SDK_USR_CFLAGS += -I$(GMP_DIR)/include
SDK_USR_CFLAGS += -I$(GMP_DIR)/usr/include
SDK_USR_CFLAGS += -I$(ISP_DIR)/include
SDK_USR_CFLAGS += -I$(ISP_DIR)/../include
SDK_USR_CFLAGS += -I.
AT := @
$(info SRCS=$(SRCS))
include $(SDK_DIR)/build/sdk_lib_rules.mk
@@ -0,0 +1,4 @@
SRCS-y += sc500ai.c
SRCS-y += sc500ai_ctrl.c
File diff suppressed because it is too large Load Diff
+70
View File
@@ -0,0 +1,70 @@
#ifndef __SC500AI_H__
#define __SC500AI_H__
#include "sns_comm.h"
#ifdef __cplusplus
extern "C" {
#endif
// sensor fps mode
#define SC500AI_FULL_LINES_MAX 0xFFFF
#define SC500AI_VMAX_5M_LINEAR 1650
#define SC500AI_VMAX_5M_WDR 3300
#define SC500AI_VMAX_640_480_LINEAR 1650
#define SC500AI_EXP_OFFSET_LINEAR 10
#define SC500AI_EXP_OFFSET_WDR 18
#define SC500AI_S_EXP_MAX_DEFAULT_1620P 0xcc
// the value of the sc500ai exposure register is in half line units, (<< 1) for AE calculation, (>> 1) for EXP reg
#define SC500AI_EXP_SHIFT 1
#define SC500AI_REG_ADDR_EXP_H 0x3e00
#define SC500AI_REG_ADDR_EXP_M 0x3e01
#define SC500AI_REG_ADDR_EXP_L 0x3e02
#define SC500AI_REG_ADDR_AGAIN_H 0x3e08
#define SC500AI_REG_ADDR_AGAIN_L 0x3e09
#define SC500AI_REG_ADDR_DGAIN_H 0x3e06
#define SC500AI_REG_ADDR_DGAIN_L 0x3e07
#define SC500AI_REG_ADDR_VMAX_H 0x320e
#define SC500AI_REG_ADDR_VMAX_L 0x320f
#define SC500AI_REG_ADDR_S_EXP_H 0x3e04
#define SC500AI_REG_ADDR_S_EXP_L 0x3e05
#define SC500AI_REG_ADDR_S_AGAIN_H 0x3e12
#define SC500AI_REG_ADDR_S_AGAIN_L 0x3e13
#define SC500AI_REG_ADDR_S_DGAIN_H 0x3e10
#define SC500AI_REG_ADDR_S_DGAIN_L 0x3e11
#define SC500AI_REG_ADDR_S_EXP_MAX_H 0x3e23
#define SC500AI_REG_ADDR_S_EXP_MAX_L 0x3e24
typedef enum {
SC500AI_REG_EXP_H = 0,
SC500AI_REG_EXP_M,
SC500AI_REG_EXP_L,
SC500AI_REG_AGAIN_H,
SC500AI_REG_AGAIN_L,
SC500AI_REG_DGAIN_H,
SC500AI_REG_DGAIN_L,
SC500AI_REG_VMAX_H,
SC500AI_REG_VMAX_L,
SC500AI_REG_L_MAX_NUM,
// short frame reg info from here
SC500AI_REG_S_EXP_H = SC500AI_REG_L_MAX_NUM,
SC500AI_REG_S_EXP_L,
SC500AI_REG_S_AGAIN_H,
SC500AI_REG_S_AGAIN_L,
SC500AI_REG_S_DGAIN_H,
SC500AI_REG_S_DGAIN_L,
SC500AI_REG_S_EXP_MAX_H,
SC500AI_REG_S_EXP_MAX_L,
SC500AI_REG_MAX_NUM
} sc500ai_reg_info;
#ifdef __cplusplus
}
#endif
#endif // __SC500AI_H__
+603
View File
@@ -0,0 +1,603 @@
#include <stdio.h>
#include <string.h>
#include "i2c_dev.h"
#include "sc500ai.h"
#include "sc500ai_ctrl.h"
#define SENSOR_READ_REG_BY_IOCTL
#ifdef SENSOR_READ_REG_BY_IOCTL
#include <linux/fb.h>
static xmedia_s32 g_sc500ai_i2c_addr[XMEDIA_SENSOR_DEV_MAX_NUM] = { [0 ...(XMEDIA_SENSOR_DEV_MAX_NUM - 1)] =
SENSOR_I2C_INVALID };
#endif
#define SC500AI_REG_ADDR_MIRROR_FLIP 0x3221
#define SC500AI_RECV_BUF_NUM 4
static xmedia_s32 g_sc500ai_i2c_fd[XMEDIA_SENSOR_DEV_MAX_NUM] = { [0 ...(XMEDIA_SENSOR_DEV_MAX_NUM - 1)] =
SENSOR_I2C_INVALID };
/*
* 函数功能: sc500ai MIPI 4lane 1620p线性模式初始化序列 - 2880x1620x30fps
* 函数参数:
* dev - sensor 设备号
* 返回值:
*
*/
static xmedia_s32 sc500ai_4lane_linear_2880x1620_init(xmedia_u32 dev)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
ret |= sc500ai_write_reg(dev, 0x0103, 0x01);
ret |= sc500ai_write_reg(dev, 0x0100, 0x00);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x80);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x80);
ret |= sc500ai_write_reg(dev, 0x59e0, 0x60);
ret |= sc500ai_write_reg(dev, 0x59e1, 0x08);
ret |= sc500ai_write_reg(dev, 0x59e2, 0x3f);
ret |= sc500ai_write_reg(dev, 0x59e3, 0x18);
ret |= sc500ai_write_reg(dev, 0x59e4, 0x18);
ret |= sc500ai_write_reg(dev, 0x59e5, 0x3f);
ret |= sc500ai_write_reg(dev, 0x59e7, 0x02);
ret |= sc500ai_write_reg(dev, 0x59e8, 0x38);
ret |= sc500ai_write_reg(dev, 0x59e9, 0x20);
ret |= sc500ai_write_reg(dev, 0x59ea, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59ec, 0x08);
ret |= sc500ai_write_reg(dev, 0x59ed, 0x02);
ret |= sc500ai_write_reg(dev, 0x59ee, 0xa0);
ret |= sc500ai_write_reg(dev, 0x59ef, 0x08);
ret |= sc500ai_write_reg(dev, 0x59f4, 0x18);
ret |= sc500ai_write_reg(dev, 0x59f5, 0x10);
ret |= sc500ai_write_reg(dev, 0x59f6, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59f9, 0x02);
ret |= sc500ai_write_reg(dev, 0x59fa, 0x18);
ret |= sc500ai_write_reg(dev, 0x59fb, 0x10);
ret |= sc500ai_write_reg(dev, 0x59fc, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59ff, 0x02);
ret |= sc500ai_write_reg(dev, 0x3e16, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e17, 0x80);
ret |= sc500ai_write_reg(dev, 0x5799, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e01, 0xcd);
ret |= sc500ai_write_reg(dev, 0x3e02, 0xc0);
ret |= sc500ai_write_reg(dev, 0x3308, 0x10);
ret |= sc500ai_write_reg(dev, 0x3356, 0x23);
ret |= sc500ai_write_reg(dev, 0x4500, 0x88);
ret |= sc500ai_write_reg(dev, 0x3651, 0x7d);
ret |= sc500ai_write_reg(dev, 0x3622, 0x0a);
ret |= sc500ai_write_reg(dev, 0x320e, 0x06); // vts 0xce4 0x157c
ret |= sc500ai_write_reg(dev, 0x320f, 0x72);
ret |= sc500ai_write_reg(dev, 0x36ec, 0x1a);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x1c);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x24);
ret |= sc500ai_write_reg(dev, 0x330a, 0x00);
ret |= sc500ai_write_reg(dev, 0x330b, 0xd0);
ret |= sc500ai_write_reg(dev, 0x3253, 0x08);
ret |= sc500ai_write_reg(dev, 0x363a, 0x1f);
ret |= sc500ai_write_reg(dev, 0x3908, 0x41);
ret |= sc500ai_write_reg(dev, 0x391d, 0x04);
ret |= sc500ai_write_reg(dev, 0x330d, 0x18);
ret |= sc500ai_write_reg(dev, 0x3302, 0x18);
ret |= sc500ai_write_reg(dev, 0x3301, 0x28);
ret |= sc500ai_write_reg(dev, 0x3304, 0x70);
ret |= sc500ai_write_reg(dev, 0x3303, 0x10);
ret |= sc500ai_write_reg(dev, 0x3308, 0x10);
ret |= sc500ai_write_reg(dev, 0x3309, 0x80);
ret |= sc500ai_write_reg(dev, 0x3310, 0x02);
ret |= sc500ai_write_reg(dev, 0x334c, 0x08);
ret |= sc500ai_write_reg(dev, 0x330f, 0x02);
ret |= sc500ai_write_reg(dev, 0x330e, 0x20);
ret |= sc500ai_write_reg(dev, 0x331c, 0x04);
ret |= sc500ai_write_reg(dev, 0x3320, 0x09);
ret |= sc500ai_write_reg(dev, 0x33ac, 0x10);
ret |= sc500ai_write_reg(dev, 0x33ae, 0x10);
ret |= sc500ai_write_reg(dev, 0x331e, 0x61);
ret |= sc500ai_write_reg(dev, 0x3356, 0x09);
ret |= sc500ai_write_reg(dev, 0x33af, 0x19);
ret |= sc500ai_write_reg(dev, 0x331f, 0x71);
ret |= sc500ai_write_reg(dev, 0x3333, 0x10);
ret |= sc500ai_write_reg(dev, 0x336d, 0x40);
ret |= sc500ai_write_reg(dev, 0x3306, 0x40);
ret |= sc500ai_write_reg(dev, 0x3622, 0x03);
ret |= sc500ai_write_reg(dev, 0x3364, 0x17);
ret |= sc500ai_write_reg(dev, 0x3390, 0x08);
ret |= sc500ai_write_reg(dev, 0x3391, 0x18);
ret |= sc500ai_write_reg(dev, 0x3392, 0x38);
ret |= sc500ai_write_reg(dev, 0x3301, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3393, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3394, 0x28);
ret |= sc500ai_write_reg(dev, 0x3395, 0x28);
ret |= sc500ai_write_reg(dev, 0x3396, 0x08);
ret |= sc500ai_write_reg(dev, 0x3397, 0x18);
ret |= sc500ai_write_reg(dev, 0x3398, 0x38);
ret |= sc500ai_write_reg(dev, 0x3399, 0x0a);
ret |= sc500ai_write_reg(dev, 0x339a, 0x28);
ret |= sc500ai_write_reg(dev, 0x339b, 0x28);
ret |= sc500ai_write_reg(dev, 0x339c, 0x28);
ret |= sc500ai_write_reg(dev, 0x3670, 0x02);
ret |= sc500ai_write_reg(dev, 0x367c, 0x58);
ret |= sc500ai_write_reg(dev, 0x367d, 0x78);
ret |= sc500ai_write_reg(dev, 0x3674, 0x82);
ret |= sc500ai_write_reg(dev, 0x3675, 0x64);
ret |= sc500ai_write_reg(dev, 0x3676, 0x66);
ret |= sc500ai_write_reg(dev, 0x3670, 0x0a);
ret |= sc500ai_write_reg(dev, 0x369c, 0x40);
ret |= sc500ai_write_reg(dev, 0x369d, 0x48);
ret |= sc500ai_write_reg(dev, 0x3690, 0x33);
ret |= sc500ai_write_reg(dev, 0x3691, 0x33);
ret |= sc500ai_write_reg(dev, 0x3692, 0x44);
ret |= sc500ai_write_reg(dev, 0x360f, 0x01);
ret |= sc500ai_write_reg(dev, 0x367a, 0x40);
ret |= sc500ai_write_reg(dev, 0x367b, 0x48);
ret |= sc500ai_write_reg(dev, 0x3671, 0x07);
ret |= sc500ai_write_reg(dev, 0x3672, 0x07);
ret |= sc500ai_write_reg(dev, 0x3673, 0x17);
ret |= sc500ai_write_reg(dev, 0x3253, 0x0a);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x1c);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x24);
ret |= sc500ai_write_reg(dev, 0x3221, 0x66); // mirror & filp
ret |= sc500ai_write_reg(dev, 0x0100, 0x01);
if (ret != XMEDIA_SUCCESS) {
SENSOR_TRACE(MODULE_DBG_ERR, "sc500ai_write_reg failed\n");
return XMEDIA_FAILURE;
} else {
SENSOR_PRINT("=================================================================================\n");
SENSOR_PRINT("========= SC500AI_27MInput_MIPI_4lane_10bit_2880x1620_30fps init success!========\n");
SENSOR_PRINT("=================================================================================\n");
return XMEDIA_SUCCESS;
}
}
static xmedia_s32 sc500ai_4lane_wdr_2880x1620_init(xmedia_u32 dev)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
ret |= sc500ai_write_reg(dev, 0x0103, 0x01);
ret |= sc500ai_write_reg(dev, 0x0100, 0x00);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x80);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x80);
ret |= sc500ai_write_reg(dev, 0x301f, 0x23);
ret |= sc500ai_write_reg(dev, 0x3106, 0x01);
ret |= sc500ai_write_reg(dev, 0x320e, 0x0c);
ret |= sc500ai_write_reg(dev, 0x320f, 0xe4);
ret |= sc500ai_write_reg(dev, 0x3220, 0x53);
ret |= sc500ai_write_reg(dev, 0x3250, 0xff); //old-3f new-ff
ret |= sc500ai_write_reg(dev, 0x3253, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3301, 0x0b);
ret |= sc500ai_write_reg(dev, 0x3302, 0x20);
ret |= sc500ai_write_reg(dev, 0x3303, 0x10);
ret |= sc500ai_write_reg(dev, 0x3304, 0x70);
ret |= sc500ai_write_reg(dev, 0x3306, 0x50);
ret |= sc500ai_write_reg(dev, 0x3308, 0x18);
ret |= sc500ai_write_reg(dev, 0x3309, 0x80);
ret |= sc500ai_write_reg(dev, 0x330a, 0x00);
ret |= sc500ai_write_reg(dev, 0x330b, 0xe8);
ret |= sc500ai_write_reg(dev, 0x330d, 0x30);
ret |= sc500ai_write_reg(dev, 0x330e, 0x30);
ret |= sc500ai_write_reg(dev, 0x330f, 0x02);
ret |= sc500ai_write_reg(dev, 0x3310, 0x02);
ret |= sc500ai_write_reg(dev, 0x331c, 0x08);
ret |= sc500ai_write_reg(dev, 0x331e, 0x61);
ret |= sc500ai_write_reg(dev, 0x331f, 0x71);
ret |= sc500ai_write_reg(dev, 0x3320, 0x11);
ret |= sc500ai_write_reg(dev, 0x3333, 0x10);
ret |= sc500ai_write_reg(dev, 0x334c, 0x10);
ret |= sc500ai_write_reg(dev, 0x3356, 0x11);
ret |= sc500ai_write_reg(dev, 0x3364, 0x17);
ret |= sc500ai_write_reg(dev, 0x336d, 0x03);
ret |= sc500ai_write_reg(dev, 0x3390, 0x08);
ret |= sc500ai_write_reg(dev, 0x3391, 0x18);
ret |= sc500ai_write_reg(dev, 0x3392, 0x38);
ret |= sc500ai_write_reg(dev, 0x3393, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3394, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3395, 0x12);
ret |= sc500ai_write_reg(dev, 0x3396, 0x08);
ret |= sc500ai_write_reg(dev, 0x3397, 0x18);
ret |= sc500ai_write_reg(dev, 0x3398, 0x38);
ret |= sc500ai_write_reg(dev, 0x3399, 0x0a);
ret |= sc500ai_write_reg(dev, 0x339a, 0x0a);
ret |= sc500ai_write_reg(dev, 0x339b, 0x0a);
ret |= sc500ai_write_reg(dev, 0x339c, 0x12);
ret |= sc500ai_write_reg(dev, 0x33ac, 0x10);
ret |= sc500ai_write_reg(dev, 0x33ae, 0x20);
ret |= sc500ai_write_reg(dev, 0x33af, 0x21);
ret |= sc500ai_write_reg(dev, 0x360f, 0x01);
ret |= sc500ai_write_reg(dev, 0x3621, 0xe8);
ret |= sc500ai_write_reg(dev, 0x3622, 0x06);
ret |= sc500ai_write_reg(dev, 0x3630, 0x82);
ret |= sc500ai_write_reg(dev, 0x3633, 0x33);
ret |= sc500ai_write_reg(dev, 0x3634, 0x64);
ret |= sc500ai_write_reg(dev, 0x3637, 0x50);
ret |= sc500ai_write_reg(dev, 0x363a, 0x1f);
ret |= sc500ai_write_reg(dev, 0x363c, 0x40);
ret |= sc500ai_write_reg(dev, 0x3651, 0x7d);
ret |= sc500ai_write_reg(dev, 0x3670, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3671, 0x06);
ret |= sc500ai_write_reg(dev, 0x3672, 0x16);
ret |= sc500ai_write_reg(dev, 0x3673, 0x17);
ret |= sc500ai_write_reg(dev, 0x3674, 0x82);
ret |= sc500ai_write_reg(dev, 0x3675, 0x62);
ret |= sc500ai_write_reg(dev, 0x3676, 0x44);
ret |= sc500ai_write_reg(dev, 0x367a, 0x48);
ret |= sc500ai_write_reg(dev, 0x367b, 0x78);
ret |= sc500ai_write_reg(dev, 0x367c, 0x48);
ret |= sc500ai_write_reg(dev, 0x367d, 0x58);
ret |= sc500ai_write_reg(dev, 0x3690, 0x34);
ret |= sc500ai_write_reg(dev, 0x3691, 0x34);
ret |= sc500ai_write_reg(dev, 0x3692, 0x54);
ret |= sc500ai_write_reg(dev, 0x369c, 0x48);
ret |= sc500ai_write_reg(dev, 0x369d, 0x78);
ret |= sc500ai_write_reg(dev, 0x36ea, 0x2d);
ret |= sc500ai_write_reg(dev, 0x36eb, 0x04);
ret |= sc500ai_write_reg(dev, 0x36ec, 0x0a);
ret |= sc500ai_write_reg(dev, 0x36ed, 0x14);
ret |= sc500ai_write_reg(dev, 0x36fa, 0x35);
ret |= sc500ai_write_reg(dev, 0x36fb, 0x04);
ret |= sc500ai_write_reg(dev, 0x36fc, 0x00);
ret |= sc500ai_write_reg(dev, 0x36fd, 0x16);
ret |= sc500ai_write_reg(dev, 0x3904, 0x04);
ret |= sc500ai_write_reg(dev, 0x3908, 0x41);
ret |= sc500ai_write_reg(dev, 0x391f, 0x10);
ret |= sc500ai_write_reg(dev, 0x39c2, 0x30);
ret |= sc500ai_write_reg(dev, 0x3e00, 0x01);
ret |= sc500ai_write_reg(dev, 0x3e01, 0x82);
ret |= sc500ai_write_reg(dev, 0x3e02, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e04, 0x18);
ret |= sc500ai_write_reg(dev, 0x3e05, 0x20);
ret |= sc500ai_write_reg(dev, 0x3e23, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e24, 0xc6);
ret |= sc500ai_write_reg(dev, 0x4500, 0x88);
ret |= sc500ai_write_reg(dev, 0x4509, 0x20);
ret |= sc500ai_write_reg(dev, 0x4800, 0x24);
ret |= sc500ai_write_reg(dev, 0x4837, 0x14);
ret |= sc500ai_write_reg(dev, 0x4853, 0xfd);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x30);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x44);
ret |= sc500ai_write_reg(dev, 0x0100, 0x01);
ret |= sc500ai_write_reg(dev, 0x3221, 0x66);
if (ret != XMEDIA_SUCCESS) {
SENSOR_TRACE(MODULE_DBG_ERR, "sc500ai_write_reg failed\n");
return XMEDIA_FAILURE;
} else {
SENSOR_PRINT("============================================================================================\n");
SENSOR_PRINT("==== sc500ai_raw10_2880X1620_2to1wdr_VC_30fps_4lane_820.8Mbps_27MInput init success! =====\n");
SENSOR_PRINT("============================================================================================\n");
return XMEDIA_SUCCESS;
}
}
static xmedia_s32 sc500ai_2lane_linear_640x480_init(xmedia_u32 dev)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
ret |= sc500ai_write_reg(dev, 0x0103, 0x01);
ret |= sc500ai_write_reg(dev, 0x0100, 0x00);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x80);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x80);
ret |= sc500ai_write_reg(dev, 0x3018, 0x32);
ret |= sc500ai_write_reg(dev, 0x301f, 0xfd);
ret |= sc500ai_write_reg(dev, 0x3031, 0x08);
ret |= sc500ai_write_reg(dev, 0x3106, 0x01);
ret |= sc500ai_write_reg(dev, 0x3200, 0x00);
ret |= sc500ai_write_reg(dev, 0x3201, 0x60);
ret |= sc500ai_write_reg(dev, 0x3202, 0x00);
ret |= sc500ai_write_reg(dev, 0x3203, 0x32);
ret |= sc500ai_write_reg(dev, 0x3204, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3205, 0xe7);
ret |= sc500ai_write_reg(dev, 0x3206, 0x06);
ret |= sc500ai_write_reg(dev, 0x3207, 0x29);
ret |= sc500ai_write_reg(dev, 0x3208, 0x02);
ret |= sc500ai_write_reg(dev, 0x3209, 0x80);
ret |= sc500ai_write_reg(dev, 0x320a, 0x01);
ret |= sc500ai_write_reg(dev, 0x320b, 0xe0);
// ret |= sc500ai_write_reg(dev, 0x320e, 0x0c);
// ret |= sc500ai_write_reg(dev, 0x320f, 0xe4);
ret |= sc500ai_write_reg(dev, 0x3210, 0x00);
ret |= sc500ai_write_reg(dev, 0x3211, 0x04);
ret |= sc500ai_write_reg(dev, 0x3212, 0x00);
ret |= sc500ai_write_reg(dev, 0x3213, 0x04);
ret |= sc500ai_write_reg(dev, 0x3222, 0x00); //master/slave
ret |= sc500ai_write_reg(dev, 0x3224, 0x82);
ret |= sc500ai_write_reg(dev, 0x3225, 0x10);
ret |= sc500ai_write_reg(dev, 0x3230, 0x00);
ret |= sc500ai_write_reg(dev, 0x3231, 0x04);
ret |= sc500ai_write_reg(dev, 0x3253, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3301, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3302, 0x18);
ret |= sc500ai_write_reg(dev, 0x3303, 0x10);
ret |= sc500ai_write_reg(dev, 0x3304, 0x60);
ret |= sc500ai_write_reg(dev, 0x3306, 0x60);
ret |= sc500ai_write_reg(dev, 0x3308, 0x10);
ret |= sc500ai_write_reg(dev, 0x3309, 0x70);
ret |= sc500ai_write_reg(dev, 0x330a, 0x00);
ret |= sc500ai_write_reg(dev, 0x330b, 0xf0);
ret |= sc500ai_write_reg(dev, 0x330d, 0x18);
ret |= sc500ai_write_reg(dev, 0x330e, 0x20);
ret |= sc500ai_write_reg(dev, 0x330f, 0x02);
ret |= sc500ai_write_reg(dev, 0x3310, 0x02);
ret |= sc500ai_write_reg(dev, 0x331c, 0x04);
ret |= sc500ai_write_reg(dev, 0x331e, 0x51);
ret |= sc500ai_write_reg(dev, 0x331f, 0x61);
ret |= sc500ai_write_reg(dev, 0x3320, 0x09);
ret |= sc500ai_write_reg(dev, 0x3333, 0x10);
ret |= sc500ai_write_reg(dev, 0x334c, 0x08);
ret |= sc500ai_write_reg(dev, 0x3356, 0x09);
ret |= sc500ai_write_reg(dev, 0x3364, 0x17);
ret |= sc500ai_write_reg(dev, 0x336d, 0x03);
ret |= sc500ai_write_reg(dev, 0x3390, 0x08);
ret |= sc500ai_write_reg(dev, 0x3391, 0x18);
ret |= sc500ai_write_reg(dev, 0x3392, 0x38);
ret |= sc500ai_write_reg(dev, 0x3393, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3394, 0x20);
ret |= sc500ai_write_reg(dev, 0x3395, 0x20);
ret |= sc500ai_write_reg(dev, 0x3396, 0x08);
ret |= sc500ai_write_reg(dev, 0x3397, 0x18);
ret |= sc500ai_write_reg(dev, 0x3398, 0x38);
ret |= sc500ai_write_reg(dev, 0x3399, 0x0a);
ret |= sc500ai_write_reg(dev, 0x339a, 0x20);
ret |= sc500ai_write_reg(dev, 0x339b, 0x20);
ret |= sc500ai_write_reg(dev, 0x339c, 0x20);
ret |= sc500ai_write_reg(dev, 0x33ac, 0x10);
ret |= sc500ai_write_reg(dev, 0x33ae, 0x10);
ret |= sc500ai_write_reg(dev, 0x33af, 0x19);
ret |= sc500ai_write_reg(dev, 0x360f, 0x01);
ret |= sc500ai_write_reg(dev, 0x3622, 0x03);
ret |= sc500ai_write_reg(dev, 0x363a, 0x1f);
ret |= sc500ai_write_reg(dev, 0x363c, 0x40);
ret |= sc500ai_write_reg(dev, 0x3651, 0x7d);
ret |= sc500ai_write_reg(dev, 0x3670, 0x0a);
ret |= sc500ai_write_reg(dev, 0x3671, 0x07);
ret |= sc500ai_write_reg(dev, 0x3672, 0x17);
ret |= sc500ai_write_reg(dev, 0x3673, 0x1e);
ret |= sc500ai_write_reg(dev, 0x3674, 0x82);
ret |= sc500ai_write_reg(dev, 0x3675, 0x64);
ret |= sc500ai_write_reg(dev, 0x3676, 0x66);
ret |= sc500ai_write_reg(dev, 0x367a, 0x48);
ret |= sc500ai_write_reg(dev, 0x367b, 0x78);
ret |= sc500ai_write_reg(dev, 0x367c, 0x58);
ret |= sc500ai_write_reg(dev, 0x367d, 0x78);
ret |= sc500ai_write_reg(dev, 0x3690, 0x34);
ret |= sc500ai_write_reg(dev, 0x3691, 0x34);
ret |= sc500ai_write_reg(dev, 0x3692, 0x54);
ret |= sc500ai_write_reg(dev, 0x369c, 0x48);
ret |= sc500ai_write_reg(dev, 0x369d, 0x78);
ret |= sc500ai_write_reg(dev, 0x36ea, 0x36);
ret |= sc500ai_write_reg(dev, 0x36eb, 0x1c);
ret |= sc500ai_write_reg(dev, 0x36ec, 0x2a);
ret |= sc500ai_write_reg(dev, 0x36ed, 0x14);
ret |= sc500ai_write_reg(dev, 0x36fa, 0x36);
ret |= sc500ai_write_reg(dev, 0x36fb, 0x1e);
ret |= sc500ai_write_reg(dev, 0x36fc, 0x11);
ret |= sc500ai_write_reg(dev, 0x36fd, 0x24);
ret |= sc500ai_write_reg(dev, 0x3904, 0x04);
ret |= sc500ai_write_reg(dev, 0x3908, 0x41);
ret |= sc500ai_write_reg(dev, 0x391d, 0x04);
ret |= sc500ai_write_reg(dev, 0x39c2, 0x30);
ret |= sc500ai_write_reg(dev, 0x3e00, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e01, 0xcd);
ret |= sc500ai_write_reg(dev, 0x3e02, 0xc0);
ret |= sc500ai_write_reg(dev, 0x3e16, 0x00);
ret |= sc500ai_write_reg(dev, 0x3e17, 0x80);
ret |= sc500ai_write_reg(dev, 0x4500, 0x88);
ret |= sc500ai_write_reg(dev, 0x4509, 0x20);
ret |= sc500ai_write_reg(dev, 0x5799, 0x00);
ret |= sc500ai_write_reg(dev, 0x59e0, 0x60);
ret |= sc500ai_write_reg(dev, 0x59e1, 0x08);
ret |= sc500ai_write_reg(dev, 0x59e2, 0x3f);
ret |= sc500ai_write_reg(dev, 0x59e3, 0x18);
ret |= sc500ai_write_reg(dev, 0x59e4, 0x18);
ret |= sc500ai_write_reg(dev, 0x59e5, 0x3f);
ret |= sc500ai_write_reg(dev, 0x59e7, 0x02);
ret |= sc500ai_write_reg(dev, 0x59e8, 0x38);
ret |= sc500ai_write_reg(dev, 0x59e9, 0x20);
ret |= sc500ai_write_reg(dev, 0x59ea, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59ec, 0x08);
ret |= sc500ai_write_reg(dev, 0x59ed, 0x02);
ret |= sc500ai_write_reg(dev, 0x59ee, 0xa0);
ret |= sc500ai_write_reg(dev, 0x59ef, 0x08);
ret |= sc500ai_write_reg(dev, 0x59f4, 0x18);
ret |= sc500ai_write_reg(dev, 0x59f5, 0x10);
ret |= sc500ai_write_reg(dev, 0x59f6, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59f9, 0x02);
ret |= sc500ai_write_reg(dev, 0x59fa, 0x18);
ret |= sc500ai_write_reg(dev, 0x59fb, 0x10);
ret |= sc500ai_write_reg(dev, 0x59fc, 0x0c);
ret |= sc500ai_write_reg(dev, 0x59ff, 0x02);
ret |= sc500ai_write_reg(dev, 0x36e9, 0x44);
ret |= sc500ai_write_reg(dev, 0x36f9, 0x54);
ret |= sc500ai_write_reg(dev, 0x0100, 0x01);
if (ret != XMEDIA_SUCCESS) {
SENSOR_TRACE(MODULE_DBG_ERR, "sc500ai_write_reg failed\n");
return XMEDIA_FAILURE;
} else {
SENSOR_PRINT("============================================================================================\n");
SENSOR_PRINT("==== sc500ai_raw8_640X480_linear_2lane_80Mbps_24MInput init success! ====================\n");
SENSOR_PRINT("==== sc500ai 640X480 slave setting init success! =========================================\n");
SENSOR_PRINT("============================================================================================\n");
return XMEDIA_SUCCESS;
}
}
static xmedia_void sc500ai_slave_init(xmedia_u32 dev)
{
sc500ai_write_reg(dev, 0x0100, 0x00);
sc500ai_write_reg(dev, 0x3222, 0x02);
sc500ai_write_reg(dev, 0x3225, 0x10);
sc500ai_write_reg(dev, 0x3224, 0x82);
sc500ai_write_reg(dev, 0x3230, 0x00);
sc500ai_write_reg(dev, 0x3231, 0x04);
sc500ai_write_reg(dev, 0x300a, 0x20);
sc500ai_write_reg(dev, 0x0100, 0x01);
SENSOR_PRINT("====== SC500AI slave setting init success!=======\n");
}
xmedia_s32 sc500ai_init_image(xmedia_u32 dev, xmedia_u8 image_mode, xmedia_sensor_work_mode work_mode)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
switch(image_mode) {
case SC500AI_5M_10BIT_LINEAR_MODE:
ret = sc500ai_4lane_linear_2880x1620_init(dev);
break;
case SC500AI_5M_10BIT_WDR_MODE:
ret = sc500ai_4lane_wdr_2880x1620_init(dev);
break;
case SC500AI_640_480_10BIT_LINEAR_MODE:
ret = sc500ai_2lane_linear_640x480_init(dev);
break;
default:
SENSOR_TRACE(MODULE_DBG_ERR, "Not support, please check image param!\n");
return XMEDIA_ERRCODE_NOT_SUPPORT;
}
if (work_mode == XMEDIA_SENSOR_WORK_MODE_SLAVE && image_mode == SC500AI_5M_10BIT_LINEAR_MODE) {
sc500ai_slave_init(dev);
}
return ret;
}
SENSOR_PRIORITY_FUNC xmedia_s32 sc500ai_set_slave_addr(xmedia_u32 dev, xmedia_u32 slave_addr)
{
xmedia_s32 ret;
if (g_sc500ai_i2c_fd[dev] < 0) {
SENSOR_PRINT("Sensor dev [%d], i2c not open. please init i2c at first.\n", dev);
return XMEDIA_ERRCODE_NOT_INIT;
}
ret = i2c_set_slave_addr(g_sc500ai_i2c_fd[dev], slave_addr);
if (ret < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "I2C_SLAVE_FORCE error!\n");
i2c_close(g_sc500ai_i2c_fd[dev]);
g_sc500ai_i2c_fd[dev] = SENSOR_I2C_INVALID;
return XMEDIA_FAILURE;
}
g_sc500ai_i2c_addr[dev] = slave_addr;
SENSOR_PRINT("Sensor dev [%d] set slave addr 0x%x success.\n", dev, slave_addr);
return XMEDIA_SUCCESS;
}
SENSOR_PRIORITY_FUNC xmedia_s32 sc500ai_i2c_init(xmedia_u32 dev, xmedia_s8 i2c_dev, xmedia_u32 i2c_addr)
{
xmedia_s32 ret;
if (g_sc500ai_i2c_fd[dev] >= 0) {
SENSOR_PRINT("====== Sensor dev [%d], i2c already init !=======\n", dev);
return XMEDIA_SUCCESS;
}
if (i2c_dev == SENSOR_I2C_INVALID) {
SENSOR_TRACE(MODULE_DBG_ERR, "Sensor i2c dev invalid! Please set i2c dev at first!\n");
return XMEDIA_ERRCODE_NOT_CONFIG;
}
g_sc500ai_i2c_fd[dev] = i2c_open(i2c_dev);
if (g_sc500ai_i2c_fd[dev] < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "Open /dev/i2c_drv-%u error!\n", i2c_dev);
return XMEDIA_ERRCODE_OPEN_FAILED;
}
ret = sc500ai_set_slave_addr(dev, i2c_addr);
SENSOR_CHECK_RET_RETURN(ret);
SENSOR_PRINT("====== i2c[%d] init success!=======\n", i2c_dev);
return XMEDIA_SUCCESS;
}
SENSOR_PRIORITY_FUNC xmedia_s32 sc500ai_i2c_exit(xmedia_u32 dev)
{
xmedia_s32 ret;
ret = i2c_close(g_sc500ai_i2c_fd[dev]);
if(ret < 0 ) {
SENSOR_TRACE(MODULE_DBG_ERR, "sensor dev[%d] close i2c failed!\n", dev);
return ret;
}
g_sc500ai_i2c_fd[dev] = SENSOR_I2C_INVALID;
return XMEDIA_SUCCESS;
}
SENSOR_PRIORITY_FUNC xmedia_s32 sc500ai_read_reg(xmedia_u32 dev, xmedia_u32 addr, xmedia_u32 *data)
{
xmedia_s32 ret;
xmedia_u8 buf[SC500AI_DATA_BYTE];
if (g_sc500ai_i2c_fd[dev] < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "sensor dev[%d]'s i2c is not init!\n", dev);
return XMEDIA_ERRCODE_NOT_INIT;
}
ret = i2c_read(g_sc500ai_i2c_fd[dev], g_sc500ai_i2c_addr[dev], addr, SC500AI_ADDR_BYTE, buf, SC500AI_DATA_BYTE);
if (ret < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "sensor dev[%d] read i2c addr [0x%X] failed!\n", dev, addr);
return ret;
}
*data = buf[0]; //SC500AI_DATA_BYTE == 1
return XMEDIA_SUCCESS;
}
SENSOR_PRIORITY_FUNC xmedia_s32 sc500ai_write_reg(xmedia_u32 dev, xmedia_u32 addr, xmedia_u32 data)
{
xmedia_u32 idx = 0;
xmedia_s32 ret;
xmedia_u8 buf[8];
if (g_sc500ai_i2c_fd[dev] < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "sensor dev[%d]'s i2c is not init!\n", dev);
return XMEDIA_ERRCODE_NOT_INIT;
}
buf[idx] = (addr >> 8) & 0xff;
idx++;
buf[idx] = addr & 0xff;
idx++;
buf[idx] = data & 0xff;
ret = i2c_write(g_sc500ai_i2c_fd[dev], g_sc500ai_i2c_addr[dev], buf, SC500AI_ADDR_BYTE + SC500AI_DATA_BYTE);
if (ret < 0) {
SENSOR_TRACE(MODULE_DBG_ERR, "I2C_WRITE error!\n");
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
xmedia_s32 sc500ai_set_mirror_flip(xmedia_u32 dev, xmedia_bool mirror_en, xmedia_bool flip_en)
{
xmedia_s32 ret;
xmedia_u32 mirror_flip_type;
sc500ai_read_reg(dev, SC500AI_REG_ADDR_MIRROR_FLIP, &mirror_flip_type);
if (mirror_en) {
mirror_flip_type |= 0x06;
} else {
mirror_flip_type &= 0xf9;
}
if (flip_en) {
mirror_flip_type |= 0x60;
} else {
mirror_flip_type &= 0x9f;
}
ret = sc500ai_write_reg(dev, SC500AI_REG_ADDR_MIRROR_FLIP, mirror_flip_type);
if (ret != XMEDIA_SUCCESS) {
SENSOR_TRACE(MODULE_DBG_ERR, "sc500ai_write_reg failed\n");
}
return XMEDIA_SUCCESS;
}
+31
View File
@@ -0,0 +1,31 @@
#ifndef __SC500AI_CTRL_H__
#define __SC500AI_CTRL_H__
#include "sns_comm.h"
#ifdef __cplusplus
extern "C" {
#endif
#define SC500AI_I2C_ADDR 0x60
#define SC500AI_ADDR_BYTE 2
#define SC500AI_DATA_BYTE 1
// sc500ai specs list
#define SC500AI_5M_10BIT_LINEAR_MODE 1 // 2880x1620x30fps
#define SC500AI_5M_10BIT_WDR_MODE 2 // 2880x1620x30fps
#define SC500AI_640_480_10BIT_LINEAR_MODE 3 // 640x480x7fps
xmedia_s32 sc500ai_i2c_init(xmedia_u32 dev, xmedia_s8 i2c_dev, xmedia_u32 i2c_addr);
xmedia_s32 sc500ai_i2c_exit(xmedia_u32 dev);
xmedia_s32 sc500ai_read_reg(xmedia_u32 dev, xmedia_u32 addr, xmedia_u32 *data);
xmedia_s32 sc500ai_write_reg(xmedia_u32 dev, xmedia_u32 addr, xmedia_u32 data);
xmedia_s32 sc500ai_init_image(xmedia_u32 dev, xmedia_u8 image_mode, xmedia_sensor_work_mode work_mode);
xmedia_s32 sc500ai_set_mirror_flip(xmedia_u32 dev, xmedia_bool mirror_en, xmedia_bool flip_en);
xmedia_s32 sc500ai_set_slave_addr(xmedia_u32 dev, xmedia_u32 slave_addr);
#ifdef __cplusplus
}
#endif
#endif //__SC500AI_CTRL_H__
+131
View File
@@ -0,0 +1,131 @@
#ifndef __SC500AI_EX_H__
#define __SC500AI_EX_H__
#ifdef __cplusplus
extern "C" {
#endif
// Piris attr
static const xmedia_isp_piris_attr g_sc500ai_piris_attr = {
0,
1,
94,
62,
// Step-F number mapping table. Must be from small to large. F1.0 is 1024 and F32.0 is 1
{30, 35, 40, 45, 50, 56, 61, 67, 73, 79, 85, 92, 98, 105, 112, 120, 127, 135, 143, 150, 158,
166, 174, 183, 191, 200, 208, 217, 225, 234, 243, 252, 261, 270, 279, 289, 298, 307, 316, 325, 335, 344,
353, 362, 372, 381, 390, 399, 408, 417, 426, 435, 444, 453, 462, 470, 478, 486, 493, 500, 506, 512},
XMEDIA_ISP_IRIS_F_NO_1_4,
XMEDIA_ISP_IRIS_F_NO_5_6
};
static const xmedia_isp_awb_ccm g_sc500ai_awb_ccm = {
4,
{
{
6150,
{
569, 33198, 117, 32838, 328, 32770, 0, 33019, 507
},
},
{
4850,
{
606, 33210, 92, 32837, 331, 32774, 32769, 33085, 574
},
},
{
3650,
{
523, 33069, 34, 32879, 392, 32793, 32785, 33014, 519
},
},
{
2650,
{
594, 33130, 24, 32892, 353, 27, 32803, 33246, 769
},
},
},
};
static const xmedia_isp_awb_agc_table g_sc500ai_awb_agc_ir_table = {
// bvalid
1,
// saturation
// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
static const xmedia_isp_awb_agc_table g_sc500ai_awb_agc_table = {
// bvalid
1,
// saturation
// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
{ 110, 110, 108, 108, 105, 100, 95, 95, 90, 90, 90, 80, 80, 80, 80, 80}
};
static const xmedia_isp_awb_ccm g_sc500ai_awb_wdr_ccm = {
5,
{
{
6800,
{
0x0134, 0x8075, 0x0041,
0x802B, 0x0140, 0x8015,
0x0010, 0x805A, 0x014A
},
},
{
6000,
{
0x0164, 0x80A5, 0x0041,
0x802F, 0x0162, 0x8033,
0x000F, 0x8075, 0x0166
},
},
{
4850,
{
0x0159, 0x8085, 0x002C,
0x803E, 0x017A, 0x803C,
0x001E, 0x807E, 0x0160
},
},
{
3650,
{
0x01A7, 0x80C7, 0x0020,
0x8038, 0x0149, 0x8011,
0x0016, 0x8088, 0x0172
},
},
{
2650,
{
0x0167, 0x80A2, 0x003B,
0x8033, 0x0135, 0x8002,
0x0014, 0x80AC, 0x0198
},
},
},
};
static const xmedia_isp_awb_agc_table g_sc500ai_awb_wdr_agc_table = {
// bvalid
1,
// saturation
// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
{ 110, 110, 108, 108, 105, 100, 95, 95, 90, 90, 90, 80, 80, 80, 80, 80}
};
#ifdef __cplusplus
}
#endif
#endif