xref: /openbmc/linux/drivers/media/usb/gspca/sn9c2028.h (revision c942fddf)
1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
20c0d06caSMauro Carvalho Chehab /*
30c0d06caSMauro Carvalho Chehab  * SN9C2028 common functions
40c0d06caSMauro Carvalho Chehab  *
50c0d06caSMauro Carvalho Chehab  * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn,edu>
60c0d06caSMauro Carvalho Chehab  *
70c0d06caSMauro Carvalho Chehab  * Based closely upon the file gspca/pac_common.h
80c0d06caSMauro Carvalho Chehab  */
90c0d06caSMauro Carvalho Chehab 
10d8fd9f56SVasily Khoruzhick static const unsigned char sn9c2028_sof_marker[] = {
11d8fd9f56SVasily Khoruzhick 	0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96,
12d8fd9f56SVasily Khoruzhick 	0x00,
13d8fd9f56SVasily Khoruzhick 	0x00, /* seq */
14d8fd9f56SVasily Khoruzhick 	0x00,
15d8fd9f56SVasily Khoruzhick 	0x00,
16d8fd9f56SVasily Khoruzhick 	0x00, /* avg luminance lower 8 bit */
17d8fd9f56SVasily Khoruzhick 	0x00, /* avg luminance higher 8 bit */
18d8fd9f56SVasily Khoruzhick };
190c0d06caSMauro Carvalho Chehab 
sn9c2028_find_sof(struct gspca_dev * gspca_dev,unsigned char * m,int len)200c0d06caSMauro Carvalho Chehab static unsigned char *sn9c2028_find_sof(struct gspca_dev *gspca_dev,
210c0d06caSMauro Carvalho Chehab 					unsigned char *m, int len)
220c0d06caSMauro Carvalho Chehab {
230c0d06caSMauro Carvalho Chehab 	struct sd *sd = (struct sd *) gspca_dev;
240c0d06caSMauro Carvalho Chehab 	int i;
250c0d06caSMauro Carvalho Chehab 
260c0d06caSMauro Carvalho Chehab 	/* Search for the SOF marker (fixed part) in the header */
270c0d06caSMauro Carvalho Chehab 	for (i = 0; i < len; i++) {
28d8fd9f56SVasily Khoruzhick 		if ((m[i] == sn9c2028_sof_marker[sd->sof_read]) ||
29d8fd9f56SVasily Khoruzhick 		    (sd->sof_read > 5)) {
300c0d06caSMauro Carvalho Chehab 			sd->sof_read++;
31d8fd9f56SVasily Khoruzhick 			if (sd->sof_read == 11)
32d8fd9f56SVasily Khoruzhick 				sd->avg_lum_l = m[i];
33d8fd9f56SVasily Khoruzhick 			if (sd->sof_read == 12)
34d8fd9f56SVasily Khoruzhick 				sd->avg_lum = (m[i] << 8) + sd->avg_lum_l;
350c0d06caSMauro Carvalho Chehab 			if (sd->sof_read == sizeof(sn9c2028_sof_marker)) {
3637d5efb0SJoe Perches 				gspca_dbg(gspca_dev, D_FRAM,
3737d5efb0SJoe Perches 					  "SOF found, bytes to analyze: %u - Frame starts at byte #%u\n",
380c0d06caSMauro Carvalho Chehab 					  len, i + 1);
390c0d06caSMauro Carvalho Chehab 				sd->sof_read = 0;
400c0d06caSMauro Carvalho Chehab 				return m + i + 1;
410c0d06caSMauro Carvalho Chehab 			}
420c0d06caSMauro Carvalho Chehab 		} else {
430c0d06caSMauro Carvalho Chehab 			sd->sof_read = 0;
440c0d06caSMauro Carvalho Chehab 		}
450c0d06caSMauro Carvalho Chehab 	}
460c0d06caSMauro Carvalho Chehab 
470c0d06caSMauro Carvalho Chehab 	return NULL;
480c0d06caSMauro Carvalho Chehab }
49