⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uvc_ctrl.c

📁 linux camera下的uvc driver驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* *      uvcvideo.c  --  USB Video Class driver * *      Copyright (C) 2005-2006 *          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>#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)#include <linux/uaccess.h>#endif#include <linux/usb.h>#include <linux/videodev.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_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_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_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_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_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_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,	},};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[] = {	{ 1, "Manual Mode" },	{ 2, "Auto 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,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_BOOLEAN,		.data_type	= UVC_CTRL_DATA_TYPE_BOOLEAN,	},	{		.id		= V4L2_CID_WHITE_BALANCE_TEMPERATURE,		.name		= "White Balance Temperature",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_TEMPERATURE_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_AUTO_WHITE_BALANCE,		.name		= "White Balance Component, Auto",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,		.size		= 1,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_BOOLEAN,		.data_type	= UVC_CTRL_DATA_TYPE_BOOLEAN,	},	{		.id		= V4L2_CID_BLUE_BALANCE,		.name		= "White Balance Blue Component",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_COMPONENT_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_SIGNED,	},	{		.id		= V4L2_CID_RED_BALANCE,		.name		= "White Balance Red Component",		.entity		= UVC_GUID_UVC_PROCESSING,		.selector	= PU_WHITE_BALANCE_COMPONENT_CONTROL,		.size		= 16,		.offset		= 16,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_SIGNED,	},	{		.id		= V4L2_CID_FOCUS_ABSOLUTE,		.name		= "Focus (absolute)",		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_FOCUS_ABSOLUTE_CONTROL,		.size		= 16,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,	},	{		.id		= V4L2_CID_FOCUS_AUTO,		.name		= "Focus, Auto",		.entity		= UVC_GUID_UVC_CAMERA,		.selector	= CT_FOCUS_AUTO_CONTROL,		.size		= 1,		.offset		= 0,		.v4l2_type	= V4L2_CTRL_TYPE_BOOLEAN,		.data_type	= UVC_CTRL_DATA_TYPE_BOOLEAN,	},};/* ------------------------------------------------------------------------ * Utility functions */static inline __u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id){	return ctrl->data + id * ctrl->info->size;}static inline int uvc_get_bit(const __u8 *data, int bit){	return (data[bit >> 3] >> (bit & 7)) & 1;

⌨️ 快捷键说明

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