1be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin/* Subdriver for the GL860 chip with the OV2640 sensor 2be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin * Author Olivier LORIN, from Malmostoso's logs 34f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * 44f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * This program is free software; you can redistribute it and/or modify 54f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * it under the terms of the GNU General Public License as published by 64f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * the Free Software Foundation; either version 2 of the License, or 74f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * any later version. 84f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * 94f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * This program is distributed in the hope that it will be useful, 104f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * but WITHOUT ANY WARRANTY; without even the implied warranty of 114f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 124f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * GNU General Public License for more details. 134f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * 144f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * You should have received a copy of the GNU General Public License 154f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin * along with this program. If not, see <http://www.gnu.org/licenses/>. 164f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin */ 174f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 184f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin/* Sensor : OV2640 */ 194f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 204f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin#include "gl860.h" 214f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 224f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_init1[] = "\x00\x41\x07\x6a\x06\x61\x0d\x6a" "\x10\x10\xc1\x01"; 23fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin 24fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorinstatic u8 c61[] = {0x61}; /* expected */ 25fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorinstatic u8 c51[] = {0x51}; /* expected */ 26fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorinstatic u8 c50[] = {0x50}; /* expected */ 27fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorinstatic u8 c28[] = {0x28}; /* expected */ 28fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorinstatic u8 ca8[] = {0xa8}; /* expected */ 294f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 304f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_post[] = 314f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin "\x00\x41\x07\x6a\x06\xef\x0d\x6a" "\x10\x10\xc1\x01"; 324f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 334f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_640[] = "\xd0\x01\xd1\x08\xd2\xe0\xd3\x02\xd4\x10\xd5\x81"; 344f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_800[] = "\xd0\x01\xd1\x10\xd2\x58\xd3\x02\xd4\x18\xd5\x21"; 354f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_1280[] = "\xd0\x01\xd1\x18\xd2\xc0\xd3\x02\xd4\x28\xd5\x01"; 364f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic u8 dat_1600[] = "\xd0\x01\xd1\x20\xd2\xb0\xd3\x02\xd4\x30\xd5\x41"; 374f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 384f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic struct validx tbl_init_at_startup[] = { 394f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0000, 0x0000}, {0x0010, 0x0010}, {0x0008, 0x00c0}, {0x0001, 0x00c1}, 404f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0001, 0x00c2}, {0x0020, 0x0006}, {0x006a, 0x000d}, 414f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0050, 0x0000}, {0x0041, 0x0000}, {0x006a, 0x0007}, {0x0061, 0x0006}, 424f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x006a, 0x000d}, {0x0000, 0x00c0}, {0x0010, 0x0010}, {0x0001, 0x00c1}, 434f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0041, 0x00c2}, {0x0004, 0x00d8}, {0x0012, 0x0004}, {0x0000, 0x0058}, 444f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0041, 0x0000}, {0x0061, 0x0000}, 454f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 464f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 474f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic struct validx tbl_common[] = { 484f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00ff}, {0x60ff, 0x002c}, {0x60df, 0x002e}, {0x6001, 0x00ff}, 494f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6080, 0x0012}, {0x6000, 0x0000}, {0x6000, 0x0045}, {0x6000, 0x0010}, 504f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6035, 0x003c}, {0x6000, 0x0011}, {0x6028, 0x0004}, {0x60e5, 0x0013}, 514f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6088, 0x0014}, {0x600c, 0x002c}, {0x6078, 0x0033}, {0x60f7, 0x003b}, 524f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x003e}, {0x6011, 0x0043}, {0x6010, 0x0016}, {0x6082, 0x0039}, 534f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6088, 0x0035}, {0x600a, 0x0022}, {0x6040, 0x0037}, {0x6000, 0x0023}, 544f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60a0, 0x0034}, {0x601a, 0x0036}, {0x6002, 0x0006}, {0x60c0, 0x0007}, 554f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60b7, 0x000d}, {0x6001, 0x000e}, {0x6000, 0x004c}, {0x6081, 0x004a}, 564f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6099, 0x0021}, {0x6002, 0x0009}, {0x603e, 0x0024}, {0x6034, 0x0025}, 574f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6081, 0x0026}, {0x6000, 0x0000}, {0x6000, 0x0045}, {0x6000, 0x0010}, 584f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x005c}, {0x6000, 0x0063}, {0x6000, 0x007c}, {0x6070, 0x0061}, 594f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6080, 0x0062}, {0x6080, 0x0020}, {0x6030, 0x0028}, {0x6000, 0x006c}, 604f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x006e}, {0x6002, 0x0070}, {0x6094, 0x0071}, {0x60c1, 0x0073}, 614f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6034, 0x003d}, {0x6057, 0x005a}, {0x60bb, 0x004f}, {0x609c, 0x0050}, 624f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6080, 0x006d}, {0x6002, 0x0039}, {0x6033, 0x003a}, {0x60f1, 0x003b}, 634f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6031, 0x003c}, {0x6000, 0x00ff}, {0x6014, 0x00e0}, {0x60ff, 0x0076}, 644f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60a0, 0x0033}, {0x6020, 0x0042}, {0x6018, 0x0043}, {0x6000, 0x004c}, 654f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60d0, 0x0087}, {0x600f, 0x0088}, {0x6003, 0x00d7}, {0x6010, 0x00d9}, 664f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6005, 0x00da}, {0x6082, 0x00d3}, {0x60c0, 0x00f9}, {0x6006, 0x0044}, 674f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6007, 0x00d1}, {0x6002, 0x00d2}, {0x6000, 0x00d2}, {0x6011, 0x00d8}, 684f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6008, 0x00c8}, {0x6080, 0x00c9}, {0x6008, 0x007c}, {0x6020, 0x007d}, 694f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6020, 0x007d}, {0x6000, 0x0090}, {0x600e, 0x0091}, {0x601a, 0x0091}, 704f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6031, 0x0091}, {0x605a, 0x0091}, {0x6069, 0x0091}, {0x6075, 0x0091}, 714f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x607e, 0x0091}, {0x6088, 0x0091}, {0x608f, 0x0091}, {0x6096, 0x0091}, 724f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60a3, 0x0091}, {0x60af, 0x0091}, {0x60c4, 0x0091}, {0x60d7, 0x0091}, 734f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60e8, 0x0091}, {0x6020, 0x0091}, {0x6000, 0x0092}, {0x6006, 0x0093}, 744f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60e3, 0x0093}, {0x6005, 0x0093}, {0x6005, 0x0093}, {0x6000, 0x0093}, 754f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6004, 0x0093}, {0x6000, 0x0093}, {0x6000, 0x0093}, {0x6000, 0x0093}, 764f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0093}, {0x6000, 0x0093}, {0x6000, 0x0093}, {0x6000, 0x0093}, 774f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0096}, {0x6008, 0x0097}, {0x6019, 0x0097}, {0x6002, 0x0097}, 784f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x600c, 0x0097}, {0x6024, 0x0097}, {0x6030, 0x0097}, {0x6028, 0x0097}, 794f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6026, 0x0097}, {0x6002, 0x0097}, {0x6098, 0x0097}, {0x6080, 0x0097}, 804f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0097}, {0x6000, 0x0097}, {0x60ed, 0x00c3}, {0x609a, 0x00c4}, 814f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00a4}, {0x6011, 0x00c5}, {0x6051, 0x00c6}, {0x6010, 0x00c7}, 824f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6066, 0x00b6}, {0x60a5, 0x00b8}, {0x6064, 0x00b7}, {0x607c, 0x00b9}, 834f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60af, 0x00b3}, {0x6097, 0x00b4}, {0x60ff, 0x00b5}, {0x60c5, 0x00b0}, 844f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6094, 0x00b1}, {0x600f, 0x00b2}, {0x605c, 0x00c4}, {0x6000, 0x00a8}, 854f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60c8, 0x00c0}, {0x6096, 0x00c1}, {0x601d, 0x0086}, {0x6000, 0x0050}, 864f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6090, 0x0051}, {0x6018, 0x0052}, {0x6000, 0x0053}, {0x6000, 0x0054}, 874f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6088, 0x0055}, {0x6000, 0x0057}, {0x6090, 0x005a}, {0x6018, 0x005b}, 884f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6005, 0x005c}, {0x60ed, 0x00c3}, {0x6000, 0x007f}, {0x6005, 0x00da}, 894f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x601f, 0x00e5}, {0x6067, 0x00e1}, {0x6000, 0x00e0}, {0x60ff, 0x00dd}, 904f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0005}, {0x6001, 0x00ff}, {0x6000, 0x0000}, {0x6000, 0x0045}, 914f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0010}, 924f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 934f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 94be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorinstatic struct validx tbl_sensor_settings_common1[] = { 954f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0041, 0x0000}, {0x006a, 0x0007}, {0x00ef, 0x0006}, {0x006a, 0x000d}, 964f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0000, 0x00c0}, {0x0010, 0x0010}, {0x0001, 0x00c1}, {0x0041, 0x00c2}, 974f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0004, 0x00d8}, {0x0012, 0x0004}, {0x0000, 0x0058}, {0x0041, 0x0000}, 984f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {50, 0xffff}, 994f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0061, 0x0000}, 1004f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0xffff, 0xffff}, 1014f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00ff}, {0x6000, 0x007c}, {0x6007, 0x007d}, 1024f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {30, 0xffff}, 1034f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0040, 0x0000}, 1044f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1054f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 106be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorinstatic struct validx tbl_sensor_settings_common2[] = { 1074f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6038, 0x000c}, 1084f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {10, 0xffff}, 1094f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0011}, 1104f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1114f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1124f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic struct validx tbl_640[] = { 1134f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, {0x6067, 0x00e1}, 1144f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6004, 0x00da}, {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, 1154f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6000, 0x0012}, {0x6000, 0x0011}, {0x6011, 0x0017}, 1164f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6075, 0x0018}, {0x6001, 0x0019}, {0x6097, 0x001a}, {0x6036, 0x0032}, 1174f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60bb, 0x004f}, {0x6057, 0x005a}, {0x609c, 0x0050}, {0x6080, 0x006d}, 1184f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6092, 0x0026}, {0x60ff, 0x0020}, {0x6000, 0x0027}, {0x6000, 0x00ff}, 1194f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60c8, 0x00c0}, {0x6096, 0x00c1}, {0x6000, 0x008c}, {0x603d, 0x0086}, 1204f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6089, 0x0050}, {0x6090, 0x0051}, {0x602c, 0x0052}, {0x6000, 0x0053}, 1214f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0054}, {0x6088, 0x0055}, {0x6000, 0x0057}, {0x60a0, 0x005a}, 1224f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6078, 0x005b}, {0x6000, 0x005c}, {0x6004, 0x00d3}, {0x6000, 0x00e0}, 1234f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60ff, 0x00dd}, {0x60a1, 0x005a}, 1244f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1254f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1264f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic struct validx tbl_800[] = { 1274f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, {0x6067, 0x00e1}, 1284f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6004, 0x00da}, {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, 1294f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6040, 0x0012}, {0x6000, 0x0011}, {0x6011, 0x0017}, 1304f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6043, 0x0018}, {0x6000, 0x0019}, {0x604b, 0x001a}, {0x6009, 0x0032}, 1314f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60ca, 0x004f}, {0x60a8, 0x0050}, {0x6000, 0x006d}, {0x6038, 0x003d}, 1324f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60c8, 0x0035}, {0x6000, 0x0022}, {0x6092, 0x0026}, {0x60ff, 0x0020}, 1334f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0027}, {0x6000, 0x00ff}, {0x6064, 0x00c0}, {0x604b, 0x00c1}, 1344f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x008c}, {0x601d, 0x0086}, {0x6082, 0x00d3}, {0x6000, 0x00e0}, 1354f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60ff, 0x00dd}, {0x6020, 0x008c}, {0x6001, 0x00ff}, {0x6044, 0x0018}, 1364f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1374f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 138be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorinstatic struct validx tbl_big1[] = { 1394f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0002, 0x00c1}, {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, 1404f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6000, 0x0012}, {0x6000, 0x0000}, {0x6000, 0x0045}, 1414f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0010}, {0x6000, 0x0011}, {0x6011, 0x0017}, {0x6075, 0x0018}, 1424f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x0019}, {0x6097, 0x001a}, {0x6036, 0x0032}, {0x60bb, 0x004f}, 1434f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x609c, 0x0050}, {0x6057, 0x005a}, {0x6080, 0x006d}, {0x6043, 0x000f}, 1444f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x608f, 0x0003}, {0x6005, 0x007c}, {0x6081, 0x0026}, {0x6000, 0x00ff}, 1454f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x60c8, 0x00c0}, {0x6096, 0x00c1}, {0x6000, 0x008c}, 1464f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1474f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 148be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorinstatic struct validx tbl_big2[] = { 1494f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x603d, 0x0086}, {0x6000, 0x0050}, {0x6090, 0x0051}, {0x602c, 0x0052}, 1504f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0053}, {0x6000, 0x0054}, {0x6088, 0x0055}, {0x6000, 0x0057}, 1514f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6040, 0x005a}, {0x60f0, 0x005b}, {0x6001, 0x005c}, {0x6082, 0x00d3}, 1524f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x008e}, 1534f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1544f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 155be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorinstatic struct validx tbl_big3[] = { 1564f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6004, 0x00da}, {0x6000, 0x00e0}, {0x6067, 0x00e1}, {0x60ff, 0x00dd}, 1574f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6000, 0x00ff}, {0x60f1, 0x00dd}, {0x6004, 0x00e0}, 1584f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6001, 0x00ff}, {0x6000, 0x0011}, {0x6000, 0x00ff}, {0x6010, 0x00c7}, 1594f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0092}, {0x6006, 0x0093}, {0x60e3, 0x0093}, {0x6005, 0x0093}, 1604f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6005, 0x0093}, {0x60ed, 0x00c3}, {0x6000, 0x00a4}, {0x60d0, 0x0087}, 1614f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6003, 0x0096}, {0x600c, 0x0097}, {0x6024, 0x0097}, {0x6030, 0x0097}, 1624f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6028, 0x0097}, {0x6026, 0x0097}, {0x6002, 0x0097}, {0x6001, 0x00ff}, 1634f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6043, 0x000f}, {0x608f, 0x0003}, {0x6000, 0x002d}, {0x6000, 0x002e}, 1644f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x600a, 0x0022}, {0x6002, 0x0070}, {0x6008, 0x0014}, {0x6048, 0x0014}, 1654f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x00ff}, {0x6000, 0x00e0}, {0x60ff, 0x00dd}, 1664f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1674f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1684f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic struct validx tbl_post_unset_alt[] = { 1694f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x006a, 0x000d}, {0x6001, 0x00ff}, {0x6081, 0x0026}, {0x6000, 0x0000}, 1704f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x6000, 0x0045}, {0x6000, 0x0010}, {0x6068, 0x000d}, 1714f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {50, 0xffff}, 1724f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin {0x0021, 0x0000}, 1734f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin}; 1744f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1754f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_at_startup(struct gspca_dev *gspca_dev); 1764f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_configure_alt(struct gspca_dev *gspca_dev); 1774f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_pre_alt(struct gspca_dev *gspca_dev); 1784f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_post_alt(struct gspca_dev *gspca_dev); 1794f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic void ov2640_post_unset_alt(struct gspca_dev *gspca_dev); 1804f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_camera_settings(struct gspca_dev *gspca_dev); 1814f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin/*==========================================================================*/ 1824f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1834f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinvoid ov2640_init_settings(struct gspca_dev *gspca_dev) 1844f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 1854f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin struct sd *sd = (struct sd *) gspca_dev; 1864f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1874f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.backlight = 32; 1884f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.brightness = 0; 1894f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.sharpness = 6; 1904f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.contrast = 0; 1914f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.gamma = 32; 1924f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.hue = 0; 1934f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.saturation = 128; 1944f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vcur.whitebal = 64; 195fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vcur.mirror = 0; 196fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vcur.flip = 0; 1974f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 1984f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.backlight = 64; 1994f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.brightness = 255; 2004f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.sharpness = 31; 2014f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.contrast = 255; 2024f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.gamma = 64; 203fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vmax.hue = 254 + 2; 2044f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.saturation = 255; 2054f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.whitebal = 128; 206fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vmax.mirror = 1; 207fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vmax.flip = 1; 2084f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vmax.AC50Hz = 0; 2094f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2104f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->dev_camera_settings = ov2640_camera_settings; 2114f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->dev_init_at_startup = ov2640_init_at_startup; 2124f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->dev_configure_alt = ov2640_configure_alt; 2134f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->dev_init_pre_alt = ov2640_init_pre_alt; 2144f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->dev_post_unset_alt = ov2640_post_unset_alt; 2154f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 2164f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2174f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin/*==========================================================================*/ 2184f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2194f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic void common(struct gspca_dev *gspca_dev) 2204f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 2214f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin fetch_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common)); 2224f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 2234f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2244f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_at_startup(struct gspca_dev *gspca_dev) 2254f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 2264f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin fetch_validx(gspca_dev, tbl_init_at_startup, 2274f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ARRAY_SIZE(tbl_init_at_startup)); 2284f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2294f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_init1); 2304f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2314f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin common(gspca_dev); 2324f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 233fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0006, 1, c61); 2344f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2354f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x00ef, 0x0006, 0, NULL); 2364f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 237fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, c51); 2384f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2394f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x0051, 0x0000, 0, NULL); 2404f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin/* ctrl_out(gspca_dev, 0x40, 11, 0x0000, 0x0000, 0, NULL); */ 2414f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2424f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin return 0; 2434f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 2444f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2454f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_pre_alt(struct gspca_dev *gspca_dev) 2464f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 2474f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin struct sd *sd = (struct sd *) gspca_dev; 2484f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 249be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin sd->mirrorMask = 0; 250be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin 2514f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.backlight = -1; 2524f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.brightness = -1; 2534f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.sharpness = -1; 2544f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.contrast = -1; 2554f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.saturation = -1; 2564f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.gamma = -1; 2574f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.hue = -1; 2584f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.whitebal = -1; 259fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vold.mirror = -1; 260fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vold.flip = -1; 2614f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2624f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ov2640_init_post_alt(gspca_dev); 2634f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2644f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin return 0; 2654f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 2664f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2674f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_init_post_alt(struct gspca_dev *gspca_dev) 2684f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 2694f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; 270be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin s32 n; /* reserved for FETCH functions */ 2714f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2724f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); 2734f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 274be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin n = fetch_validx(gspca_dev, tbl_sensor_settings_common1, 275be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin ARRAY_SIZE(tbl_sensor_settings_common1)); 2764f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_post); 2774f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin common(gspca_dev); 278be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin keep_on_fetching_validx(gspca_dev, tbl_sensor_settings_common1, 279be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin ARRAY_SIZE(tbl_sensor_settings_common1), n); 2804f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2814f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin switch (reso) { 2824f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_640: 2834f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin n = fetch_validx(gspca_dev, tbl_640, ARRAY_SIZE(tbl_640)); 2844f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_640); 2854f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin break; 2864f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2874f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_800: 2884f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin n = fetch_validx(gspca_dev, tbl_800, ARRAY_SIZE(tbl_800)); 2894f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_800); 2904f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin break; 2914f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2924f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_1600: 2934f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_1280: 294be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin n = fetch_validx(gspca_dev, tbl_big1, ARRAY_SIZE(tbl_big1)); 2954f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 2964f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (reso == IMAGE_1280) { 297be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin n = fetch_validx(gspca_dev, tbl_big2, 298be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin ARRAY_SIZE(tbl_big2)); 2994f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } else { 3004f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x601d, 0x0086, 0, NULL); 3014f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00d7, 0, NULL); 3024f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6082, 0x00d3, 0, NULL); 3034f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3044f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 305be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin n = fetch_validx(gspca_dev, tbl_big3, ARRAY_SIZE(tbl_big3)); 3064f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3074f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (reso == IMAGE_1280) { 3084f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); 3094f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 3104f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 12, dat_1280); 3114f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } else { 3124f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6020, 0x008c, 0, NULL); 3134f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); 3144f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6076, 0x0018, 0, NULL); 3154f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 3164f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 12, dat_1600); 3174f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3184f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin break; 3194f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3204f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 321be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin n = fetch_validx(gspca_dev, tbl_sensor_settings_common2, 322be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin ARRAY_SIZE(tbl_sensor_settings_common2)); 3234f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3244f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ov2640_camera_settings(gspca_dev); 3254f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3264f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin return 0; 3274f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 3284f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3294f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_configure_alt(struct gspca_dev *gspca_dev) 3304f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 3314f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; 3324f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3334f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin switch (reso) { 3344f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_640: 3354f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin gspca_dev->alt = 3 + 1; 3364f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin break; 3374f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3384f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_800: 3394f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_1280: 3404f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin case IMAGE_1600: 3414f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin gspca_dev->alt = 1 + 1; 3424f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin break; 3434f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3444f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin return 0; 3454f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 3464f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3474f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic int ov2640_camera_settings(struct gspca_dev *gspca_dev) 3484f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 3494f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin struct sd *sd = (struct sd *) gspca_dev; 3504f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3514f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 backlight = sd->vcur.backlight; 3524f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 bright = sd->vcur.brightness; 3534f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 sharp = sd->vcur.sharpness; 3544f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 gam = sd->vcur.gamma; 3554f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 cntr = sd->vcur.contrast; 3564f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 sat = sd->vcur.saturation; 3574f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 hue = sd->vcur.hue; 3584f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin s32 wbal = sd->vcur.whitebal; 359fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) == 0); 360fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) == 0); 3614f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3624f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (backlight != sd->vold.backlight) { 363be9904bdde05137085af1df98de98a49ddce9ad8Olivier Lorin /* No sd->vold.backlight=backlight; (to be done again later) */ 3644f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (backlight < 0 || backlight > sd->vmax.backlight) 3654f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin backlight = 0; 3664f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3674f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x00ff, 3684f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 369fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight , 0x0024, 3704f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 371fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight - 10, 0x0025, 3724f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 3734f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3744f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3754f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (bright != sd->vold.brightness) { 3764f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.brightness = bright; 3774f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (bright < 0 || bright > sd->vmax.brightness) 3784f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin bright = 0; 3794f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3804f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 3814f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6009 , 0x007c, 0, NULL); 3824f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + bright, 0x007d, 0, NULL); 3834f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3844f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3854f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (wbal != sd->vold.whitebal) { 3864f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.whitebal = wbal; 3874f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (wbal < 0 || wbal > sd->vmax.whitebal) 3884f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin wbal = 0; 3894f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3904f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 3914f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6003 , 0x007c, 0, NULL); 3924f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + wbal, 0x007d, 0, NULL); 3934f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 3944f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 3954f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (cntr != sd->vold.contrast) { 3964f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.contrast = cntr; 3974f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (cntr < 0 || cntr > sd->vmax.contrast) 3984f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin cntr = 0; 3994f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4004f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 4014f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6007 , 0x007c, 0, NULL); 4024f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + cntr, 0x007d, 0, NULL); 4034f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4044f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4054f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (sat != sd->vold.saturation) { 4064f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.saturation = sat; 4074f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (sat < 0 || sat > sd->vmax.saturation) 4084f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sat = 0; 4094f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4104f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 4114f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x007c, 0, NULL); 4124f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + sat, 0x007d, 0, NULL); 4134f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4144f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4154f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (sharp != sd->vold.sharpness) { 4164f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.sharpness = sharp; 4174f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (sharp < 0 || sharp > sd->vmax.sharpness) 4184f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sharp = 0; 4194f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4204f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 4214f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x0092, 0, NULL); 4224f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x60c0 + sharp, 0x0093, 0, NULL); 4234f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4244f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4254f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (hue != sd->vold.hue) { 4264f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.hue = hue; 4274f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (hue < 0 || hue > sd->vmax.hue) 4284f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin hue = 0; 4294f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4304f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 4314f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6002 , 0x007c, 0, NULL); 4324f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + hue * (hue < 255), 0x007d, 4334f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 434fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin if (hue >= 255) 4354f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->swapRB = 1; 4364f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin else 4374f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->swapRB = 0; 4384f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4394f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4404f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (gam != sd->vold.gamma) { 4414f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.gamma = gam; 4424f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (gam < 0 || gam > sd->vmax.gamma) 4434f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin gam = 0; 4444f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4454f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); 4464f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6008 , 0x007c, 0, NULL); 4474f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000 + gam, 0x007d, 0, NULL); 4484f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4494f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 450fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin if (mirror != sd->vold.mirror || flip != sd->vold.flip) { 451fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vold.mirror = mirror; 452fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin sd->vold.flip = flip; 453fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin 454fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin mirror = 0x80 * mirror; 455fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); 456fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x8004, 0, NULL); 457fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x8004, 1, c28); 458fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6028 + mirror, 0x0004, 0, NULL); 459fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin 460fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin flip = 0x50 * flip + mirror; 461fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); 462fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x8004, 0, NULL); 463fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x8004, 1, ca8); 464fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6028 + flip, 0x0004, 0, NULL); 465fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin 466fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, c50); 467fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin } 468fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin 4694f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin if (backlight != sd->vold.backlight) { 4704f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin sd->vold.backlight = backlight; 4714f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4724f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x00ff, 4734f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 474fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight , 0x0024, 4754f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 476fdd1dd1d246e14dacd8fb0bf842828b03bed2481Olivier Lorin ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight - 10, 0x0025, 4774f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 0, NULL); 4784f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin } 4794f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4804f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin return 0; 4814f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 4824f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin 4834f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorinstatic void ov2640_post_unset_alt(struct gspca_dev *gspca_dev) 4844f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin{ 4854f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ctrl_out(gspca_dev, 0x40, 5, 0x0000, 0x0000, 0, NULL); 4864f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin msleep(20); 4874f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin fetch_validx(gspca_dev, tbl_post_unset_alt, 4884f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin ARRAY_SIZE(tbl_post_unset_alt)); 4894f7cb8837cec65ade18b0e2655292fd98040234eOlivier Lorin} 490