/* * ov10823.c - ov10823 sensor driver * * Copyright (c) 2016-2017, NVIDIA CORPORATION, All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #ifndef __OV10823_I2C_TABLES__ #define __OV10823_I2C_TABLES__ #define OV10823_TABLE_WAIT_MS 0 #define OV10823_TABLE_END 1 #define OV10823_MAX_RETRIES 3 #define OV10823_WAIT_MS 3 #define OV10823_ADJUST_HS_PREPARE 1 #define ov10823_reg struct reg_8 static ov10823_reg ov10823_start[] = { {0x0100, 0x01}, {OV10823_TABLE_WAIT_MS, 66}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg ov10823_stop[] = { {0x0100, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg fsync_master[] = { {0x3002, 0x88}, {0x3009, 0x06}, {0x3823, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg fsync_slave[] = { {0x3002, 0x80}, {0x3009, 0x02}, {0x3823, 0x30}, {0x3824, 0x00}, /* CS reset value on fsin */ {0x3825, 0x08}, {OV10823_TABLE_END, 0x00} }; #ifdef OV10823_UNUSED_MODES static ov10823_reg mode_4336x2440_24MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x05}, {0x308d, 0xae}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE /* Bit[7] is hs_preparei_sel */ {0x4800, 0x20}, {0x4831, 0x6a}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a01, 0x08}, {0x5a03, 0x06}, {0x5a04, 0x10}, {0x5a05, 0xf0}, {0x5a06, 0x09}, {0x5a07, 0x88}, {0x5a08, 0x01}, {0x5a04, 0x00}, {0x5a06, 0x00}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x6c}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x01}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x31}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x98}, {0x3808, 0x10}, {0x3809, 0xf0}, {0x380a, 0x09}, {0x380b, 0x88}, {0x380c, 0x15}, {0x380d, 0x86}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x00}, {0x3811, 0x08}, {0x3813, 0x04}, {0x3815, 0x11}, {0x3820, 0x00}, {0x3821, 0x00}, {0x3834, 0x00}, {0x4001, 0x00}, {0x4003, 0x30}, {0x402a, 0x0c}, {0x402b, 0x08}, {0x402e, 0x1c}, {0x4837, 0x11}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_4336x2440_24MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_3000x2440_24MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x05}, {0x308d, 0xae}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE /* Bit[7] is hs_preparei_sel */ {0x4802, 0x80}, {0x4826, 0x10}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a00, 0x02}, {0x5a01, 0xf6}, {0x5a03, 0x06}, {0x5a04, 0x0b}, {0x5a05, 0xb8}, {0x5a06, 0x09}, {0x5a07, 0x88}, {0x5a08, 0x01}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x6c}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x01}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x31}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x98}, {0x3808, 0x0b}, {0x3809, 0xb8}, {0x380a, 0x09}, {0x380b, 0x88}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x02}, {0x3811, 0xf6}, {0x3813, 0x04}, {0x3815, 0x11}, {0x3820, 0x00}, {0x3821, 0x00}, {0x3834, 0x00}, {0x4001, 0x00}, {0x4003, 0x30}, {0x402a, 0x0c}, {0x402b, 0x08}, {0x402e, 0x1c}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_3000x2440_24MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_2168x1220_24MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x05}, {0x308d, 0xae}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE /* Bit[7] is hs_preparei_sel */ {0x4802, 0x80}, {0x4826, 0x10}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a04, 0x00}, {0x5a06, 0x00}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x6c}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x11}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x33}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x00}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x97}, {0x3808, 0x08}, {0x3809, 0x78}, {0x380a, 0x04}, {0x380b, 0xc4}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x00}, {0x3811, 0x04}, {0x3813, 0x02}, {0x3815, 0x31}, {0x3820, 0x02}, {0x3821, 0x00}, {0x3834, 0x01}, {0x4001, 0x00}, {0x4003, 0x1c}, {0x402a, 0x0a}, {0x402b, 0x06}, {0x402e, 0x14}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_2168x1220_24MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_4336x2440_26MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x06}, {0x308d, 0xf1}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE {0x4800, 0x20}, {0x4831, 0x6a}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a01, 0x08}, {0x5a03, 0x06}, {0x5a04, 0x10}, {0x5a05, 0xf0}, {0x5a06, 0x09}, {0x5a07, 0x88}, {0x5a08, 0x01}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x69}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x01}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x31}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x98}, {0x3808, 0x10}, {0x3809, 0xf0}, {0x380a, 0x09}, {0x380b, 0x88}, {0x380c, 0x15}, {0x380d, 0x86}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x00}, {0x3811, 0x08}, {0x3813, 0x04}, {0x3815, 0x11}, {0x3820, 0x00}, {0x3821, 0x00}, {0x3834, 0x00}, {0x4001, 0x00}, {0x4003, 0x30}, {0x402a, 0x0c}, {0x402b, 0x08}, {0x402e, 0x1c}, {0x4837, 0x11}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_4336x2440_26MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_3000x2440_26MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x06}, {0x308d, 0xf1}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE {0x4800, 0x20}, {0x4831, 0x6a}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a00, 0x02}, {0x5a01, 0xf6}, {0x5a03, 0x06}, {0x5a04, 0x0b}, {0x5a05, 0xb8}, {0x5a06, 0x09}, {0x5a07, 0x88}, {0x5a08, 0x01}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x64}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x01}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x31}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x98}, {0x3808, 0x0b}, {0x3809, 0xb8}, {0x380a, 0x09}, {0x380b, 0x88}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x02}, {0x3811, 0xf6}, {0x3813, 0x04}, {0x3815, 0x11}, {0x3820, 0x00}, {0x3821, 0x00}, {0x3834, 0x00}, {0x4001, 0x00}, {0x4003, 0x30}, {0x402a, 0x0c}, {0x402b, 0x08}, {0x402e, 0x1c}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_3000x2440_26MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_2168x1220_26MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x06}, {0x308d, 0xf1}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xa0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x80}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE /* Bit[7] is hs_preparei_sel */ {0x4802, 0x80}, {0x4826, 0x10}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5002, 0x08}, {0x5a04, 0x00}, {0x5a06, 0x00}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x64}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x11}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x33}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x00}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x97}, {0x3808, 0x08}, {0x3809, 0x78}, {0x380a, 0x04}, {0x380b, 0xc4}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x09}, {0x380f, 0xe0}, {0x3810, 0x00}, {0x3811, 0x04}, {0x3813, 0x02}, {0x3815, 0x31}, {0x3820, 0x02}, {0x3821, 0x00}, {0x3834, 0x01}, {0x4001, 0x00}, {0x4003, 0x1c}, {0x402a, 0x0a}, {0x402b, 0x06}, {0x402e, 0x14}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x9c}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_2168x1220_26MhzMCLK_fsync_slave[] = { {0x3826, 0x09}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xdc}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_4336x1220_60fps_26MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x06}, {0x308d, 0xf1}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xf0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x00}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE {0x4802, 0x80}, {0x4826, 0x10}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5001, 0x03}, {0x5002, 0x08}, {0x5a04, 0x00}, {0x5a06, 0x00}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x64}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x01}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x33}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x97}, {0x3808, 0x10}, {0x3809, 0xf0}, {0x380a, 0x04}, {0x380b, 0xc4}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x04}, {0x380f, 0xf0}, {0x3810, 0x00}, {0x3811, 0x08}, {0x3813, 0x02}, {0x3815, 0x31}, {0x3820, 0x02}, {0x3821, 0x00}, {0x3834, 0x00}, {0x4001, 0x00}, {0x4003, 0x1c}, {0x402a, 0x0a}, {0x402b, 0x06}, {0x402e, 0x14}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x4d}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_4336x1220_60fps_26MhzMCLK_fsync_slave[] = { {0x3826, 0x04}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xec}, {OV10823_TABLE_END, 0x00} }; #endif /* OV10823_UNUSED_MODES */ static ov10823_reg mode_2168x1220_60fps_26MhzMCLK[] = { /* PLL */ {0x3080, 0x04}, {0x3083, 0x00}, {0x3084, 0x03}, {0x308b, 0x06}, {0x308d, 0xf1}, {0x308e, 0x00}, {0x308f, 0x09}, {0x3011, 0xd0}, {0x3012, 0x41}, {0x3031, 0x0c}, {0x3032, 0xc0}, {0x3503, 0x07}, {0x3603, 0x04}, {0x3641, 0x83}, {0x3643, 0x02}, {0x3645, 0x41}, {0x3646, 0x83}, {0x3648, 0x0d}, {0x3649, 0x86}, {0x3653, 0x37}, {0x3658, 0x8b}, {0x3659, 0x87}, {0x365c, 0x5a}, {0x3660, 0x82}, {0x3705, 0x22}, {0x3719, 0x0c}, {0x371b, 0x00}, {0x371c, 0x80}, {0x371e, 0x00}, {0x371f, 0x20}, {0x3720, 0xf0}, {0x3721, 0xf0}, {0x3723, 0x78}, {0x372a, 0x08}, {0x372c, 0x11}, {0x373c, 0x02}, {0x3749, 0xd7}, {0x374a, 0x8c}, {0x3752, 0x80}, {0x382e, 0x04}, {0x3901, 0x00}, {0x3902, 0xc6}, {0x4004, 0x00}, {0x4005, 0x20}, {0x400d, 0x10}, {0x401b, 0x00}, {0x401d, 0x00}, {0x401f, 0x00}, {0x4020, 0x01}, {0x4022, 0x03}, {0x4024, 0x0e}, {0x4025, 0x10}, {0x4026, 0x0f}, {0x4027, 0x9f}, {0x4028, 0x00}, {0x4029, 0x04}, {0x402d, 0x04}, {0x402f, 0x08}, {0x4602, 0x02}, #if OV10823_ADJUST_HS_PREPARE /* Bit[7] is hs_preparei_sel */ {0x4802, 0x80}, {0x4826, 0x10}, #endif {0x4810, 0x00}, {0x4811, 0x1f}, {0x4819, 0xa0}, {0x481b, 0x35}, {0x481f, 0x30}, {0x4823, 0x35}, {0x4d00, 0x04}, {0x4d01, 0x71}, {0x4d03, 0xf5}, {0x4d04, 0x0c}, {0x4d05, 0xcc}, {0x4d0b, 0x01}, {0x5001, 0x03}, {0x5002, 0x08}, {0x5a04, 0x00}, {0x5a06, 0x00}, {0x5b01, 0x10}, {0x5b05, 0xec}, {0x5b09, 0x02}, {0x5e10, 0x0c}, {0x3082, 0x64}, {0x3092, 0x04}, {0x300d, 0x22}, {0x301b, 0xb4}, {0x3033, 0x5c}, {0x3034, 0x91}, {0x3035, 0x6e}, {0x3036, 0xa4}, {0x3037, 0x6e}, {0x3038, 0xa4}, {0x3642, 0x35}, {0x3663, 0x11}, {0x3700, 0x44}, {0x3701, 0x1c}, {0x3702, 0x90}, {0x3703, 0x60}, {0x3704, 0x20}, {0x3706, 0x18}, {0x3707, 0x5d}, {0x3708, 0x74}, {0x3709, 0x40}, {0x370a, 0x33}, {0x370b, 0x33}, {0x370c, 0x8a}, {0x370d, 0x03}, {0x370e, 0x28}, {0x370f, 0x3b}, {0x3710, 0x21}, {0x3711, 0x15}, {0x3712, 0x19}, {0x3714, 0x42}, {0x3730, 0x01}, {0x3731, 0x6e}, {0x3732, 0x01}, {0x3733, 0x03}, {0x3738, 0x02}, {0x3739, 0x19}, {0x373a, 0x01}, {0x373b, 0xe6}, {0x373d, 0xa3}, {0x373e, 0x02}, {0x373f, 0x70}, {0x3740, 0x03}, {0x3741, 0x33}, {0x3742, 0x02}, {0x3743, 0xf8}, {0x3748, 0xa5}, {0x374c, 0x88}, {0x3802, 0x00}, {0x3803, 0x08}, {0x3806, 0x09}, {0x3807, 0x97}, {0x3808, 0x08}, {0x3809, 0x78}, {0x380a, 0x04}, {0x380b, 0xc4}, {0x380c, 0x15}, {0x380d, 0x80}, {0x380e, 0x04}, {0x380f, 0xf0}, {0x3810, 0x00}, {0x3811, 0x04}, {0x3813, 0x02}, {0x3815, 0x31}, {0x3820, 0x02}, {0x3821, 0x00}, {0x3834, 0x01}, {0x4001, 0x00}, {0x4003, 0x1c}, {0x402a, 0x0a}, {0x402b, 0x06}, {0x402e, 0x14}, {0x4837, 0x12}, {0x5b04, 0x02}, /* Exposure/Gain */ {0x3500, 0x00}, {0x3501, 0x4d}, {0x3502, 0x00}, {0x350b, 0x40}, /* fsync */ {0x3002, 0x80}, {0x3009, 0x06}, {0x3823, 0x00}, {0x3826, 0x00}, {0x3827, 0x00}, {0x3830, 0x00}, {0x3831, 0x00}, {OV10823_TABLE_END, 0x00} }; static ov10823_reg mode_2168x1220_60fps_26MhzMCLK_fsync_slave[] = { {0x3826, 0x04}, /* R reset value on fsin. VTS - 4 */ {0x3827, 0xec}, {OV10823_TABLE_END, 0x00} }; enum { #ifdef OV10823_UNUSED_MODES OV10823_MODE_4336X2440, OV10823_MODE_3000X2440, OV10823_MODE_2168X1220, #endif OV10823_MODE_2168X1220_60FPS, OV10823_MODE_START_STREAM, OV10823_MODE_STOP_STREAM, }; static ov10823_reg *mode_table[] = { #ifdef OV10823_UNUSED_MODES [OV10823_MODE_4336X2440] = mode_4336x2440_26MhzMCLK, [OV10823_MODE_3000X2440] = mode_3000x2440_26MhzMCLK, [OV10823_MODE_2168X1220] = mode_2168x1220_26MhzMCLK, #endif [OV10823_MODE_2168X1220_60FPS] = mode_2168x1220_60fps_26MhzMCLK, [OV10823_MODE_START_STREAM] = ov10823_start, [OV10823_MODE_STOP_STREAM] = ov10823_stop, }; static ov10823_reg *fsync_slave_mode_table[] = { #ifdef OV10823_UNUSED_MODES [OV10823_MODE_4336X2440] = mode_4336x2440_26MhzMCLK_fsync_slave, [OV10823_MODE_3000X2440] = mode_3000x2440_26MhzMCLK_fsync_slave, [OV10823_MODE_2168X1220] = mode_2168x1220_26MhzMCLK_fsync_slave, #endif [OV10823_MODE_2168X1220_60FPS] = mode_2168x1220_60fps_26MhzMCLK_fsync_slave, }; enum { OV10823_FSYNC_NONE, OV10823_FSYNC_MASTER, OV10823_FSYNC_SLAVE, }; static ov10823_reg *fsync_table[] = { [OV10823_FSYNC_NONE] = NULL, [OV10823_FSYNC_MASTER] = fsync_master, [OV10823_FSYNC_SLAVE] = fsync_slave, }; static const int ov10823_30fps[] = { 30, }; static const int ov10823_60fps[] = { 60, }; static const struct camera_common_frmfmt ov10823_frmfmt[] = { #ifdef OV10823_UNUSED_MODES {{4336, 2440}, ov10823_30fps, 1, 0, OV10823_MODE_4336X2440}, {{3000, 2440}, ov10823_30fps, 1, 0, OV10823_MODE_3000X2440}, {{2168, 1220}, ov10823_30fps, 1, 0, OV10823_MODE_2168X1220}, #endif {{2168, 1220}, ov10823_60fps, 1, 0, OV10823_MODE_2168X1220_60FPS}, }; #endif /* __OV10823_I2C_TABLES__ */