162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* Linux driver for Philips webcam 362306a36Sopenharmony_ci Various miscellaneous functions and tables. 462306a36Sopenharmony_ci (C) 1999-2003 Nemosoft Unv. 562306a36Sopenharmony_ci (C) 2004-2006 Luc Saillard (luc@saillard.org) 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx 862306a36Sopenharmony_ci driver and thus may have bugs that are not present in the original version. 962306a36Sopenharmony_ci Please send bug reports and support requests to <luc@saillard.org>. 1062306a36Sopenharmony_ci The decompression routines have been implemented by reverse-engineering the 1162306a36Sopenharmony_ci Nemosoft binary pwcx module. Caveat emptor. 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci*/ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "pwc.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciconst int pwc_image_sizes[PSZ_MAX][2] = 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci { 128, 96 }, /* sqcif */ 2162306a36Sopenharmony_ci { 160, 120 }, /* qsif */ 2262306a36Sopenharmony_ci { 176, 144 }, /* qcif */ 2362306a36Sopenharmony_ci { 320, 240 }, /* sif */ 2462306a36Sopenharmony_ci { 352, 288 }, /* cif */ 2562306a36Sopenharmony_ci { 640, 480 }, /* vga */ 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* x,y -> PSZ_ */ 2962306a36Sopenharmony_ciint pwc_get_size(struct pwc_device *pdev, int width, int height) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci int i; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci /* Find the largest size supported by the camera that fits into the 3462306a36Sopenharmony_ci requested size. */ 3562306a36Sopenharmony_ci for (i = PSZ_MAX - 1; i >= 0; i--) { 3662306a36Sopenharmony_ci if (!(pdev->image_mask & (1 << i))) 3762306a36Sopenharmony_ci continue; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci if (pwc_image_sizes[i][0] <= width && 4062306a36Sopenharmony_ci pwc_image_sizes[i][1] <= height) 4162306a36Sopenharmony_ci return i; 4262306a36Sopenharmony_ci } 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci /* No mode found, return the smallest mode we have */ 4562306a36Sopenharmony_ci for (i = 0; i < PSZ_MAX; i++) { 4662306a36Sopenharmony_ci if (pdev->image_mask & (1 << i)) 4762306a36Sopenharmony_ci return i; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci /* Never reached there always is at least one supported mode */ 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* initialize variables depending on type and decompressor */ 5562306a36Sopenharmony_civoid pwc_construct(struct pwc_device *pdev) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci if (DEVICE_USE_CODEC1(pdev->type)) { 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QCIF | 1 << PSZ_CIF; 6062306a36Sopenharmony_ci pdev->vcinterface = 2; 6162306a36Sopenharmony_ci pdev->vendpoint = 4; 6262306a36Sopenharmony_ci pdev->frame_header_size = 0; 6362306a36Sopenharmony_ci pdev->frame_trailer_size = 0; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci } else if (DEVICE_USE_CODEC3(pdev->type)) { 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA; 6862306a36Sopenharmony_ci pdev->vcinterface = 3; 6962306a36Sopenharmony_ci pdev->vendpoint = 5; 7062306a36Sopenharmony_ci pdev->frame_header_size = TOUCAM_HEADER_SIZE; 7162306a36Sopenharmony_ci pdev->frame_trailer_size = TOUCAM_TRAILER_SIZE; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci } else /* if (DEVICE_USE_CODEC2(pdev->type)) */ { 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA; 7662306a36Sopenharmony_ci pdev->vcinterface = 3; 7762306a36Sopenharmony_ci pdev->vendpoint = 4; 7862306a36Sopenharmony_ci pdev->frame_header_size = 0; 7962306a36Sopenharmony_ci pdev->frame_trailer_size = 0; 8062306a36Sopenharmony_ci } 8162306a36Sopenharmony_ci} 82