v4l2-common.c
来自「omap3 linux 2.6 用nocc去除了冗余代码」· C语言 代码 · 共 733 行 · 第 1/2 页
C
733 行
/* * Video for Linux Two * * A generic video device interface for the LINUX operating system * using a set of device structures/vectors for low level operations. * * This file replaces the videodev.c file that comes with the * regular kernel distribution. * * 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. * * Author: Bill Dirks <bill@thedirks.org> * based on code by Alan Cox, <alan@cymru.net> * *//* * Video capture interface for Linux * * A generic video device interface for the LINUX operating system * using a set of device structures/vectors for low level operations. * * 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. * * Author: Alan Cox, <alan@redhat.com> * * Fixes: *//* * Video4linux 1/2 integration by Justin Schoeman * <justin@suntiger.ee.up.ac.za> * 2.4 PROCFS support ported from 2.4 kernels by * Iñaki García Etxebarria <garetxe@euskalnet.net> * Makefile fix by "W. Michael Petullo" <mike@flyn.org> * 2.4 devfs support ported from 2.4 kernels by * Dan Merillat <dan@merillat.org> * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman) */#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/i2c.h>#include <asm/uaccess.h>#include <asm/system.h>#include <asm/pgtable.h>#include <asm/io.h>#include <asm/div64.h>#define __OLD_VIDIOC_ /* To allow fixing old calls*/#include <media/v4l2-common.h>#include <media/v4l2-chip-ident.h>#include <linux/kmod.h>#include <linux/videodev.h>MODULE_AUTHOR("Bill Dirks, Justin Schoeman, Gerd Knorr");MODULE_DESCRIPTION("misc helper functions for v4l2 device drivers");MODULE_LICENSE("GPL");/* * * V 4 L 2 D R I V E R H E L P E R A P I * *//* * Video Standard Operations (contributed by Michael Schimek) *//* ----------------------------------------------------------------- *//* priority handling */#define V4L2_PRIO_VALID(val) (val == V4L2_PRIORITY_BACKGROUND || \ val == V4L2_PRIORITY_INTERACTIVE || \ val == V4L2_PRIORITY_RECORD)int v4l2_prio_init(struct v4l2_prio_state *global){ memset(global,0,sizeof(*global)); return 0;}EXPORT_SYMBOL(v4l2_prio_init);int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local, enum v4l2_priority new){ if (!V4L2_PRIO_VALID(new)) return -EINVAL; if (*local == new) return 0; atomic_inc(&global->prios[new]); if (V4L2_PRIO_VALID(*local)) atomic_dec(&global->prios[*local]); *local = new; return 0;}EXPORT_SYMBOL(v4l2_prio_change);int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local){ return v4l2_prio_change(global,local,V4L2_PRIORITY_DEFAULT);}EXPORT_SYMBOL(v4l2_prio_open);int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local){ if (V4L2_PRIO_VALID(*local)) atomic_dec(&global->prios[*local]); return 0;}EXPORT_SYMBOL(v4l2_prio_close);enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global){ if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0) return V4L2_PRIORITY_RECORD; if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0) return V4L2_PRIORITY_INTERACTIVE; if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0) return V4L2_PRIORITY_BACKGROUND; return V4L2_PRIORITY_UNSET;}EXPORT_SYMBOL(v4l2_prio_max);int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local){ if (*local < v4l2_prio_max(global)) return -EBUSY; return 0;}EXPORT_SYMBOL(v4l2_prio_check);/* ----------------------------------------------------------------- *//* Helper functions for control handling *//* Check for correctness of the ctrl's value based on the data from struct v4l2_queryctrl and the available menu items. Note that menu_items may be NULL, in that case it is ignored. */int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl, const char **menu_items){ if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED) return -EINVAL; if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED) return -EBUSY; if (qctrl->type == V4L2_CTRL_TYPE_BUTTON || qctrl->type == V4L2_CTRL_TYPE_INTEGER64 || qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS) return 0; if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum) return -ERANGE; if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) { if (menu_items[ctrl->value] == NULL || menu_items[ctrl->value][0] == '\0') return -EINVAL; } return 0;}EXPORT_SYMBOL(v4l2_ctrl_check);/* Returns NULL or a character pointer array containing the menu for the given control ID. The pointer array ends with a NULL pointer. An empty string signifies a menu entry that is invalid. This allows drivers to disable certain options if it is not supported. */const char **v4l2_ctrl_get_menu(u32 id){ static const char *mpeg_audio_sampling_freq[] = { "44.1 kHz", "48 kHz", "32 kHz", NULL }; static const char *mpeg_audio_encoding[] = { "Layer I", "Layer II", "Layer III", NULL }; static const char *mpeg_audio_l1_bitrate[] = { "32 kbps", "64 kbps", "96 kbps", "128 kbps", "160 kbps", "192 kbps", "224 kbps", "256 kbps", "288 kbps", "320 kbps", "352 kbps", "384 kbps", "416 kbps", "448 kbps", NULL }; static const char *mpeg_audio_l2_bitrate[] = { "32 kbps", "48 kbps", "56 kbps", "64 kbps", "80 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", "192 kbps", "224 kbps", "256 kbps", "320 kbps", "384 kbps", NULL }; static const char *mpeg_audio_l3_bitrate[] = { "32 kbps", "40 kbps", "48 kbps", "56 kbps", "64 kbps", "80 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", "192 kbps", "224 kbps", "256 kbps", "320 kbps", NULL }; static const char *mpeg_audio_mode[] = { "Stereo", "Joint Stereo", "Dual", "Mono", NULL }; static const char *mpeg_audio_mode_extension[] = { "Bound 4", "Bound 8", "Bound 12", "Bound 16", NULL }; static const char *mpeg_audio_emphasis[] = { "No Emphasis", "50/15 us", "CCITT J17", NULL }; static const char *mpeg_audio_crc[] = { "No CRC", "16-bit CRC", NULL }; static const char *mpeg_video_encoding[] = { "MPEG-1", "MPEG-2", NULL }; static const char *mpeg_video_aspect[] = { "1x1", "4x3", "16x9", "2.21x1", NULL }; static const char *mpeg_video_bitrate_mode[] = { "Variable Bitrate", "Constant Bitrate", NULL }; static const char *mpeg_stream_type[] = { "MPEG-2 Program Stream", "MPEG-2 Transport Stream", "MPEG-1 System Stream", "MPEG-2 DVD-compatible Stream", "MPEG-1 VCD-compatible Stream", "MPEG-2 SVCD-compatible Stream", NULL }; static const char *mpeg_stream_vbi_fmt[] = { "No VBI", "Private packet, IVTV format", NULL }; switch (id) { case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return mpeg_audio_sampling_freq; case V4L2_CID_MPEG_AUDIO_ENCODING: return mpeg_audio_encoding; case V4L2_CID_MPEG_AUDIO_L1_BITRATE: return mpeg_audio_l1_bitrate; case V4L2_CID_MPEG_AUDIO_L2_BITRATE: return mpeg_audio_l2_bitrate; case V4L2_CID_MPEG_AUDIO_L3_BITRATE: return mpeg_audio_l3_bitrate; case V4L2_CID_MPEG_AUDIO_MODE: return mpeg_audio_mode; case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return mpeg_audio_mode_extension; case V4L2_CID_MPEG_AUDIO_EMPHASIS: return mpeg_audio_emphasis; case V4L2_CID_MPEG_AUDIO_CRC: return mpeg_audio_crc; case V4L2_CID_MPEG_VIDEO_ENCODING: return mpeg_video_encoding; case V4L2_CID_MPEG_VIDEO_ASPECT: return mpeg_video_aspect; case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: return mpeg_video_bitrate_mode; case V4L2_CID_MPEG_STREAM_TYPE: return mpeg_stream_type; case V4L2_CID_MPEG_STREAM_VBI_FMT: return mpeg_stream_vbi_fmt; default: return NULL; }}EXPORT_SYMBOL(v4l2_ctrl_get_menu);/* Fill in a struct v4l2_queryctrl */int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def){ const char *name; qctrl->flags = 0; switch (qctrl->id) { /* USER controls */ case V4L2_CID_USER_CLASS: name = "User Controls"; break; case V4L2_CID_AUDIO_VOLUME: name = "Volume"; break; case V4L2_CID_AUDIO_MUTE: name = "Mute"; break; case V4L2_CID_AUDIO_BALANCE: name = "Balance"; break; case V4L2_CID_AUDIO_BASS: name = "Bass"; break; case V4L2_CID_AUDIO_TREBLE: name = "Treble"; break; case V4L2_CID_AUDIO_LOUDNESS: name = "Loudness"; break; case V4L2_CID_BRIGHTNESS: name = "Brightness"; break; case V4L2_CID_CONTRAST: name = "Contrast"; break; case V4L2_CID_SATURATION: name = "Saturation"; break; case V4L2_CID_HUE: name = "Hue"; break; /* MPEG controls */ case V4L2_CID_MPEG_CLASS: name = "MPEG Encoder Controls"; break; case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: name = "Audio Sampling Frequency"; break; case V4L2_CID_MPEG_AUDIO_ENCODING: name = "Audio Encoding Layer"; break; case V4L2_CID_MPEG_AUDIO_L1_BITRATE: name = "Audio Layer I Bitrate"; break; case V4L2_CID_MPEG_AUDIO_L2_BITRATE: name = "Audio Layer II Bitrate"; break; case V4L2_CID_MPEG_AUDIO_L3_BITRATE: name = "Audio Layer III Bitrate"; break; case V4L2_CID_MPEG_AUDIO_MODE: name = "Audio Stereo Mode"; break; case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: name = "Audio Stereo Mode Extension"; break; case V4L2_CID_MPEG_AUDIO_EMPHASIS: name = "Audio Emphasis"; break; case V4L2_CID_MPEG_AUDIO_CRC: name = "Audio CRC"; break; case V4L2_CID_MPEG_AUDIO_MUTE: name = "Audio Mute"; break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?