doubao_chat/apps/common/camera/pr2000k/pr2000k.c

864 lines
23 KiB
C

#include "asm/iic.h"
#include "asm/isp_dev.h"
#include "gpio.h"
#include "generic/jiffies.h"
#include "asm/isc.h"
#include "device/iic.h"
#include "device/device.h"
#include "app_config.h"
#ifdef CONFIG_VIDEO_ENABLE
static u8 avin_fps();
static u8 reset_gpio[2] = {-1, -1};
static u8 power_gpio[2] = {-1, -1};
static void *iic = NULL;
#define WRCMD 0xB8 //硬件MPP3,MPP4-->GND
#define RDCMD 0xB9 //硬件MPP3,MPP4-->GND
#define DELAY_TIME 10
static unsigned char wrPR2000KReg(u16 regID, unsigned char regDat)
{
u8 ret = 1;
dev_ioctl(iic, IIC_IOCTL_START, 0);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, WRCMD)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __wend;
}
delay(DELAY_TIME);
if (dev_ioctl(iic, IIC_IOCTL_TX, regID)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __wend;
}
delay(DELAY_TIME);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_STOP_BIT, regDat)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __wend;
}
delay(DELAY_TIME);
__wend:
dev_ioctl(iic, IIC_IOCTL_STOP, 0);
return ret;
}
static unsigned char rdPR2000KReg(u16 regID, unsigned char *regDat)
{
u8 ret = 1;
dev_ioctl(iic, IIC_IOCTL_START, 0);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, WRCMD)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __rend;
}
delay(DELAY_TIME);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_STOP_BIT, regID)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __rend;
}
delay(DELAY_TIME);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, RDCMD)) {
ret = 0;
printf("err in %s - %d \n", __func__, __LINE__);
goto __rend;
}
delay(DELAY_TIME);
dev_ioctl(iic, IIC_IOCTL_RX_WITH_STOP_BIT, (u32)regDat);
__rend:
dev_ioctl(iic, IIC_IOCTL_STOP, 0);
return ret;
}
static void pr2000k_reset(u8 isp_dev)
{
u8 gpio;
gpio = reset_gpio[isp_dev];
if (gpio != (u8) - 1) {
gpio_direction_output(gpio, 1);
gpio_direction_output(gpio, 0);
os_time_dly(1);
gpio_direction_output(gpio, 1);
}
}
static s32 pr2000k_id_check()
{
u16 id = 0;
u16 id1 = 0;
delay(50000);
wrPR2000KReg(0xff, 0x00);
rdPR2000KReg(0xfc, (unsigned char *)&id);
id <<= 8;
rdPR2000KReg(0xfd, (unsigned char *)&id1);
id |= id1;
printf("id: 0x%x\n", id);
if (id == 0x2000) {
puts("\nhello -----pr2000k sensor-----\n");
return 1;
}
puts("not pr2000k_id_check\n");
return 0;
}
static void av_sensor_power_ctrl(u32 _power_gpio, u32 on_off)
{
u8 gpio = (u8)_power_gpio;
if (gpio != (u8) - 1) {
gpio_direction_output(gpio, on_off);
}
}
static s32 pr2000k_check(u8 isp_dev, u32 _reset_gpio, u32 _power_gpio)
{
printf("pr2000k_id check %x\n", isp_dev);
if (!iic) {
if (isp_dev == ISP_DEV_0) {
iic = dev_open("iic0", 0);
} else {
iic = dev_open("iic1", 0);
}
if (!iic) {
return -1;
}
}
isp_dev = isp_dev > ISP_DEV_1 ? ISP_DEV_1 : isp_dev;
reset_gpio[isp_dev] = (u8)_reset_gpio;
power_gpio[isp_dev] = (u8)_power_gpio;
av_sensor_power_ctrl(_power_gpio, 1);
pr2000k_reset(isp_dev);
if (0 == pr2000k_id_check()) {
dev_close(iic);
iic = NULL;
return -1;
}
return 0;
}
static s32 pr2000k_set_output_size(u16 *width, u16 *height, u8 *freq)
{
return 0;
}
static void ajust_phase()
{
u8 Lock_Status;
u8 C_PHASE_REF_orig_T;
u8 C_PHASE_REF_orig_H;
u8 C_PHASE_REF_orig_L;
u8 C_PHASE_REF_H;
u8 C_PHASE_REF_L;
u8 C_PHASE_REF;
u32 iCount;
printf("->Start to modify C phase refrence\n");
os_time_dly(40);
wrPR2000KReg(0xff, 0x01);
rdPR2000KReg(0x46, &C_PHASE_REF_orig_T);
rdPR2000KReg(0x47, &C_PHASE_REF_orig_H);
rdPR2000KReg(0x48, &C_PHASE_REF_orig_L);
wrPR2000KReg(0x46, C_PHASE_REF_orig_T | 0x20);
C_PHASE_REF_H = C_PHASE_REF_orig_H;
C_PHASE_REF_L = C_PHASE_REF_orig_L;
C_PHASE_REF = (C_PHASE_REF_H << 8) + C_PHASE_REF_L;
wrPR2000KReg(0xff, 0x00);
rdPR2000KReg(0x01, &Lock_Status);
os_time_dly(40);
if ((Lock_Status & 0x06) != 0x06) {
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x47, C_PHASE_REF_orig_H);
wrPR2000KReg(0x48, C_PHASE_REF_orig_L);
C_PHASE_REF_H = C_PHASE_REF_orig_H;
C_PHASE_REF_L = C_PHASE_REF_orig_L;
C_PHASE_REF = (C_PHASE_REF_H << 8) + C_PHASE_REF_L;
for (iCount = 1; iCount < 6; iCount++) { // Scan C phase refrence 5 times by minus 0x40
if ((Lock_Status & 0x06) != 0x06) {
printf("->checkkkkkkkkk C_phase_ref minus times = %x\n", iCount);
C_PHASE_REF -= 0x40;
C_PHASE_REF_H = C_PHASE_REF >> 8;
C_PHASE_REF_L = C_PHASE_REF;
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x47, C_PHASE_REF_H);
wrPR2000KReg(0x48, C_PHASE_REF_L);
printf("->checkkkkkkkkk C_PHASE_REF = %x\n", C_PHASE_REF);
os_time_dly(40);
wrPR2000KReg(0xff, 0x00);
rdPR2000KReg(0x01, &Lock_Status);
} else {
delay(5000); //delay 10ms
}
}
}
for (iCount = 1; iCount < 6; iCount++) { // Scan C phase refrence 5 times by plus 0x40
if ((Lock_Status & 0x06) != 0x06) {
printf("->checkkkkkkkkk C_phase_ref plus times = %x\n", iCount);
C_PHASE_REF += 0x40;
C_PHASE_REF_H = C_PHASE_REF >> 8;
C_PHASE_REF_L = C_PHASE_REF;
printf("->checkkkkkkkkk C_PHASE_REF = %x\n", C_PHASE_REF);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x47, C_PHASE_REF_H);
wrPR2000KReg(0x48, C_PHASE_REF_L);
os_time_dly(40);
wrPR2000KReg(0xff, 0x00);
rdPR2000KReg(0x01, &Lock_Status);
} else {
os_time_dly(2);
}
/* delay(5000);//delay 10ms */
}
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x47, C_PHASE_REF_orig_H);
wrPR2000KReg(0x48, C_PHASE_REF_orig_L);
printf("->C phase modify finished!\n");
}
static u8 avin_valid_signal()
{
u8 DetVideo;
u8 LockStatus;
u8 j;
wrPR2000KReg(0xff, 0x00);
for (j = 0; j < 3; j++) {
rdPR2000KReg(0x00, &DetVideo);
rdPR2000KReg(0x01, &LockStatus);
if (LockStatus & 0xff) {
/* if ((LockStatus & 0x06) != 0x06) { */
/* ajust_phase(); */
/* } */
return 1;
}
delay(5000);
}
return 0;
}
static int wait_signal_valid()
{
u32 time;
if (avin_valid_signal()) {
//信号有效等50ms 待信号稳定
time = jiffies + msecs_to_jiffies(50);
while (1) {
if (time_after(jiffies, time)) {
puts("\n xxxxx pr2000k valid\n");
return 0;
}
}
} else {
//信号无效等100ms
time = jiffies + msecs_to_jiffies(100);
while (!avin_valid_signal()) {
if (time_after(jiffies, time)) {
puts("\n xxxxx pr2000k no no no no validxx \n");
return -1;
}
}
}
return 0;
}
static void pr2000k_init();
static int PR2000K_config_SENSOR(u16 *width, u16 *height, u8 *format, u8 *frame_freq)
{
pr2000k_init();
if (wait_signal_valid() != 0) {
printf("err in PR2000K_config_SENSOR\n");
return -1;
}
pr2000k_set_output_size(width, height, frame_freq);
printf("PR2000K init OK \n");
return 0;
}
static s32 pr2000k_initialize(u8 isp_dev, u16 *width, u16 *height, u8 *format, u8 *frame_freq)
{
puts("\npr2000k_init \n");
if (PR2000K_config_SENSOR(width, height, format, frame_freq) != 0) {
puts("\nerr pr2000k_init fail\n");
return -1;
}
return 0;
}
static void pr2000k_init()
{
//wrPR2000KReg(0xff,0x01);
//wrPR2000KReg(0x39,0x0f);
#if 1//720P 驱动
wrPR2000KReg(0xff, 0x00);
wrPR2000KReg(0x10, 0x82);
wrPR2000KReg(0x11, 0x07);
wrPR2000KReg(0x12, 0x00);
wrPR2000KReg(0x13, 0x11); //00 11 22 33SHARPNESS
wrPR2000KReg(0x14, 0x21);
wrPR2000KReg(0x15, 0x44);
wrPR2000KReg(0x16, 0x0d);
wrPR2000KReg(0x40, 0x00);
wrPR2000KReg(0x47, 0x3a);
wrPR2000KReg(0x4e, 0x3f);
wrPR2000KReg(0x80, 0x56);
wrPR2000KReg(0x81, 0x0e);
wrPR2000KReg(0x82, 0x0d);
wrPR2000KReg(0x84, 0x30);
wrPR2000KReg(0x86, 0x30);
wrPR2000KReg(0x87, 0x00);
wrPR2000KReg(0x8a, 0x00);
wrPR2000KReg(0x90, 0x00);
wrPR2000KReg(0x91, 0x00);
wrPR2000KReg(0x92, 0x00);
wrPR2000KReg(0x94, 0xff);
wrPR2000KReg(0x95, 0xff);
wrPR2000KReg(0x96, 0xff);
wrPR2000KReg(0xa0, 0x00);
wrPR2000KReg(0xa1, 0x20);
wrPR2000KReg(0xa4, 0x01);
wrPR2000KReg(0xa5, 0xe3);
wrPR2000KReg(0xa6, 0x00);
wrPR2000KReg(0xa7, 0x12);
wrPR2000KReg(0xa8, 0x00);
wrPR2000KReg(0xd0, 0x30);
wrPR2000KReg(0xd1, 0x08);
wrPR2000KReg(0xd2, 0x21);
wrPR2000KReg(0xd3, 0x00);
wrPR2000KReg(0xd8, 0x31);
wrPR2000KReg(0xd9, 0x08);
wrPR2000KReg(0xda, 0x21);
wrPR2000KReg(0xe0, 0x39);
wrPR2000KReg(0xe1, 0x90);
wrPR2000KReg(0xe2, 0x38);
wrPR2000KReg(0xe3, 0x19);
wrPR2000KReg(0xe4, 0x19);
wrPR2000KReg(0xea, 0x01); //0x02 PCLK_OUT1 硬件的PCLK接的是PCLK_OUT
/*wrPR2000KReg(0xea, 0x02); // 0x02//0x01 sel pclk_out1 or pclk_out2*/
wrPR2000KReg(0xeb, 0xff);
wrPR2000KReg(0xf1, 0x44);
wrPR2000KReg(0xf2, 0x01);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x00, 0xe4);
wrPR2000KReg(0x01, 0x61);
wrPR2000KReg(0x02, 0x00);
wrPR2000KReg(0x03, 0x57);
wrPR2000KReg(0x04, 0x0c);
wrPR2000KReg(0x05, 0x88);
wrPR2000KReg(0x06, 0x04);
wrPR2000KReg(0x07, 0xb2);
wrPR2000KReg(0x08, 0x44);
wrPR2000KReg(0x09, 0x34);
wrPR2000KReg(0x0a, 0x02);
wrPR2000KReg(0x0b, 0x14);
wrPR2000KReg(0x0c, 0x04);
wrPR2000KReg(0x0d, 0x08);
wrPR2000KReg(0x0e, 0x5e);
wrPR2000KReg(0x0f, 0x5e);
wrPR2000KReg(0x10, 0x26);
wrPR2000KReg(0x11, 0x01);
wrPR2000KReg(0x12, 0x45);
wrPR2000KReg(0x13, 0x0c);
wrPR2000KReg(0x14, 0x00);
wrPR2000KReg(0x15, 0x1b);
wrPR2000KReg(0x16, 0xd0);
wrPR2000KReg(0x17, 0x00);
wrPR2000KReg(0x18, 0x41);
wrPR2000KReg(0x19, 0x46);
wrPR2000KReg(0x1a, 0x22);
wrPR2000KReg(0x1b, 0x05);
wrPR2000KReg(0x1c, 0xea);
wrPR2000KReg(0x1d, 0x45);
wrPR2000KReg(0x1e, 0x4c);
wrPR2000KReg(0x1f, 0x00);
wrPR2000KReg(0x20, 0x80); //80 contrast
wrPR2000KReg(0x21, 0x80); // 80BRIGHTNESS
wrPR2000KReg(0x22, 0x98); //98 SAT
wrPR2000KReg(0x23, 0x80);
wrPR2000KReg(0x24, 0x80);
wrPR2000KReg(0x25, 0x80);
wrPR2000KReg(0x26, 0x84);
wrPR2000KReg(0x27, 0x82);
wrPR2000KReg(0x28, 0x00);
wrPR2000KReg(0x29, 0x7d);
wrPR2000KReg(0x2a, 0x00);
wrPR2000KReg(0x2b, 0x00);
wrPR2000KReg(0x2c, 0x00);
wrPR2000KReg(0x2d, 0x00);
wrPR2000KReg(0x2e, 0x00);
wrPR2000KReg(0x2f, 0x00);
wrPR2000KReg(0x30, 0x00);
wrPR2000KReg(0x31, 0x00);
wrPR2000KReg(0x32, 0xc0);
wrPR2000KReg(0x33, 0x14);
wrPR2000KReg(0x34, 0x14);
wrPR2000KReg(0x35, 0x80);
wrPR2000KReg(0x36, 0x80);
wrPR2000KReg(0x37, 0xaa);
wrPR2000KReg(0x38, 0x48);
wrPR2000KReg(0x39, 0x08); //0X08
wrPR2000KReg(0x3a, 0x27);
wrPR2000KReg(0x3b, 0x02);
wrPR2000KReg(0x3c, 0x01);
wrPR2000KReg(0x3d, 0x23);
wrPR2000KReg(0x3e, 0x02);
wrPR2000KReg(0x3f, 0xc4);
wrPR2000KReg(0x40, 0x05);
wrPR2000KReg(0x41, 0x55);
wrPR2000KReg(0x42, 0x01);
wrPR2000KReg(0x43, 0x33);
wrPR2000KReg(0x44, 0x6a);
wrPR2000KReg(0x45, 0x00);
wrPR2000KReg(0x46, 0x09);
wrPR2000KReg(0x47, 0xe2);
wrPR2000KReg(0x48, 0x01);
wrPR2000KReg(0x49, 0x00);
wrPR2000KReg(0x4a, 0x7b);
wrPR2000KReg(0x4b, 0x60);
wrPR2000KReg(0x4c, 0x00);
wrPR2000KReg(0x4d, 0x4a);
wrPR2000KReg(0x4e, 0x00);
wrPR2000KReg(0x4f, 0x2c);
wrPR2000KReg(0x50, 0x01);
wrPR2000KReg(0x51, 0x28);
wrPR2000KReg(0x52, 0x40);
wrPR2000KReg(0x53, 0x0c);
wrPR2000KReg(0x54, 0x0f);
wrPR2000KReg(0x55, 0x8d);
wrPR2000KReg(0x70, 0x06);
wrPR2000KReg(0x71, 0x08);
wrPR2000KReg(0x72, 0x0a);
wrPR2000KReg(0x73, 0x0c);
wrPR2000KReg(0x74, 0x0e);
wrPR2000KReg(0x75, 0x10);
wrPR2000KReg(0x76, 0x12);
wrPR2000KReg(0x77, 0x14);
wrPR2000KReg(0x78, 0x06);
wrPR2000KReg(0x79, 0x08);
wrPR2000KReg(0x7a, 0x0a);
wrPR2000KReg(0x7b, 0x0c);
wrPR2000KReg(0x7c, 0x0e);
wrPR2000KReg(0x7d, 0x10);
wrPR2000KReg(0x7e, 0x12);
wrPR2000KReg(0x7f, 0x14);
wrPR2000KReg(0x80, 0x00);
wrPR2000KReg(0x81, 0x09);
wrPR2000KReg(0x82, 0x00);
wrPR2000KReg(0x83, 0x07);
wrPR2000KReg(0x84, 0x00);
wrPR2000KReg(0x85, 0x14);
wrPR2000KReg(0x86, 0x03);
wrPR2000KReg(0x87, 0x36);
wrPR2000KReg(0x88, 0x0c);
wrPR2000KReg(0x89, 0x76);
wrPR2000KReg(0x8a, 0x0c);
wrPR2000KReg(0x8b, 0x76);
wrPR2000KReg(0x8c, 0x0b);
wrPR2000KReg(0x8d, 0xe0);
wrPR2000KReg(0x8e, 0x06);
wrPR2000KReg(0x8f, 0x66);
wrPR2000KReg(0x90, 0x06);
wrPR2000KReg(0x91, 0x8f);
wrPR2000KReg(0x92, 0x73);
wrPR2000KReg(0x93, 0x39);
wrPR2000KReg(0x94, 0x0f);
wrPR2000KReg(0x95, 0x5e);
wrPR2000KReg(0x96, 0x09);
wrPR2000KReg(0x97, 0x26);
wrPR2000KReg(0x98, 0x1c);
wrPR2000KReg(0x99, 0x20);
wrPR2000KReg(0x9a, 0x17);
wrPR2000KReg(0x9b, 0x70);
wrPR2000KReg(0x9c, 0x0e);
wrPR2000KReg(0x9d, 0x10);
wrPR2000KReg(0x9e, 0x0b);
wrPR2000KReg(0x9f, 0xb8);
wrPR2000KReg(0xa0, 0x01);
wrPR2000KReg(0xa1, 0xc2);
wrPR2000KReg(0xa2, 0x01);
wrPR2000KReg(0xa3, 0xb8);
wrPR2000KReg(0xa4, 0x00);
wrPR2000KReg(0xa5, 0xe1);
wrPR2000KReg(0xa6, 0x00);
wrPR2000KReg(0xa7, 0xc6);
wrPR2000KReg(0xa8, 0x01);
wrPR2000KReg(0xa9, 0x7c);
wrPR2000KReg(0xaa, 0x01);
wrPR2000KReg(0xab, 0x7c);
wrPR2000KReg(0xac, 0x00);
wrPR2000KReg(0xad, 0xea);
wrPR2000KReg(0xae, 0x00);
wrPR2000KReg(0xaf, 0xea);
wrPR2000KReg(0xb0, 0x0b);
wrPR2000KReg(0xb1, 0x99);
wrPR2000KReg(0xb2, 0x12);
wrPR2000KReg(0xb3, 0xca);
wrPR2000KReg(0xb4, 0x00);
wrPR2000KReg(0xb5, 0x17);
wrPR2000KReg(0xb6, 0x08);
wrPR2000KReg(0xb7, 0xe8);
wrPR2000KReg(0xb8, 0xb0);
wrPR2000KReg(0xb9, 0xce);
wrPR2000KReg(0xba, 0x90);
wrPR2000KReg(0xbb, 0x00);
wrPR2000KReg(0xbc, 0x00);
wrPR2000KReg(0xbd, 0x04);
wrPR2000KReg(0xbe, 0x05);
wrPR2000KReg(0xbf, 0x00);
wrPR2000KReg(0xc0, 0x00);
wrPR2000KReg(0xc1, 0x12);
wrPR2000KReg(0xc2, 0x02);
wrPR2000KReg(0xc3, 0xd0);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x54, 0x0e);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x54, 0x0f);
#else //1080P 驱动
// Page0 sys
wrPR2000KReg(0xff, 0x00);
wrPR2000KReg(0x10, 0x83);
wrPR2000KReg(0x11, 0x07);
wrPR2000KReg(0x12, 0x00);
wrPR2000KReg(0x13, 0x00);
wrPR2000KReg(0x14, 0x21); //b[1:0); => Select Camera Input. VinP(1),VinN(3),Differ(0).
wrPR2000KReg(0x15, 0x44);
wrPR2000KReg(0x16, 0x0d);
wrPR2000KReg(0x40, 0x00);
wrPR2000KReg(0x47, 0x3a);
wrPR2000KReg(0x4e, 0x3f);
wrPR2000KReg(0x80, 0x56);
wrPR2000KReg(0x81, 0x0e);
wrPR2000KReg(0x82, 0x0d);
wrPR2000KReg(0x84, 0x30);
wrPR2000KReg(0x86, 0x20);
wrPR2000KReg(0x87, 0x00);
wrPR2000KReg(0x8a, 0x00);
wrPR2000KReg(0x90, 0x00);
wrPR2000KReg(0x91, 0x00);
wrPR2000KReg(0x92, 0x00);
wrPR2000KReg(0x94, 0xff);
wrPR2000KReg(0x95, 0xff);
wrPR2000KReg(0x96, 0xff);
wrPR2000KReg(0xa0, 0x00);
wrPR2000KReg(0xa1, 0x20);
wrPR2000KReg(0xa4, 0x01);
wrPR2000KReg(0xa5, 0xe3);
wrPR2000KReg(0xa6, 0x00);
wrPR2000KReg(0xa7, 0x12);
wrPR2000KReg(0xa8, 0x00);
wrPR2000KReg(0xd0, 0x30);
wrPR2000KReg(0xd1, 0x08);
wrPR2000KReg(0xd2, 0x21);
wrPR2000KReg(0xd3, 0x00);
wrPR2000KReg(0xd8, 0x30);
wrPR2000KReg(0xd9, 0x08);
wrPR2000KReg(0xda, 0x21);
wrPR2000KReg(0xe0, 0x35);
wrPR2000KReg(0xe1, 0x80);
wrPR2000KReg(0xe2, 0x18);
wrPR2000KReg(0xe3, 0x00); //0x00
wrPR2000KReg(0xe4, 0x00); //0x00
/* wrPR2000KReg(0xea, 0x01); // 0x02//0x01 sel pclk_out1 or pclk_out2 */
wrPR2000KReg(0xea, 0x02); // 0x02//0x01 sel pclk_out1 or pclk_out2
wrPR2000KReg(0xeb, 0xff);
wrPR2000KReg(0xf1, 0x44);
wrPR2000KReg(0xf2, 0x01);
// Page1 vdec
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x00, 0xe4);
wrPR2000KReg(0x01, 0x61);
wrPR2000KReg(0x02, 0x00);
wrPR2000KReg(0x03, 0x57);
wrPR2000KReg(0x04, 0x0c);
wrPR2000KReg(0x05, 0x88);
wrPR2000KReg(0x06, 0x04);
wrPR2000KReg(0x07, 0xb2);
wrPR2000KReg(0x08, 0x44);
wrPR2000KReg(0x09, 0x34);
wrPR2000KReg(0x0a, 0x02);
wrPR2000KReg(0x0b, 0x14);
wrPR2000KReg(0x0c, 0x04);
wrPR2000KReg(0x0d, 0x08);
wrPR2000KReg(0x0e, 0x5e);
wrPR2000KReg(0x0f, 0x5e);
wrPR2000KReg(0x10, 0x26);
wrPR2000KReg(0x11, 0x00);
wrPR2000KReg(0x12, 0x87);
wrPR2000KReg(0x13, 0x24);
wrPR2000KReg(0x14, 0x80);
wrPR2000KReg(0x15, 0x2a);
wrPR2000KReg(0x16, 0x38);
wrPR2000KReg(0x17, 0x00);
wrPR2000KReg(0x18, 0x80);
wrPR2000KReg(0x19, 0x48);
wrPR2000KReg(0x1a, 0x6c);
wrPR2000KReg(0x1b, 0x05);
wrPR2000KReg(0x1c, 0x61);
wrPR2000KReg(0x1d, 0x07);
wrPR2000KReg(0x1e, 0x7e);
wrPR2000KReg(0x1f, 0x80);
wrPR2000KReg(0x20, 0x80);
wrPR2000KReg(0x21, 0x80);
wrPR2000KReg(0x22, 0x90);
wrPR2000KReg(0x23, 0x80);
wrPR2000KReg(0x24, 0x80);
wrPR2000KReg(0x25, 0x80);
wrPR2000KReg(0x26, 0x84);
wrPR2000KReg(0x27, 0x82);
wrPR2000KReg(0x28, 0x00);
wrPR2000KReg(0x29, 0xff);
wrPR2000KReg(0x2a, 0xff);
wrPR2000KReg(0x2b, 0x00);
wrPR2000KReg(0x2c, 0x00);
wrPR2000KReg(0x2d, 0x00);
wrPR2000KReg(0x2e, 0x00);
wrPR2000KReg(0x2f, 0x00);
wrPR2000KReg(0x30, 0x00);
wrPR2000KReg(0x31, 0x00);
wrPR2000KReg(0x32, 0xc0);
wrPR2000KReg(0x33, 0x14);
wrPR2000KReg(0x34, 0x14);
wrPR2000KReg(0x35, 0x80);
wrPR2000KReg(0x36, 0x80);
wrPR2000KReg(0x37, 0xad);
wrPR2000KReg(0x38, 0x4b);
wrPR2000KReg(0x39, 0x08);
wrPR2000KReg(0x3a, 0x21);
wrPR2000KReg(0x3b, 0x02);
wrPR2000KReg(0x3c, 0x01);
wrPR2000KReg(0x3d, 0x23);
wrPR2000KReg(0x3e, 0x05);
wrPR2000KReg(0x3f, 0xc8);
wrPR2000KReg(0x40, 0x05);
wrPR2000KReg(0x41, 0x55);
wrPR2000KReg(0x42, 0x01);
wrPR2000KReg(0x43, 0x38);
wrPR2000KReg(0x44, 0x6a);
wrPR2000KReg(0x45, 0x00);
wrPR2000KReg(0x46, 0x14);
wrPR2000KReg(0x47, 0xb0);
wrPR2000KReg(0x48, 0xdf);
wrPR2000KReg(0x49, 0x00);
wrPR2000KReg(0x4a, 0x7b);
wrPR2000KReg(0x4b, 0x60);
wrPR2000KReg(0x4c, 0x00);
wrPR2000KReg(0x4d, 0x26);
wrPR2000KReg(0x4e, 0x00);
wrPR2000KReg(0x4f, 0x24);
wrPR2000KReg(0x50, 0x01);
wrPR2000KReg(0x51, 0x28);
wrPR2000KReg(0x52, 0x40);
wrPR2000KReg(0x53, 0x0c);
wrPR2000KReg(0x54, 0x0f);
wrPR2000KReg(0x55, 0x8d);
wrPR2000KReg(0x70, 0x06);
wrPR2000KReg(0x71, 0x08);
wrPR2000KReg(0x72, 0x0a);
wrPR2000KReg(0x73, 0x0c);
wrPR2000KReg(0x74, 0x0e);
wrPR2000KReg(0x75, 0x10);
wrPR2000KReg(0x76, 0x12);
wrPR2000KReg(0x77, 0x14);
wrPR2000KReg(0x78, 0x06);
wrPR2000KReg(0x79, 0x08);
wrPR2000KReg(0x7a, 0x0a);
wrPR2000KReg(0x7b, 0x0c);
wrPR2000KReg(0x7c, 0x0e);
wrPR2000KReg(0x7d, 0x10);
wrPR2000KReg(0x7e, 0x12);
wrPR2000KReg(0x7f, 0x14);
wrPR2000KReg(0x80, 0x00);
wrPR2000KReg(0x81, 0x09);
wrPR2000KReg(0x82, 0x00);
wrPR2000KReg(0x83, 0x07);
wrPR2000KReg(0x84, 0x00);
wrPR2000KReg(0x85, 0x14);
wrPR2000KReg(0x86, 0x03);
wrPR2000KReg(0x87, 0x36);
wrPR2000KReg(0x88, 0x06);
wrPR2000KReg(0x89, 0x3b);
wrPR2000KReg(0x8a, 0x06);
wrPR2000KReg(0x8b, 0x3b);
wrPR2000KReg(0x8c, 0x08);
wrPR2000KReg(0x8d, 0xe8);
wrPR2000KReg(0x8e, 0x06);
wrPR2000KReg(0x8f, 0x66);
wrPR2000KReg(0x90, 0x03);
wrPR2000KReg(0x91, 0x47);
wrPR2000KReg(0x92, 0x73);
wrPR2000KReg(0x93, 0x39);
wrPR2000KReg(0x94, 0x0f);
wrPR2000KReg(0x95, 0x5e);
wrPR2000KReg(0x96, 0x04);
wrPR2000KReg(0x97, 0x9c);
wrPR2000KReg(0x98, 0x1c);
wrPR2000KReg(0x99, 0x20);
wrPR2000KReg(0x9a, 0x17);
wrPR2000KReg(0x9b, 0x70);
wrPR2000KReg(0x9c, 0x0e);
wrPR2000KReg(0x9d, 0x10);
wrPR2000KReg(0x9e, 0x0b);
wrPR2000KReg(0x9f, 0xb8);
wrPR2000KReg(0xa0, 0x01);
wrPR2000KReg(0xa1, 0xc2);
wrPR2000KReg(0xa2, 0x01);
wrPR2000KReg(0xa3, 0xb8);
wrPR2000KReg(0xa4, 0x00);
wrPR2000KReg(0xa5, 0xe1);
wrPR2000KReg(0xa6, 0x00);
wrPR2000KReg(0xa7, 0xc6);
wrPR2000KReg(0xa8, 0x01);
wrPR2000KReg(0xa9, 0x7c);
wrPR2000KReg(0xaa, 0x01);
wrPR2000KReg(0xab, 0x7c);
wrPR2000KReg(0xac, 0x00);
wrPR2000KReg(0xad, 0xea);
wrPR2000KReg(0xae, 0x00);
wrPR2000KReg(0xaf, 0xea);
wrPR2000KReg(0xb0, 0x05);
wrPR2000KReg(0xb1, 0xcc);
wrPR2000KReg(0xb2, 0x09);
wrPR2000KReg(0xb3, 0x6d);
wrPR2000KReg(0xb4, 0x00);
wrPR2000KReg(0xb5, 0x17);
wrPR2000KReg(0xb6, 0x08);
wrPR2000KReg(0xb7, 0xe8);
wrPR2000KReg(0xb8, 0xb0);
wrPR2000KReg(0xb9, 0xce);
wrPR2000KReg(0xba, 0x90);
wrPR2000KReg(0xbb, 0x00);
wrPR2000KReg(0xbc, 0x00);
wrPR2000KReg(0xbd, 0x04);
wrPR2000KReg(0xbe, 0x07);
wrPR2000KReg(0xbf, 0x80);
wrPR2000KReg(0xc0, 0x00);
wrPR2000KReg(0xc1, 0x20);
wrPR2000KReg(0xc2, 0x04);
wrPR2000KReg(0xc3, 0x38);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x54, 0x0e);
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x54, 0x0f);
#endif
wrPR2000KReg(0xff, 0x01);
wrPR2000KReg(0x39, 0x0f);
#if 0
//open color bar
u8 temp ;
wrPR2000KReg(0xff, 0x01);
rdPR2000KReg(0x4f, &temp);
temp = (temp | 0x10);
wrPR2000KReg(0x4f, temp);
wrPR2000KReg(0xff, 0x02);
rdPR2000KReg(0x80, &temp);
temp = (temp | 0xb0);
wrPR2000KReg(0x80, temp);
#endif
}
static s32 pr2000k_power_ctl(u8 isp_dev, u8 is_work)
{
return 0;
}
static u8 avin_fps()
{
u8 DetVideo;
wrPR2000KReg(0xff, 0x00);
rdPR2000KReg(0x00, &DetVideo);
if ((DetVideo & 0x30) == 0) {
return 1;
}
return 0;
}
static u8 avin_mode_det(void *parm)
{
return 0;
}
// *INDENT-OFF*
REGISTER_CAMERA(PR2000K) = {
.logo = "PR2000K",
.isp_dev = ISP_DEV_NONE,
.in_format = SEN_IN_FORMAT_UYVY,
.mbus_type = SEN_MBUS_BT656,
.mbus_config = SEN_MBUS_DATA_WIDTH_8B_REVERSE | SEN_MBUS_PCLK_SAMPLE_FALLING,
.fps = 25,
.sen_size = {1280, 720},
.cap_fps = 25,
.sen_cap_size = {1280, 720},
.ops = {
.avin_fps = avin_fps,
.avin_valid_signal = avin_valid_signal,
.avin_mode_det = avin_mode_det,
.sensor_check = pr2000k_check,
.init = pr2000k_initialize,
.set_size_fps = pr2000k_set_output_size,
.power_ctrl = pr2000k_power_ctl,
.sleep = NULL,
.wakeup = NULL,
.write_reg = NULL,
.read_reg = NULL,
}
};
// *INDENT-ON*
#endif