uvc_ctrl.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,409 行 · 第 1/3 页

C
1,409
字号
/* *      uvc_ctrl.c  --  USB Video Class driver - Controls * *      Copyright (C) 2005-2008 *          Laurent Pinchart (laurent.pinchart@skynet.be) * *      This program is free software; you can redistribute it and/or modify *      it under the terms of the GNU General Public License as published by *      the Free Software Foundation; either version 2 of the License, or *      (at your option) any later version. * */#include <linux/kernel.h>#include <linux/version.h>#include <linux/list.h>#include <linux/module.h>#include <linux/uaccess.h>#include <linux/usb.h>#include <linux/videodev2.h>#include <linux/vmalloc.h>#include <linux/wait.h>#include <asm/atomic.h>#include "uvcvideo.h"#define UVC_CTRL_NDATA		2#define UVC_CTRL_DATA_CURRENT	0#define UVC_CTRL_DATA_BACKUP	1/* ------------------------------------------------------------------------ * Control, formats, ... */static struct uvc_control_info uvc_ctrls[] = {	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_BRIGHTNESS_CONTROL,		.index		= 0,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_CONTRAST_CONTROL,		.index		= 1,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_HUE_CONTROL,		.index		= 2,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_SATURATION_CONTROL,		.index		= 3,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_SHARPNESS_CONTROL,		.index		= 4,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_GAMMA_CONTROL,		.index		= 5,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_TEMPERATURE_CONTROL,		.index		= 6,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_COMPONENT_CONTROL,		.index		= 7,		.size		= 4,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_BACKLIGHT_COMPENSATION_CONTROL,		.index		= 8,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_GAIN_CONTROL,		.index		= 9,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_POWER_LINE_FREQUENCY_CONTROL,		.index		= 10,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_HUE_AUTO_CONTROL,		.index		= 11,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,		.index		= 12,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,		.index		= 13,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_DIGITAL_MULTIPLIER_CONTROL,		.index		= 14,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL,		.index		= 15,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_ANALOG_VIDEO_STANDARD_CONTROL,		.index		= 16,		.size		= 1,		.flags		= UVC_CONTROL_GET_CUR,	},	{		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_ANALOG_LOCK_STATUS_CONTROL,		.index		= 17,		.size		= 1,		.flags		= UVC_CONTROL_GET_CUR,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_SCANNING_MODE_CONTROL,		.index		= 0,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_AE_MODE_CONTROL,		.index		= 1,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_GET_DEF | UVC_CONTROL_GET_RES				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_AE_PRIORITY_CONTROL,		.index		= 2,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,		.index		= 3,		.size		= 4,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_EXPOSURE_TIME_RELATIVE_CONTROL,		.index		= 4,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_FOCUS_ABSOLUTE_CONTROL,		.index		= 5,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_FOCUS_RELATIVE_CONTROL,		.index		= 6,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_IRIS_ABSOLUTE_CONTROL,		.index		= 7,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_IRIS_RELATIVE_CONTROL,		.index		= 8,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_ZOOM_ABSOLUTE_CONTROL,		.index		= 9,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_ZOOM_RELATIVE_CONTROL,		.index		= 10,		.size		= 3,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_PANTILT_ABSOLUTE_CONTROL,		.index		= 11,		.size		= 8,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_PANTILT_RELATIVE_CONTROL,		.index		= 12,		.size		= 4,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_ROLL_ABSOLUTE_CONTROL,		.index		= 13,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_ROLL_RELATIVE_CONTROL,		.index		= 14,		.size		= 2,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE				| UVC_CONTROL_AUTO_UPDATE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_FOCUS_AUTO_CONTROL,		.index		= 17,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE,	},	{		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_PRIVACY_CONTROL,		.index		= 18,		.size		= 1,		.flags		= UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR				| UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE,	},};static struct uvc_menu_info power_line_frequency_controls[] = {	{ 0, "Disabled" },	{ 1, "50 Hz" },	{ 2, "60 Hz" },};static struct uvc_menu_info exposure_auto_controls[] = {	{ 2, "Auto Mode" },	{ 1, "Manual Mode" },	{ 4, "Shutter Priority Mode" },	{ 8, "Aperture Priority Mode" },};static struct uvc_control_mapping uvc_ctrl_mappings[] = {	{		.id		= V4L2_CID_BRIGHTNESS,		.name		= "Brightness",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_BRIGHTNESS_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_SIGNED,	},	{		.id		= V4L2_CID_CONTRAST,		.name		= "Contrast",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_CONTRAST_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_HUE,		.name		= "Hue",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_HUE_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_SIGNED,	},	{		.id		= V4L2_CID_SATURATION,		.name		= "Saturation",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_SATURATION_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_SHARPNESS,		.name		= "Sharpness",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_SHARPNESS_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_GAMMA,		.name		= "Gamma",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_GAMMA_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_BACKLIGHT_COMPENSATION,		.name		= "Backlight Compensation",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_BACKLIGHT_COMPENSATION_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_GAIN,		.name		= "Gain",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_GAIN_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_POWER_LINE_FREQUENCY,		.name		= "Power Line Frequency",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_POWER_LINE_FREQUENCY_CONTROL,		.size		= 2,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_MENU,		.data_type	= UVC_CTRL_DATA_TYPE_ENUM,		.menu_info	= power_line_frequency_controls,		.menu_count	= ARRAY_SIZE(power_line_frequency_controls),	},	{		.id		= V4L2_CID_HUE_AUTO,		.name		= "Hue, Auto",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_HUE_AUTO_CONTROL,		.size		= 1,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_BOOLEAN,		.data_type	= UVC_CTRL_DATA_TYPE_BOOLEAN,	},	{		.id		= V4L2_CID_EXPOSURE_AUTO,		.name		= "Exposure, Auto",		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_AE_MODE_CONTROL,		.size		= 4,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_MENU,		.data_type	= UVC_CTRL_DATA_TYPE_BITMASK,		.menu_info	= exposure_auto_controls,		.menu_count	= ARRAY_SIZE(exposure_auto_controls),	},	{		.id		= V4L2_CID_EXPOSURE_AUTO_PRIORITY,		.name		= "Exposure, Auto Priority",		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_AE_PRIORITY_CONTROL,		.size		= 1,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_BOOLEAN,		.data_type	= UVC_CTRL_DATA_TYPE_BOOLEAN,	},	{		.id		= V4L2_CID_EXPOSURE_ABSOLUTE,		.name		= "Exposure (Absolute)",		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,		.size		= 32,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_AUTO_WHITE_BALANCE,		.name		= "White Balance Temperature, Auto",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,		.size		= 1,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?