/************************************************************************** * double_camera.c * * Create Date : * * Modify Date : * * Create by : AWINIC Technology CO., LTD * * Version : 0.9, 2016/02/15 **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "prize_dual_cam.h" #define OV5645_SENSOR_ID 0x5645 static char i2c_write_reg(struct i2c_client *client, int addr, char reg_data) { char ret; u8 wdbuf[512] = {0}; struct i2c_msg msgs[] = { { .addr = client->addr, .flags = 0, .len = 3, .buf = wdbuf, }, }; wdbuf[0] = ((addr >> 8)&0xff); wdbuf[1] = (addr&0xff); wdbuf[2] = reg_data; ret = i2c_transfer(client->adapter, msgs, 1); if (ret < 0) pr_err("msg %s i2c read error: %d\n", __func__, ret); return ret; } static char i2c_read_reg(struct i2c_client *client, int addr) { char ret; u8 rdbuf[2] = {0}; struct i2c_msg msgs[] = { { .addr = client->addr, .flags = 0, .len = 2, .buf = rdbuf, }, { .addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = rdbuf, }, }; rdbuf[0] = ((addr >> 8)&0xff); rdbuf[1] = (addr&0xff); ret = i2c_transfer(client->adapter, msgs, 2); if (ret < 0) pr_err("msg %s i2c read error: %d\n", __func__, ret); return rdbuf[0]; } static inline char ov5645_write_cmos_sensor(struct i2c_client *client, int addr, char para) { return i2c_write_reg(client, addr, para); } static char ov5645_read_cmos_sensor(struct i2c_client *client, int addr) { char get_byte=0; get_byte = i2c_read_reg(client, addr); return get_byte; } static void ov5645_sensor_init(struct i2c_client *client) { ov5645_write_cmos_sensor(client,0x3103,0x11); ov5645_write_cmos_sensor(client,0x3008,0x82); ov5645_write_cmos_sensor(client,0x3008,0x42); ov5645_write_cmos_sensor(client,0x3103,0x03); ov5645_write_cmos_sensor(client,0x3503,0x07); ov5645_write_cmos_sensor(client,0x3002,0x1c); ov5645_write_cmos_sensor(client,0x3006,0xc3); ov5645_write_cmos_sensor(client,0x300e,0x45); ov5645_write_cmos_sensor(client,0x3017,0x40); ov5645_write_cmos_sensor(client,0x3018,0x00); ov5645_write_cmos_sensor(client,0x302e,0x0b); ov5645_write_cmos_sensor(client,0x3037,0x13); ov5645_write_cmos_sensor(client,0x3108,0x01); ov5645_write_cmos_sensor(client,0x3611,0x06); ov5645_write_cmos_sensor(client,0x3612,0xab); ov5645_write_cmos_sensor(client,0x3614,0x50); ov5645_write_cmos_sensor(client,0x3618,0x04); ov5645_write_cmos_sensor(client,0x3034,0x18); ov5645_write_cmos_sensor(client,0x3035,0x11); ov5645_write_cmos_sensor(client,0x3036,0x54); ov5645_write_cmos_sensor(client,0x3500,0x00); ov5645_write_cmos_sensor(client,0x3501,0x01); ov5645_write_cmos_sensor(client,0x3502,0x00); ov5645_write_cmos_sensor(client,0x350a,0x00); ov5645_write_cmos_sensor(client,0x350b,0x3f); ov5645_write_cmos_sensor(client,0x3600,0x08); ov5645_write_cmos_sensor(client,0x3601,0x33); ov5645_write_cmos_sensor(client,0x3620,0x33); ov5645_write_cmos_sensor(client,0x3621,0xe0); ov5645_write_cmos_sensor(client,0x3622,0x01); ov5645_write_cmos_sensor(client,0x3630,0x2d); ov5645_write_cmos_sensor(client,0x3631,0x00); ov5645_write_cmos_sensor(client,0x3632,0x32); ov5645_write_cmos_sensor(client,0x3633,0x52); ov5645_write_cmos_sensor(client,0x3634,0x70); ov5645_write_cmos_sensor(client,0x3635,0x13); ov5645_write_cmos_sensor(client,0x3636,0x03); ov5645_write_cmos_sensor(client,0x3702,0x6e); ov5645_write_cmos_sensor(client,0x3703,0x52); ov5645_write_cmos_sensor(client,0x3704,0xa0); ov5645_write_cmos_sensor(client,0x3705,0x33); ov5645_write_cmos_sensor(client,0x3708,0x63); ov5645_write_cmos_sensor(client,0x3709,0x12); ov5645_write_cmos_sensor(client,0x370b,0x61); ov5645_write_cmos_sensor(client,0x370c,0xc0); ov5645_write_cmos_sensor(client,0x370f,0x10); ov5645_write_cmos_sensor(client,0x3715,0x08); ov5645_write_cmos_sensor(client,0x3717,0x01); ov5645_write_cmos_sensor(client,0x371b,0x20); ov5645_write_cmos_sensor(client,0x3731,0x22); ov5645_write_cmos_sensor(client,0x3739,0x70); ov5645_write_cmos_sensor(client,0x3901,0x0a); ov5645_write_cmos_sensor(client,0x3905,0x02); ov5645_write_cmos_sensor(client,0x3906,0x10); ov5645_write_cmos_sensor(client,0x3719,0x86); ov5645_write_cmos_sensor(client,0x3800,0x00); ov5645_write_cmos_sensor(client,0x3801,0x00); ov5645_write_cmos_sensor(client,0x3802,0x00); ov5645_write_cmos_sensor(client,0x3803,0x00); ov5645_write_cmos_sensor(client,0x3804,0x0a); ov5645_write_cmos_sensor(client,0x3805,0x3f); ov5645_write_cmos_sensor(client,0x3806,0x07); ov5645_write_cmos_sensor(client,0x3807,0x9f); ov5645_write_cmos_sensor(client,0x3808,0x0a); ov5645_write_cmos_sensor(client,0x3809,0x20); ov5645_write_cmos_sensor(client,0x380a,0x07); ov5645_write_cmos_sensor(client,0x380b,0x98); ov5645_write_cmos_sensor(client,0x380c,0x0b); ov5645_write_cmos_sensor(client,0x380d,0x1c); ov5645_write_cmos_sensor(client,0x380e,0x07); ov5645_write_cmos_sensor(client,0x380f,0xb0); ov5645_write_cmos_sensor(client,0x3810,0x00); ov5645_write_cmos_sensor(client,0x3811,0x10); ov5645_write_cmos_sensor(client,0x3812,0x00); ov5645_write_cmos_sensor(client,0x3813,0x06); ov5645_write_cmos_sensor(client,0x3814,0x11); ov5645_write_cmos_sensor(client,0x3815,0x11); ov5645_write_cmos_sensor(client,0x3820,0x40); ov5645_write_cmos_sensor(client,0x3821,0x06); ov5645_write_cmos_sensor(client,0x3824,0x01); ov5645_write_cmos_sensor(client,0x3826,0x03); ov5645_write_cmos_sensor(client,0x3828,0x08); ov5645_write_cmos_sensor(client,0x3a02,0x07); ov5645_write_cmos_sensor(client,0x3a03,0xb0); ov5645_write_cmos_sensor(client,0x3a08,0x01); ov5645_write_cmos_sensor(client,0x3a09,0x27); ov5645_write_cmos_sensor(client,0x3a0a,0x00); ov5645_write_cmos_sensor(client,0x3a0b,0xf6); ov5645_write_cmos_sensor(client,0x3a0e,0x06); ov5645_write_cmos_sensor(client,0x3a0d,0x08); ov5645_write_cmos_sensor(client,0x3a14,0x07); ov5645_write_cmos_sensor(client,0x3a15,0xb0); ov5645_write_cmos_sensor(client,0x3a18,0x00); ov5645_write_cmos_sensor(client,0x3a19,0xf8); ov5645_write_cmos_sensor(client,0x3c01,0x34); ov5645_write_cmos_sensor(client,0x3c04,0x28); ov5645_write_cmos_sensor(client,0x3c05,0x98); ov5645_write_cmos_sensor(client,0x3c07,0x07); ov5645_write_cmos_sensor(client,0x3c09,0xc2); ov5645_write_cmos_sensor(client,0x3c0a,0x9c); ov5645_write_cmos_sensor(client,0x3c0b,0x40); ov5645_write_cmos_sensor(client,0x3c01,0x34); ov5645_write_cmos_sensor(client,0x4001,0x02); ov5645_write_cmos_sensor(client,0x4004,0x06); ov5645_write_cmos_sensor(client,0x4005,0x18); ov5645_write_cmos_sensor(client,0x4050,0x6e); ov5645_write_cmos_sensor(client,0x4051,0x8f); ov5645_write_cmos_sensor(client,0x4300,0x30); ov5645_write_cmos_sensor(client,0x4514,0x00); ov5645_write_cmos_sensor(client,0x4520,0xb0); ov5645_write_cmos_sensor(client,0x460b,0x37); ov5645_write_cmos_sensor(client,0x460c,0x20); ov5645_write_cmos_sensor(client,0x4818,0x01); ov5645_write_cmos_sensor(client,0x481d,0xf0); ov5645_write_cmos_sensor(client,0x481f,0x50); ov5645_write_cmos_sensor(client,0x4823,0x70); ov5645_write_cmos_sensor(client,0x4831,0x14); ov5645_write_cmos_sensor(client,0x4837,0x0b); ov5645_write_cmos_sensor(client,0x5000,0xa7); ov5645_write_cmos_sensor(client,0x5001,0x83); ov5645_write_cmos_sensor(client,0x501d,0x00); ov5645_write_cmos_sensor(client,0x501f,0x00); ov5645_write_cmos_sensor(client,0x503d,0x00); ov5645_write_cmos_sensor(client,0x505c,0x30); ov5645_write_cmos_sensor(client,0x5181,0x59); ov5645_write_cmos_sensor(client,0x5183,0x00); ov5645_write_cmos_sensor(client,0x5191,0xf0); ov5645_write_cmos_sensor(client,0x5192,0x03); ov5645_write_cmos_sensor(client,0x5684,0x10); ov5645_write_cmos_sensor(client,0x5685,0xa0); ov5645_write_cmos_sensor(client,0x5686,0x0c); ov5645_write_cmos_sensor(client,0x5687,0x78); ov5645_write_cmos_sensor(client,0x5a00,0x08); ov5645_write_cmos_sensor(client,0x5a21,0x00); ov5645_write_cmos_sensor(client,0x5a24,0x00); ov5645_write_cmos_sensor(client,0x3008,0x02); ov5645_write_cmos_sensor(client,0x3503,0x00); ov5645_write_cmos_sensor(client,0x5180,0xff); ov5645_write_cmos_sensor(client,0x5181,0xf2); ov5645_write_cmos_sensor(client,0x5182,0x00); ov5645_write_cmos_sensor(client,0x5183,0x14); ov5645_write_cmos_sensor(client,0x5184,0x25); ov5645_write_cmos_sensor(client,0x5185,0x24); ov5645_write_cmos_sensor(client,0x5186,0x09); ov5645_write_cmos_sensor(client,0x5187,0x09); ov5645_write_cmos_sensor(client,0x5188,0x0a); ov5645_write_cmos_sensor(client,0x5189,0x75); ov5645_write_cmos_sensor(client,0x518a,0x52); ov5645_write_cmos_sensor(client,0x518b,0xea); ov5645_write_cmos_sensor(client,0x518c,0xa8); ov5645_write_cmos_sensor(client,0x518d,0x42); ov5645_write_cmos_sensor(client,0x518e,0x38); ov5645_write_cmos_sensor(client,0x518f,0x56); ov5645_write_cmos_sensor(client,0x5190,0x42); ov5645_write_cmos_sensor(client,0x5191,0xf8); ov5645_write_cmos_sensor(client,0x5192,0x04); ov5645_write_cmos_sensor(client,0x5193,0x70); ov5645_write_cmos_sensor(client,0x5194,0xf0); ov5645_write_cmos_sensor(client,0x5195,0xf0); ov5645_write_cmos_sensor(client,0x5196,0x03); ov5645_write_cmos_sensor(client,0x5197,0x01); ov5645_write_cmos_sensor(client,0x5198,0x04); ov5645_write_cmos_sensor(client,0x5199,0x12); ov5645_write_cmos_sensor(client,0x519a,0x04); ov5645_write_cmos_sensor(client,0x519b,0x00); ov5645_write_cmos_sensor(client,0x519c,0x06); ov5645_write_cmos_sensor(client,0x519d,0x82); ov5645_write_cmos_sensor(client,0x519e,0x38); ov5645_write_cmos_sensor(client,0x5381,0x1e); ov5645_write_cmos_sensor(client,0x5382,0x5b); ov5645_write_cmos_sensor(client,0x5383,0x08); ov5645_write_cmos_sensor(client,0x5384,0x0b); ov5645_write_cmos_sensor(client,0x5385,0x84); ov5645_write_cmos_sensor(client,0x5386,0x8f); ov5645_write_cmos_sensor(client,0x5387,0x82); ov5645_write_cmos_sensor(client,0x5388,0x71); ov5645_write_cmos_sensor(client,0x5389,0x11); ov5645_write_cmos_sensor(client,0x538a,0x01); ov5645_write_cmos_sensor(client,0x538b,0x98); ov5645_write_cmos_sensor(client,0x5300,0x08); ov5645_write_cmos_sensor(client,0x5301,0x1e); ov5645_write_cmos_sensor(client,0x5302,0x10); ov5645_write_cmos_sensor(client,0x5303,0x00); ov5645_write_cmos_sensor(client,0x5304,0x08); ov5645_write_cmos_sensor(client,0x5305,0x1e); ov5645_write_cmos_sensor(client,0x5306,0x08); ov5645_write_cmos_sensor(client,0x5307,0x16); ov5645_write_cmos_sensor(client,0x5309,0x08); ov5645_write_cmos_sensor(client,0x530a,0x1e); ov5645_write_cmos_sensor(client,0x530b,0x04); ov5645_write_cmos_sensor(client,0x530c,0x06); ov5645_write_cmos_sensor(client,0x5480,0x01); ov5645_write_cmos_sensor(client,0x5481,0x0e); ov5645_write_cmos_sensor(client,0x5482,0x18); ov5645_write_cmos_sensor(client,0x5483,0x2b); ov5645_write_cmos_sensor(client,0x5484,0x52); ov5645_write_cmos_sensor(client,0x5485,0x65); ov5645_write_cmos_sensor(client,0x5486,0x71); ov5645_write_cmos_sensor(client,0x5487,0x7d); ov5645_write_cmos_sensor(client,0x5488,0x87); ov5645_write_cmos_sensor(client,0x5489,0x91); ov5645_write_cmos_sensor(client,0x548a,0x9a); ov5645_write_cmos_sensor(client,0x548b,0xaa); ov5645_write_cmos_sensor(client,0x548c,0xb8); ov5645_write_cmos_sensor(client,0x548d,0xcd); ov5645_write_cmos_sensor(client,0x548e,0xdd); ov5645_write_cmos_sensor(client,0x548f,0xea); ov5645_write_cmos_sensor(client,0x5490,0x1d); ov5645_write_cmos_sensor(client,0x5580,0x02); ov5645_write_cmos_sensor(client,0x5583,0x40); ov5645_write_cmos_sensor(client,0x5584,0x30); ov5645_write_cmos_sensor(client,0x5589,0x10); ov5645_write_cmos_sensor(client,0x558a,0x00); ov5645_write_cmos_sensor(client,0x558b,0xf8); ov5645_write_cmos_sensor(client,0x5780,0xfc); ov5645_write_cmos_sensor(client,0x5781,0x13); ov5645_write_cmos_sensor(client,0x5782,0x03); ov5645_write_cmos_sensor(client,0x5786,0x20); ov5645_write_cmos_sensor(client,0x5787,0x40); ov5645_write_cmos_sensor(client,0x5788,0x08); ov5645_write_cmos_sensor(client,0x5789,0x08); ov5645_write_cmos_sensor(client,0x578a,0x02); ov5645_write_cmos_sensor(client,0x578b,0x01); ov5645_write_cmos_sensor(client,0x578c,0x01); ov5645_write_cmos_sensor(client,0x578d,0x0c); ov5645_write_cmos_sensor(client,0x578e,0x02); ov5645_write_cmos_sensor(client,0x578f,0x01); ov5645_write_cmos_sensor(client,0x5790,0x01); ov5645_write_cmos_sensor(client,0x5800,0x3f); ov5645_write_cmos_sensor(client,0x5801,0x16); ov5645_write_cmos_sensor(client,0x5802,0x0e); ov5645_write_cmos_sensor(client,0x5803,0x0d); ov5645_write_cmos_sensor(client,0x5804,0x17); ov5645_write_cmos_sensor(client,0x5805,0x3f); ov5645_write_cmos_sensor(client,0x5806,0x0b); ov5645_write_cmos_sensor(client,0x5807,0x06); ov5645_write_cmos_sensor(client,0x5808,0x04); ov5645_write_cmos_sensor(client,0x5809,0x04); ov5645_write_cmos_sensor(client,0x580a,0x06); ov5645_write_cmos_sensor(client,0x580b,0x0b); ov5645_write_cmos_sensor(client,0x580c,0x09); ov5645_write_cmos_sensor(client,0x580d,0x03); ov5645_write_cmos_sensor(client,0x580e,0x00); ov5645_write_cmos_sensor(client,0x580f,0x00); ov5645_write_cmos_sensor(client,0x5810,0x03); ov5645_write_cmos_sensor(client,0x5811,0x08); ov5645_write_cmos_sensor(client,0x5812,0x0a); ov5645_write_cmos_sensor(client,0x5813,0x03); ov5645_write_cmos_sensor(client,0x5814,0x00); ov5645_write_cmos_sensor(client,0x5815,0x00); ov5645_write_cmos_sensor(client,0x5816,0x04); ov5645_write_cmos_sensor(client,0x5817,0x09); ov5645_write_cmos_sensor(client,0x5818,0x0f); ov5645_write_cmos_sensor(client,0x5819,0x08); ov5645_write_cmos_sensor(client,0x581a,0x06); ov5645_write_cmos_sensor(client,0x581b,0x06); ov5645_write_cmos_sensor(client,0x581c,0x08); ov5645_write_cmos_sensor(client,0x581d,0x0c); ov5645_write_cmos_sensor(client,0x581e,0x3f); ov5645_write_cmos_sensor(client,0x581f,0x1e); ov5645_write_cmos_sensor(client,0x5820,0x12); ov5645_write_cmos_sensor(client,0x5821,0x13); ov5645_write_cmos_sensor(client,0x5822,0x21); ov5645_write_cmos_sensor(client,0x5823,0x3f); ov5645_write_cmos_sensor(client,0x5824,0x68); ov5645_write_cmos_sensor(client,0x5825,0x28); ov5645_write_cmos_sensor(client,0x5826,0x2c); ov5645_write_cmos_sensor(client,0x5827,0x28); ov5645_write_cmos_sensor(client,0x5828,0x08); ov5645_write_cmos_sensor(client,0x5829,0x48); ov5645_write_cmos_sensor(client,0x582a,0x64); ov5645_write_cmos_sensor(client,0x582b,0x62); ov5645_write_cmos_sensor(client,0x582c,0x64); ov5645_write_cmos_sensor(client,0x582d,0x28); ov5645_write_cmos_sensor(client,0x582e,0x46); ov5645_write_cmos_sensor(client,0x582f,0x62); ov5645_write_cmos_sensor(client,0x5830,0x60); ov5645_write_cmos_sensor(client,0x5831,0x62); ov5645_write_cmos_sensor(client,0x5832,0x26); ov5645_write_cmos_sensor(client,0x5833,0x48); ov5645_write_cmos_sensor(client,0x5834,0x66); ov5645_write_cmos_sensor(client,0x5835,0x44); ov5645_write_cmos_sensor(client,0x5836,0x64); ov5645_write_cmos_sensor(client,0x5837,0x28); ov5645_write_cmos_sensor(client,0x5838,0x66); ov5645_write_cmos_sensor(client,0x5839,0x48); ov5645_write_cmos_sensor(client,0x583a,0x2c); ov5645_write_cmos_sensor(client,0x583b,0x28); ov5645_write_cmos_sensor(client,0x583c,0x26); ov5645_write_cmos_sensor(client,0x583d,0xae); ov5645_write_cmos_sensor(client,0x5025,0x00); ov5645_write_cmos_sensor(client,0x3a0f,0x38); ov5645_write_cmos_sensor(client,0x3a10,0x30); ov5645_write_cmos_sensor(client,0x3a11,0x70); ov5645_write_cmos_sensor(client,0x3a1b,0x38); ov5645_write_cmos_sensor(client,0x3a1e,0x30); ov5645_write_cmos_sensor(client,0x3a1f,0x18); ov5645_write_cmos_sensor(client,0x3008,0x02); } static void ov5645_stream_on(struct i2c_client *client) { //msleep(150); //ov5645_write_cmos_sensor(client,0xfe,0x03); //ov5645_write_cmos_sensor(client,0x10,0x94); //ov5645_write_cmos_sensor(client,0xfe,0x00); //msleep(50); } static unsigned short ov5645_read_shutter(struct i2c_client *client) { /* prize modified by chenjiaxi, ov5645 read shutter, 20190305-start */ #if 0 unsigned char temp_reg1,temp_reg2,temp_reg3; unsigned short shutter; //0x3a63 0x3a64 gain //0x3500 0x3501 0x3502 aec not good temp_reg1 = ov5645_read_cmos_sensor(client,0x3b01); temp_reg2 = ov5645_read_cmos_sensor(client,0x3b04); //temp_reg2 &= 0x01; temp_reg3 = ov5645_read_cmos_sensor(client,0x3b05); shutter = (temp_reg1 << 16)|(temp_reg2<<8)|temp_reg3; //shutter = shutter >>4; #else unsigned char temp_reg; unsigned short shutter; temp_reg = ov5645_read_cmos_sensor(client,0x3507); shutter = temp_reg; #endif /* prize modified by chenjiaxi, ov5645 read shutter, 20190305-end */ //CAMERA_DBG("OV5645MIPI_Read_Shutter %d\r\n",shutter); return shutter; } static unsigned int ov5645_get_sensor_id(struct i2c_client *client,unsigned int *sensorID) { // check if sensor ID correct *sensorID=((ov5645_read_cmos_sensor(client,0x300A)<< 8)|ov5645_read_cmos_sensor(client,0x300B)); CAMERA_DBG("OV5645 Read ID %x",*sensorID); return 0; } static int ov5645_set_power(struct i2c_client *client,unsigned int enable) { struct spc_data_t *spc_data = i2c_get_clientdata(client); int ret = 0; if (enable){ gpio_direction_output(spc_data->pdn_pin,0); mdelay(4); gpio_direction_output(spc_data->pdn_pin,1); }else{ gpio_direction_output(spc_data->pdn_pin,0); //gpio_direction_output(spc_data->rst_pin,0); } return ret; } static int ov5645_open(struct i2c_client *client) { unsigned char i; unsigned short sensor_id=0; int id_status = 0; int ret,addr = 0; CAMERA_DBG(" Entry Open!!!"); // Read sensor ID to adjust I2C is OK? addr = client->addr; for(i=0;i<128;i++){ client->addr = i; ret = i2c_smbus_read_byte_data(client,0x30); CAMERA_DBG("i(%d) ret(%d)\n",i,ret); } client->addr = addr; for(i=0;i<3;i++) { sensor_id = ((ov5645_read_cmos_sensor(client,0x300A) << 8) | ov5645_read_cmos_sensor(client,0x300B)); CAMERA_DBG("*sensorID=%x %s",sensor_id,__func__); if(sensor_id != OV5645_SENSOR_ID) { CAMERA_DBG("Read Sensor ID Fail[open] = 0x%x\n", sensor_id); return -EINVAL; }else{ id_status = 1; break; } } if (!id_status){ return -EINVAL; } CAMERA_DBG("OV5645mipi_ Sensor Read ID OK \r\n"); ov5645_sensor_init(client); return 0; } const struct sensor_info_t ov5645_info = { .sensor_type = SENSOR_TYPE_5645, .sensor_id = OV5645_SENSOR_ID, .open = ov5645_open, .init = ov5645_sensor_init, .stream_on = ov5645_stream_on, .get_shutter = ov5645_read_shutter, .get_sensor_id = ov5645_get_sensor_id, .set_power = ov5645_set_power, };