blob: acd1be93649d145a549d2acb8e2437c7aff2ded6 [file] [log] [blame]
Thomas Gleixnerc942fdd2019-05-27 08:55:06 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Hans de Goede327c4ab2008-09-03 17:12:14 -03002/*
3 * Pixart PAC207BCA / PAC73xx common functions
4 *
5 * Copyright (C) 2008 Hans de Goede <j.w.r.degoede@hhs.nl>
6 * Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
7 * Copyleft (C) 2005 Michel Xhaard mxhaard@magic.fr
8 *
9 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
Hans de Goede327c4ab2008-09-03 17:12:14 -030010 */
11
Hans de Goede8a5b2e92008-09-03 17:12:17 -030012/* We calculate the autogain at the end of the transfer of a frame, at this
Hans de Goede5fb2dde2010-02-17 11:59:19 -030013 moment a frame with the old settings is being captured and transmitted. So
Mauro Carvalho Chehab3e4d8f42019-02-18 14:29:03 -050014 if we adjust the gain or exposure we must ignore at least the next frame for
Hans de Goede5fb2dde2010-02-17 11:59:19 -030015 the new settings to come into effect before doing any other adjustments. */
16#define PAC_AUTOGAIN_IGNORE_FRAMES 2
Hans de Goede8a5b2e92008-09-03 17:12:17 -030017
Hans de Goede327c4ab2008-09-03 17:12:14 -030018static const unsigned char pac_sof_marker[5] =
19 { 0xff, 0xff, 0x00, 0xff, 0x96 };
20
Marton Nemethe0d49e22009-10-05 05:41:30 -030021/*
22 The following state machine finds the SOF marker sequence
23 0xff, 0xff, 0x00, 0xff, 0x96 in a byte stream.
24
25 +----------+
26 | 0: START |<---------------\
27 +----------+<-\ |
28 | \---/otherwise |
29 v 0xff |
30 +----------+ otherwise |
31 | 1 |--------------->*
32 | | ^
33 +----------+ |
34 | |
35 v 0xff |
36 +----------+<-\0xff |
37 /->| |--/ |
38 | | 2 |--------------->*
39 | | | otherwise ^
40 | +----------+ |
41 | | |
42 | v 0x00 |
43 | +----------+ |
44 | | 3 | |
45 | | |--------------->*
46 | +----------+ otherwise ^
47 | | |
48 0xff | v 0xff |
49 | +----------+ |
50 \--| 4 | |
51 | |----------------/
52 +----------+ otherwise
53 |
54 v 0x96
55 +----------+
56 | FOUND |
57 +----------+
58*/
59
Theodore Kilgorec93396e2013-02-04 13:17:55 -030060static unsigned char *pac_find_sof(struct gspca_dev *gspca_dev, u8 *sof_read,
Hans de Goede327c4ab2008-09-03 17:12:14 -030061 unsigned char *m, int len)
62{
Hans de Goede327c4ab2008-09-03 17:12:14 -030063 int i;
64
65 /* Search for the SOF marker (fixed part) in the header */
66 for (i = 0; i < len; i++) {
Marton Nemetha6b69e42009-11-02 08:05:51 -030067 switch (*sof_read) {
Marton Nemethe0d49e22009-10-05 05:41:30 -030068 case 0:
69 if (m[i] == 0xff)
Marton Nemetha6b69e42009-11-02 08:05:51 -030070 *sof_read = 1;
Marton Nemethe0d49e22009-10-05 05:41:30 -030071 break;
72 case 1:
73 if (m[i] == 0xff)
Marton Nemetha6b69e42009-11-02 08:05:51 -030074 *sof_read = 2;
Marton Nemethe0d49e22009-10-05 05:41:30 -030075 else
Marton Nemetha6b69e42009-11-02 08:05:51 -030076 *sof_read = 0;
Marton Nemethe0d49e22009-10-05 05:41:30 -030077 break;
78 case 2:
79 switch (m[i]) {
80 case 0x00:
Marton Nemetha6b69e42009-11-02 08:05:51 -030081 *sof_read = 3;
Marton Nemethe0d49e22009-10-05 05:41:30 -030082 break;
83 case 0xff:
84 /* stay in this state */
85 break;
86 default:
Marton Nemetha6b69e42009-11-02 08:05:51 -030087 *sof_read = 0;
Marton Nemethe0d49e22009-10-05 05:41:30 -030088 }
89 break;
90 case 3:
91 if (m[i] == 0xff)
Marton Nemetha6b69e42009-11-02 08:05:51 -030092 *sof_read = 4;
Marton Nemethe0d49e22009-10-05 05:41:30 -030093 else
Marton Nemetha6b69e42009-11-02 08:05:51 -030094 *sof_read = 0;
Marton Nemethe0d49e22009-10-05 05:41:30 -030095 break;
96 case 4:
97 switch (m[i]) {
98 case 0x96:
99 /* Pattern found */
Joe Perches37d5efb2017-09-22 15:20:33 -0400100 gspca_dbg(gspca_dev, D_FRAM,
101 "SOF found, bytes to analyze: %u - Frame starts at byte #%u\n",
102 len, i + 1);
Marton Nemetha6b69e42009-11-02 08:05:51 -0300103 *sof_read = 0;
Hans de Goede327c4ab2008-09-03 17:12:14 -0300104 return m + i + 1;
Marton Nemethe0d49e22009-10-05 05:41:30 -0300105 break;
106 case 0xff:
Marton Nemetha6b69e42009-11-02 08:05:51 -0300107 *sof_read = 2;
Marton Nemethe0d49e22009-10-05 05:41:30 -0300108 break;
109 default:
Marton Nemetha6b69e42009-11-02 08:05:51 -0300110 *sof_read = 0;
Hans de Goede327c4ab2008-09-03 17:12:14 -0300111 }
Marton Nemethe0d49e22009-10-05 05:41:30 -0300112 break;
113 default:
Marton Nemetha6b69e42009-11-02 08:05:51 -0300114 *sof_read = 0;
Hans de Goede327c4ab2008-09-03 17:12:14 -0300115 }
116 }
117
118 return NULL;
119}