162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * SN9C2028 common functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn,edu> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Based closely upon the file gspca/pac_common.h 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic const unsigned char sn9c2028_sof_marker[] = { 1162306a36Sopenharmony_ci 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 1262306a36Sopenharmony_ci 0x00, 1362306a36Sopenharmony_ci 0x00, /* seq */ 1462306a36Sopenharmony_ci 0x00, 1562306a36Sopenharmony_ci 0x00, 1662306a36Sopenharmony_ci 0x00, /* avg luminance lower 8 bit */ 1762306a36Sopenharmony_ci 0x00, /* avg luminance higher 8 bit */ 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic unsigned char *sn9c2028_find_sof(struct gspca_dev *gspca_dev, 2162306a36Sopenharmony_ci unsigned char *m, int len) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 2462306a36Sopenharmony_ci int i; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci /* Search for the SOF marker (fixed part) in the header */ 2762306a36Sopenharmony_ci for (i = 0; i < len; i++) { 2862306a36Sopenharmony_ci if ((m[i] == sn9c2028_sof_marker[sd->sof_read]) || 2962306a36Sopenharmony_ci (sd->sof_read > 5)) { 3062306a36Sopenharmony_ci sd->sof_read++; 3162306a36Sopenharmony_ci if (sd->sof_read == 11) 3262306a36Sopenharmony_ci sd->avg_lum_l = m[i]; 3362306a36Sopenharmony_ci if (sd->sof_read == 12) 3462306a36Sopenharmony_ci sd->avg_lum = (m[i] << 8) + sd->avg_lum_l; 3562306a36Sopenharmony_ci if (sd->sof_read == sizeof(sn9c2028_sof_marker)) { 3662306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_FRAM, 3762306a36Sopenharmony_ci "SOF found, bytes to analyze: %u - Frame starts at byte #%u\n", 3862306a36Sopenharmony_ci len, i + 1); 3962306a36Sopenharmony_ci sd->sof_read = 0; 4062306a36Sopenharmony_ci return m + i + 1; 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci } else { 4362306a36Sopenharmony_ci sd->sof_read = 0; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci return NULL; 4862306a36Sopenharmony_ci} 49