162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* Subdriver for the GL860 chip with the MI2020 sensor 362306a36Sopenharmony_ci * Author Olivier LORIN, from logs by Iceman/Soro2005 + Fret_saw/Hulkie/Tricid 462306a36Sopenharmony_ci * with the help of Kytrix/BUGabundo/Blazercist. 562306a36Sopenharmony_ci * Driver achieved thanks to a webcam gift by Kytrix. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* Sensor : MI2020 */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "gl860.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic u8 dat_wbal1[] = {0x8c, 0xa2, 0x0c}; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistatic u8 dat_bright1[] = {0x8c, 0xa2, 0x06}; 1562306a36Sopenharmony_cistatic u8 dat_bright3[] = {0x8c, 0xa1, 0x02}; 1662306a36Sopenharmony_cistatic u8 dat_bright4[] = {0x90, 0x00, 0x0f}; 1762306a36Sopenharmony_cistatic u8 dat_bright5[] = {0x8c, 0xa1, 0x03}; 1862306a36Sopenharmony_cistatic u8 dat_bright6[] = {0x90, 0x00, 0x05}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic u8 dat_hvflip1[] = {0x8c, 0x27, 0x19}; 2162306a36Sopenharmony_cistatic u8 dat_hvflip3[] = {0x8c, 0x27, 0x3b}; 2262306a36Sopenharmony_cistatic u8 dat_hvflip5[] = {0x8c, 0xa1, 0x03}; 2362306a36Sopenharmony_cistatic u8 dat_hvflip6[] = {0x90, 0x00, 0x06}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic struct idxdata tbl_middle_hvflip_low[] = { 2662306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x06}}, 2762306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 2862306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x06}}, 2962306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 3062306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x06}}, 3162306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 3262306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x06}}, 3362306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic struct idxdata tbl_middle_hvflip_big[] = { 3762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x01}}, 3862306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x00}}, 3962306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x00}}, 4062306a36Sopenharmony_ci {102, {0xff, 0xff, 0xff}}, 4162306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x02}}, 4262306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x72}}, 4362306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x01}}, 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic struct idxdata tbl_end_hvflip[] = { 4762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x02}}, {0x33, {0x90, 0x00, 0x1f}}, 4862306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 4962306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x02}}, {0x33, {0x90, 0x00, 0x1f}}, 5062306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 5162306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x02}}, {0x33, {0x90, 0x00, 0x1f}}, 5262306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, 5362306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x02}}, {0x33, {0x90, 0x00, 0x1f}}, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic u8 dat_freq1[] = { 0x8c, 0xa4, 0x04 }; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic u8 dat_multi5[] = { 0x8c, 0xa1, 0x03 }; 5962306a36Sopenharmony_cistatic u8 dat_multi6[] = { 0x90, 0x00, 0x05 }; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic struct validx tbl_init_at_startup[] = { 6262306a36Sopenharmony_ci {0x0000, 0x0000}, {0x0010, 0x0010}, {0x0008, 0x00c0}, {0x0001, 0x00c1}, 6362306a36Sopenharmony_ci {0x0001, 0x00c2}, {0x0020, 0x0006}, {0x006a, 0x000d}, 6462306a36Sopenharmony_ci {53, 0xffff}, 6562306a36Sopenharmony_ci {0x0040, 0x0000}, {0x0063, 0x0006}, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistatic struct validx tbl_common_0B[] = { 6962306a36Sopenharmony_ci {0x0002, 0x0004}, {0x006a, 0x0007}, {0x00ef, 0x0006}, {0x006a, 0x000d}, 7062306a36Sopenharmony_ci {0x0000, 0x00c0}, {0x0010, 0x0010}, {0x0003, 0x00c1}, {0x0042, 0x00c2}, 7162306a36Sopenharmony_ci {0x0004, 0x00d8}, {0x0000, 0x0058}, {0x0041, 0x0000}, 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic struct idxdata tbl_common_3B[] = { 7562306a36Sopenharmony_ci {0x33, {0x86, 0x25, 0x01}}, {0x33, {0x86, 0x25, 0x00}}, 7662306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 7762306a36Sopenharmony_ci {0x30, {0x1a, 0x0a, 0xcc}}, {0x32, {0x02, 0x00, 0x08}}, 7862306a36Sopenharmony_ci {0x33, {0xf4, 0x03, 0x1d}}, 7962306a36Sopenharmony_ci {6, {0xff, 0xff, 0xff}}, /* 12 */ 8062306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x34, {0x1c, 0x01, 0x28}}, 8162306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, 8262306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, /* - */ 8362306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x32, {0x14, 0x06, 0xe6}}, 8462306a36Sopenharmony_ci {0x33, {0x8c, 0x22, 0x23}}, {0x33, {0x90, 0x00, 0x00}}, 8562306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x0f}}, {0x33, {0x90, 0x00, 0x0d}}, 8662306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x10}}, {0x33, {0x90, 0x00, 0x0b}}, 8762306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x11}}, {0x33, {0x90, 0x00, 0x07}}, 8862306a36Sopenharmony_ci {0x33, {0xf4, 0x03, 0x1d}}, {0x35, {0xa2, 0x00, 0xe2}}, 8962306a36Sopenharmony_ci {0x33, {0x8c, 0xab, 0x05}}, {0x33, {0x90, 0x00, 0x01}}, 9062306a36Sopenharmony_ci {0x32, {0x6e, 0x00, 0x86}}, {0x32, {0x70, 0x0f, 0xaa}}, 9162306a36Sopenharmony_ci {0x32, {0x72, 0x0f, 0xe4}}, {0x33, {0x8c, 0xa3, 0x4a}}, 9262306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x5a}}, {0x33, {0x8c, 0xa3, 0x4b}}, 9362306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0xa6}}, {0x33, {0x8c, 0xa3, 0x61}}, 9462306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0xc8}}, {0x33, {0x8c, 0xa3, 0x62}}, 9562306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0xe1}}, {0x34, {0xce, 0x01, 0xa8}}, 9662306a36Sopenharmony_ci {0x34, {0xd0, 0x66, 0x33}}, {0x34, {0xd2, 0x31, 0x9a}}, 9762306a36Sopenharmony_ci {0x34, {0xd4, 0x94, 0x63}}, {0x34, {0xd6, 0x4b, 0x25}}, 9862306a36Sopenharmony_ci {0x34, {0xd8, 0x26, 0x70}}, {0x34, {0xda, 0x72, 0x4c}}, 9962306a36Sopenharmony_ci {0x34, {0xdc, 0xff, 0x04}}, {0x34, {0xde, 0x01, 0x5b}}, 10062306a36Sopenharmony_ci {0x34, {0xe6, 0x01, 0x13}}, {0x34, {0xee, 0x0b, 0xf0}}, 10162306a36Sopenharmony_ci {0x34, {0xf6, 0x0b, 0xa4}}, {0x35, {0x00, 0xf6, 0xe7}}, 10262306a36Sopenharmony_ci {0x35, {0x08, 0x0d, 0xfd}}, {0x35, {0x10, 0x25, 0x63}}, 10362306a36Sopenharmony_ci {0x35, {0x18, 0x35, 0x6c}}, {0x35, {0x20, 0x42, 0x7e}}, 10462306a36Sopenharmony_ci {0x35, {0x28, 0x19, 0x44}}, {0x35, {0x30, 0x39, 0xd4}}, 10562306a36Sopenharmony_ci {0x35, {0x38, 0xf5, 0xa8}}, {0x35, {0x4c, 0x07, 0x90}}, 10662306a36Sopenharmony_ci {0x35, {0x44, 0x07, 0xb8}}, {0x35, {0x5c, 0x06, 0x88}}, 10762306a36Sopenharmony_ci {0x35, {0x54, 0x07, 0xff}}, {0x34, {0xe0, 0x01, 0x52}}, 10862306a36Sopenharmony_ci {0x34, {0xe8, 0x00, 0xcc}}, {0x34, {0xf0, 0x0d, 0x83}}, 10962306a36Sopenharmony_ci {0x34, {0xf8, 0x0c, 0xb3}}, {0x35, {0x02, 0xfe, 0xba}}, 11062306a36Sopenharmony_ci {0x35, {0x0a, 0x04, 0xe0}}, {0x35, {0x12, 0x1c, 0x63}}, 11162306a36Sopenharmony_ci {0x35, {0x1a, 0x2b, 0x5a}}, {0x35, {0x22, 0x32, 0x5e}}, 11262306a36Sopenharmony_ci {0x35, {0x2a, 0x0d, 0x28}}, {0x35, {0x32, 0x2c, 0x02}}, 11362306a36Sopenharmony_ci {0x35, {0x3a, 0xf4, 0xfa}}, {0x35, {0x4e, 0x07, 0xef}}, 11462306a36Sopenharmony_ci {0x35, {0x46, 0x07, 0x88}}, {0x35, {0x5e, 0x07, 0xc1}}, 11562306a36Sopenharmony_ci {0x35, {0x56, 0x04, 0x64}}, {0x34, {0xe4, 0x01, 0x15}}, 11662306a36Sopenharmony_ci {0x34, {0xec, 0x00, 0x82}}, {0x34, {0xf4, 0x0c, 0xce}}, 11762306a36Sopenharmony_ci {0x34, {0xfc, 0x0c, 0xba}}, {0x35, {0x06, 0x1f, 0x02}}, 11862306a36Sopenharmony_ci {0x35, {0x0e, 0x02, 0xe3}}, {0x35, {0x16, 0x1a, 0x50}}, 11962306a36Sopenharmony_ci {0x35, {0x1e, 0x24, 0x39}}, {0x35, {0x26, 0x23, 0x4c}}, 12062306a36Sopenharmony_ci {0x35, {0x2e, 0xf9, 0x1b}}, {0x35, {0x36, 0x23, 0x19}}, 12162306a36Sopenharmony_ci {0x35, {0x3e, 0x12, 0x08}}, {0x35, {0x52, 0x07, 0x22}}, 12262306a36Sopenharmony_ci {0x35, {0x4a, 0x03, 0xd3}}, {0x35, {0x62, 0x06, 0x54}}, 12362306a36Sopenharmony_ci {0x35, {0x5a, 0x04, 0x5d}}, {0x34, {0xe2, 0x01, 0x04}}, 12462306a36Sopenharmony_ci {0x34, {0xea, 0x00, 0xa0}}, {0x34, {0xf2, 0x0c, 0xbc}}, 12562306a36Sopenharmony_ci {0x34, {0xfa, 0x0c, 0x5b}}, {0x35, {0x04, 0x17, 0xf2}}, 12662306a36Sopenharmony_ci {0x35, {0x0c, 0x02, 0x08}}, {0x35, {0x14, 0x28, 0x43}}, 12762306a36Sopenharmony_ci {0x35, {0x1c, 0x28, 0x62}}, {0x35, {0x24, 0x2b, 0x60}}, 12862306a36Sopenharmony_ci {0x35, {0x2c, 0x07, 0x33}}, {0x35, {0x34, 0x1f, 0xb0}}, 12962306a36Sopenharmony_ci {0x35, {0x3c, 0xed, 0xcd}}, {0x35, {0x50, 0x00, 0x06}}, 13062306a36Sopenharmony_ci {0x35, {0x48, 0x07, 0xff}}, {0x35, {0x60, 0x05, 0x89}}, 13162306a36Sopenharmony_ci {0x35, {0x58, 0x07, 0xff}}, {0x35, {0x40, 0x00, 0xa0}}, 13262306a36Sopenharmony_ci {0x35, {0x42, 0x00, 0x00}}, {0x32, {0x10, 0x01, 0xfc}}, 13362306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x18}}, {0x33, {0x90, 0x00, 0x3c}}, 13462306a36Sopenharmony_ci {0x33, {0x78, 0x00, 0x00}}, 13562306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 13662306a36Sopenharmony_ci {0x35, {0xb8, 0x1f, 0x20}}, {0x33, {0x8c, 0xa2, 0x06}}, 13762306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x10}}, {0x33, {0x8c, 0xa2, 0x07}}, 13862306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x08}}, {0x33, {0x8c, 0xa2, 0x42}}, 13962306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x0b}}, {0x33, {0x8c, 0xa2, 0x4a}}, 14062306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x8c}}, {0x35, {0xba, 0xfa, 0x08}}, 14162306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x02}}, {0x33, {0x90, 0x00, 0x22}}, 14262306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x03}}, {0x33, {0x90, 0x00, 0xbb}}, 14362306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x04}}, {0x33, {0x90, 0x00, 0x80}}, 14462306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x9d}}, {0x33, {0x90, 0x00, 0x00}}, 14562306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x9e}}, {0x33, {0x90, 0x00, 0x00}}, 14662306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x0c}}, {0x33, {0x90, 0x00, 0x17}}, 14762306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x15}}, {0x33, {0x90, 0x00, 0x04}}, 14862306a36Sopenharmony_ci {0x33, {0x8c, 0xa2, 0x14}}, {0x33, {0x90, 0x00, 0x20}}, 14962306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x00}}, 15062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x17}}, {0x33, {0x90, 0x21, 0x11}}, 15162306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x1b}}, {0x33, {0x90, 0x02, 0x4f}}, 15262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x25}}, {0x33, {0x90, 0x06, 0x0f}}, 15362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x39}}, {0x33, {0x90, 0x21, 0x11}}, 15462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x3d}}, {0x33, {0x90, 0x01, 0x20}}, 15562306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x47}}, {0x33, {0x90, 0x09, 0x4c}}, 15662306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x03}}, {0x33, {0x90, 0x02, 0x84}}, 15762306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x05}}, {0x33, {0x90, 0x01, 0xe2}}, 15862306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x07}}, {0x33, {0x90, 0x06, 0x40}}, 15962306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x09}}, {0x33, {0x90, 0x04, 0xb0}}, 16062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x0d}}, {0x33, {0x90, 0x00, 0x00}}, 16162306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x0f}}, {0x33, {0x90, 0x00, 0x00}}, 16262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x11}}, {0x33, {0x90, 0x04, 0xbd}}, 16362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x13}}, {0x33, {0x90, 0x06, 0x4d}}, 16462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x15}}, {0x33, {0x90, 0x00, 0x00}}, 16562306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x17}}, {0x33, {0x90, 0x21, 0x11}}, 16662306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x19}}, {0x33, {0x90, 0x04, 0x6c}}, 16762306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x1b}}, {0x33, {0x90, 0x02, 0x4f}}, 16862306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x1d}}, {0x33, {0x90, 0x01, 0x02}}, 16962306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x1f}}, {0x33, {0x90, 0x02, 0x79}}, 17062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x21}}, {0x33, {0x90, 0x01, 0x55}}, 17162306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x23}}, {0x33, {0x90, 0x02, 0x85}}, 17262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x25}}, {0x33, {0x90, 0x06, 0x0f}}, 17362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x27}}, {0x33, {0x90, 0x20, 0x20}}, 17462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x29}}, {0x33, {0x90, 0x20, 0x20}}, 17562306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x2b}}, {0x33, {0x90, 0x10, 0x20}}, 17662306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x2d}}, {0x33, {0x90, 0x20, 0x07}}, 17762306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x2f}}, {0x33, {0x90, 0x00, 0x04}}, 17862306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x31}}, {0x33, {0x90, 0x00, 0x04}}, 17962306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x33}}, {0x33, {0x90, 0x04, 0xbb}}, 18062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x35}}, {0x33, {0x90, 0x06, 0x4b}}, 18162306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x37}}, {0x33, {0x90, 0x00, 0x00}}, 18262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x39}}, {0x33, {0x90, 0x21, 0x11}}, 18362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x3b}}, {0x33, {0x90, 0x00, 0x24}}, 18462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x3d}}, {0x33, {0x90, 0x01, 0x20}}, 18562306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x41}}, {0x33, {0x90, 0x01, 0x69}}, 18662306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x45}}, {0x33, {0x90, 0x04, 0xed}}, 18762306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x47}}, {0x33, {0x90, 0x09, 0x4c}}, 18862306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x51}}, {0x33, {0x90, 0x00, 0x00}}, 18962306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x53}}, {0x33, {0x90, 0x03, 0x20}}, 19062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x55}}, {0x33, {0x90, 0x00, 0x00}}, 19162306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x57}}, {0x33, {0x90, 0x02, 0x58}}, 19262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x5f}}, {0x33, {0x90, 0x00, 0x00}}, 19362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x61}}, {0x33, {0x90, 0x06, 0x40}}, 19462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x63}}, {0x33, {0x90, 0x00, 0x00}}, 19562306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x65}}, {0x33, {0x90, 0x04, 0xb0}}, 19662306a36Sopenharmony_ci {0x33, {0x8c, 0x22, 0x2e}}, {0x33, {0x90, 0x00, 0xa1}}, 19762306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x08}}, {0x33, {0x90, 0x00, 0x1f}}, 19862306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x09}}, {0x33, {0x90, 0x00, 0x21}}, 19962306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x0a}}, {0x33, {0x90, 0x00, 0x25}}, 20062306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x0b}}, {0x33, {0x90, 0x00, 0x27}}, 20162306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x11}}, {0x33, {0x90, 0x00, 0xa1}}, 20262306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x13}}, {0x33, {0x90, 0x00, 0xc1}}, 20362306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x15}}, {0x33, {0x90, 0x00, 0x6a}}, 20462306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x17}}, {0x33, {0x90, 0x00, 0x80}}, 20562306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 20662306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 20762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 20862306a36Sopenharmony_ci {3, {0xff, 0xff, 0xff}}, 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic struct idxdata tbl_init_post_alt_low1[] = { 21262306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x15}}, {0x33, {0x90, 0x00, 0x25}}, 21362306a36Sopenharmony_ci {0x33, {0x8c, 0x22, 0x2e}}, {0x33, {0x90, 0x00, 0x81}}, 21462306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x08}}, {0x33, {0x90, 0x00, 0x17}}, 21562306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x09}}, {0x33, {0x90, 0x00, 0x1a}}, 21662306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x0a}}, {0x33, {0x90, 0x00, 0x1d}}, 21762306a36Sopenharmony_ci {0x33, {0x8c, 0xa4, 0x0b}}, {0x33, {0x90, 0x00, 0x20}}, 21862306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x11}}, {0x33, {0x90, 0x00, 0x81}}, 21962306a36Sopenharmony_ci {0x33, {0x8c, 0x24, 0x13}}, {0x33, {0x90, 0x00, 0x9b}}, 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistatic struct idxdata tbl_init_post_alt_low2[] = { 22362306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x03}}, {0x33, {0x90, 0x03, 0x24}}, 22462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x05}}, {0x33, {0x90, 0x02, 0x58}}, 22562306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 22662306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 22762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 22862306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic struct idxdata tbl_init_post_alt_low3[] = { 23262306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x34, {0x1c, 0x01, 0x28}}, 23362306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, 23462306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 23562306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x32, {0x14, 0x06, 0xe6}}, 23662306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x00}}, 23762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x01}}, 23862306a36Sopenharmony_ci {0x33, {0x2e, 0x01, 0x00}}, {0x34, {0x04, 0x00, 0x2a}}, 23962306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x00}}, 24062306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x95}}, {0x33, {0x90, 0x01, 0x00}}, 24162306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 24262306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x72}}, 24362306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x02}}, 24462306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x01}}, 24562306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 24662306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x00}}, 24762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x01}}, 24862306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x00}}, 24962306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 25062306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 25162306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 25262306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 25362306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 25462306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 25562306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 25662306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistatic struct idxdata tbl_init_post_alt_big[] = { 26062306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 26162306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 26262306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 26362306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 26462306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x34, {0x1c, 0x01, 0x28}}, 26562306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, 26662306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 26762306a36Sopenharmony_ci {0x34, {0x1e, 0x8f, 0x09}}, {0x32, {0x14, 0x06, 0xe6}}, 26862306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, 26962306a36Sopenharmony_ci {0x33, {0x90, 0x00, 0x05}}, 27062306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 27162306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 27262306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 27362306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x05}}, 27462306a36Sopenharmony_ci {2, {0xff, 0xff, 0xff}}, 27562306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x06}}, 27662306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x72}}, 27762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x30}}, {0x33, {0x90, 0x00, 0x03}}, 27862306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x31}}, {0x33, {0x90, 0x00, 0x02}}, 27962306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x32}}, {0x33, {0x90, 0x00, 0x03}}, 28062306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x34}}, {0x33, {0x90, 0x00, 0x03}}, 28162306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x02}}, 28262306a36Sopenharmony_ci {0x33, {0x2e, 0x01, 0x00}}, {0x34, {0x04, 0x00, 0x2a}}, 28362306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x01}}, 28462306a36Sopenharmony_ci {0x33, {0x8c, 0x27, 0x97}}, {0x33, {0x90, 0x01, 0x00}}, 28562306a36Sopenharmony_ci {51, {0xff, 0xff, 0xff}}, 28662306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x00}}, 28762306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x01}}, 28862306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x00}}, 28962306a36Sopenharmony_ci {51, {0xff, 0xff, 0xff}}, 29062306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x20}}, {0x33, {0x90, 0x00, 0x72}}, 29162306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x03}}, {0x33, {0x90, 0x00, 0x02}}, 29262306a36Sopenharmony_ci {0x33, {0x8c, 0xa7, 0x02}}, {0x33, {0x90, 0x00, 0x01}}, 29362306a36Sopenharmony_ci {51, {0xff, 0xff, 0xff}}, 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic struct idxdata tbl_init_post_alt_3B[] = { 29762306a36Sopenharmony_ci {0x32, {0x10, 0x01, 0xf8}}, {0x34, {0xce, 0x01, 0xa8}}, 29862306a36Sopenharmony_ci {0x34, {0xd0, 0x66, 0x33}}, {0x34, {0xd2, 0x31, 0x9a}}, 29962306a36Sopenharmony_ci {0x34, {0xd4, 0x94, 0x63}}, {0x34, {0xd6, 0x4b, 0x25}}, 30062306a36Sopenharmony_ci {0x34, {0xd8, 0x26, 0x70}}, {0x34, {0xda, 0x72, 0x4c}}, 30162306a36Sopenharmony_ci {0x34, {0xdc, 0xff, 0x04}}, {0x34, {0xde, 0x01, 0x5b}}, 30262306a36Sopenharmony_ci {0x34, {0xe6, 0x01, 0x13}}, {0x34, {0xee, 0x0b, 0xf0}}, 30362306a36Sopenharmony_ci {0x34, {0xf6, 0x0b, 0xa4}}, {0x35, {0x00, 0xf6, 0xe7}}, 30462306a36Sopenharmony_ci {0x35, {0x08, 0x0d, 0xfd}}, {0x35, {0x10, 0x25, 0x63}}, 30562306a36Sopenharmony_ci {0x35, {0x18, 0x35, 0x6c}}, {0x35, {0x20, 0x42, 0x7e}}, 30662306a36Sopenharmony_ci {0x35, {0x28, 0x19, 0x44}}, {0x35, {0x30, 0x39, 0xd4}}, 30762306a36Sopenharmony_ci {0x35, {0x38, 0xf5, 0xa8}}, {0x35, {0x4c, 0x07, 0x90}}, 30862306a36Sopenharmony_ci {0x35, {0x44, 0x07, 0xb8}}, {0x35, {0x5c, 0x06, 0x88}}, 30962306a36Sopenharmony_ci {0x35, {0x54, 0x07, 0xff}}, {0x34, {0xe0, 0x01, 0x52}}, 31062306a36Sopenharmony_ci {0x34, {0xe8, 0x00, 0xcc}}, {0x34, {0xf0, 0x0d, 0x83}}, 31162306a36Sopenharmony_ci {0x34, {0xf8, 0x0c, 0xb3}}, {0x35, {0x02, 0xfe, 0xba}}, 31262306a36Sopenharmony_ci {0x35, {0x0a, 0x04, 0xe0}}, {0x35, {0x12, 0x1c, 0x63}}, 31362306a36Sopenharmony_ci {0x35, {0x1a, 0x2b, 0x5a}}, {0x35, {0x22, 0x32, 0x5e}}, 31462306a36Sopenharmony_ci {0x35, {0x2a, 0x0d, 0x28}}, {0x35, {0x32, 0x2c, 0x02}}, 31562306a36Sopenharmony_ci {0x35, {0x3a, 0xf4, 0xfa}}, {0x35, {0x4e, 0x07, 0xef}}, 31662306a36Sopenharmony_ci {0x35, {0x46, 0x07, 0x88}}, {0x35, {0x5e, 0x07, 0xc1}}, 31762306a36Sopenharmony_ci {0x35, {0x56, 0x04, 0x64}}, {0x34, {0xe4, 0x01, 0x15}}, 31862306a36Sopenharmony_ci {0x34, {0xec, 0x00, 0x82}}, {0x34, {0xf4, 0x0c, 0xce}}, 31962306a36Sopenharmony_ci {0x34, {0xfc, 0x0c, 0xba}}, {0x35, {0x06, 0x1f, 0x02}}, 32062306a36Sopenharmony_ci {0x35, {0x0e, 0x02, 0xe3}}, {0x35, {0x16, 0x1a, 0x50}}, 32162306a36Sopenharmony_ci {0x35, {0x1e, 0x24, 0x39}}, {0x35, {0x26, 0x23, 0x4c}}, 32262306a36Sopenharmony_ci {0x35, {0x2e, 0xf9, 0x1b}}, {0x35, {0x36, 0x23, 0x19}}, 32362306a36Sopenharmony_ci {0x35, {0x3e, 0x12, 0x08}}, {0x35, {0x52, 0x07, 0x22}}, 32462306a36Sopenharmony_ci {0x35, {0x4a, 0x03, 0xd3}}, {0x35, {0x62, 0x06, 0x54}}, 32562306a36Sopenharmony_ci {0x35, {0x5a, 0x04, 0x5d}}, {0x34, {0xe2, 0x01, 0x04}}, 32662306a36Sopenharmony_ci {0x34, {0xea, 0x00, 0xa0}}, {0x34, {0xf2, 0x0c, 0xbc}}, 32762306a36Sopenharmony_ci {0x34, {0xfa, 0x0c, 0x5b}}, {0x35, {0x04, 0x17, 0xf2}}, 32862306a36Sopenharmony_ci {0x35, {0x0c, 0x02, 0x08}}, {0x35, {0x14, 0x28, 0x43}}, 32962306a36Sopenharmony_ci {0x35, {0x1c, 0x28, 0x62}}, {0x35, {0x24, 0x2b, 0x60}}, 33062306a36Sopenharmony_ci {0x35, {0x2c, 0x07, 0x33}}, {0x35, {0x34, 0x1f, 0xb0}}, 33162306a36Sopenharmony_ci {0x35, {0x3c, 0xed, 0xcd}}, {0x35, {0x50, 0x00, 0x06}}, 33262306a36Sopenharmony_ci {0x35, {0x48, 0x07, 0xff}}, {0x35, {0x60, 0x05, 0x89}}, 33362306a36Sopenharmony_ci {0x35, {0x58, 0x07, 0xff}}, {0x35, {0x40, 0x00, 0xa0}}, 33462306a36Sopenharmony_ci {0x35, {0x42, 0x00, 0x00}}, {0x32, {0x10, 0x01, 0xfc}}, 33562306a36Sopenharmony_ci {0x33, {0x8c, 0xa1, 0x18}}, {0x33, {0x90, 0x00, 0x3c}}, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic u8 *dat_640 = "\xd0\x02\xd1\x08\xd2\xe1\xd3\x02\xd4\x10\xd5\x81"; 33962306a36Sopenharmony_cistatic u8 *dat_800 = "\xd0\x02\xd1\x10\xd2\x57\xd3\x02\xd4\x18\xd5\x21"; 34062306a36Sopenharmony_cistatic u8 *dat_1280 = "\xd0\x02\xd1\x20\xd2\x01\xd3\x02\xd4\x28\xd5\x01"; 34162306a36Sopenharmony_cistatic u8 *dat_1600 = "\xd0\x02\xd1\x20\xd2\xaf\xd3\x02\xd4\x30\xd5\x41"; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic int mi2020_init_at_startup(struct gspca_dev *gspca_dev); 34462306a36Sopenharmony_cistatic int mi2020_configure_alt(struct gspca_dev *gspca_dev); 34562306a36Sopenharmony_cistatic int mi2020_init_pre_alt(struct gspca_dev *gspca_dev); 34662306a36Sopenharmony_cistatic int mi2020_init_post_alt(struct gspca_dev *gspca_dev); 34762306a36Sopenharmony_cistatic void mi2020_post_unset_alt(struct gspca_dev *gspca_dev); 34862306a36Sopenharmony_cistatic int mi2020_camera_settings(struct gspca_dev *gspca_dev); 34962306a36Sopenharmony_ci/*==========================================================================*/ 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_civoid mi2020_init_settings(struct gspca_dev *gspca_dev) 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci sd->vcur.backlight = 0; 35662306a36Sopenharmony_ci sd->vcur.brightness = 70; 35762306a36Sopenharmony_ci sd->vcur.sharpness = 20; 35862306a36Sopenharmony_ci sd->vcur.contrast = 0; 35962306a36Sopenharmony_ci sd->vcur.gamma = 0; 36062306a36Sopenharmony_ci sd->vcur.hue = 0; 36162306a36Sopenharmony_ci sd->vcur.saturation = 60; 36262306a36Sopenharmony_ci sd->vcur.whitebal = 0; /* 50, not done by hardware */ 36362306a36Sopenharmony_ci sd->vcur.mirror = 0; 36462306a36Sopenharmony_ci sd->vcur.flip = 0; 36562306a36Sopenharmony_ci sd->vcur.AC50Hz = 1; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci sd->vmax.backlight = 64; 36862306a36Sopenharmony_ci sd->vmax.brightness = 128; 36962306a36Sopenharmony_ci sd->vmax.sharpness = 40; 37062306a36Sopenharmony_ci sd->vmax.contrast = 3; 37162306a36Sopenharmony_ci sd->vmax.gamma = 2; 37262306a36Sopenharmony_ci sd->vmax.hue = 0 + 1; /* 200, not done by hardware */ 37362306a36Sopenharmony_ci sd->vmax.saturation = 0; /* 100, not done by hardware */ 37462306a36Sopenharmony_ci sd->vmax.whitebal = 2; /* 100, not done by hardware */ 37562306a36Sopenharmony_ci sd->vmax.mirror = 1; 37662306a36Sopenharmony_ci sd->vmax.flip = 1; 37762306a36Sopenharmony_ci sd->vmax.AC50Hz = 1; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci sd->dev_camera_settings = mi2020_camera_settings; 38062306a36Sopenharmony_ci sd->dev_init_at_startup = mi2020_init_at_startup; 38162306a36Sopenharmony_ci sd->dev_configure_alt = mi2020_configure_alt; 38262306a36Sopenharmony_ci sd->dev_init_pre_alt = mi2020_init_pre_alt; 38362306a36Sopenharmony_ci sd->dev_post_unset_alt = mi2020_post_unset_alt; 38462306a36Sopenharmony_ci} 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci/*==========================================================================*/ 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic void common(struct gspca_dev *gspca_dev) 38962306a36Sopenharmony_ci{ 39062306a36Sopenharmony_ci fetch_validx(gspca_dev, tbl_common_0B, ARRAY_SIZE(tbl_common_0B)); 39162306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_common_3B, ARRAY_SIZE(tbl_common_3B)); 39262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x0000, 0, NULL); 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic int mi2020_init_at_startup(struct gspca_dev *gspca_dev) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci u8 c; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &c); 40062306a36Sopenharmony_ci ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &c); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci fetch_validx(gspca_dev, tbl_init_at_startup, 40362306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_at_startup)); 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x7a00, 0x8030, 0, NULL); 40662306a36Sopenharmony_ci ctrl_in(gspca_dev, 0xc0, 2, 0x7a00, 0x8030, 1, &c); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci common(gspca_dev); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci msleep(61); 41162306a36Sopenharmony_ci/* ctrl_out(gspca_dev, 0x40, 11, 0x0000, 0x0000, 0, NULL); */ 41262306a36Sopenharmony_ci/* msleep(36); */ 41362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0000, 0, NULL); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci return 0; 41662306a36Sopenharmony_ci} 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cistatic int mi2020_init_pre_alt(struct gspca_dev *gspca_dev) 41962306a36Sopenharmony_ci{ 42062306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci sd->mirrorMask = 0; 42362306a36Sopenharmony_ci sd->vold.hue = -1; 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /* These controls need to be reset */ 42662306a36Sopenharmony_ci sd->vold.brightness = -1; 42762306a36Sopenharmony_ci sd->vold.sharpness = -1; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci /* If not different from default, they do not need to be set */ 43062306a36Sopenharmony_ci sd->vold.contrast = 0; 43162306a36Sopenharmony_ci sd->vold.gamma = 0; 43262306a36Sopenharmony_ci sd->vold.backlight = 0; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci mi2020_init_post_alt(gspca_dev); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci return 0; 43762306a36Sopenharmony_ci} 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic int mi2020_init_post_alt(struct gspca_dev *gspca_dev) 44062306a36Sopenharmony_ci{ 44162306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 44262306a36Sopenharmony_ci s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) > 0); 44562306a36Sopenharmony_ci s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) > 0); 44662306a36Sopenharmony_ci s32 freq = (sd->vcur.AC50Hz > 0); 44762306a36Sopenharmony_ci s32 wbal = sd->vcur.whitebal; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci u8 dat_freq2[] = {0x90, 0x00, 0x80}; 45062306a36Sopenharmony_ci u8 dat_multi1[] = {0x8c, 0xa7, 0x00}; 45162306a36Sopenharmony_ci u8 dat_multi2[] = {0x90, 0x00, 0x00}; 45262306a36Sopenharmony_ci u8 dat_multi3[] = {0x8c, 0xa7, 0x00}; 45362306a36Sopenharmony_ci u8 dat_multi4[] = {0x90, 0x00, 0x00}; 45462306a36Sopenharmony_ci u8 dat_hvflip2[] = {0x90, 0x04, 0x6c}; 45562306a36Sopenharmony_ci u8 dat_hvflip4[] = {0x90, 0x00, 0x24}; 45662306a36Sopenharmony_ci u8 dat_wbal2[] = {0x90, 0x00, 0x00}; 45762306a36Sopenharmony_ci u8 c; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci sd->nbIm = -1; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci dat_freq2[2] = freq ? 0xc0 : 0x80; 46262306a36Sopenharmony_ci dat_multi1[2] = 0x9d; 46362306a36Sopenharmony_ci dat_multi3[2] = dat_multi1[2] + 1; 46462306a36Sopenharmony_ci if (wbal == 0) { 46562306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0; 46662306a36Sopenharmony_ci dat_wbal2[2] = 0x17; 46762306a36Sopenharmony_ci } else if (wbal == 1) { 46862306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0; 46962306a36Sopenharmony_ci dat_wbal2[2] = 0x35; 47062306a36Sopenharmony_ci } else if (wbal == 2) { 47162306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0x20; 47262306a36Sopenharmony_ci dat_wbal2[2] = 0x17; 47362306a36Sopenharmony_ci } 47462306a36Sopenharmony_ci dat_hvflip2[2] = 0x6c + 2 * (1 - flip) + (1 - mirror); 47562306a36Sopenharmony_ci dat_hvflip4[2] = 0x24 + 2 * (1 - flip) + (1 - mirror); 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci msleep(200); 47862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); 47962306a36Sopenharmony_ci msleep(2); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci common(gspca_dev); 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci msleep(142); 48462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); 48562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0003, 0x00c1, 0, NULL); 48662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0042, 0x00c2, 0, NULL); 48762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x006a, 0x000d, 0, NULL); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci switch (reso) { 49062306a36Sopenharmony_ci case IMAGE_640: 49162306a36Sopenharmony_ci case IMAGE_800: 49262306a36Sopenharmony_ci if (reso != IMAGE_800) 49362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 49462306a36Sopenharmony_ci 12, dat_640); 49562306a36Sopenharmony_ci else 49662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 49762306a36Sopenharmony_ci 12, dat_800); 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_low1, 50062306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_low1)); 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci if (reso == IMAGE_800) 50362306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_low2, 50462306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_low2)); 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_low3, 50762306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_low3)); 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); 51062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); 51162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); 51262306a36Sopenharmony_ci msleep(120); 51362306a36Sopenharmony_ci break; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci case IMAGE_1280: 51662306a36Sopenharmony_ci case IMAGE_1600: 51762306a36Sopenharmony_ci if (reso == IMAGE_1280) { 51862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 51962306a36Sopenharmony_ci 12, dat_1280); 52062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 52162306a36Sopenharmony_ci 3, "\x8c\x27\x07"); 52262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 52362306a36Sopenharmony_ci 3, "\x90\x05\x04"); 52462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 52562306a36Sopenharmony_ci 3, "\x8c\x27\x09"); 52662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 52762306a36Sopenharmony_ci 3, "\x90\x04\x02"); 52862306a36Sopenharmony_ci } else { 52962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 53062306a36Sopenharmony_ci 12, dat_1600); 53162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 53262306a36Sopenharmony_ci 3, "\x8c\x27\x07"); 53362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 53462306a36Sopenharmony_ci 3, "\x90\x06\x40"); 53562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 53662306a36Sopenharmony_ci 3, "\x8c\x27\x09"); 53762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 53862306a36Sopenharmony_ci 3, "\x90\x04\xb0"); 53962306a36Sopenharmony_ci } 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_big, 54262306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_big)); 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0010, 0, NULL); 54562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); 54662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); 54762306a36Sopenharmony_ci msleep(1850); 54862306a36Sopenharmony_ci } 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); 55162306a36Sopenharmony_ci msleep(40); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci /* AC power frequency */ 55462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq1); 55562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq2); 55662306a36Sopenharmony_ci msleep(33); 55762306a36Sopenharmony_ci /* light source */ 55862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); 55962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); 56062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); 56162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); 56262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_wbal1); 56362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_wbal2); 56462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); 56562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); 56662306a36Sopenharmony_ci msleep(7); 56762306a36Sopenharmony_ci ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, &c); 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_3B, 57062306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_3B)); 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci /* hvflip */ 57362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip1); 57462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip2); 57562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip3); 57662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip4); 57762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip5); 57862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip6); 57962306a36Sopenharmony_ci msleep(250); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci if (reso == IMAGE_640 || reso == IMAGE_800) 58262306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_middle_hvflip_low, 58362306a36Sopenharmony_ci ARRAY_SIZE(tbl_middle_hvflip_low)); 58462306a36Sopenharmony_ci else 58562306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_middle_hvflip_big, 58662306a36Sopenharmony_ci ARRAY_SIZE(tbl_middle_hvflip_big)); 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_end_hvflip, 58962306a36Sopenharmony_ci ARRAY_SIZE(tbl_end_hvflip)); 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci sd->nbIm = 0; 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci sd->vold.mirror = mirror; 59462306a36Sopenharmony_ci sd->vold.flip = flip; 59562306a36Sopenharmony_ci sd->vold.AC50Hz = freq; 59662306a36Sopenharmony_ci sd->vold.whitebal = wbal; 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_ci mi2020_camera_settings(gspca_dev); 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci return 0; 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistatic int mi2020_configure_alt(struct gspca_dev *gspca_dev) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci switch (reso) { 60862306a36Sopenharmony_ci case IMAGE_640: 60962306a36Sopenharmony_ci gspca_dev->alt = 3 + 1; 61062306a36Sopenharmony_ci break; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci case IMAGE_800: 61362306a36Sopenharmony_ci case IMAGE_1280: 61462306a36Sopenharmony_ci case IMAGE_1600: 61562306a36Sopenharmony_ci gspca_dev->alt = 1 + 1; 61662306a36Sopenharmony_ci break; 61762306a36Sopenharmony_ci } 61862306a36Sopenharmony_ci return 0; 61962306a36Sopenharmony_ci} 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_cistatic int mi2020_camera_settings(struct gspca_dev *gspca_dev) 62262306a36Sopenharmony_ci{ 62362306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 62462306a36Sopenharmony_ci s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci s32 backlight = sd->vcur.backlight; 62762306a36Sopenharmony_ci s32 bright = sd->vcur.brightness; 62862306a36Sopenharmony_ci s32 sharp = sd->vcur.sharpness; 62962306a36Sopenharmony_ci s32 cntr = sd->vcur.contrast; 63062306a36Sopenharmony_ci s32 gam = sd->vcur.gamma; 63162306a36Sopenharmony_ci s32 hue = (sd->vcur.hue > 0); 63262306a36Sopenharmony_ci s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) > 0); 63362306a36Sopenharmony_ci s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) > 0); 63462306a36Sopenharmony_ci s32 freq = (sd->vcur.AC50Hz > 0); 63562306a36Sopenharmony_ci s32 wbal = sd->vcur.whitebal; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci u8 dat_sharp[] = {0x6c, 0x00, 0x08}; 63862306a36Sopenharmony_ci u8 dat_bright2[] = {0x90, 0x00, 0x00}; 63962306a36Sopenharmony_ci u8 dat_freq2[] = {0x90, 0x00, 0x80}; 64062306a36Sopenharmony_ci u8 dat_multi1[] = {0x8c, 0xa7, 0x00}; 64162306a36Sopenharmony_ci u8 dat_multi2[] = {0x90, 0x00, 0x00}; 64262306a36Sopenharmony_ci u8 dat_multi3[] = {0x8c, 0xa7, 0x00}; 64362306a36Sopenharmony_ci u8 dat_multi4[] = {0x90, 0x00, 0x00}; 64462306a36Sopenharmony_ci u8 dat_hvflip2[] = {0x90, 0x04, 0x6c}; 64562306a36Sopenharmony_ci u8 dat_hvflip4[] = {0x90, 0x00, 0x24}; 64662306a36Sopenharmony_ci u8 dat_wbal2[] = {0x90, 0x00, 0x00}; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci /* Less than 4 images received -> too early to set the settings */ 64962306a36Sopenharmony_ci if (sd->nbIm < 4) { 65062306a36Sopenharmony_ci sd->waitSet = 1; 65162306a36Sopenharmony_ci return 0; 65262306a36Sopenharmony_ci } 65362306a36Sopenharmony_ci sd->waitSet = 0; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci if (freq != sd->vold.AC50Hz) { 65662306a36Sopenharmony_ci sd->vold.AC50Hz = freq; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci dat_freq2[2] = freq ? 0xc0 : 0x80; 65962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq1); 66062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq2); 66162306a36Sopenharmony_ci msleep(20); 66262306a36Sopenharmony_ci } 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci if (wbal != sd->vold.whitebal) { 66562306a36Sopenharmony_ci sd->vold.whitebal = wbal; 66662306a36Sopenharmony_ci if (wbal < 0 || wbal > sd->vmax.whitebal) 66762306a36Sopenharmony_ci wbal = 0; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci dat_multi1[2] = 0x9d; 67062306a36Sopenharmony_ci dat_multi3[2] = dat_multi1[2] + 1; 67162306a36Sopenharmony_ci if (wbal == 0) { 67262306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0; 67362306a36Sopenharmony_ci dat_wbal2[2] = 0x17; 67462306a36Sopenharmony_ci } else if (wbal == 1) { 67562306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0; 67662306a36Sopenharmony_ci dat_wbal2[2] = 0x35; 67762306a36Sopenharmony_ci } else if (wbal == 2) { 67862306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = 0x20; 67962306a36Sopenharmony_ci dat_wbal2[2] = 0x17; 68062306a36Sopenharmony_ci } 68162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); 68262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); 68362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); 68462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); 68562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_wbal1); 68662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_wbal2); 68762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); 68862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); 68962306a36Sopenharmony_ci } 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci if (mirror != sd->vold.mirror || flip != sd->vold.flip) { 69262306a36Sopenharmony_ci sd->vold.mirror = mirror; 69362306a36Sopenharmony_ci sd->vold.flip = flip; 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci dat_hvflip2[2] = 0x6c + 2 * (1 - flip) + (1 - mirror); 69662306a36Sopenharmony_ci dat_hvflip4[2] = 0x24 + 2 * (1 - flip) + (1 - mirror); 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_init_post_alt_3B, 69962306a36Sopenharmony_ci ARRAY_SIZE(tbl_init_post_alt_3B)); 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip1); 70262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip2); 70362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip3); 70462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip4); 70562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip5); 70662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip6); 70762306a36Sopenharmony_ci msleep(40); 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci if (reso == IMAGE_640 || reso == IMAGE_800) 71062306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_middle_hvflip_low, 71162306a36Sopenharmony_ci ARRAY_SIZE(tbl_middle_hvflip_low)); 71262306a36Sopenharmony_ci else 71362306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_middle_hvflip_big, 71462306a36Sopenharmony_ci ARRAY_SIZE(tbl_middle_hvflip_big)); 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ci fetch_idxdata(gspca_dev, tbl_end_hvflip, 71762306a36Sopenharmony_ci ARRAY_SIZE(tbl_end_hvflip)); 71862306a36Sopenharmony_ci } 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci if (bright != sd->vold.brightness) { 72162306a36Sopenharmony_ci sd->vold.brightness = bright; 72262306a36Sopenharmony_ci if (bright < 0 || bright > sd->vmax.brightness) 72362306a36Sopenharmony_ci bright = 0; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci dat_bright2[2] = bright; 72662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright1); 72762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright2); 72862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright3); 72962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright4); 73062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright5); 73162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright6); 73262306a36Sopenharmony_ci } 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci if (cntr != sd->vold.contrast || gam != sd->vold.gamma) { 73562306a36Sopenharmony_ci sd->vold.contrast = cntr; 73662306a36Sopenharmony_ci if (cntr < 0 || cntr > sd->vmax.contrast) 73762306a36Sopenharmony_ci cntr = 0; 73862306a36Sopenharmony_ci sd->vold.gamma = gam; 73962306a36Sopenharmony_ci if (gam < 0 || gam > sd->vmax.gamma) 74062306a36Sopenharmony_ci gam = 0; 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_ci dat_multi1[2] = 0x6d; 74362306a36Sopenharmony_ci dat_multi3[2] = dat_multi1[2] + 1; 74462306a36Sopenharmony_ci if (cntr == 0) 74562306a36Sopenharmony_ci cntr = 4; 74662306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = cntr * 0x10 + 2 - gam; 74762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); 74862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); 74962306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); 75062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); 75162306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); 75262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); 75362306a36Sopenharmony_ci } 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci if (backlight != sd->vold.backlight) { 75662306a36Sopenharmony_ci sd->vold.backlight = backlight; 75762306a36Sopenharmony_ci if (backlight < 0 || backlight > sd->vmax.backlight) 75862306a36Sopenharmony_ci backlight = 0; 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci dat_multi1[2] = 0x9d; 76162306a36Sopenharmony_ci dat_multi3[2] = dat_multi1[2] + 1; 76262306a36Sopenharmony_ci dat_multi4[2] = dat_multi2[2] = backlight; 76362306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); 76462306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); 76562306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); 76662306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); 76762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); 76862306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); 76962306a36Sopenharmony_ci } 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci if (sharp != sd->vold.sharpness) { 77262306a36Sopenharmony_ci sd->vold.sharpness = sharp; 77362306a36Sopenharmony_ci if (sharp < 0 || sharp > sd->vmax.sharpness) 77462306a36Sopenharmony_ci sharp = 0; 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci dat_sharp[1] = sharp; 77762306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0032, 3, dat_sharp); 77862306a36Sopenharmony_ci } 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci if (hue != sd->vold.hue) { 78162306a36Sopenharmony_ci sd->swapRB = hue; 78262306a36Sopenharmony_ci sd->vold.hue = hue; 78362306a36Sopenharmony_ci } 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci return 0; 78662306a36Sopenharmony_ci} 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_cistatic void mi2020_post_unset_alt(struct gspca_dev *gspca_dev) 78962306a36Sopenharmony_ci{ 79062306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 5, 0x0000, 0x0000, 0, NULL); 79162306a36Sopenharmony_ci msleep(40); 79262306a36Sopenharmony_ci ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0000, 0, NULL); 79362306a36Sopenharmony_ci} 794