mirror of
https://github.com/pvvx/RTL00MP3.git
synced 2025-07-31 12:41:06 +00:00
add and update
This commit is contained in:
parent
03ed2886cb
commit
bda4d33012
109 changed files with 73065 additions and 85 deletions
105
RTL00_SDKV35a/component/common/video/v4l2/inc/media-device.h
Normal file
105
RTL00_SDKV35a/component/common/video/v4l2/inc/media-device.h
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Media device
|
||||
*
|
||||
* Copyright (C) 2010 Nokia Corporation
|
||||
*
|
||||
* Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
* Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _MEDIA_DEVICE_H
|
||||
#define _MEDIA_DEVICE_H
|
||||
|
||||
#if 0
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/spinlock.h>
|
||||
#endif
|
||||
|
||||
#include "v4l2-osdep.h"
|
||||
#include "media-devnode.h"
|
||||
#include "media-entity.h"
|
||||
|
||||
|
||||
//struct device;
|
||||
|
||||
/**
|
||||
* struct media_device - Media device
|
||||
* @dev: Parent device
|
||||
* @devnode: Media device node
|
||||
* @model: Device model name
|
||||
* @serial: Device serial number (optional)
|
||||
* @bus_info: Unique and stable device location identifier
|
||||
* @hw_revision: Hardware device revision
|
||||
* @driver_version: Device driver version
|
||||
* @entity_id: ID of the next entity to be registered
|
||||
* @entities: List of registered entities
|
||||
* @lock: Entities list lock
|
||||
* @graph_mutex: Entities graph operation lock
|
||||
* @link_notify: Link state change notification callback
|
||||
*
|
||||
* This structure represents an abstract high-level media device. It allows easy
|
||||
* access to entities and provides basic media device-level support. The
|
||||
* structure can be allocated directly or embedded in a larger structure.
|
||||
*
|
||||
* The parent @dev is a physical device. It must be set before registering the
|
||||
* media device.
|
||||
*
|
||||
* @model is a descriptive model name exported through sysfs. It doesn't have to
|
||||
* be unique.
|
||||
*/
|
||||
struct media_device {
|
||||
/* dev->driver_data points to this struct. */
|
||||
//struct device *dev;
|
||||
struct media_devnode devnode;
|
||||
|
||||
char model[32];
|
||||
char serial[40];
|
||||
char bus_info[32];
|
||||
u32 hw_revision;
|
||||
u32 driver_version;
|
||||
|
||||
u32 entity_id;
|
||||
struct list_head entities;
|
||||
|
||||
/* Protects the entities list */
|
||||
spinlock_t lock;
|
||||
/* Serializes graph operations. */
|
||||
//struct mutex graph_mutex;
|
||||
_Mutex graph_mutex;
|
||||
|
||||
int (*link_notify)(struct media_link *link, u32 flags, unsigned int notification);
|
||||
};
|
||||
|
||||
/* Supported link_notify @notification values. */
|
||||
#define MEDIA_DEV_NOTIFY_PRE_LINK_CH 0
|
||||
#define MEDIA_DEV_NOTIFY_POST_LINK_CH 1
|
||||
|
||||
/* media_devnode to media_device */
|
||||
#define to_media_device(node) container_of(node, struct media_device, devnode)
|
||||
|
||||
int media_device_register(struct media_device *mdev);
|
||||
void media_device_unregister(struct media_device *mdev);
|
||||
|
||||
int media_device_register_entity(struct media_device *mdev,
|
||||
struct media_entity *entity);
|
||||
void media_device_unregister_entity(struct media_entity *entity);
|
||||
|
||||
/* Iterate over all entities. */
|
||||
#define media_device_for_each_entity(entity, mdev, type) \
|
||||
list_for_each_entry(entity, &(mdev)->entities, list, type)
|
||||
|
||||
#endif
|
104
RTL00_SDKV35a/component/common/video/v4l2/inc/media-devnode.h
Normal file
104
RTL00_SDKV35a/component/common/video/v4l2/inc/media-devnode.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Media device node
|
||||
*
|
||||
* Copyright (C) 2010 Nokia Corporation
|
||||
*
|
||||
* Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
* Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* --
|
||||
*
|
||||
* Common functions for media-related drivers to register and unregister media
|
||||
* device nodes.
|
||||
*/
|
||||
|
||||
#ifndef _MEDIA_DEVNODE_H
|
||||
#define _MEDIA_DEVNODE_H
|
||||
|
||||
#if 0
|
||||
#include <linux/poll.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/cdev.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Flag to mark the media_devnode struct as registered. Drivers must not touch
|
||||
* this flag directly, it will be set and cleared by media_devnode_register and
|
||||
* media_devnode_unregister.
|
||||
*/
|
||||
#define MEDIA_FLAG_REGISTERED 0
|
||||
|
||||
struct media_file_operations {
|
||||
//struct module *owner;
|
||||
#if 0
|
||||
ssize_t (*read) (char __user *, size_t, loff_t *);
|
||||
ssize_t (*write) (const char __user *, size_t, loff_t *);
|
||||
unsigned int (*poll) (struct poll_table_struct *);
|
||||
#endif
|
||||
long (*ioctl) (unsigned int, unsigned long);
|
||||
long (*compat_ioctl) (unsigned int, unsigned long);
|
||||
int (*open) ();
|
||||
int (*release) ();
|
||||
};
|
||||
|
||||
/**
|
||||
* struct media_devnode - Media device node
|
||||
* @parent: parent device
|
||||
* @minor: device node minor number
|
||||
* @flags: flags, combination of the MEDIA_FLAG_* constants
|
||||
*
|
||||
* This structure represents a media-related device node.
|
||||
*
|
||||
* The @parent is a physical device. It must be set by core or device drivers
|
||||
* before registering the node.
|
||||
*/
|
||||
struct media_devnode {
|
||||
/* device ops */
|
||||
const struct media_file_operations *fops;
|
||||
|
||||
/* sysfs */
|
||||
#if 0
|
||||
struct device dev; /* media device */
|
||||
struct cdev cdev; /* character device */
|
||||
struct device *parent; /* device parent */
|
||||
#endif
|
||||
/* device info */
|
||||
int minor;
|
||||
unsigned long flags; /* Use bitops to access flags */
|
||||
|
||||
/* callbacks */
|
||||
void (*release)(struct media_devnode *mdev);
|
||||
};
|
||||
|
||||
/* dev to media_devnode */
|
||||
#define to_media_devnode(minor) container_of(minor, struct media_devnode, dev)
|
||||
|
||||
int media_devnode_register(struct media_devnode *mdev);
|
||||
void media_devnode_unregister(struct media_devnode *mdev);
|
||||
#if 0
|
||||
static inline struct media_devnode *media_devnode_data()
|
||||
{
|
||||
return private_data;
|
||||
}
|
||||
#endif
|
||||
static inline int media_devnode_is_registered(struct media_devnode *mdev)
|
||||
{
|
||||
return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags);
|
||||
}
|
||||
|
||||
#endif /* _MEDIA_DEVNODE_H */
|
164
RTL00_SDKV35a/component/common/video/v4l2/inc/media-entity.h
Normal file
164
RTL00_SDKV35a/component/common/video/v4l2/inc/media-entity.h
Normal file
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* Media entity
|
||||
*
|
||||
* Copyright (C) 2010 Nokia Corporation
|
||||
*
|
||||
* Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
* Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _MEDIA_ENTITY_H
|
||||
#define _MEDIA_ENTITY_H
|
||||
|
||||
#if 0
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/media.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
|
||||
|
||||
struct media_pipeline {
|
||||
int media_test;
|
||||
};
|
||||
|
||||
struct media_link {
|
||||
struct media_pad *source; /* Source pad */
|
||||
struct media_pad *sink; /* Sink pad */
|
||||
struct media_link *reverse; /* Link in the reverse direction */
|
||||
unsigned long flags; /* Link flags (MEDIA_LNK_FL_*) */
|
||||
};
|
||||
|
||||
struct media_pad {
|
||||
struct media_entity *entity; /* Entity this pad belongs to */
|
||||
u16 index; /* Pad index in the entity pads array */
|
||||
unsigned long flags; /* Pad flags (MEDIA_PAD_FL_*) */
|
||||
};
|
||||
|
||||
struct media_entity_operations {
|
||||
int (*link_setup)(struct media_entity *entity,
|
||||
const struct media_pad *local,
|
||||
const struct media_pad *remote, u32 flags);
|
||||
int (*link_validate)(struct media_link *link);
|
||||
};
|
||||
|
||||
struct media_entity {
|
||||
//struct LISlist;
|
||||
struct media_device *parent; /* Media device this entity belongs to*/
|
||||
u32 id; /* Entity ID, unique in the parent media
|
||||
* device context */
|
||||
const char *name; /* Entity name */
|
||||
u32 type; /* Entity type (MEDIA_ENT_T_*) */
|
||||
u32 revision; /* Entity revision, driver specific */
|
||||
unsigned long flags; /* Entity flags (MEDIA_ENT_FL_*) */
|
||||
u32 group_id; /* Entity group ID */
|
||||
|
||||
u16 num_pads; /* Number of sink and source pads */
|
||||
u16 num_links; /* Number of existing links, both
|
||||
* enabled and disabled */
|
||||
u16 num_backlinks; /* Number of backlinks */
|
||||
u16 max_links; /* Maximum number of links */
|
||||
|
||||
struct media_pad *pads; /* Pads array (num_pads elements) */
|
||||
struct media_link *links; /* Links array (max_links elements)*/
|
||||
|
||||
const struct media_entity_operations *ops; /* Entity operations */
|
||||
|
||||
/* Reference counts must never be negative, but are signed integers on
|
||||
* purpose: a simple WARN_ON(<0) check can be used to detect reference
|
||||
* count bugs that would make them negative.
|
||||
*/
|
||||
int stream_count; /* Stream count for the entity. */
|
||||
int use_count; /* Use count for the entity. */
|
||||
|
||||
struct media_pipeline *pipe; /* Pipeline this entity belongs to. */
|
||||
|
||||
union {
|
||||
/* Node specifications */
|
||||
struct {
|
||||
u32 major;
|
||||
u32 minor;
|
||||
} v4l;
|
||||
struct {
|
||||
u32 major;
|
||||
u32 minor;
|
||||
} fb;
|
||||
struct {
|
||||
u32 card;
|
||||
u32 device;
|
||||
u32 subdevice;
|
||||
} alsa;
|
||||
int dvb;
|
||||
|
||||
/* Sub-device specifications */
|
||||
/* Nothing needed yet */
|
||||
} info;
|
||||
};
|
||||
#if 0
|
||||
static inline u32 media_entity_type(struct media_entity *entity)
|
||||
{
|
||||
return entity->type & MEDIA_ENT_TYPE_MASK;
|
||||
}
|
||||
|
||||
static inline u32 media_entity_subtype(struct media_entity *entity)
|
||||
{
|
||||
return entity->type & MEDIA_ENT_SUBTYPE_MASK;
|
||||
}
|
||||
|
||||
#define MEDIA_ENTITY_ENUM_MAX_DEPTH 16
|
||||
#define MEDIA_ENTITY_ENUM_MAX_ID 64
|
||||
|
||||
struct media_entity_graph {
|
||||
struct {
|
||||
struct media_entity *entity;
|
||||
int link;
|
||||
} stack[MEDIA_ENTITY_ENUM_MAX_DEPTH];
|
||||
|
||||
DECLARE_BITMAP(entities, MEDIA_ENTITY_ENUM_MAX_ID);
|
||||
int top;
|
||||
};
|
||||
|
||||
int media_entity_init(struct media_entity *entity, u16 num_pads,
|
||||
struct media_pad *pads, u16 extra_links);
|
||||
void media_entity_cleanup(struct media_entity *entity);
|
||||
|
||||
int media_entity_create_link(struct media_entity *source, u16 source_pad,
|
||||
struct media_entity *sink, u16 sink_pad, u32 flags);
|
||||
void __media_entity_remove_links(struct media_entity *entity);
|
||||
void media_entity_remove_links(struct media_entity *entity);
|
||||
|
||||
int __media_entity_setup_link(struct media_link *link, u32 flags);
|
||||
int media_entity_setup_link(struct media_link *link, u32 flags);
|
||||
struct media_link *media_entity_find_link(struct media_pad *source,
|
||||
struct media_pad *sink);
|
||||
struct media_pad *media_entity_remote_pad(struct media_pad *pad);
|
||||
|
||||
struct media_entity *media_entity_get(struct media_entity *entity);
|
||||
void media_entity_put(struct media_entity *entity);
|
||||
|
||||
void media_entity_graph_walk_start(struct media_entity_graph *graph,
|
||||
struct media_entity *entity);
|
||||
struct media_entity *
|
||||
media_entity_graph_walk_next(struct media_entity_graph *graph);
|
||||
int media_entity_pipeline_start(struct media_entity *entity,
|
||||
struct media_pipeline *pipe);
|
||||
void media_entity_pipeline_stop(struct media_entity *entity);
|
||||
|
||||
#define media_entity_call(entity, operation, args...) \
|
||||
(((entity)->ops && (entity)->ops->operation) ? \
|
||||
(entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* include/linux/v4l2-common.h
|
||||
*
|
||||
* Common V4L2 and V4L2 subdev definitions.
|
||||
*
|
||||
* Users are advised to #include this file either through videodev2.h
|
||||
* (V4L2) or through v4l2-subdev.h (V4L2 subdev) rather than to refer
|
||||
* to this file directly.
|
||||
*
|
||||
* Copyright (C) 2012 Nokia Corporation
|
||||
* Contact: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __V4L2_COMMON__
|
||||
#define __V4L2_COMMON__
|
||||
|
||||
/*
|
||||
*
|
||||
* Selection interface definitions
|
||||
*
|
||||
*/
|
||||
|
||||
/* Current cropping area */
|
||||
#define V4L2_SEL_TGT_CROP 0x0000
|
||||
/* Default cropping area */
|
||||
#define V4L2_SEL_TGT_CROP_DEFAULT 0x0001
|
||||
/* Cropping bounds */
|
||||
#define V4L2_SEL_TGT_CROP_BOUNDS 0x0002
|
||||
/* Current composing area */
|
||||
#define V4L2_SEL_TGT_COMPOSE 0x0100
|
||||
/* Default composing area */
|
||||
#define V4L2_SEL_TGT_COMPOSE_DEFAULT 0x0101
|
||||
/* Composing bounds */
|
||||
#define V4L2_SEL_TGT_COMPOSE_BOUNDS 0x0102
|
||||
/* Current composing area plus all padding pixels */
|
||||
#define V4L2_SEL_TGT_COMPOSE_PADDED 0x0103
|
||||
|
||||
/* Backward compatibility target definitions --- to be removed. */
|
||||
#define V4L2_SEL_TGT_CROP_ACTIVE V4L2_SEL_TGT_CROP
|
||||
#define V4L2_SEL_TGT_COMPOSE_ACTIVE V4L2_SEL_TGT_COMPOSE
|
||||
#define V4L2_SUBDEV_SEL_TGT_CROP_ACTUAL V4L2_SEL_TGT_CROP
|
||||
#define V4L2_SUBDEV_SEL_TGT_COMPOSE_ACTUAL V4L2_SEL_TGT_COMPOSE
|
||||
#define V4L2_SUBDEV_SEL_TGT_CROP_BOUNDS V4L2_SEL_TGT_CROP_BOUNDS
|
||||
#define V4L2_SUBDEV_SEL_TGT_COMPOSE_BOUNDS V4L2_SEL_TGT_COMPOSE_BOUNDS
|
||||
|
||||
/* Selection flags */
|
||||
#define V4L2_SEL_FLAG_GE (1 << 0)
|
||||
#define V4L2_SEL_FLAG_LE (1 << 1)
|
||||
#define V4L2_SEL_FLAG_KEEP_CONFIG (1 << 2)
|
||||
|
||||
/* Backward compatibility flag definitions --- to be removed. */
|
||||
#define V4L2_SUBDEV_SEL_FLAG_SIZE_GE V4L2_SEL_FLAG_GE
|
||||
#define V4L2_SUBDEV_SEL_FLAG_SIZE_LE V4L2_SEL_FLAG_LE
|
||||
#define V4L2_SUBDEV_SEL_FLAG_KEEP_CONFIG V4L2_SEL_FLAG_KEEP_CONFIG
|
||||
|
||||
#endif /* __V4L2_COMMON__ */
|
2225
RTL00_SDKV35a/component/common/video/v4l2/inc/uapi_videodev2.h
Normal file
2225
RTL00_SDKV35a/component/common/video/v4l2/inc/uapi_videodev2.h
Normal file
File diff suppressed because it is too large
Load diff
99
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-async.h
Normal file
99
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-async.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* V4L2 asynchronous subdevice registration API
|
||||
*
|
||||
* Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef V4L2_ASYNC_H
|
||||
#define V4L2_ASYNC_H
|
||||
#if 0
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
|
||||
|
||||
//struct device;
|
||||
//struct device_node;
|
||||
struct v4l2_device;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_async_notifier;
|
||||
|
||||
/* A random max subdevice number, used to allocate an array on stack */
|
||||
#define V4L2_MAX_SUBDEVS 128U
|
||||
|
||||
enum v4l2_async_match_type {
|
||||
V4L2_ASYNC_MATCH_CUSTOM,
|
||||
V4L2_ASYNC_MATCH_DEVNAME,
|
||||
V4L2_ASYNC_MATCH_I2C,
|
||||
V4L2_ASYNC_MATCH_OF,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
|
||||
* @bus_type: subdevice bus type to select the appropriate matching method
|
||||
* @match: union of per-bus type matching data sets
|
||||
* @list: used to link struct v4l2_async_subdev objects, waiting to be
|
||||
* probed, to a notifier->waiting list
|
||||
*/
|
||||
struct v4l2_async_subdev {
|
||||
enum v4l2_async_match_type match_type;
|
||||
union {
|
||||
struct {
|
||||
const struct device_node *node;
|
||||
} of;
|
||||
struct {
|
||||
const char *name;
|
||||
} device_name;
|
||||
struct {
|
||||
int adapter_id;
|
||||
unsigned short address;
|
||||
} i2c;
|
||||
struct {
|
||||
bool (*match)(const char *dev_init_name, struct v4l2_async_subdev *);
|
||||
void *priv;
|
||||
} custom;
|
||||
} match;
|
||||
|
||||
/* v4l2-async core private: not to be used by drivers */
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier - v4l2_device notifier data
|
||||
* @num_subdevs:number of subdevices
|
||||
* @subdevs: array of pointers to subdevice descriptors
|
||||
* @v4l2_dev: pointer to struct v4l2_device
|
||||
* @waiting: list of struct v4l2_async_subdev, waiting for their drivers
|
||||
* @done: list of struct v4l2_subdev, already probed
|
||||
* @list: member in a global list of notifiers
|
||||
* @bound: a subdevice driver has successfully probed one of subdevices
|
||||
* @complete: all subdevices have been probed successfully
|
||||
* @unbind: a subdevice is leaving
|
||||
*/
|
||||
struct v4l2_async_notifier {
|
||||
unsigned int num_subdevs;
|
||||
struct v4l2_async_subdev **subdevs;
|
||||
struct v4l2_device *v4l2_dev;
|
||||
struct list_head waiting;
|
||||
struct list_head done;
|
||||
struct list_head list;
|
||||
int (*bound)(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd);
|
||||
int (*complete)(struct v4l2_async_notifier *notifier);
|
||||
void (*unbind)(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd);
|
||||
};
|
||||
|
||||
int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
|
||||
struct v4l2_async_notifier *notifier);
|
||||
void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier);
|
||||
int v4l2_async_register_subdev(struct v4l2_subdev *sd);
|
||||
void v4l2_async_unregister_subdev(struct v4l2_subdev *sd);
|
||||
#endif
|
59
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-clk.h
Normal file
59
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-clk.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* V4L2 clock service
|
||||
*
|
||||
* Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* ATTENTION: This is a temporary API and it shall be replaced by the generic
|
||||
* clock API, when the latter becomes widely available.
|
||||
*/
|
||||
|
||||
#ifndef MEDIA_V4L2_CLK_H
|
||||
#define MEDIA_V4L2_CLK_H
|
||||
|
||||
#if 0
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
|
||||
|
||||
//struct module;
|
||||
//struct device;
|
||||
|
||||
struct v4l2_clk {
|
||||
struct LIST_HEADER list;
|
||||
const struct v4l2_clk_ops *ops;
|
||||
const char *dev_id;
|
||||
const char *id;
|
||||
int enable;
|
||||
//struct mutex lock; /* Protect the enable count */
|
||||
_Mutex lock;
|
||||
atomic_t use_count;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct v4l2_clk_ops {
|
||||
//struct module *owner;
|
||||
int (*enable)(struct v4l2_clk *clk);
|
||||
void (*disable)(struct v4l2_clk *clk);
|
||||
unsigned long (*get_rate)(struct v4l2_clk *clk);
|
||||
int (*set_rate)(struct v4l2_clk *clk, unsigned long);
|
||||
};
|
||||
|
||||
struct v4l2_clk *v4l2_clk_register(const struct v4l2_clk_ops *ops,
|
||||
const char *dev_name,
|
||||
const char *name, void *priv);
|
||||
void v4l2_clk_unregister(struct v4l2_clk *clk);
|
||||
struct v4l2_clk *v4l2_clk_get(const char *id);
|
||||
void v4l2_clk_put(struct v4l2_clk *clk);
|
||||
int v4l2_clk_enable(struct v4l2_clk *clk);
|
||||
void v4l2_clk_disable(struct v4l2_clk *clk);
|
||||
unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk);
|
||||
int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate);
|
||||
|
||||
#endif
|
210
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-common.h
Normal file
210
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-common.h
Normal file
|
@ -0,0 +1,210 @@
|
|||
/*
|
||||
v4l2 common internal API header
|
||||
|
||||
This header contains internal shared ioctl definitions for use by the
|
||||
internal low-level v4l2 drivers.
|
||||
Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal
|
||||
define,
|
||||
|
||||
Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef V4L2_COMMON_H_
|
||||
#define V4L2_COMMON_H_
|
||||
|
||||
#include "v4l2-dev.h"
|
||||
|
||||
|
||||
/* Common printk constucts for v4l-i2c drivers. These macros create a unique
|
||||
prefix consisting of the driver name, the adapter number and the i2c
|
||||
address. */
|
||||
#if 0
|
||||
#define v4l_printk(level, name, adapter, addr, fmt, arg...) \
|
||||
printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg)
|
||||
|
||||
#define v4l_client_printk(level, client, fmt, arg...) \
|
||||
v4l_printk(level, (client)->driver->driver.name, (client)->adapter, \
|
||||
(client)->addr, fmt , ## arg)
|
||||
|
||||
#define v4l_err(client, fmt, arg...) \
|
||||
v4l_client_printk(KERN_ERR, client, fmt , ## arg)
|
||||
|
||||
#define v4l_warn(client, fmt, arg...) \
|
||||
v4l_client_printk(KERN_WARNING, client, fmt , ## arg)
|
||||
|
||||
#define v4l_info(client, fmt, arg...) \
|
||||
v4l_client_printk(KERN_INFO, client, fmt , ## arg)
|
||||
|
||||
/* These three macros assume that the debug level is set with a module
|
||||
parameter called 'debug'. */
|
||||
#define v4l_dbg(level, debug, client, fmt, arg...) \
|
||||
do { \
|
||||
if (debug >= (level)) \
|
||||
v4l_client_printk(KERN_DEBUG, client, fmt , ## arg); \
|
||||
} while (0)
|
||||
#endif
|
||||
/* ------------------------------------------------------------------------- */
|
||||
#if 0
|
||||
/* These printk constructs can be used with v4l2_device and v4l2_subdev */
|
||||
#define v4l2_printk(level, dev, fmt, arg...) \
|
||||
printk(level "%s: " fmt, (dev)->name , ## arg)
|
||||
|
||||
#define v4l2_err(dev, fmt, arg...) \
|
||||
v4l2_printk(KERN_ERR, dev, fmt , ## arg)
|
||||
|
||||
#define v4l2_warn(dev, fmt, arg...) \
|
||||
v4l2_printk(KERN_WARNING, dev, fmt , ## arg)
|
||||
|
||||
#define v4l2_info(dev, fmt, arg...) \
|
||||
v4l2_printk(KERN_INFO, dev, fmt , ## arg)
|
||||
|
||||
/* These three macros assume that the debug level is set with a module
|
||||
parameter called 'debug'. */
|
||||
#define v4l2_dbg(level, debug, dev, fmt, arg...) \
|
||||
do { \
|
||||
if (debug >= (level)) \
|
||||
v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \
|
||||
} while (0)
|
||||
#endif
|
||||
/* ------------------------------------------------------------------------- */
|
||||
//edit by Ian -- remove control helper functions
|
||||
#if 0
|
||||
/* Control helper functions */
|
||||
|
||||
int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
|
||||
const char * const *menu_items);
|
||||
const char *v4l2_ctrl_get_name(u32 id);
|
||||
const char * const *v4l2_ctrl_get_menu(u32 id);
|
||||
const s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len);
|
||||
int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def);
|
||||
int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu,
|
||||
struct v4l2_queryctrl *qctrl, const char * const *menu_items);
|
||||
#define V4L2_CTRL_MENU_IDS_END (0xffffffff)
|
||||
int v4l2_ctrl_query_menu_valid_items(struct v4l2_querymenu *qmenu, const u32 *ids);
|
||||
#endif
|
||||
/* Note: ctrl_classes points to an array of u32 pointers. Each u32 array is a
|
||||
0-terminated array of control IDs. Each array must be sorted low to high
|
||||
and belong to the same control class. The array of u32 pointers must also
|
||||
be sorted, from low class IDs to high class IDs. */
|
||||
//u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* I2C Helper functions */
|
||||
#if 0
|
||||
struct i2c_driver;
|
||||
struct i2c_adapter;
|
||||
struct i2c_client;
|
||||
struct i2c_device_id;
|
||||
struct v4l2_device;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_subdev_ops;
|
||||
|
||||
|
||||
/* Load an i2c module and return an initialized v4l2_subdev struct.
|
||||
The client_type argument is the name of the chip that's on the adapter. */
|
||||
struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
|
||||
struct i2c_adapter *adapter, const char *client_type,
|
||||
u8 addr, const unsigned short *probe_addrs);
|
||||
|
||||
struct i2c_board_info;
|
||||
|
||||
struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
|
||||
struct i2c_adapter *adapter, struct i2c_board_info *info,
|
||||
const unsigned short *probe_addrs);
|
||||
|
||||
/* Initialize a v4l2_subdev with data from an i2c_client struct */
|
||||
void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
|
||||
const struct v4l2_subdev_ops *ops);
|
||||
/* Return i2c client address of v4l2_subdev. */
|
||||
unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd);
|
||||
|
||||
enum v4l2_i2c_tuner_type {
|
||||
ADDRS_RADIO, /* Radio tuner addresses */
|
||||
ADDRS_DEMOD, /* Demod tuner addresses */
|
||||
ADDRS_TV, /* TV tuner addresses */
|
||||
/* TV tuner addresses if demod is present, this excludes
|
||||
addresses used by the demodulator from the list of
|
||||
candidates. */
|
||||
ADDRS_TV_WITH_DEMOD,
|
||||
};
|
||||
/* Return a list of I2C tuner addresses to probe. Use only if the tuner
|
||||
addresses are unknown. */
|
||||
const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* SPI Helper functions */
|
||||
#if defined(CONFIG_SPI)
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
struct spi_device;
|
||||
|
||||
/* Load an spi module and return an initialized v4l2_subdev struct.
|
||||
The client_type argument is the name of the chip that's on the adapter. */
|
||||
struct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev,
|
||||
struct spi_master *master, struct spi_board_info *info);
|
||||
|
||||
/* Initialize a v4l2_subdev with data from an spi_device struct */
|
||||
void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,
|
||||
const struct v4l2_subdev_ops *ops);
|
||||
#endif
|
||||
#endif
|
||||
/* ------------------------------------------------------------------------- */
|
||||
#if 0
|
||||
/* Note: these remaining ioctls/structs should be removed as well, but they are
|
||||
still used in tuner-simple.c (TUNER_SET_CONFIG), cx18/ivtv (RESET) and
|
||||
v4l2-int-device.h (v4l2_routing). To remove these ioctls some more cleanup
|
||||
is needed in those modules. */
|
||||
|
||||
/* s_config */
|
||||
struct v4l2_priv_tun_config {
|
||||
int tuner;
|
||||
void *priv;
|
||||
};
|
||||
#define TUNER_SET_CONFIG _IOW('d', 92, struct v4l2_priv_tun_config)
|
||||
|
||||
#define VIDIOC_INT_RESET _IOW ('d', 102, u32)
|
||||
|
||||
struct v4l2_routing {
|
||||
u32 input;
|
||||
u32 output;
|
||||
};
|
||||
#endif
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* Miscellaneous helper functions */
|
||||
#if 0
|
||||
void v4l_bound_align_image(u32*w, unsigned int wmin,
|
||||
unsigned int wmax, unsigned int walign,
|
||||
u32 *h, unsigned int hmin,
|
||||
unsigned int hmax, unsigned int halign,
|
||||
unsigned int salign);
|
||||
|
||||
struct v4l2_discrete_probe {
|
||||
const struct v4l2_frmsize_discrete *sizes;
|
||||
int num_sizes;
|
||||
};
|
||||
|
||||
const struct v4l2_frmsize_discrete *v4l2_find_nearest_format(
|
||||
const struct v4l2_discrete_probe *probe,
|
||||
s32 width, s32 height);
|
||||
#endif
|
||||
//void v4l2_get_timestamp(struct timeval *tv);
|
||||
|
||||
#endif /* V4L2_COMMON_H_ */
|
885
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-controls.h
Normal file
885
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-controls.h
Normal file
|
@ -0,0 +1,885 @@
|
|||
/*
|
||||
* Video for Linux Two controls header file
|
||||
*
|
||||
* Copyright (C) 1999-2012 the contributors
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Alternatively you can redistribute this file under the terms of the
|
||||
* BSD license as stated below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. The names of its contributors may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The contents of this header was split off from videodev2.h. All control
|
||||
* definitions should be added to this header, which is included by
|
||||
* videodev2.h.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_V4L2_CONTROLS_H
|
||||
#define __LINUX_V4L2_CONTROLS_H
|
||||
|
||||
/* Control classes */
|
||||
#define V4L2_CTRL_CLASS_USER 0x00980000 /* Old-style 'user' controls */
|
||||
#define V4L2_CTRL_CLASS_MPEG 0x00990000 /* MPEG-compression controls */
|
||||
#define V4L2_CTRL_CLASS_CAMERA 0x009a0000 /* Camera class controls */
|
||||
#define V4L2_CTRL_CLASS_FM_TX 0x009b0000 /* FM Modulator controls */
|
||||
#define V4L2_CTRL_CLASS_FLASH 0x009c0000 /* Camera flash controls */
|
||||
#define V4L2_CTRL_CLASS_JPEG 0x009d0000 /* JPEG-compression controls */
|
||||
#define V4L2_CTRL_CLASS_IMAGE_SOURCE 0x009e0000 /* Image source controls */
|
||||
#define V4L2_CTRL_CLASS_IMAGE_PROC 0x009f0000 /* Image processing controls */
|
||||
#define V4L2_CTRL_CLASS_DV 0x00a00000 /* Digital Video controls */
|
||||
#define V4L2_CTRL_CLASS_FM_RX 0x00a10000 /* FM Receiver controls */
|
||||
|
||||
/* User-class control IDs */
|
||||
|
||||
#define V4L2_CID_BASE (V4L2_CTRL_CLASS_USER | 0x900)
|
||||
#define V4L2_CID_USER_BASE V4L2_CID_BASE
|
||||
#define V4L2_CID_USER_CLASS (V4L2_CTRL_CLASS_USER | 1)
|
||||
#define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0)
|
||||
#define V4L2_CID_CONTRAST (V4L2_CID_BASE+1)
|
||||
#define V4L2_CID_SATURATION (V4L2_CID_BASE+2)
|
||||
#define V4L2_CID_HUE (V4L2_CID_BASE+3)
|
||||
#define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5)
|
||||
#define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6)
|
||||
#define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7)
|
||||
#define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8)
|
||||
#define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9)
|
||||
#define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10)
|
||||
#define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11) /* Deprecated */
|
||||
#define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12)
|
||||
#define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13)
|
||||
#define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14)
|
||||
#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15)
|
||||
#define V4L2_CID_GAMMA (V4L2_CID_BASE+16)
|
||||
#define V4L2_CID_WHITENESS (V4L2_CID_GAMMA) /* Deprecated */
|
||||
#define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17)
|
||||
#define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18)
|
||||
#define V4L2_CID_GAIN (V4L2_CID_BASE+19)
|
||||
#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
|
||||
#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
|
||||
|
||||
#define V4L2_CID_POWER_LINE_FREQUENCY (V4L2_CID_BASE+24)
|
||||
enum v4l2_power_line_frequency {
|
||||
V4L2_CID_POWER_LINE_FREQUENCY_DISABLED = 0,
|
||||
V4L2_CID_POWER_LINE_FREQUENCY_50HZ = 1,
|
||||
V4L2_CID_POWER_LINE_FREQUENCY_60HZ = 2,
|
||||
V4L2_CID_POWER_LINE_FREQUENCY_AUTO = 3,
|
||||
};
|
||||
#define V4L2_CID_HUE_AUTO (V4L2_CID_BASE+25)
|
||||
#define V4L2_CID_WHITE_BALANCE_TEMPERATURE (V4L2_CID_BASE+26)
|
||||
#define V4L2_CID_SHARPNESS (V4L2_CID_BASE+27)
|
||||
#define V4L2_CID_BACKLIGHT_COMPENSATION (V4L2_CID_BASE+28)
|
||||
#define V4L2_CID_CHROMA_AGC (V4L2_CID_BASE+29)
|
||||
#define V4L2_CID_COLOR_KILLER (V4L2_CID_BASE+30)
|
||||
#define V4L2_CID_COLORFX (V4L2_CID_BASE+31)
|
||||
enum v4l2_colorfx {
|
||||
V4L2_COLORFX_NONE = 0,
|
||||
V4L2_COLORFX_BW = 1,
|
||||
V4L2_COLORFX_SEPIA = 2,
|
||||
V4L2_COLORFX_NEGATIVE = 3,
|
||||
V4L2_COLORFX_EMBOSS = 4,
|
||||
V4L2_COLORFX_SKETCH = 5,
|
||||
V4L2_COLORFX_SKY_BLUE = 6,
|
||||
V4L2_COLORFX_GRASS_GREEN = 7,
|
||||
V4L2_COLORFX_SKIN_WHITEN = 8,
|
||||
V4L2_COLORFX_VIVID = 9,
|
||||
V4L2_COLORFX_AQUA = 10,
|
||||
V4L2_COLORFX_ART_FREEZE = 11,
|
||||
V4L2_COLORFX_SILHOUETTE = 12,
|
||||
V4L2_COLORFX_SOLARIZATION = 13,
|
||||
V4L2_COLORFX_ANTIQUE = 14,
|
||||
V4L2_COLORFX_SET_CBCR = 15,
|
||||
};
|
||||
#define V4L2_CID_AUTOBRIGHTNESS (V4L2_CID_BASE+32)
|
||||
#define V4L2_CID_BAND_STOP_FILTER (V4L2_CID_BASE+33)
|
||||
|
||||
#define V4L2_CID_ROTATE (V4L2_CID_BASE+34)
|
||||
#define V4L2_CID_BG_COLOR (V4L2_CID_BASE+35)
|
||||
|
||||
#define V4L2_CID_CHROMA_GAIN (V4L2_CID_BASE+36)
|
||||
|
||||
#define V4L2_CID_ILLUMINATORS_1 (V4L2_CID_BASE+37)
|
||||
#define V4L2_CID_ILLUMINATORS_2 (V4L2_CID_BASE+38)
|
||||
|
||||
#define V4L2_CID_MIN_BUFFERS_FOR_CAPTURE (V4L2_CID_BASE+39)
|
||||
#define V4L2_CID_MIN_BUFFERS_FOR_OUTPUT (V4L2_CID_BASE+40)
|
||||
|
||||
#define V4L2_CID_ALPHA_COMPONENT (V4L2_CID_BASE+41)
|
||||
#define V4L2_CID_COLORFX_CBCR (V4L2_CID_BASE+42)
|
||||
|
||||
/* last CID + 1 */
|
||||
#define V4L2_CID_LASTP1 (V4L2_CID_BASE+43)
|
||||
|
||||
/* USER-class private control IDs */
|
||||
|
||||
/* The base for the meye driver controls. See linux/meye.h for the list
|
||||
* of controls. We reserve 16 controls for this driver. */
|
||||
#define V4L2_CID_USER_MEYE_BASE (V4L2_CID_USER_BASE + 0x1000)
|
||||
|
||||
/* The base for the bttv driver controls.
|
||||
* We reserve 32 controls for this driver. */
|
||||
#define V4L2_CID_USER_BTTV_BASE (V4L2_CID_USER_BASE + 0x1010)
|
||||
|
||||
|
||||
/* The base for the s2255 driver controls.
|
||||
* We reserve 16 controls for this driver. */
|
||||
#define V4L2_CID_USER_S2255_BASE (V4L2_CID_USER_BASE + 0x1030)
|
||||
|
||||
/* The base for the si476x driver controls. See include/media/si476x.h for the list
|
||||
* of controls. Total of 16 controls is reserved for this driver */
|
||||
#define V4L2_CID_USER_SI476X_BASE (V4L2_CID_USER_BASE + 0x1040)
|
||||
|
||||
/* MPEG-class control IDs */
|
||||
/* The MPEG controls are applicable to all codec controls
|
||||
* and the 'MPEG' part of the define is historical */
|
||||
|
||||
#define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900)
|
||||
#define V4L2_CID_MPEG_CLASS (V4L2_CTRL_CLASS_MPEG | 1)
|
||||
|
||||
/* MPEG streams, specific to multiplexed streams */
|
||||
#define V4L2_CID_MPEG_STREAM_TYPE (V4L2_CID_MPEG_BASE+0)
|
||||
enum v4l2_mpeg_stream_type {
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG2_PS = 0, /* MPEG-2 program stream */
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG2_TS = 1, /* MPEG-2 transport stream */
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG1_SS = 2, /* MPEG-1 system stream */
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG2_DVD = 3, /* MPEG-2 DVD-compatible stream */
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG1_VCD = 4, /* MPEG-1 VCD-compatible stream */
|
||||
V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream */
|
||||
};
|
||||
#define V4L2_CID_MPEG_STREAM_PID_PMT (V4L2_CID_MPEG_BASE+1)
|
||||
#define V4L2_CID_MPEG_STREAM_PID_AUDIO (V4L2_CID_MPEG_BASE+2)
|
||||
#define V4L2_CID_MPEG_STREAM_PID_VIDEO (V4L2_CID_MPEG_BASE+3)
|
||||
#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE+4)
|
||||
#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE+5)
|
||||
#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE+6)
|
||||
#define V4L2_CID_MPEG_STREAM_VBI_FMT (V4L2_CID_MPEG_BASE+7)
|
||||
enum v4l2_mpeg_stream_vbi_fmt {
|
||||
V4L2_MPEG_STREAM_VBI_FMT_NONE = 0, /* No VBI in the MPEG stream */
|
||||
V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1, /* VBI in private packets, IVTV format */
|
||||
};
|
||||
|
||||
/* MPEG audio controls specific to multiplexed streams */
|
||||
#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE+100)
|
||||
enum v4l2_mpeg_audio_sampling_freq {
|
||||
V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
|
||||
V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
|
||||
V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_ENCODING (V4L2_CID_MPEG_BASE+101)
|
||||
enum v4l2_mpeg_audio_encoding {
|
||||
V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
|
||||
V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
|
||||
V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2,
|
||||
V4L2_MPEG_AUDIO_ENCODING_AAC = 3,
|
||||
V4L2_MPEG_AUDIO_ENCODING_AC3 = 4,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_L1_BITRATE (V4L2_CID_MPEG_BASE+102)
|
||||
enum v4l2_mpeg_audio_l1_bitrate {
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_32K = 0,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_64K = 1,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_96K = 2,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
|
||||
V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_L2_BITRATE (V4L2_CID_MPEG_BASE+103)
|
||||
enum v4l2_mpeg_audio_l2_bitrate {
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_32K = 0,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_48K = 1,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_56K = 2,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_64K = 3,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_80K = 4,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_96K = 5,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
|
||||
V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_L3_BITRATE (V4L2_CID_MPEG_BASE+104)
|
||||
enum v4l2_mpeg_audio_l3_bitrate {
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_32K = 0,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_40K = 1,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_48K = 2,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_56K = 3,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_64K = 4,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_80K = 5,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_96K = 6,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
|
||||
V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_MODE (V4L2_CID_MPEG_BASE+105)
|
||||
enum v4l2_mpeg_audio_mode {
|
||||
V4L2_MPEG_AUDIO_MODE_STEREO = 0,
|
||||
V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
|
||||
V4L2_MPEG_AUDIO_MODE_DUAL = 2,
|
||||
V4L2_MPEG_AUDIO_MODE_MONO = 3,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION (V4L2_CID_MPEG_BASE+106)
|
||||
enum v4l2_mpeg_audio_mode_extension {
|
||||
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4 = 0,
|
||||
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8 = 1,
|
||||
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
|
||||
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_EMPHASIS (V4L2_CID_MPEG_BASE+107)
|
||||
enum v4l2_mpeg_audio_emphasis {
|
||||
V4L2_MPEG_AUDIO_EMPHASIS_NONE = 0,
|
||||
V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
|
||||
V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17 = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_CRC (V4L2_CID_MPEG_BASE+108)
|
||||
enum v4l2_mpeg_audio_crc {
|
||||
V4L2_MPEG_AUDIO_CRC_NONE = 0,
|
||||
V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_MUTE (V4L2_CID_MPEG_BASE+109)
|
||||
#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE (V4L2_CID_MPEG_BASE+110)
|
||||
#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE (V4L2_CID_MPEG_BASE+111)
|
||||
enum v4l2_mpeg_audio_ac3_bitrate {
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_32K = 0,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_40K = 1,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_48K = 2,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_56K = 3,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_64K = 4,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_80K = 5,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_96K = 6,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_112K = 7,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_128K = 8,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_160K = 9,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_192K = 10,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_224K = 11,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_256K = 12,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_320K = 13,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_384K = 14,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_448K = 15,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_512K = 16,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_576K = 17,
|
||||
V4L2_MPEG_AUDIO_AC3_BITRATE_640K = 18,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK (V4L2_CID_MPEG_BASE+112)
|
||||
enum v4l2_mpeg_audio_dec_playback {
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO = 0,
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO = 1,
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_LEFT = 2,
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_RIGHT = 3,
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_MONO = 4,
|
||||
V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO = 5,
|
||||
};
|
||||
#define V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK (V4L2_CID_MPEG_BASE+113)
|
||||
|
||||
/* MPEG video controls specific to multiplexed streams */
|
||||
#define V4L2_CID_MPEG_VIDEO_ENCODING (V4L2_CID_MPEG_BASE+200)
|
||||
enum v4l2_mpeg_video_encoding {
|
||||
V4L2_MPEG_VIDEO_ENCODING_MPEG_1 = 0,
|
||||
V4L2_MPEG_VIDEO_ENCODING_MPEG_2 = 1,
|
||||
V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_ASPECT (V4L2_CID_MPEG_BASE+201)
|
||||
enum v4l2_mpeg_video_aspect {
|
||||
V4L2_MPEG_VIDEO_ASPECT_1x1 = 0,
|
||||
V4L2_MPEG_VIDEO_ASPECT_4x3 = 1,
|
||||
V4L2_MPEG_VIDEO_ASPECT_16x9 = 2,
|
||||
V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_B_FRAMES (V4L2_CID_MPEG_BASE+202)
|
||||
#define V4L2_CID_MPEG_VIDEO_GOP_SIZE (V4L2_CID_MPEG_BASE+203)
|
||||
#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE (V4L2_CID_MPEG_BASE+204)
|
||||
#define V4L2_CID_MPEG_VIDEO_PULLDOWN (V4L2_CID_MPEG_BASE+205)
|
||||
#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE (V4L2_CID_MPEG_BASE+206)
|
||||
enum v4l2_mpeg_video_bitrate_mode {
|
||||
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
|
||||
V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_BITRATE (V4L2_CID_MPEG_BASE+207)
|
||||
#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK (V4L2_CID_MPEG_BASE+208)
|
||||
#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209)
|
||||
#define V4L2_CID_MPEG_VIDEO_MUTE (V4L2_CID_MPEG_BASE+210)
|
||||
#define V4L2_CID_MPEG_VIDEO_MUTE_YUV (V4L2_CID_MPEG_BASE+211)
|
||||
#define V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE (V4L2_CID_MPEG_BASE+212)
|
||||
#define V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER (V4L2_CID_MPEG_BASE+213)
|
||||
#define V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB (V4L2_CID_MPEG_BASE+214)
|
||||
#define V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE (V4L2_CID_MPEG_BASE+215)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEADER_MODE (V4L2_CID_MPEG_BASE+216)
|
||||
enum v4l2_mpeg_video_header_mode {
|
||||
V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE = 0,
|
||||
V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME = 1,
|
||||
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_MAX_REF_PIC (V4L2_CID_MPEG_BASE+217)
|
||||
#define V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE (V4L2_CID_MPEG_BASE+218)
|
||||
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES (V4L2_CID_MPEG_BASE+219)
|
||||
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB (V4L2_CID_MPEG_BASE+220)
|
||||
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE (V4L2_CID_MPEG_BASE+221)
|
||||
enum v4l2_mpeg_video_multi_slice_mode {
|
||||
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE = 0,
|
||||
V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB = 1,
|
||||
V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_VBV_SIZE (V4L2_CID_MPEG_BASE+222)
|
||||
#define V4L2_CID_MPEG_VIDEO_DEC_PTS (V4L2_CID_MPEG_BASE+223)
|
||||
#define V4L2_CID_MPEG_VIDEO_DEC_FRAME (V4L2_CID_MPEG_BASE+224)
|
||||
#define V4L2_CID_MPEG_VIDEO_VBV_DELAY (V4L2_CID_MPEG_BASE+225)
|
||||
#define V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER (V4L2_CID_MPEG_BASE+226)
|
||||
|
||||
#define V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP (V4L2_CID_MPEG_BASE+300)
|
||||
#define V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP (V4L2_CID_MPEG_BASE+301)
|
||||
#define V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP (V4L2_CID_MPEG_BASE+302)
|
||||
#define V4L2_CID_MPEG_VIDEO_H263_MIN_QP (V4L2_CID_MPEG_BASE+303)
|
||||
#define V4L2_CID_MPEG_VIDEO_H263_MAX_QP (V4L2_CID_MPEG_BASE+304)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP (V4L2_CID_MPEG_BASE+350)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP (V4L2_CID_MPEG_BASE+351)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP (V4L2_CID_MPEG_BASE+352)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_MIN_QP (V4L2_CID_MPEG_BASE+353)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_MAX_QP (V4L2_CID_MPEG_BASE+354)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM (V4L2_CID_MPEG_BASE+355)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE (V4L2_CID_MPEG_BASE+356)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE (V4L2_CID_MPEG_BASE+357)
|
||||
enum v4l2_mpeg_video_h264_entropy_mode {
|
||||
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC = 0,
|
||||
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_I_PERIOD (V4L2_CID_MPEG_BASE+358)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_LEVEL (V4L2_CID_MPEG_BASE+359)
|
||||
enum v4l2_mpeg_video_h264_level {
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_1_0 = 0,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_1B = 1,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_1_1 = 2,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_1_2 = 3,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_1_3 = 4,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_2_0 = 5,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_2_1 = 6,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_2_2 = 7,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_3_0 = 8,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_3_1 = 9,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_3_2 = 10,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_4_0 = 11,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_4_1 = 12,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_4_2 = 13,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_5_0 = 14,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_5_1 = 15,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA (V4L2_CID_MPEG_BASE+360)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA (V4L2_CID_MPEG_BASE+361)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE (V4L2_CID_MPEG_BASE+362)
|
||||
enum v4l2_mpeg_video_h264_loop_filter_mode {
|
||||
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED = 0,
|
||||
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED = 1,
|
||||
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_PROFILE (V4L2_CID_MPEG_BASE+363)
|
||||
enum v4l2_mpeg_video_h264_profile {
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE = 0,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE = 1,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_MAIN = 2,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED = 3,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH = 4,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10 = 5,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422 = 6,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE = 7,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA = 8,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA = 9,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA = 10,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA = 11,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE = 12,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH = 13,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA = 14,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH = 15,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH = 16,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT (V4L2_CID_MPEG_BASE+364)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH (V4L2_CID_MPEG_BASE+365)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE (V4L2_CID_MPEG_BASE+366)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC (V4L2_CID_MPEG_BASE+367)
|
||||
enum v4l2_mpeg_video_h264_vui_sar_idc {
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_UNSPECIFIED = 0,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1 = 1,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_12x11 = 2,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_10x11 = 3,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_16x11 = 4,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_40x33 = 5,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_24x11 = 6,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_20x11 = 7,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_32x11 = 8,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_80x33 = 9,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_18x11 = 10,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_15x11 = 11,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_64x33 = 12,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_160x99 = 13,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_4x3 = 14,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_3x2 = 15,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_2x1 = 16,
|
||||
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED = 17,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING (V4L2_CID_MPEG_BASE+368)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0 (V4L2_CID_MPEG_BASE+369)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE (V4L2_CID_MPEG_BASE+370)
|
||||
enum v4l2_mpeg_video_h264_sei_fp_arrangement_type {
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_CHECKERBOARD = 0,
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_COLUMN = 1,
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_ROW = 2,
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_SIDE_BY_SIDE = 3,
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM = 4,
|
||||
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TEMPORAL = 5,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO (V4L2_CID_MPEG_BASE+371)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE (V4L2_CID_MPEG_BASE+372)
|
||||
enum v4l2_mpeg_video_h264_fmo_map_type {
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_INTERLEAVED_SLICES = 0,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_SCATTERED_SLICES = 1,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_FOREGROUND_WITH_LEFT_OVER = 2,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_BOX_OUT = 3,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_RASTER_SCAN = 4,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_WIPE_SCAN = 5,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_EXPLICIT = 6,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP (V4L2_CID_MPEG_BASE+373)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION (V4L2_CID_MPEG_BASE+374)
|
||||
enum v4l2_mpeg_video_h264_fmo_change_dir {
|
||||
V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_RIGHT = 0,
|
||||
V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_LEFT = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE (V4L2_CID_MPEG_BASE+375)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH (V4L2_CID_MPEG_BASE+376)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_ASO (V4L2_CID_MPEG_BASE+377)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER (V4L2_CID_MPEG_BASE+378)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING (V4L2_CID_MPEG_BASE+379)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE (V4L2_CID_MPEG_BASE+380)
|
||||
enum v4l2_mpeg_video_h264_hierarchical_coding_type {
|
||||
V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B = 0,
|
||||
V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (V4L2_CID_MPEG_BASE+381)
|
||||
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_BASE+382)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (V4L2_CID_MPEG_BASE+400)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (V4L2_CID_MPEG_BASE+401)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (V4L2_CID_MPEG_BASE+402)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP (V4L2_CID_MPEG_BASE+403)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP (V4L2_CID_MPEG_BASE+404)
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL (V4L2_CID_MPEG_BASE+405)
|
||||
enum v4l2_mpeg_video_mpeg4_level {
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_0 = 0,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B = 1,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_1 = 2,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_2 = 3,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_3 = 4,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_3B = 5,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_4 = 6,
|
||||
V4L2_MPEG_VIDEO_MPEG4_LEVEL_5 = 7,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE (V4L2_CID_MPEG_BASE+406)
|
||||
enum v4l2_mpeg_video_mpeg4_profile {
|
||||
V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE = 0,
|
||||
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE = 1,
|
||||
V4L2_MPEG_VIDEO_MPEG4_PROFILE_CORE = 2,
|
||||
V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE_SCALABLE = 3,
|
||||
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY = 4,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPEG_BASE+407)
|
||||
|
||||
/* Control IDs for VP8 streams
|
||||
* Although VP8 is not part of MPEG we add these controls to the MPEG class
|
||||
* as that class is already handling other video compression standards
|
||||
*/
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS (V4L2_CID_MPEG_BASE+500)
|
||||
enum v4l2_vp8_num_partitions {
|
||||
V4L2_CID_MPEG_VIDEO_VPX_1_PARTITION = 0,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_2_PARTITIONS = 1,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_4_PARTITIONS = 2,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_8_PARTITIONS = 3,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4 (V4L2_CID_MPEG_BASE+501)
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES (V4L2_CID_MPEG_BASE+502)
|
||||
enum v4l2_vp8_num_ref_frames {
|
||||
V4L2_CID_MPEG_VIDEO_VPX_1_REF_FRAME = 0,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_2_REF_FRAME = 1,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_3_REF_FRAME = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL (V4L2_CID_MPEG_BASE+503)
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS (V4L2_CID_MPEG_BASE+504)
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD (V4L2_CID_MPEG_BASE+505)
|
||||
#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL (V4L2_CID_MPEG_BASE+506)
|
||||
enum v4l2_vp8_golden_frame_sel {
|
||||
V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV = 0,
|
||||
V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD = 1,
|
||||
};
|
||||
|
||||
/* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
|
||||
#define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+0)
|
||||
enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
|
||||
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
|
||||
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+1)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+2)
|
||||
enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
|
||||
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF = 0,
|
||||
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
|
||||
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT = 2,
|
||||
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE = 3,
|
||||
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4,
|
||||
};
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+3)
|
||||
enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
|
||||
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF = 0,
|
||||
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+4)
|
||||
enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
|
||||
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
|
||||
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO = 1,
|
||||
};
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+5)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+6)
|
||||
enum v4l2_mpeg_cx2341x_video_median_filter_type {
|
||||
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF = 0,
|
||||
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR = 1,
|
||||
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT = 2,
|
||||
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
|
||||
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG = 4,
|
||||
};
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+7)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+8)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+9)
|
||||
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+10)
|
||||
#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS (V4L2_CID_MPEG_CX2341X_BASE+11)
|
||||
|
||||
/* MPEG-class control IDs specific to the Samsung MFC 5.1 driver as defined by V4L2 */
|
||||
#define V4L2_CID_MPEG_MFC51_BASE (V4L2_CTRL_CLASS_MPEG | 0x1100)
|
||||
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY (V4L2_CID_MPEG_MFC51_BASE+0)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE (V4L2_CID_MPEG_MFC51_BASE+1)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE (V4L2_CID_MPEG_MFC51_BASE+2)
|
||||
enum v4l2_mpeg_mfc51_video_frame_skip_mode {
|
||||
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_DISABLED = 0,
|
||||
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT = 1,
|
||||
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE (V4L2_CID_MPEG_MFC51_BASE+3)
|
||||
enum v4l2_mpeg_mfc51_video_force_frame_type {
|
||||
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_DISABLED = 0,
|
||||
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_I_FRAME = 1,
|
||||
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_NOT_CODED = 2,
|
||||
};
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING (V4L2_CID_MPEG_MFC51_BASE+4)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV (V4L2_CID_MPEG_MFC51_BASE+5)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT (V4L2_CID_MPEG_MFC51_BASE+6)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF (V4L2_CID_MPEG_MFC51_BASE+7)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY (V4L2_CID_MPEG_MFC51_BASE+50)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK (V4L2_CID_MPEG_MFC51_BASE+51)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH (V4L2_CID_MPEG_MFC51_BASE+52)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC (V4L2_CID_MPEG_MFC51_BASE+53)
|
||||
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P (V4L2_CID_MPEG_MFC51_BASE+54)
|
||||
|
||||
|
||||
/* Camera class control IDs */
|
||||
|
||||
#define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900)
|
||||
#define V4L2_CID_CAMERA_CLASS (V4L2_CTRL_CLASS_CAMERA | 1)
|
||||
|
||||
#define V4L2_CID_EXPOSURE_AUTO (V4L2_CID_CAMERA_CLASS_BASE+1)
|
||||
enum v4l2_exposure_auto_type {
|
||||
V4L2_EXPOSURE_AUTO = 0,
|
||||
V4L2_EXPOSURE_MANUAL = 1,
|
||||
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
|
||||
V4L2_EXPOSURE_APERTURE_PRIORITY = 3
|
||||
};
|
||||
#define V4L2_CID_EXPOSURE_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+2)
|
||||
#define V4L2_CID_EXPOSURE_AUTO_PRIORITY (V4L2_CID_CAMERA_CLASS_BASE+3)
|
||||
|
||||
#define V4L2_CID_PAN_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+4)
|
||||
#define V4L2_CID_TILT_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+5)
|
||||
#define V4L2_CID_PAN_RESET (V4L2_CID_CAMERA_CLASS_BASE+6)
|
||||
#define V4L2_CID_TILT_RESET (V4L2_CID_CAMERA_CLASS_BASE+7)
|
||||
|
||||
#define V4L2_CID_PAN_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+8)
|
||||
#define V4L2_CID_TILT_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+9)
|
||||
|
||||
#define V4L2_CID_FOCUS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+10)
|
||||
#define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+11)
|
||||
#define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE+12)
|
||||
|
||||
#define V4L2_CID_ZOOM_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+13)
|
||||
#define V4L2_CID_ZOOM_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+14)
|
||||
#define V4L2_CID_ZOOM_CONTINUOUS (V4L2_CID_CAMERA_CLASS_BASE+15)
|
||||
|
||||
#define V4L2_CID_PRIVACY (V4L2_CID_CAMERA_CLASS_BASE+16)
|
||||
|
||||
#define V4L2_CID_IRIS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+17)
|
||||
#define V4L2_CID_IRIS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+18)
|
||||
|
||||
#define V4L2_CID_AUTO_EXPOSURE_BIAS (V4L2_CID_CAMERA_CLASS_BASE+19)
|
||||
|
||||
#define V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE (V4L2_CID_CAMERA_CLASS_BASE+20)
|
||||
enum v4l2_auto_n_preset_white_balance {
|
||||
V4L2_WHITE_BALANCE_MANUAL = 0,
|
||||
V4L2_WHITE_BALANCE_AUTO = 1,
|
||||
V4L2_WHITE_BALANCE_INCANDESCENT = 2,
|
||||
V4L2_WHITE_BALANCE_FLUORESCENT = 3,
|
||||
V4L2_WHITE_BALANCE_FLUORESCENT_H = 4,
|
||||
V4L2_WHITE_BALANCE_HORIZON = 5,
|
||||
V4L2_WHITE_BALANCE_DAYLIGHT = 6,
|
||||
V4L2_WHITE_BALANCE_FLASH = 7,
|
||||
V4L2_WHITE_BALANCE_CLOUDY = 8,
|
||||
V4L2_WHITE_BALANCE_SHADE = 9,
|
||||
};
|
||||
|
||||
#define V4L2_CID_WIDE_DYNAMIC_RANGE (V4L2_CID_CAMERA_CLASS_BASE+21)
|
||||
#define V4L2_CID_IMAGE_STABILIZATION (V4L2_CID_CAMERA_CLASS_BASE+22)
|
||||
|
||||
#define V4L2_CID_ISO_SENSITIVITY (V4L2_CID_CAMERA_CLASS_BASE+23)
|
||||
#define V4L2_CID_ISO_SENSITIVITY_AUTO (V4L2_CID_CAMERA_CLASS_BASE+24)
|
||||
enum v4l2_iso_sensitivity_auto_type {
|
||||
V4L2_ISO_SENSITIVITY_MANUAL = 0,
|
||||
V4L2_ISO_SENSITIVITY_AUTO = 1,
|
||||
};
|
||||
|
||||
#define V4L2_CID_EXPOSURE_METERING (V4L2_CID_CAMERA_CLASS_BASE+25)
|
||||
enum v4l2_exposure_metering {
|
||||
V4L2_EXPOSURE_METERING_AVERAGE = 0,
|
||||
V4L2_EXPOSURE_METERING_CENTER_WEIGHTED = 1,
|
||||
V4L2_EXPOSURE_METERING_SPOT = 2,
|
||||
V4L2_EXPOSURE_METERING_MATRIX = 3,
|
||||
};
|
||||
|
||||
#define V4L2_CID_SCENE_MODE (V4L2_CID_CAMERA_CLASS_BASE+26)
|
||||
enum v4l2_scene_mode {
|
||||
V4L2_SCENE_MODE_NONE = 0,
|
||||
V4L2_SCENE_MODE_BACKLIGHT = 1,
|
||||
V4L2_SCENE_MODE_BEACH_SNOW = 2,
|
||||
V4L2_SCENE_MODE_CANDLE_LIGHT = 3,
|
||||
V4L2_SCENE_MODE_DAWN_DUSK = 4,
|
||||
V4L2_SCENE_MODE_FALL_COLORS = 5,
|
||||
V4L2_SCENE_MODE_FIREWORKS = 6,
|
||||
V4L2_SCENE_MODE_LANDSCAPE = 7,
|
||||
V4L2_SCENE_MODE_NIGHT = 8,
|
||||
V4L2_SCENE_MODE_PARTY_INDOOR = 9,
|
||||
V4L2_SCENE_MODE_PORTRAIT = 10,
|
||||
V4L2_SCENE_MODE_SPORTS = 11,
|
||||
V4L2_SCENE_MODE_SUNSET = 12,
|
||||
V4L2_SCENE_MODE_TEXT = 13,
|
||||
};
|
||||
|
||||
#define V4L2_CID_3A_LOCK (V4L2_CID_CAMERA_CLASS_BASE+27)
|
||||
#define V4L2_LOCK_EXPOSURE (1 << 0)
|
||||
#define V4L2_LOCK_WHITE_BALANCE (1 << 1)
|
||||
#define V4L2_LOCK_FOCUS (1 << 2)
|
||||
|
||||
#define V4L2_CID_AUTO_FOCUS_START (V4L2_CID_CAMERA_CLASS_BASE+28)
|
||||
#define V4L2_CID_AUTO_FOCUS_STOP (V4L2_CID_CAMERA_CLASS_BASE+29)
|
||||
#define V4L2_CID_AUTO_FOCUS_STATUS (V4L2_CID_CAMERA_CLASS_BASE+30)
|
||||
#define V4L2_AUTO_FOCUS_STATUS_IDLE (0 << 0)
|
||||
#define V4L2_AUTO_FOCUS_STATUS_BUSY (1 << 0)
|
||||
#define V4L2_AUTO_FOCUS_STATUS_REACHED (1 << 1)
|
||||
#define V4L2_AUTO_FOCUS_STATUS_FAILED (1 << 2)
|
||||
|
||||
#define V4L2_CID_AUTO_FOCUS_RANGE (V4L2_CID_CAMERA_CLASS_BASE+31)
|
||||
enum v4l2_auto_focus_range {
|
||||
V4L2_AUTO_FOCUS_RANGE_AUTO = 0,
|
||||
V4L2_AUTO_FOCUS_RANGE_NORMAL = 1,
|
||||
V4L2_AUTO_FOCUS_RANGE_MACRO = 2,
|
||||
V4L2_AUTO_FOCUS_RANGE_INFINITY = 3,
|
||||
};
|
||||
|
||||
|
||||
/* FM Modulator class control IDs */
|
||||
|
||||
#define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900)
|
||||
#define V4L2_CID_FM_TX_CLASS (V4L2_CTRL_CLASS_FM_TX | 1)
|
||||
|
||||
#define V4L2_CID_RDS_TX_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 1)
|
||||
#define V4L2_CID_RDS_TX_PI (V4L2_CID_FM_TX_CLASS_BASE + 2)
|
||||
#define V4L2_CID_RDS_TX_PTY (V4L2_CID_FM_TX_CLASS_BASE + 3)
|
||||
#define V4L2_CID_RDS_TX_PS_NAME (V4L2_CID_FM_TX_CLASS_BASE + 5)
|
||||
#define V4L2_CID_RDS_TX_RADIO_TEXT (V4L2_CID_FM_TX_CLASS_BASE + 6)
|
||||
|
||||
#define V4L2_CID_AUDIO_LIMITER_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 64)
|
||||
#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 65)
|
||||
#define V4L2_CID_AUDIO_LIMITER_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 66)
|
||||
|
||||
#define V4L2_CID_AUDIO_COMPRESSION_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 80)
|
||||
#define V4L2_CID_AUDIO_COMPRESSION_GAIN (V4L2_CID_FM_TX_CLASS_BASE + 81)
|
||||
#define V4L2_CID_AUDIO_COMPRESSION_THRESHOLD (V4L2_CID_FM_TX_CLASS_BASE + 82)
|
||||
#define V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME (V4L2_CID_FM_TX_CLASS_BASE + 83)
|
||||
#define V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 84)
|
||||
|
||||
#define V4L2_CID_PILOT_TONE_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 96)
|
||||
#define V4L2_CID_PILOT_TONE_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 97)
|
||||
#define V4L2_CID_PILOT_TONE_FREQUENCY (V4L2_CID_FM_TX_CLASS_BASE + 98)
|
||||
|
||||
#define V4L2_CID_TUNE_PREEMPHASIS (V4L2_CID_FM_TX_CLASS_BASE + 112)
|
||||
enum v4l2_preemphasis {
|
||||
V4L2_PREEMPHASIS_DISABLED = 0,
|
||||
V4L2_PREEMPHASIS_50_uS = 1,
|
||||
V4L2_PREEMPHASIS_75_uS = 2,
|
||||
};
|
||||
#define V4L2_CID_TUNE_POWER_LEVEL (V4L2_CID_FM_TX_CLASS_BASE + 113)
|
||||
#define V4L2_CID_TUNE_ANTENNA_CAPACITOR (V4L2_CID_FM_TX_CLASS_BASE + 114)
|
||||
|
||||
|
||||
/* Flash and privacy (indicator) light controls */
|
||||
|
||||
#define V4L2_CID_FLASH_CLASS_BASE (V4L2_CTRL_CLASS_FLASH | 0x900)
|
||||
#define V4L2_CID_FLASH_CLASS (V4L2_CTRL_CLASS_FLASH | 1)
|
||||
|
||||
#define V4L2_CID_FLASH_LED_MODE (V4L2_CID_FLASH_CLASS_BASE + 1)
|
||||
enum v4l2_flash_led_mode {
|
||||
V4L2_FLASH_LED_MODE_NONE,
|
||||
V4L2_FLASH_LED_MODE_FLASH,
|
||||
V4L2_FLASH_LED_MODE_TORCH,
|
||||
};
|
||||
|
||||
#define V4L2_CID_FLASH_STROBE_SOURCE (V4L2_CID_FLASH_CLASS_BASE + 2)
|
||||
enum v4l2_flash_strobe_source {
|
||||
V4L2_FLASH_STROBE_SOURCE_SOFTWARE,
|
||||
V4L2_FLASH_STROBE_SOURCE_EXTERNAL,
|
||||
};
|
||||
|
||||
#define V4L2_CID_FLASH_STROBE (V4L2_CID_FLASH_CLASS_BASE + 3)
|
||||
#define V4L2_CID_FLASH_STROBE_STOP (V4L2_CID_FLASH_CLASS_BASE + 4)
|
||||
#define V4L2_CID_FLASH_STROBE_STATUS (V4L2_CID_FLASH_CLASS_BASE + 5)
|
||||
|
||||
#define V4L2_CID_FLASH_TIMEOUT (V4L2_CID_FLASH_CLASS_BASE + 6)
|
||||
#define V4L2_CID_FLASH_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 7)
|
||||
#define V4L2_CID_FLASH_TORCH_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 8)
|
||||
#define V4L2_CID_FLASH_INDICATOR_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 9)
|
||||
|
||||
#define V4L2_CID_FLASH_FAULT (V4L2_CID_FLASH_CLASS_BASE + 10)
|
||||
#define V4L2_FLASH_FAULT_OVER_VOLTAGE (1 << 0)
|
||||
#define V4L2_FLASH_FAULT_TIMEOUT (1 << 1)
|
||||
#define V4L2_FLASH_FAULT_OVER_TEMPERATURE (1 << 2)
|
||||
#define V4L2_FLASH_FAULT_SHORT_CIRCUIT (1 << 3)
|
||||
#define V4L2_FLASH_FAULT_OVER_CURRENT (1 << 4)
|
||||
#define V4L2_FLASH_FAULT_INDICATOR (1 << 5)
|
||||
|
||||
#define V4L2_CID_FLASH_CHARGE (V4L2_CID_FLASH_CLASS_BASE + 11)
|
||||
#define V4L2_CID_FLASH_READY (V4L2_CID_FLASH_CLASS_BASE + 12)
|
||||
|
||||
|
||||
/* JPEG-class control IDs */
|
||||
|
||||
#define V4L2_CID_JPEG_CLASS_BASE (V4L2_CTRL_CLASS_JPEG | 0x900)
|
||||
#define V4L2_CID_JPEG_CLASS (V4L2_CTRL_CLASS_JPEG | 1)
|
||||
|
||||
#define V4L2_CID_JPEG_CHROMA_SUBSAMPLING (V4L2_CID_JPEG_CLASS_BASE + 1)
|
||||
enum v4l2_jpeg_chroma_subsampling {
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_444 = 0,
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_422 = 1,
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_420 = 2,
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_411 = 3,
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_410 = 4,
|
||||
V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY = 5,
|
||||
};
|
||||
#define V4L2_CID_JPEG_RESTART_INTERVAL (V4L2_CID_JPEG_CLASS_BASE + 2)
|
||||
#define V4L2_CID_JPEG_COMPRESSION_QUALITY (V4L2_CID_JPEG_CLASS_BASE + 3)
|
||||
|
||||
#define V4L2_CID_JPEG_ACTIVE_MARKER (V4L2_CID_JPEG_CLASS_BASE + 4)
|
||||
#define V4L2_JPEG_ACTIVE_MARKER_APP0 (1 << 0)
|
||||
#define V4L2_JPEG_ACTIVE_MARKER_APP1 (1 << 1)
|
||||
#define V4L2_JPEG_ACTIVE_MARKER_COM (1 << 16)
|
||||
#define V4L2_JPEG_ACTIVE_MARKER_DQT (1 << 17)
|
||||
#define V4L2_JPEG_ACTIVE_MARKER_DHT (1 << 18)
|
||||
|
||||
|
||||
/* Image source controls */
|
||||
#define V4L2_CID_IMAGE_SOURCE_CLASS_BASE (V4L2_CTRL_CLASS_IMAGE_SOURCE | 0x900)
|
||||
#define V4L2_CID_IMAGE_SOURCE_CLASS (V4L2_CTRL_CLASS_IMAGE_SOURCE | 1)
|
||||
|
||||
#define V4L2_CID_VBLANK (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 1)
|
||||
#define V4L2_CID_HBLANK (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 2)
|
||||
#define V4L2_CID_ANALOGUE_GAIN (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 3)
|
||||
|
||||
|
||||
/* Image processing controls */
|
||||
|
||||
#define V4L2_CID_IMAGE_PROC_CLASS_BASE (V4L2_CTRL_CLASS_IMAGE_PROC | 0x900)
|
||||
#define V4L2_CID_IMAGE_PROC_CLASS (V4L2_CTRL_CLASS_IMAGE_PROC | 1)
|
||||
|
||||
#define V4L2_CID_LINK_FREQ (V4L2_CID_IMAGE_PROC_CLASS_BASE + 1)
|
||||
#define V4L2_CID_PIXEL_RATE (V4L2_CID_IMAGE_PROC_CLASS_BASE + 2)
|
||||
#define V4L2_CID_TEST_PATTERN (V4L2_CID_IMAGE_PROC_CLASS_BASE + 3)
|
||||
|
||||
|
||||
/* DV-class control IDs defined by V4L2 */
|
||||
#define V4L2_CID_DV_CLASS_BASE (V4L2_CTRL_CLASS_DV | 0x900)
|
||||
#define V4L2_CID_DV_CLASS (V4L2_CTRL_CLASS_DV | 1)
|
||||
|
||||
#define V4L2_CID_DV_TX_HOTPLUG (V4L2_CID_DV_CLASS_BASE + 1)
|
||||
#define V4L2_CID_DV_TX_RXSENSE (V4L2_CID_DV_CLASS_BASE + 2)
|
||||
#define V4L2_CID_DV_TX_EDID_PRESENT (V4L2_CID_DV_CLASS_BASE + 3)
|
||||
#define V4L2_CID_DV_TX_MODE (V4L2_CID_DV_CLASS_BASE + 4)
|
||||
enum v4l2_dv_tx_mode {
|
||||
V4L2_DV_TX_MODE_DVI_D = 0,
|
||||
V4L2_DV_TX_MODE_HDMI = 1,
|
||||
};
|
||||
#define V4L2_CID_DV_TX_RGB_RANGE (V4L2_CID_DV_CLASS_BASE + 5)
|
||||
enum v4l2_dv_rgb_range {
|
||||
V4L2_DV_RGB_RANGE_AUTO = 0,
|
||||
V4L2_DV_RGB_RANGE_LIMITED = 1,
|
||||
V4L2_DV_RGB_RANGE_FULL = 2,
|
||||
};
|
||||
|
||||
#define V4L2_CID_DV_RX_POWER_PRESENT (V4L2_CID_DV_CLASS_BASE + 100)
|
||||
#define V4L2_CID_DV_RX_RGB_RANGE (V4L2_CID_DV_CLASS_BASE + 101)
|
||||
|
||||
#define V4L2_CID_FM_RX_CLASS_BASE (V4L2_CTRL_CLASS_FM_RX | 0x900)
|
||||
#define V4L2_CID_FM_RX_CLASS (V4L2_CTRL_CLASS_FM_RX | 1)
|
||||
|
||||
#define V4L2_CID_TUNE_DEEMPHASIS (V4L2_CID_FM_RX_CLASS_BASE + 1)
|
||||
enum v4l2_deemphasis {
|
||||
V4L2_DEEMPHASIS_DISABLED = V4L2_PREEMPHASIS_DISABLED,
|
||||
V4L2_DEEMPHASIS_50_uS = V4L2_PREEMPHASIS_50_uS,
|
||||
V4L2_DEEMPHASIS_75_uS = V4L2_PREEMPHASIS_75_uS,
|
||||
};
|
||||
|
||||
#define V4L2_CID_RDS_RECEPTION (V4L2_CID_FM_RX_CLASS_BASE + 2)
|
||||
|
||||
#endif
|
696
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-ctrls.h
Normal file
696
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-ctrls.h
Normal file
|
@ -0,0 +1,696 @@
|
|||
/*
|
||||
V4L2 controls support header.
|
||||
|
||||
Copyright (C) 2010 Hans Verkuil <hverkuil@xs4all.nl>
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _V4L2_CTRLS_H
|
||||
#define _V4L2_CTRLS_H
|
||||
#if 0
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
#include "videodev2.h"
|
||||
|
||||
|
||||
/* forward references */
|
||||
//struct file;
|
||||
struct v4l2_ctrl_handler;
|
||||
struct v4l2_ctrl_helper;
|
||||
struct v4l2_ctrl;
|
||||
struct video_device;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_subscribed_event;
|
||||
struct v4l2_fh;
|
||||
//struct poll_table_struct;
|
||||
|
||||
/** struct v4l2_ctrl_ops - The control operations that the driver has to provide.
|
||||
* @g_volatile_ctrl: Get a new value for this control. Generally only relevant
|
||||
* for volatile (and usually read-only) controls such as a control
|
||||
* that returns the current signal strength which changes
|
||||
* continuously.
|
||||
* If not set, then the currently cached value will be returned.
|
||||
* @try_ctrl: Test whether the control's value is valid. Only relevant when
|
||||
* the usual min/max/step checks are not sufficient.
|
||||
* @s_ctrl: Actually set the new control value. s_ctrl is compulsory. The
|
||||
* ctrl->handler->lock is held when these ops are called, so no
|
||||
* one else can access controls owned by that handler.
|
||||
*/
|
||||
struct v4l2_ctrl_ops {
|
||||
int (*g_volatile_ctrl)(struct v4l2_ctrl *ctrl);
|
||||
int (*try_ctrl)(struct v4l2_ctrl *ctrl);
|
||||
int (*s_ctrl)(struct v4l2_ctrl *ctrl);
|
||||
};
|
||||
|
||||
typedef void (*v4l2_ctrl_notify_fnc)(struct v4l2_ctrl *ctrl, void *priv);
|
||||
|
||||
/** struct v4l2_ctrl - The control structure.
|
||||
* @node: The list node.
|
||||
* @ev_subs: The list of control event subscriptions.
|
||||
* @handler: The handler that owns the control.
|
||||
* @cluster: Point to start of cluster array.
|
||||
* @ncontrols: Number of controls in cluster array.
|
||||
* @done: Internal flag: set for each processed control.
|
||||
* @is_new: Set when the user specified a new value for this control. It
|
||||
* is also set when called from v4l2_ctrl_handler_setup. Drivers
|
||||
* should never set this flag.
|
||||
* @is_private: If set, then this control is private to its handler and it
|
||||
* will not be added to any other handlers. Drivers can set
|
||||
* this flag.
|
||||
* @is_auto: If set, then this control selects whether the other cluster
|
||||
* members are in 'automatic' mode or 'manual' mode. This is
|
||||
* used for autogain/gain type clusters. Drivers should never
|
||||
* set this flag directly.
|
||||
* @has_volatiles: If set, then one or more members of the cluster are volatile.
|
||||
* Drivers should never touch this flag.
|
||||
* @call_notify: If set, then call the handler's notify function whenever the
|
||||
* control's value changes.
|
||||
* @manual_mode_value: If the is_auto flag is set, then this is the value
|
||||
* of the auto control that determines if that control is in
|
||||
* manual mode. So if the value of the auto control equals this
|
||||
* value, then the whole cluster is in manual mode. Drivers should
|
||||
* never set this flag directly.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @name: The control name.
|
||||
* @type: The control type.
|
||||
* @minimum: The control's minimum value.
|
||||
* @maximum: The control's maximum value.
|
||||
* @default_value: The control's default value.
|
||||
* @step: The control's step value for non-menu controls.
|
||||
* @menu_skip_mask: The control's skip mask for menu controls. This makes it
|
||||
* easy to skip menu items that are not valid. If bit X is set,
|
||||
* then menu item X is skipped. Of course, this only works for
|
||||
* menus with <= 32 menu items. There are no menus that come
|
||||
* close to that number, so this is OK. Should we ever need more,
|
||||
* then this will have to be extended to a u64 or a bit array.
|
||||
* @qmenu: A const char * array for all menu items. Array entries that are
|
||||
* empty strings ("") correspond to non-existing menu items (this
|
||||
* is in addition to the menu_skip_mask above). The last entry
|
||||
* must be NULL.
|
||||
* @flags: The control's flags.
|
||||
* @cur: The control's current value.
|
||||
* @val: The control's new s32 value.
|
||||
* @val64: The control's new s64 value.
|
||||
* @string: The control's new string value.
|
||||
* @priv: The control's private pointer. For use by the driver. It is
|
||||
* untouched by the control framework. Note that this pointer is
|
||||
* not freed when the control is deleted. Should this be needed
|
||||
* then a new internal bitfield can be added to tell the framework
|
||||
* to free this pointer.
|
||||
*/
|
||||
struct v4l2_ctrl {
|
||||
/* Administrative fields */
|
||||
struct list_head node;
|
||||
struct list_head ev_subs;
|
||||
struct v4l2_ctrl_handler *handler;
|
||||
struct v4l2_ctrl **cluster;
|
||||
unsigned ncontrols;
|
||||
unsigned int done:1;
|
||||
|
||||
unsigned int is_new:1;
|
||||
unsigned int is_private:1;
|
||||
unsigned int is_auto:1;
|
||||
unsigned int has_volatiles:1;
|
||||
unsigned int call_notify:1;
|
||||
unsigned int manual_mode_value:8;
|
||||
|
||||
const struct v4l2_ctrl_ops *ops;
|
||||
u32 id;
|
||||
const char *name;
|
||||
enum v4l2_ctrl_type type;
|
||||
s32 minimum, maximum, default_value;
|
||||
union {
|
||||
u32 step;
|
||||
u32 menu_skip_mask;
|
||||
};
|
||||
union {
|
||||
const char * const *qmenu;
|
||||
const s64 *qmenu_int;
|
||||
};
|
||||
unsigned long flags;
|
||||
union {
|
||||
s32 val;
|
||||
s64 val64;
|
||||
char *string;
|
||||
} cur;
|
||||
union {
|
||||
s32 val;
|
||||
s64 val64;
|
||||
char *string;
|
||||
};
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/** struct v4l2_ctrl_ref - The control reference.
|
||||
* @node: List node for the sorted list.
|
||||
* @next: Single-link list node for the hash.
|
||||
* @ctrl: The actual control information.
|
||||
* @helper: Pointer to helper struct. Used internally in prepare_ext_ctrls().
|
||||
*
|
||||
* Each control handler has a list of these refs. The list_head is used to
|
||||
* keep a sorted-by-control-ID list of all controls, while the next pointer
|
||||
* is used to link the control in the hash's bucket.
|
||||
*/
|
||||
struct v4l2_ctrl_ref {
|
||||
struct list_head node;
|
||||
struct v4l2_ctrl_ref *next;
|
||||
struct v4l2_ctrl *ctrl;
|
||||
struct v4l2_ctrl_helper *helper;
|
||||
};
|
||||
|
||||
/** struct v4l2_ctrl_handler - The control handler keeps track of all the
|
||||
* controls: both the controls owned by the handler and those inherited
|
||||
* from other handlers.
|
||||
* @_lock: Default for "lock".
|
||||
* @lock: Lock to control access to this handler and its controls.
|
||||
* May be replaced by the user right after init.
|
||||
* @ctrls: The list of controls owned by this handler.
|
||||
* @ctrl_refs: The list of control references.
|
||||
* @cached: The last found control reference. It is common that the same
|
||||
* control is needed multiple times, so this is a simple
|
||||
* optimization.
|
||||
* @buckets: Buckets for the hashing. Allows for quick control lookup.
|
||||
* @notify: A notify callback that is called whenever the control changes value.
|
||||
* Note that the handler's lock is held when the notify function
|
||||
* is called!
|
||||
* @notify_priv: Passed as argument to the v4l2_ctrl notify callback.
|
||||
* @nr_of_buckets: Total number of buckets in the array.
|
||||
* @error: The error code of the first failed control addition.
|
||||
*/
|
||||
struct v4l2_ctrl_handler {
|
||||
//struct mutex _lock;
|
||||
//struct mutex *lock;
|
||||
_Mutex _lock;
|
||||
_Mutex *lock;
|
||||
struct list_head ctrls;
|
||||
struct list_head ctrl_refs;
|
||||
struct v4l2_ctrl_ref *cached;
|
||||
struct v4l2_ctrl_ref **buckets;
|
||||
v4l2_ctrl_notify_fnc notify;
|
||||
void *notify_priv;
|
||||
u16 nr_of_buckets;
|
||||
int error;
|
||||
};
|
||||
|
||||
/** struct v4l2_ctrl_config - Control configuration structure.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @name: The control name.
|
||||
* @type: The control type.
|
||||
* @min: The control's minimum value.
|
||||
* @max: The control's maximum value.
|
||||
* @step: The control's step value for non-menu controls.
|
||||
* @def: The control's default value.
|
||||
* @flags: The control's flags.
|
||||
* @menu_skip_mask: The control's skip mask for menu controls. This makes it
|
||||
* easy to skip menu items that are not valid. If bit X is set,
|
||||
* then menu item X is skipped. Of course, this only works for
|
||||
* menus with <= 32 menu items. There are no menus that come
|
||||
* close to that number, so this is OK. Should we ever need more,
|
||||
* then this will have to be extended to a u64 or a bit array.
|
||||
* @qmenu: A const char * array for all menu items. Array entries that are
|
||||
* empty strings ("") correspond to non-existing menu items (this
|
||||
* is in addition to the menu_skip_mask above). The last entry
|
||||
* must be NULL.
|
||||
* @is_private: If set, then this control is private to its handler and it
|
||||
* will not be added to any other handlers.
|
||||
*/
|
||||
struct v4l2_ctrl_config {
|
||||
const struct v4l2_ctrl_ops *ops;
|
||||
u32 id;
|
||||
const char *name;
|
||||
enum v4l2_ctrl_type type;
|
||||
s32 min;
|
||||
s32 max;
|
||||
u32 step;
|
||||
s32 def;
|
||||
u32 flags;
|
||||
u32 menu_skip_mask;
|
||||
const char * const *qmenu;
|
||||
const s64 *qmenu_int;
|
||||
unsigned int is_private:1;
|
||||
};
|
||||
|
||||
/** v4l2_ctrl_fill() - Fill in the control fields based on the control ID.
|
||||
*
|
||||
* This works for all standard V4L2 controls.
|
||||
* For non-standard controls it will only fill in the given arguments
|
||||
* and @name will be NULL.
|
||||
*
|
||||
* This function will overwrite the contents of @name, @type and @flags.
|
||||
* The contents of @min, @max, @step and @def may be modified depending on
|
||||
* the type.
|
||||
*
|
||||
* Do not use in drivers! It is used internally for backwards compatibility
|
||||
* control handling only. Once all drivers are converted to use the new
|
||||
* control framework this function will no longer be exported.
|
||||
*/
|
||||
void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
|
||||
s32 *min, s32 *max, s32 *step, s32 *def, u32 *flags);
|
||||
|
||||
|
||||
/** v4l2_ctrl_handler_init_class() - Initialize the control handler.
|
||||
* @hdl: The control handler.
|
||||
* @nr_of_controls_hint: A hint of how many controls this handler is
|
||||
* expected to refer to. This is the total number, so including
|
||||
* any inherited controls. It doesn't have to be precise, but if
|
||||
* it is way off, then you either waste memory (too many buckets
|
||||
* are allocated) or the control lookup becomes slower (not enough
|
||||
* buckets are allocated, so there are more slow list lookups).
|
||||
* It will always work, though.
|
||||
* @key: Used by the lock validator if CONFIG_LOCKDEP is set.
|
||||
* @name: Used by the lock validator if CONFIG_LOCKDEP is set.
|
||||
*
|
||||
* Returns an error if the buckets could not be allocated. This error will
|
||||
* also be stored in @hdl->error.
|
||||
*
|
||||
* Never use this call directly, always use the v4l2_ctrl_handler_init
|
||||
* macro that hides the @key and @name arguments.
|
||||
*/
|
||||
#if 0
|
||||
int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
|
||||
unsigned nr_of_controls_hint,
|
||||
struct lock_class_key *key, const char *name);
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define v4l2_ctrl_handler_init(hdl, nr_of_controls_hint) \
|
||||
( \
|
||||
({ \
|
||||
static struct lock_class_key _key; \
|
||||
v4l2_ctrl_handler_init_class(hdl, nr_of_controls_hint, \
|
||||
&_key, \
|
||||
KBUILD_BASENAME ":" \
|
||||
__stringify(__LINE__) ":" \
|
||||
"(" #hdl ")->_lock"); \
|
||||
}) \
|
||||
)
|
||||
#else
|
||||
#define v4l2_ctrl_handler_init(hdl, nr_of_controls_hint) \
|
||||
v4l2_ctrl_handler_init_class(hdl, nr_of_controls_hint, NULL, NULL)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** v4l2_ctrl_handler_free() - Free all controls owned by the handler and free
|
||||
* the control list.
|
||||
* @hdl: The control handler.
|
||||
*
|
||||
* Does nothing if @hdl == NULL.
|
||||
*/
|
||||
void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl);
|
||||
|
||||
/** v4l2_ctrl_handler_setup() - Call the s_ctrl op for all controls belonging
|
||||
* to the handler to initialize the hardware to the current control values.
|
||||
* @hdl: The control handler.
|
||||
*
|
||||
* Button controls will be skipped, as are read-only controls.
|
||||
*
|
||||
* If @hdl == NULL, then this just returns 0.
|
||||
*/
|
||||
int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl);
|
||||
|
||||
/** v4l2_ctrl_handler_log_status() - Log all controls owned by the handler.
|
||||
* @hdl: The control handler.
|
||||
* @prefix: The prefix to use when logging the control values. If the
|
||||
* prefix does not end with a space, then ": " will be added
|
||||
* after the prefix. If @prefix == NULL, then no prefix will be
|
||||
* used.
|
||||
*
|
||||
* For use with VIDIOC_LOG_STATUS.
|
||||
*
|
||||
* Does nothing if @hdl == NULL.
|
||||
*/
|
||||
void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
|
||||
const char *prefix);
|
||||
|
||||
/** v4l2_ctrl_new_custom() - Allocate and initialize a new custom V4L2
|
||||
* control.
|
||||
* @hdl: The control handler.
|
||||
* @cfg: The control's configuration data.
|
||||
* @priv: The control's driver-specific private data.
|
||||
*
|
||||
* If the &v4l2_ctrl struct could not be allocated then NULL is returned
|
||||
* and @hdl->error is set to the error code (if it wasn't set already).
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_config *cfg, void *priv);
|
||||
|
||||
/** v4l2_ctrl_new_std() - Allocate and initialize a new standard V4L2 non-menu control.
|
||||
* @hdl: The control handler.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @min: The control's minimum value.
|
||||
* @max: The control's maximum value.
|
||||
* @step: The control's step value
|
||||
* @def: The control's default value.
|
||||
*
|
||||
* If the &v4l2_ctrl struct could not be allocated, or the control
|
||||
* ID is not known, then NULL is returned and @hdl->error is set to the
|
||||
* appropriate error code (if it wasn't set already).
|
||||
*
|
||||
* If @id refers to a menu control, then this function will return NULL.
|
||||
*
|
||||
* Use v4l2_ctrl_new_std_menu() when adding menu controls.
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 min, s32 max, u32 step, s32 def);
|
||||
|
||||
/** v4l2_ctrl_new_std_menu() - Allocate and initialize a new standard V4L2 menu control.
|
||||
* @hdl: The control handler.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @max: The control's maximum value.
|
||||
* @mask: The control's skip mask for menu controls. This makes it
|
||||
* easy to skip menu items that are not valid. If bit X is set,
|
||||
* then menu item X is skipped. Of course, this only works for
|
||||
* menus with <= 32 menu items. There are no menus that come
|
||||
* close to that number, so this is OK. Should we ever need more,
|
||||
* then this will have to be extended to a u64 or a bit array.
|
||||
* @def: The control's default value.
|
||||
*
|
||||
* Same as v4l2_ctrl_new_std(), but @min is set to 0 and the @mask value
|
||||
* determines which menu items are to be skipped.
|
||||
*
|
||||
* If @id refers to a non-menu control, then this function will return NULL.
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 max, s32 mask, s32 def);
|
||||
|
||||
/** v4l2_ctrl_new_std_menu_items() - Create a new standard V4L2 menu control
|
||||
* with driver specific menu.
|
||||
* @hdl: The control handler.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @max: The control's maximum value.
|
||||
* @mask: The control's skip mask for menu controls. This makes it
|
||||
* easy to skip menu items that are not valid. If bit X is set,
|
||||
* then menu item X is skipped. Of course, this only works for
|
||||
* menus with <= 32 menu items. There are no menus that come
|
||||
* close to that number, so this is OK. Should we ever need more,
|
||||
* then this will have to be extended to a u64 or a bit array.
|
||||
* @def: The control's default value.
|
||||
* @qmenu: The new menu.
|
||||
*
|
||||
* Same as v4l2_ctrl_new_std_menu(), but @qmenu will be the driver specific
|
||||
* menu of this control.
|
||||
*
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
|
||||
s32 mask, s32 def, const char * const *qmenu);
|
||||
|
||||
/** v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu control.
|
||||
* @hdl: The control handler.
|
||||
* @ops: The control ops.
|
||||
* @id: The control ID.
|
||||
* @max: The control's maximum value.
|
||||
* @def: The control's default value.
|
||||
* @qmenu_int: The control's menu entries.
|
||||
*
|
||||
* Same as v4l2_ctrl_new_std_menu(), but @mask is set to 0 and it additionaly
|
||||
* takes as an argument an array of integers determining the menu items.
|
||||
*
|
||||
* If @id refers to a non-integer-menu control, then this function will return NULL.
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 max, s32 def, const s64 *qmenu_int);
|
||||
|
||||
/** v4l2_ctrl_add_ctrl() - Add a control from another handler to this handler.
|
||||
* @hdl: The control handler.
|
||||
* @ctrl: The control to add.
|
||||
*
|
||||
* It will return NULL if it was unable to add the control reference.
|
||||
* If the control already belonged to the handler, then it will do
|
||||
* nothing and just return @ctrl.
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler *hdl,
|
||||
struct v4l2_ctrl *ctrl);
|
||||
|
||||
/** v4l2_ctrl_add_handler() - Add all controls from handler @add to
|
||||
* handler @hdl.
|
||||
* @hdl: The control handler.
|
||||
* @add: The control handler whose controls you want to add to
|
||||
* the @hdl control handler.
|
||||
* @filter: This function will filter which controls should be added.
|
||||
*
|
||||
* Does nothing if either of the two handlers is a NULL pointer.
|
||||
* If @filter is NULL, then all controls are added. Otherwise only those
|
||||
* controls for which @filter returns true will be added.
|
||||
* In case of an error @hdl->error will be set to the error code (if it
|
||||
* wasn't set already).
|
||||
*/
|
||||
int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
|
||||
struct v4l2_ctrl_handler *add,
|
||||
bool (*filter)(const struct v4l2_ctrl *ctrl));
|
||||
|
||||
/** v4l2_ctrl_radio_filter() - Standard filter for radio controls.
|
||||
* @ctrl: The control that is filtered.
|
||||
*
|
||||
* This will return true for any controls that are valid for radio device
|
||||
* nodes. Those are all of the V4L2_CID_AUDIO_* user controls and all FM
|
||||
* transmitter class controls.
|
||||
*
|
||||
* This function is to be used with v4l2_ctrl_add_handler().
|
||||
*/
|
||||
bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl);
|
||||
|
||||
/** v4l2_ctrl_cluster() - Mark all controls in the cluster as belonging to that cluster.
|
||||
* @ncontrols: The number of controls in this cluster.
|
||||
* @controls: The cluster control array of size @ncontrols.
|
||||
*/
|
||||
void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls);
|
||||
|
||||
|
||||
/** v4l2_ctrl_auto_cluster() - Mark all controls in the cluster as belonging to
|
||||
* that cluster and set it up for autofoo/foo-type handling.
|
||||
* @ncontrols: The number of controls in this cluster.
|
||||
* @controls: The cluster control array of size @ncontrols. The first control
|
||||
* must be the 'auto' control (e.g. autogain, autoexposure, etc.)
|
||||
* @manual_val: The value for the first control in the cluster that equals the
|
||||
* manual setting.
|
||||
* @set_volatile: If true, then all controls except the first auto control will
|
||||
* be volatile.
|
||||
*
|
||||
* Use for control groups where one control selects some automatic feature and
|
||||
* the other controls are only active whenever the automatic feature is turned
|
||||
* off (manual mode). Typical examples: autogain vs gain, auto-whitebalance vs
|
||||
* red and blue balance, etc.
|
||||
*
|
||||
* The behavior of such controls is as follows:
|
||||
*
|
||||
* When the autofoo control is set to automatic, then any manual controls
|
||||
* are set to inactive and any reads will call g_volatile_ctrl (if the control
|
||||
* was marked volatile).
|
||||
*
|
||||
* When the autofoo control is set to manual, then any manual controls will
|
||||
* be marked active, and any reads will just return the current value without
|
||||
* going through g_volatile_ctrl.
|
||||
*
|
||||
* In addition, this function will set the V4L2_CTRL_FLAG_UPDATE flag
|
||||
* on the autofoo control and V4L2_CTRL_FLAG_INACTIVE on the foo control(s)
|
||||
* if autofoo is in auto mode.
|
||||
*/
|
||||
void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
|
||||
u8 manual_val, bool set_volatile);
|
||||
|
||||
|
||||
/** v4l2_ctrl_find() - Find a control with the given ID.
|
||||
* @hdl: The control handler.
|
||||
* @id: The control ID to find.
|
||||
*
|
||||
* If @hdl == NULL this will return NULL as well. Will lock the handler so
|
||||
* do not use from inside &v4l2_ctrl_ops.
|
||||
*/
|
||||
struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
|
||||
|
||||
/** v4l2_ctrl_activate() - Make the control active or inactive.
|
||||
* @ctrl: The control to (de)activate.
|
||||
* @active: True if the control should become active.
|
||||
*
|
||||
* This sets or clears the V4L2_CTRL_FLAG_INACTIVE flag atomically.
|
||||
* Does nothing if @ctrl == NULL.
|
||||
* This will usually be called from within the s_ctrl op.
|
||||
* The V4L2_EVENT_CTRL event will be generated afterwards.
|
||||
*
|
||||
* This function assumes that the control handler is locked.
|
||||
*/
|
||||
void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
|
||||
|
||||
/** v4l2_ctrl_grab() - Mark the control as grabbed or not grabbed.
|
||||
* @ctrl: The control to (de)activate.
|
||||
* @grabbed: True if the control should become grabbed.
|
||||
*
|
||||
* This sets or clears the V4L2_CTRL_FLAG_GRABBED flag atomically.
|
||||
* Does nothing if @ctrl == NULL.
|
||||
* The V4L2_EVENT_CTRL event will be generated afterwards.
|
||||
* This will usually be called when starting or stopping streaming in the
|
||||
* driver.
|
||||
*
|
||||
* This function assumes that the control handler is not locked and will
|
||||
* take the lock itself.
|
||||
*/
|
||||
void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
||||
|
||||
/** v4l2_ctrl_modify_range() - Update the range of a control.
|
||||
* @ctrl: The control to update.
|
||||
* @min: The control's minimum value.
|
||||
* @max: The control's maximum value.
|
||||
* @step: The control's step value
|
||||
* @def: The control's default value.
|
||||
*
|
||||
* Update the range of a control on the fly. This works for control types
|
||||
* INTEGER, BOOLEAN, MENU, INTEGER MENU and BITMASK. For menu controls the
|
||||
* @step value is interpreted as a menu_skip_mask.
|
||||
*
|
||||
* An error is returned if one of the range arguments is invalid for this
|
||||
* control type.
|
||||
*
|
||||
* This function assumes that the control handler is not locked and will
|
||||
* take the lock itself.
|
||||
*/
|
||||
int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||
s32 min, s32 max, u32 step, s32 def);
|
||||
|
||||
/** v4l2_ctrl_lock() - Helper function to lock the handler
|
||||
* associated with the control.
|
||||
* @ctrl: The control to lock.
|
||||
*/
|
||||
static inline void v4l2_ctrl_lock(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
mutex_lock(ctrl->handler->lock);
|
||||
}
|
||||
|
||||
/** v4l2_ctrl_lock() - Helper function to unlock the handler
|
||||
* associated with the control.
|
||||
* @ctrl: The control to unlock.
|
||||
*/
|
||||
static inline void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
mutex_unlock(ctrl->handler->lock);
|
||||
}
|
||||
|
||||
/** v4l2_ctrl_notify() - Function to set a notify callback for a control.
|
||||
* @ctrl: The control.
|
||||
* @notify: The callback function.
|
||||
* @priv: The callback private handle, passed as argument to the callback.
|
||||
*
|
||||
* This function sets a callback function for the control. If @ctrl is NULL,
|
||||
* then it will do nothing. If @notify is NULL, then the notify callback will
|
||||
* be removed.
|
||||
*
|
||||
* There can be only one notify. If another already exists, then a WARN_ON
|
||||
* will be issued and the function will do nothing.
|
||||
*/
|
||||
void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv);
|
||||
|
||||
/** v4l2_ctrl_g_ctrl() - Helper function to get the control's value from within a driver.
|
||||
* @ctrl: The control.
|
||||
*
|
||||
* This returns the control's value safely by going through the control
|
||||
* framework. This function will lock the control's handler, so it cannot be
|
||||
* used from within the &v4l2_ctrl_ops functions.
|
||||
*
|
||||
* This function is for integer type controls only.
|
||||
*/
|
||||
s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
|
||||
|
||||
/** v4l2_ctrl_s_ctrl() - Helper function to set the control's value from within a driver.
|
||||
* @ctrl: The control.
|
||||
* @val: The new value.
|
||||
*
|
||||
* This set the control's new value safely by going through the control
|
||||
* framework. This function will lock the control's handler, so it cannot be
|
||||
* used from within the &v4l2_ctrl_ops functions.
|
||||
*
|
||||
* This function is for integer type controls only.
|
||||
*/
|
||||
int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
|
||||
|
||||
/** v4l2_ctrl_g_ctrl_int64() - Helper function to get a 64-bit control's value from within a driver.
|
||||
* @ctrl: The control.
|
||||
*
|
||||
* This returns the control's value safely by going through the control
|
||||
* framework. This function will lock the control's handler, so it cannot be
|
||||
* used from within the &v4l2_ctrl_ops functions.
|
||||
*
|
||||
* This function is for 64-bit integer type controls only.
|
||||
*/
|
||||
s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl);
|
||||
|
||||
/** v4l2_ctrl_s_ctrl_int64() - Helper function to set a 64-bit control's value from within a driver.
|
||||
* @ctrl: The control.
|
||||
* @val: The new value.
|
||||
*
|
||||
* This set the control's new value safely by going through the control
|
||||
* framework. This function will lock the control's handler, so it cannot be
|
||||
* used from within the &v4l2_ctrl_ops functions.
|
||||
*
|
||||
* This function is for 64-bit integer type controls only.
|
||||
*/
|
||||
int v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val);
|
||||
|
||||
/* Internal helper functions that deal with control events. */
|
||||
extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;
|
||||
void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new);
|
||||
void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new);
|
||||
|
||||
/* Can be used as a vidioc_log_status function that just dumps all controls
|
||||
associated with the filehandle. */
|
||||
int v4l2_ctrl_log_status(void *fh);
|
||||
|
||||
/* Can be used as a vidioc_subscribe_event function that just subscribes
|
||||
control events. */
|
||||
int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub);
|
||||
|
||||
/* Can be used as a poll function that just polls for control events. */
|
||||
//unsigned int v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait);
|
||||
|
||||
/* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */
|
||||
int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
|
||||
int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);
|
||||
int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl);
|
||||
int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
|
||||
struct v4l2_control *ctrl);
|
||||
int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c);
|
||||
int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c);
|
||||
int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
|
||||
struct v4l2_ext_controls *c);
|
||||
|
||||
/* Helpers for subdevices. If the associated ctrl_handler == NULL then they
|
||||
will all return -EINVAL. */
|
||||
int v4l2_subdev_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
|
||||
int v4l2_subdev_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
|
||||
int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
|
||||
int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
|
||||
int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
|
||||
int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
|
||||
int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
|
||||
|
||||
/* Can be used as a subscribe_event function that just subscribes control
|
||||
events. */
|
||||
int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub);
|
||||
|
||||
/* Log all controls owned by subdev's control handler. */
|
||||
int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd);
|
||||
|
||||
#endif
|
273
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-dev.h
Normal file
273
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-dev.h
Normal file
|
@ -0,0 +1,273 @@
|
|||
/*
|
||||
*
|
||||
* V 4 L 2 D R I V E R H E L P E R A P I
|
||||
*
|
||||
* Moved from videodev2.h
|
||||
*
|
||||
* Some commonly needed functions for drivers (v4l2-common.o module)
|
||||
*/
|
||||
#ifndef _V4L2_DEV_H
|
||||
#define _V4L2_DEV_H
|
||||
#if 0
|
||||
#include <linux/poll.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/mutex.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
#include "uapi_videodev2.h"
|
||||
#include "media-entity.h"
|
||||
|
||||
|
||||
#define VIDEO_MAJOR 81
|
||||
|
||||
#define VFL_TYPE_GRABBER 0
|
||||
#define VFL_TYPE_VBI 1
|
||||
#define VFL_TYPE_RADIO 2
|
||||
#define VFL_TYPE_SUBDEV 3
|
||||
#define VFL_TYPE_MAX 4
|
||||
|
||||
/* Is this a receiver, transmitter or mem-to-mem? */
|
||||
/* Ignored for VFL_TYPE_SUBDEV. */
|
||||
#define VFL_DIR_RX 0
|
||||
#define VFL_DIR_TX 1
|
||||
#define VFL_DIR_M2M 2
|
||||
|
||||
//struct v4l2_ioctl_callbacks; // can't find out from the kernel source code
|
||||
struct video_device;
|
||||
struct v4l2_device;
|
||||
struct v4l2_ctrl_handler;
|
||||
enum v4l2_priority;
|
||||
/* Flag to mark the video_device struct as registered.
|
||||
Drivers can clear this flag if they want to block all future
|
||||
device access. It is cleared by video_unregister_device. */
|
||||
#define V4L2_FL_REGISTERED (0)
|
||||
/* file->private_data points to struct v4l2_fh */
|
||||
#define V4L2_FL_USES_V4L2_FH (1)
|
||||
/* Use the prio field of v4l2_fh for core priority checking */
|
||||
#define V4L2_FL_USE_FH_PRIO (2)
|
||||
|
||||
/* Priority helper functions */
|
||||
|
||||
struct v4l2_prio_state {
|
||||
atomic_t prios[4];
|
||||
};
|
||||
|
||||
/*
|
||||
enum v4l2_priority {
|
||||
V4L2_PRIORITY_UNSET = 0, // 不初始化
|
||||
V4L2_PRIORITY_BACKGROUND = 1, // 背景
|
||||
V4L2_PRIORITY_INTERACTIVE = 2, // 互動
|
||||
V4L2_PRIORITY_RECORD = 3, // 紀錄
|
||||
V4L2_PRIORITY_DEFAULT = V4L2_PRIORITY_INTERACTIVE,
|
||||
};
|
||||
优先權是為了Multiple Opens操作,當可以支持device同時被多個thread 打開(i.e open())
|
||||
需要用這優先權去區分哪個操作更重要,使用的那個優先級別,的prios[4]就加一。
|
||||
*/
|
||||
|
||||
void v4l2_prio_init(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
|
||||
enum v4l2_priority new);
|
||||
void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
|
||||
void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
|
||||
int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local);
|
||||
|
||||
|
||||
struct v4l2_file_operations {
|
||||
//struct module *owner;
|
||||
//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
||||
//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
|
||||
//unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
||||
long (*ioctl) (unsigned int, unsigned long);
|
||||
long (*unlocked_ioctl) (unsigned int, unsigned long);
|
||||
#ifdef CONFIG_COMPAT
|
||||
long (*compat_ioctl32) (unsigned int, unsigned long);
|
||||
#endif
|
||||
//unsigned long (*get_unmapped_area) (struct file *, unsigned long,
|
||||
// unsigned long, unsigned long, unsigned long);
|
||||
int (*mmap) ();
|
||||
int (*open) ();
|
||||
int (*release) ();
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Newer version of video_device, handled by videodev2.c
|
||||
* This version moves redundant code from video device code to
|
||||
* the common handler
|
||||
*/
|
||||
|
||||
struct video_device
|
||||
{
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER)
|
||||
struct media_entity entity;
|
||||
#endif
|
||||
/* device ops */
|
||||
const struct v4l2_file_operations *fops;
|
||||
|
||||
/* sysfs */
|
||||
//struct device dev; /* v4l device,this is mainlt for sysfs */
|
||||
unsigned long dev; /* replace to the reference count */
|
||||
void *dev_driver_data;
|
||||
const char *init_name; /* initial name of the device */
|
||||
void (*dev_release)(); /* release call back in origonal dev */
|
||||
|
||||
//struct cdev *cdev; /* character device, which video device register */
|
||||
//struct file_operations *cdev_ops;/* file_operations in origonal cdev */
|
||||
|
||||
struct v4l2_device *v4l2_dev; /* v4l2_device parent */
|
||||
/* Only set parent if that can't be deduced from v4l2_dev */
|
||||
//struct device *dev_parent; /* device parent */
|
||||
|
||||
/* Control handler associated with this device node. May be NULL.
|
||||
* look up v4l2_ctrls.h for more detail */
|
||||
struct v4l2_ctrl_handler *ctrl_handler;
|
||||
|
||||
/* vb2_queue associated with this device node. May be NULL. */
|
||||
struct vb2_queue *queue;
|
||||
|
||||
/* Priority state. If NULL, then v4l2_dev->prio will be used. */
|
||||
struct v4l2_prio_state *prio;
|
||||
|
||||
/* device info */
|
||||
char name[32];
|
||||
int vfl_type; /* device type,usally assign the define VFL_TYPE_XXX value */
|
||||
int vfl_dir; /* receiver, transmitter or m2m,usally assign the define VFL_DIR_XXX value */
|
||||
/* 'minor' is set to -1 if the registration failed */
|
||||
int minor;
|
||||
u16 num; /* record the registered video device node number */
|
||||
/* use bitops to set/clear/test flags,usally assign the define VFL_FL_XXX value */
|
||||
unsigned long flags;
|
||||
/* attribute to differentiate multiple indices on one physical device */
|
||||
int index;
|
||||
|
||||
/* V4L2 file handles */
|
||||
//spinlock_t fh_lock; /* Lock for all v4l2_fhs */
|
||||
_Lock fh_lock;
|
||||
struct list_head fh_list; /* List of struct v4l2_fh */
|
||||
int debug; /* Activates debug level*/
|
||||
|
||||
/* Video standard vars (v4l2_std_id = u64)*/
|
||||
//v4l2_std_id tvnorms; /* Supported tv norms,usally assign the define VFL_STD_XXX value */
|
||||
u64 tvnorms;
|
||||
|
||||
/* callbacks,this must non-NULL,in usually use the video_device_release()to replace of */
|
||||
void (*release)(struct video_device *vdev);
|
||||
|
||||
/* ioctl callbacks,look up v4l2-ioctl.h for more detail */
|
||||
const struct v4l2_ioctl_ops *ioctl_ops;
|
||||
//DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); /* unsigned long valid_ioctls[6] */
|
||||
unsigned long valid_ioctls[6];
|
||||
/* serialization lock */
|
||||
//DECLARE_BITMAP(disable_locking, BASE_VIDIOC_PRIVATE); /* unsigned long disable_locking[6] */
|
||||
unsigned long disable_locking[6];
|
||||
//struct mutex *lock; /* make serilized ioctl lock possible */
|
||||
_Mutex *lock;
|
||||
};
|
||||
|
||||
/* todo need to modify */
|
||||
#if 0
|
||||
#define media_entity_to_video_device(__e) \
|
||||
container_of(__e, struct video_device, entity)
|
||||
|
||||
/* dev to video-device */
|
||||
#define to_video_device(cd) container_of(cd, struct video_device, dev)
|
||||
#endif
|
||||
|
||||
int __video_register_device(struct video_device *vdev, int type,
|
||||
int nr, int warn_if_nr_in_use/*, struct module *owner*/);
|
||||
|
||||
/* Register video devices. Note that if video_register_device fails,
|
||||
the release() callback of the video_device structure is *not* called, so
|
||||
the caller is responsible for freeing any data. Usually that means that
|
||||
you call video_device_release() on failure. */
|
||||
static inline int video_register_device(struct video_device *vdev,
|
||||
int type, int nr)
|
||||
{
|
||||
// type = VFL_TYPE_GRABBER, nr = -1, 1, "THIS_MODULE"
|
||||
return __video_register_device(vdev, type, nr, 1/*, vdev->fops->owner*/);
|
||||
}
|
||||
|
||||
/* Same as video_register_device, but no warning is issued if the desired
|
||||
device node number was already in use. */
|
||||
static inline int video_register_device_no_warn(
|
||||
struct video_device *vdev, int type, int nr)
|
||||
{
|
||||
return __video_register_device(vdev, type, nr, 0/*, vdev->fops->owner*/);
|
||||
}
|
||||
|
||||
/* Unregister video devices. Will do nothing if vdev == NULL or
|
||||
video_is_registered() returns false. */
|
||||
void video_unregister_device(struct video_device *vdev);
|
||||
|
||||
/* helper functions to alloc/release struct video_device, the
|
||||
latter can also be used for video_device->release(). */
|
||||
struct video_device *video_device_alloc(void);
|
||||
|
||||
/* this release function frees the vdev pointer */
|
||||
void video_device_release(struct video_device *vdev);
|
||||
|
||||
/* this release function does nothing, use when the video_device is a
|
||||
static global struct. Note that having a static video_device is
|
||||
a dubious construction at best. */
|
||||
void video_device_release_empty(struct video_device *vdev);
|
||||
|
||||
/* returns true if cmd is a known V4L2 ioctl */
|
||||
bool v4l2_is_known_ioctl(unsigned int cmd);
|
||||
|
||||
/* mark that this command shouldn't use core locking */
|
||||
static inline void v4l2_disable_ioctl_locking(struct video_device *vdev, unsigned int cmd)
|
||||
{
|
||||
#define BASE_VIDIOC_PRIVATE 192
|
||||
if (_IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)
|
||||
set_bit(_IOC_NR(cmd), vdev->disable_locking);
|
||||
}
|
||||
|
||||
/* Mark that this command isn't implemented. This must be called before
|
||||
video_device_register. See also the comments in determine_valid_ioctls().
|
||||
This function allows drivers to provide just one v4l2_ioctl_ops struct, but
|
||||
disable ioctls based on the specific card that is actually found. */
|
||||
static inline void v4l2_disable_ioctl(struct video_device *vdev, unsigned int cmd)
|
||||
{
|
||||
#define BASE_VIDIOC_PRIVATE 192
|
||||
if (_IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)
|
||||
set_bit(_IOC_NR(cmd), vdev->valid_ioctls);
|
||||
}
|
||||
|
||||
/* helper functions to access driver private data. */
|
||||
static inline void *video_get_drvdata(struct video_device *vdev)
|
||||
{
|
||||
//return dev_get_drvdata(&vdev->dev);
|
||||
return (vdev->dev_driver_data);
|
||||
}
|
||||
|
||||
static inline void video_set_drvdata(struct video_device *vdev, void *data)
|
||||
{
|
||||
//dev_set_drvdata(&vdev->dev, data);
|
||||
vdev->dev_driver_data = data;
|
||||
}
|
||||
|
||||
struct video_device *video_devdata();
|
||||
|
||||
/* Combine video_get_drvdata and video_devdata as this is
|
||||
used very often. */
|
||||
static inline void *video_drvdata()
|
||||
{
|
||||
return video_get_drvdata(video_devdata());
|
||||
}
|
||||
|
||||
static inline const char *video_device_node_name(struct video_device *vdev)
|
||||
{
|
||||
//return dev_name(&vdev->dev);
|
||||
return (vdev->init_name);
|
||||
}
|
||||
|
||||
static inline int video_is_registered(struct video_device *vdev)
|
||||
{
|
||||
return test_bit(V4L2_FL_REGISTERED, &vdev->flags);
|
||||
}
|
||||
|
||||
#endif /* _V4L2_DEV_H */
|
216
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-device.h
Normal file
216
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-device.h
Normal file
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
V4L2 device support header.
|
||||
|
||||
Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl>
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _V4L2_DEVICE_H
|
||||
#define _V4L2_DEVICE_H
|
||||
|
||||
#include "media-device.h"
|
||||
#include "v4l2-subdev.h"
|
||||
#include "v4l2-dev.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/* Each instance of a V4L2 device should create the v4l2_device struct,
|
||||
either stand-alone or embedded in a larger struct.
|
||||
|
||||
It allows easy access to sub-devices (see v4l2-subdev.h) and provides
|
||||
basic V4L2 device-level support.
|
||||
*/
|
||||
|
||||
#define V4L2_DEVICE_NAME_SIZE (20 + 16)
|
||||
|
||||
struct v4l2_ctrl_handler;
|
||||
|
||||
struct v4l2_device {
|
||||
/* dev->driver_data points to this struct.
|
||||
Note: dev might be NULL if there is no parent device
|
||||
as is the case with e.g. ISA devices. */
|
||||
//struct device *dev;
|
||||
//void *dev;
|
||||
void *dev_driver_data;
|
||||
//edit by Ian
|
||||
//unsigned long dev_ref_count;
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER)
|
||||
struct media_device *mdev;
|
||||
#endif
|
||||
/* used to keep track of the registered subdevs */
|
||||
struct list_head subdevs;
|
||||
/* lock this struct; can be used by the driver as well if this
|
||||
struct is embedded into a larger struct. */
|
||||
//spinlock_t lock;
|
||||
_Lock lock;
|
||||
/* unique device name, by default the driver name + bus ID */
|
||||
char name[V4L2_DEVICE_NAME_SIZE];
|
||||
/* notify callback called by some sub-devices. */
|
||||
void (*notify)(struct v4l2_subdev *sd, unsigned int notification, void *arg);
|
||||
/* The control handler. May be NULL. */
|
||||
struct v4l2_ctrl_handler *ctrl_handler;
|
||||
/* Device's priority state */
|
||||
struct v4l2_prio_state prio;
|
||||
/* BKL replacement mutex. Temporary solution only. */
|
||||
//struct mutex ioctl_lock;
|
||||
_Mutex ioctl_lock;
|
||||
/* Keep track of the references to this struct. */
|
||||
//struct kref ref;
|
||||
unsigned long ref;
|
||||
/* Release function that is called when the ref count goes to 0. */
|
||||
void (*release)(struct v4l2_device *v4l2_dev);
|
||||
};
|
||||
|
||||
static inline void v4l2_device_get(struct v4l2_device *v4l2_dev)
|
||||
{
|
||||
//kref_get(&v4l2_dev->ref);
|
||||
atomic_inc((atomic_t *)&v4l2_dev->ref);
|
||||
}
|
||||
|
||||
int v4l2_device_put(struct v4l2_device *v4l2_dev);
|
||||
|
||||
/* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev.
|
||||
dev may be NULL in rare cases (ISA devices). In that case you
|
||||
must fill in the v4l2_dev->name field before calling this function. */
|
||||
//int v4l2_device_register(struct v4l2_device *v4l2_dev);
|
||||
int v4l2_device_register(void *dev_prive_date, struct v4l2_device *v4l2_dev);
|
||||
|
||||
/* Optional function to initialize the name field of struct v4l2_device using
|
||||
the driver name and a driver-global atomic_t instance.
|
||||
This function will increment the instance counter and returns the instance
|
||||
value used in the name.
|
||||
|
||||
Example:
|
||||
|
||||
static atomic_t drv_instance = ATOMIC_INIT(0);
|
||||
|
||||
...
|
||||
|
||||
instance = v4l2_device_set_name(&v4l2_dev, "foo", &drv_instance);
|
||||
|
||||
The first time this is called the name field will be set to foo0 and
|
||||
this function returns 0. If the name ends with a digit (e.g. cx18),
|
||||
then the name will be set to cx18-0 since cx180 looks really odd. */
|
||||
int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename,
|
||||
atomic_t *instance);
|
||||
|
||||
/* Set v4l2_dev->dev to NULL. Call when the USB parent disconnects.
|
||||
Since the parent disappears this ensures that v4l2_dev doesn't have an
|
||||
invalid parent pointer. */
|
||||
void v4l2_device_disconnect(struct v4l2_device *v4l2_dev);
|
||||
|
||||
/* Unregister all sub-devices and any other resources related to v4l2_dev. */
|
||||
void v4l2_device_unregister(struct v4l2_device *v4l2_dev);
|
||||
|
||||
/* Register a subdev with a v4l2 device. While registered the subdev module
|
||||
is marked as in-use. An error is returned if the module is no longer
|
||||
loaded when you attempt to register it. */
|
||||
int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,
|
||||
struct v4l2_subdev *sd);
|
||||
/* Unregister a subdev with a v4l2 device. Can also be called if the subdev
|
||||
wasn't registered. In that case it will do nothing. */
|
||||
void v4l2_device_unregister_subdev(struct v4l2_subdev *sd);
|
||||
|
||||
/* Register device nodes for all subdev of the v4l2 device that are marked with
|
||||
* the V4L2_SUBDEV_FL_HAS_DEVNODE flag.
|
||||
*/
|
||||
int v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev);
|
||||
|
||||
/* Iterate over all subdevs. */
|
||||
#define v4l2_device_for_each_subdev(sd, v4l2_dev) \
|
||||
list_for_each_entry(sd, &(v4l2_dev)->subdevs, list, struct v4l2_subdev)
|
||||
|
||||
/* Call the specified callback for all subdevs matching the condition.
|
||||
Ignore any errors. Note that you cannot add or delete a subdev
|
||||
while walking the subdevs list. */
|
||||
#define __v4l2_device_call_subdevs_p(v4l2_dev, sd, cond, o, f, args...) \
|
||||
do { \
|
||||
list_for_each_entry((sd), &(v4l2_dev)->subdevs, list, struct v4l2_subdev) \
|
||||
if ((cond) && (sd)->ops->o && (sd)->ops->o->f) \
|
||||
(sd)->ops->o->f((sd) , ##args); \
|
||||
} while (0)
|
||||
|
||||
#define __v4l2_device_call_subdevs(v4l2_dev, cond, o, f, args...) \
|
||||
do { \
|
||||
struct v4l2_subdev *__sd; \
|
||||
\
|
||||
__v4l2_device_call_subdevs_p(v4l2_dev, __sd, cond, o, \
|
||||
f , ##args); \
|
||||
} while (0)
|
||||
|
||||
/* Call the specified callback for all subdevs matching the condition.
|
||||
If the callback returns an error other than 0 or -ENOIOCTLCMD, then
|
||||
return with that error code. Note that you cannot add or delete a
|
||||
subdev while walking the subdevs list. */
|
||||
#define __v4l2_device_call_subdevs_until_err_p(v4l2_dev, sd, cond, o, f, args...) \
|
||||
({ \
|
||||
long __err = 0; \
|
||||
\
|
||||
list_for_each_entry((sd), &(v4l2_dev)->subdevs, list, struct v4l2_subdev) { \
|
||||
if ((cond) && (sd)->ops->o && (sd)->ops->o->f) \
|
||||
__err = (sd)->ops->o->f((sd) , ##args); \
|
||||
if (__err && __err != -ENOIOCTLCMD) \
|
||||
break; \
|
||||
} \
|
||||
(__err == -ENOIOCTLCMD) ? 0 : __err; \
|
||||
})
|
||||
|
||||
#define __v4l2_device_call_subdevs_until_err(v4l2_dev, cond, o, f, args...) \
|
||||
({ \
|
||||
struct v4l2_subdev *__sd; \
|
||||
__v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, cond, o, \
|
||||
f , ##args); \
|
||||
})
|
||||
|
||||
/* Call the specified callback for all subdevs matching grp_id (if 0, then
|
||||
match them all). Ignore any errors. Note that you cannot add or delete
|
||||
a subdev while walking the subdevs list. */
|
||||
#define v4l2_device_call_all(v4l2_dev, grpid, o, f, args...) \
|
||||
do { \
|
||||
struct v4l2_subdev *__sd; \
|
||||
\
|
||||
__v4l2_device_call_subdevs_p(v4l2_dev, __sd, \
|
||||
!(grpid) || __sd->grp_id == (grpid), o, f , \
|
||||
##args); \
|
||||
} while (0)
|
||||
|
||||
/* Call the specified callback for all subdevs matching grp_id (if 0, then
|
||||
match them all). If the callback returns an error other than 0 or
|
||||
-ENOIOCTLCMD, then return with that error code. Note that you cannot
|
||||
add or delete a subdev while walking the subdevs list. */
|
||||
#define v4l2_device_call_until_err(v4l2_dev, grpid, o, f, args...) \
|
||||
({ \
|
||||
struct v4l2_subdev *__sd; \
|
||||
__v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, \
|
||||
!(grpid) || __sd->grp_id == (grpid), o, f , \
|
||||
##args); \
|
||||
})
|
||||
|
||||
#define v4l2_device_has_op(v4l2_dev, o, f) \
|
||||
({ \
|
||||
struct v4l2_subdev *__sd; \
|
||||
bool __result = FALSE; \
|
||||
list_for_each_entry(__sd, &(v4l2_dev)->subdevs, list, struct v4l2_subdev) { \
|
||||
if (v4l2_subdev_has_op(__sd, o, f)) { \
|
||||
__result = true; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
__result; \
|
||||
})
|
||||
|
||||
#endif
|
139
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-event.h
Normal file
139
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-event.h
Normal file
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* v4l2-event.h
|
||||
*
|
||||
* V4L2 events.
|
||||
*
|
||||
* Copyright (C) 2009--2010 Nokia Corporation.
|
||||
*
|
||||
* Contact: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef V4L2_EVENT_H
|
||||
#define V4L2_EVENT_H
|
||||
|
||||
#if 0
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
#include "videodev2.h"
|
||||
|
||||
|
||||
/*
|
||||
* Overview:
|
||||
*
|
||||
* Events are subscribed per-filehandle. An event specification consists of a
|
||||
* type and is optionally associated with an object identified through the
|
||||
* 'id' field. So an event is uniquely identified by the (type, id) tuple.
|
||||
*
|
||||
* The v4l2-fh struct has a list of subscribed events. The v4l2_subscribed_event
|
||||
* struct is added to that list, one for every subscribed event.
|
||||
*
|
||||
* Each v4l2_subscribed_event struct ends with an array of v4l2_kevent structs.
|
||||
* This array (ringbuffer, really) is used to store any events raised by the
|
||||
* driver. The v4l2_kevent struct links into the 'available' list of the
|
||||
* v4l2_fh struct so VIDIOC_DQEVENT will know which event to dequeue first.
|
||||
*
|
||||
* Finally, if the event subscription is associated with a particular object
|
||||
* such as a V4L2 control, then that object needs to know about that as well
|
||||
* so that an event can be raised by that object. So the 'node' field can
|
||||
* be used to link the v4l2_subscribed_event struct into a list of that
|
||||
* object.
|
||||
*
|
||||
* So to summarize:
|
||||
*
|
||||
* struct v4l2_fh has two lists: one of the subscribed events, and one of the
|
||||
* pending events.
|
||||
*
|
||||
* struct v4l2_subscribed_event has a ringbuffer of raised (pending) events of
|
||||
* that particular type.
|
||||
*
|
||||
* If struct v4l2_subscribed_event is associated with a specific object, then
|
||||
* that object will have an internal list of struct v4l2_subscribed_event so
|
||||
* it knows who subscribed an event to that object.
|
||||
*/
|
||||
|
||||
struct v4l2_fh;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_subscribed_event;
|
||||
struct video_device;
|
||||
|
||||
/** struct v4l2_kevent - Internal kernel event struct.
|
||||
* @list: List node for the v4l2_fh->available list.
|
||||
* @sev: Pointer to parent v4l2_subscribed_event.
|
||||
* @event: The event itself.
|
||||
*/
|
||||
struct v4l2_kevent {
|
||||
struct list_head list;
|
||||
struct v4l2_subscribed_event *sev;
|
||||
struct v4l2_event event;
|
||||
};
|
||||
|
||||
/** struct v4l2_subscribed_event_ops - Subscribed event operations.
|
||||
* @add: Optional callback, called when a new listener is added
|
||||
* @del: Optional callback, called when a listener stops listening
|
||||
* @replace: Optional callback that can replace event 'old' with event 'new'.
|
||||
* @merge: Optional callback that can merge event 'old' into event 'new'.
|
||||
*/
|
||||
struct v4l2_subscribed_event_ops {
|
||||
int (*add)(struct v4l2_subscribed_event *sev, unsigned elems);
|
||||
void (*del)(struct v4l2_subscribed_event *sev);
|
||||
void (*replace)(struct v4l2_event *old, const struct v4l2_event *new);
|
||||
void (*merge)(const struct v4l2_event *old, struct v4l2_event *new);
|
||||
};
|
||||
|
||||
/** struct v4l2_subscribed_event - Internal struct representing a subscribed event.
|
||||
* @list: List node for the v4l2_fh->subscribed list.
|
||||
* @type: Event type.
|
||||
* @id: Associated object ID (e.g. control ID). 0 if there isn't any.
|
||||
* @flags: Copy of v4l2_event_subscription->flags.
|
||||
* @fh: Filehandle that subscribed to this event.
|
||||
* @node: List node that hooks into the object's event list (if there is one).
|
||||
* @ops: v4l2_subscribed_event_ops
|
||||
* @elems: The number of elements in the events array.
|
||||
* @first: The index of the events containing the oldest available event.
|
||||
* @in_use: The number of queued events.
|
||||
* @events: An array of @elems events.
|
||||
*/
|
||||
struct v4l2_subscribed_event {
|
||||
struct list_head list;
|
||||
u32 type;
|
||||
u32 id;
|
||||
u32 flags;
|
||||
struct v4l2_fh *fh;
|
||||
struct list_head node;
|
||||
const struct v4l2_subscribed_event_ops *ops;
|
||||
unsigned elems;
|
||||
unsigned first;
|
||||
unsigned in_use;
|
||||
struct v4l2_kevent events[];
|
||||
};
|
||||
|
||||
int v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event,
|
||||
int nonblocking);
|
||||
void v4l2_event_queue(struct video_device *vdev, const struct v4l2_event *ev);
|
||||
void v4l2_event_queue_fh(struct v4l2_fh *fh, const struct v4l2_event *ev);
|
||||
int v4l2_event_pending(struct v4l2_fh *fh);
|
||||
int v4l2_event_subscribe(struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub, unsigned elems,
|
||||
const struct v4l2_subscribed_event_ops *ops);
|
||||
int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub);
|
||||
void v4l2_event_unsubscribe_all(struct v4l2_fh *fh);
|
||||
int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub);
|
||||
#endif /* V4L2_EVENT_H */
|
108
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-fh.h
Normal file
108
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-fh.h
Normal file
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* v4l2-fh.h
|
||||
*
|
||||
* V4L2 file handle. Store per file handle data for the V4L2
|
||||
* framework. Using file handles is optional for the drivers.
|
||||
*
|
||||
* Copyright (C) 2009--2010 Nokia Corporation.
|
||||
*
|
||||
* Contact: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef V4L2_FH_H
|
||||
#define V4L2_FH_H
|
||||
|
||||
//#include <linux/list.h>
|
||||
|
||||
#include "v4l2-osdep.h"
|
||||
|
||||
struct video_device;
|
||||
struct v4l2_ctrl_handler;
|
||||
|
||||
struct v4l2_fh {
|
||||
struct list_head list;
|
||||
struct video_device *vdev;
|
||||
struct v4l2_ctrl_handler *ctrl_handler;
|
||||
enum v4l2_priority prio;
|
||||
|
||||
/* Events */
|
||||
//wait_queue_head_t wait;
|
||||
_Sema wait;
|
||||
struct list_head subscribed; /* Subscribed events */
|
||||
struct list_head available; /* Dequeueable event */
|
||||
unsigned int navailable;
|
||||
u32 sequence;
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialise the file handle. Parts of the V4L2 framework using the
|
||||
* file handles should be initialised in this function. Must be called
|
||||
* from driver's v4l2_file_operations->open() handler if the driver
|
||||
* uses v4l2_fh.
|
||||
*/
|
||||
void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
|
||||
/*
|
||||
* Add the fh to the list of file handles on a video_device. The file
|
||||
* handle must be initialised first.
|
||||
*/
|
||||
void v4l2_fh_add(struct v4l2_fh *fh);
|
||||
/*
|
||||
* Can be used as the open() op of v4l2_file_operations.
|
||||
* It allocates a v4l2_fh and inits and adds it to the video_device associated
|
||||
* with the file pointer.
|
||||
*/
|
||||
int v4l2_fh_open();
|
||||
/*
|
||||
* Remove file handle from the list of file handles. Must be called in
|
||||
* v4l2_file_operations->release() handler if the driver uses v4l2_fh.
|
||||
* On error filp->private_data will be NULL, otherwise it will point to
|
||||
* the v4l2_fh struct.
|
||||
*/
|
||||
void v4l2_fh_del(struct v4l2_fh *fh);
|
||||
/*
|
||||
* Release resources related to a file handle. Parts of the V4L2
|
||||
* framework using the v4l2_fh must release their resources here, too.
|
||||
* Must be called in v4l2_file_operations->release() handler if the
|
||||
* driver uses v4l2_fh.
|
||||
*/
|
||||
void v4l2_fh_exit(struct v4l2_fh *fh);
|
||||
/*
|
||||
* Can be used as the release() op of v4l2_file_operations.
|
||||
* It deletes and exits the v4l2_fh associated with the file pointer and
|
||||
* frees it. It will do nothing if filp->private_data (the pointer to the
|
||||
* v4l2_fh struct) is NULL. This function always returns 0.
|
||||
*/
|
||||
int v4l2_fh_release();
|
||||
/*
|
||||
* Returns 1 if this filehandle is the only filehandle opened for the
|
||||
* associated video_device. If fh is NULL, then it returns 0.
|
||||
*/
|
||||
int v4l2_fh_is_singular(struct v4l2_fh *fh);
|
||||
/*
|
||||
* Helper function with struct file as argument. If filp->private_data is
|
||||
* NULL, then it will return 0.
|
||||
*/
|
||||
extern void *replace_files[16];
|
||||
static inline int v4l2_fh_is_singular_file()
|
||||
{
|
||||
//struct v4l2_fh *fh = replace_files[0];
|
||||
struct video_device *vdev = video_devdata();
|
||||
struct v4l2_fh *fh = replace_files[vdev->minor];
|
||||
return v4l2_fh_is_singular(fh);
|
||||
}
|
||||
|
||||
#endif /* V4L2_EVENT_H */
|
306
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-int-device.h
Normal file
306
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-int-device.h
Normal file
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
* include/media/v4l2-int-device.h
|
||||
*
|
||||
* V4L2 internal ioctl interface.
|
||||
*
|
||||
* Copyright (C) 2007 Nokia Corporation.
|
||||
*
|
||||
* Contact: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef V4L2_INT_DEVICE_H
|
||||
#define V4L2_INT_DEVICE_H
|
||||
|
||||
#include "v4l2-common.h"
|
||||
|
||||
|
||||
#define V4L2NAMESIZE 32
|
||||
|
||||
/*
|
||||
*
|
||||
* The internal V4L2 device interface core.
|
||||
*
|
||||
*/
|
||||
|
||||
enum v4l2_int_type {
|
||||
v4l2_int_type_master = 1,
|
||||
v4l2_int_type_slave
|
||||
};
|
||||
|
||||
//struct module;
|
||||
|
||||
struct v4l2_int_device;
|
||||
|
||||
struct v4l2_int_master {
|
||||
int (*attach)(struct v4l2_int_device *slave);
|
||||
void (*detach)(struct v4l2_int_device *slave);
|
||||
};
|
||||
|
||||
typedef int (v4l2_int_ioctl_func)(struct v4l2_int_device *);
|
||||
typedef int (v4l2_int_ioctl_func_0)(struct v4l2_int_device *);
|
||||
typedef int (v4l2_int_ioctl_func_1)(struct v4l2_int_device *, void *);
|
||||
|
||||
struct v4l2_int_ioctl_desc {
|
||||
int num;
|
||||
v4l2_int_ioctl_func *func;
|
||||
};
|
||||
|
||||
struct v4l2_int_slave {
|
||||
/* Don't touch master. */
|
||||
struct v4l2_int_device *master;
|
||||
|
||||
char attach_to[V4L2NAMESIZE];
|
||||
|
||||
int num_ioctls;
|
||||
struct v4l2_int_ioctl_desc *ioctls;
|
||||
};
|
||||
|
||||
struct v4l2_int_device {
|
||||
/* Don't touch head. */
|
||||
struct LIST_HEADER head;
|
||||
|
||||
//struct module *module;
|
||||
|
||||
char name[V4L2NAMESIZE];
|
||||
|
||||
enum v4l2_int_type type;
|
||||
union {
|
||||
struct v4l2_int_master *master;
|
||||
struct v4l2_int_slave *slave;
|
||||
} u;
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
||||
void v4l2_int_device_try_attach_all(void);
|
||||
|
||||
int v4l2_int_device_register(struct v4l2_int_device *d);
|
||||
void v4l2_int_device_unregister(struct v4l2_int_device *d);
|
||||
|
||||
int v4l2_int_ioctl_0(struct v4l2_int_device *d, int cmd);
|
||||
int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg);
|
||||
|
||||
/*
|
||||
*
|
||||
* Types and definitions for IOCTL commands.
|
||||
*
|
||||
*/
|
||||
|
||||
enum v4l2_power {
|
||||
V4L2_POWER_OFF = 0,
|
||||
V4L2_POWER_ON,
|
||||
V4L2_POWER_STANDBY,
|
||||
};
|
||||
|
||||
/* Slave interface type. */
|
||||
enum v4l2_if_type {
|
||||
/*
|
||||
* Parallel 8-, 10- or 12-bit interface, used by for example
|
||||
* on certain image sensors.
|
||||
*/
|
||||
V4L2_IF_TYPE_BT656,
|
||||
};
|
||||
|
||||
enum v4l2_if_type_bt656_mode {
|
||||
/*
|
||||
* Modes without Bt synchronisation codes. Separate
|
||||
* synchronisation signal lines are used.
|
||||
*/
|
||||
V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
|
||||
V4L2_IF_TYPE_BT656_MODE_NOBT_10BIT,
|
||||
V4L2_IF_TYPE_BT656_MODE_NOBT_12BIT,
|
||||
/*
|
||||
* Use Bt synchronisation codes. The vertical and horizontal
|
||||
* synchronisation is done based on synchronisation codes.
|
||||
*/
|
||||
V4L2_IF_TYPE_BT656_MODE_BT_8BIT,
|
||||
V4L2_IF_TYPE_BT656_MODE_BT_10BIT,
|
||||
};
|
||||
|
||||
struct v4l2_if_type_bt656 {
|
||||
/*
|
||||
* 0: Frame begins when vsync is high.
|
||||
* 1: Frame begins when vsync changes from low to high.
|
||||
*/
|
||||
unsigned frame_start_on_rising_vs:1;
|
||||
/* Use Bt synchronisation codes for sync correction. */
|
||||
unsigned bt_sync_correct:1;
|
||||
/* Swap every two adjacent image data elements. */
|
||||
unsigned swap:1;
|
||||
/* Inverted latch clock polarity from slave. */
|
||||
unsigned latch_clk_inv:1;
|
||||
/* Hs polarity. 0 is active high, 1 active low. */
|
||||
unsigned nobt_hs_inv:1;
|
||||
/* Vs polarity. 0 is active high, 1 active low. */
|
||||
unsigned nobt_vs_inv:1;
|
||||
enum v4l2_if_type_bt656_mode mode;
|
||||
/* Minimum accepted bus clock for slave (in Hz). */
|
||||
u32 clock_min;
|
||||
/* Maximum accepted bus clock for slave. */
|
||||
u32 clock_max;
|
||||
/*
|
||||
* Current wish of the slave. May only change in response to
|
||||
* ioctls that affect image capture.
|
||||
*/
|
||||
u32 clock_curr;
|
||||
};
|
||||
|
||||
struct v4l2_ifparm {
|
||||
enum v4l2_if_type if_type;
|
||||
union {
|
||||
struct v4l2_if_type_bt656 bt656;
|
||||
} u;
|
||||
};
|
||||
|
||||
/* IOCTL command numbers. */
|
||||
enum v4l2_int_ioctl_num {
|
||||
/*
|
||||
*
|
||||
* "Proper" V4L ioctls, as in struct video_device.
|
||||
*
|
||||
*/
|
||||
vidioc_int_enum_fmt_cap_num = 1,
|
||||
vidioc_int_g_fmt_cap_num,
|
||||
vidioc_int_s_fmt_cap_num,
|
||||
vidioc_int_try_fmt_cap_num,
|
||||
vidioc_int_queryctrl_num,
|
||||
vidioc_int_g_ctrl_num,
|
||||
vidioc_int_s_ctrl_num,
|
||||
vidioc_int_cropcap_num,
|
||||
vidioc_int_g_crop_num,
|
||||
vidioc_int_s_crop_num,
|
||||
vidioc_int_g_parm_num,
|
||||
vidioc_int_s_parm_num,
|
||||
vidioc_int_querystd_num,
|
||||
vidioc_int_s_std_num,
|
||||
vidioc_int_s_video_routing_num,
|
||||
|
||||
/*
|
||||
*
|
||||
* Strictly internal ioctls.
|
||||
*
|
||||
*/
|
||||
/* Initialise the device when slave attaches to the master. */
|
||||
vidioc_int_dev_init_num = 1000,
|
||||
/* Delinitialise the device at slave detach. */
|
||||
vidioc_int_dev_exit_num,
|
||||
/* Set device power state. */
|
||||
vidioc_int_s_power_num,
|
||||
/*
|
||||
* Get slave private data, e.g. platform-specific slave
|
||||
* configuration used by the master.
|
||||
*/
|
||||
vidioc_int_g_priv_num,
|
||||
/* Get slave interface parameters. */
|
||||
vidioc_int_g_ifparm_num,
|
||||
/* Does the slave need to be reset after VIDIOC_DQBUF? */
|
||||
vidioc_int_g_needs_reset_num,
|
||||
vidioc_int_enum_framesizes_num,
|
||||
vidioc_int_enum_frameintervals_num,
|
||||
|
||||
/*
|
||||
*
|
||||
* VIDIOC_INT_* ioctls.
|
||||
*
|
||||
*/
|
||||
/* VIDIOC_INT_RESET */
|
||||
vidioc_int_reset_num,
|
||||
/* VIDIOC_INT_INIT */
|
||||
vidioc_int_init_num,
|
||||
|
||||
/*
|
||||
*
|
||||
* Start of private ioctls.
|
||||
*
|
||||
*/
|
||||
vidioc_int_priv_start_num = 2000,
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* IOCTL wrapper functions for better type checking.
|
||||
*
|
||||
*/
|
||||
|
||||
#define V4L2_INT_WRAPPER_0(name) \
|
||||
static inline int vidioc_int_##name(struct v4l2_int_device *d) \
|
||||
{ \
|
||||
return v4l2_int_ioctl_0(d, vidioc_int_##name##_num); \
|
||||
} \
|
||||
\
|
||||
static inline struct v4l2_int_ioctl_desc \
|
||||
vidioc_int_##name##_cb(int (*func) \
|
||||
(struct v4l2_int_device *)) \
|
||||
{ \
|
||||
struct v4l2_int_ioctl_desc desc; \
|
||||
\
|
||||
desc.num = vidioc_int_##name##_num; \
|
||||
desc.func = (v4l2_int_ioctl_func *)func; \
|
||||
\
|
||||
return desc; \
|
||||
}
|
||||
|
||||
#define V4L2_INT_WRAPPER_1(name, arg_type, asterisk) \
|
||||
static inline int vidioc_int_##name(struct v4l2_int_device *d, \
|
||||
arg_type asterisk arg) \
|
||||
{ \
|
||||
return v4l2_int_ioctl_1(d, vidioc_int_##name##_num, \
|
||||
(void *)(unsigned long)arg); \
|
||||
} \
|
||||
\
|
||||
static inline struct v4l2_int_ioctl_desc \
|
||||
vidioc_int_##name##_cb(int (*func) \
|
||||
(struct v4l2_int_device *, \
|
||||
arg_type asterisk)) \
|
||||
{ \
|
||||
struct v4l2_int_ioctl_desc desc; \
|
||||
\
|
||||
desc.num = vidioc_int_##name##_num; \
|
||||
desc.func = (v4l2_int_ioctl_func *)func; \
|
||||
\
|
||||
return desc; \
|
||||
}
|
||||
|
||||
V4L2_INT_WRAPPER_1(enum_fmt_cap, struct v4l2_fmtdesc, *);
|
||||
V4L2_INT_WRAPPER_1(g_fmt_cap, struct v4l2_format, *);
|
||||
V4L2_INT_WRAPPER_1(s_fmt_cap, struct v4l2_format, *);
|
||||
V4L2_INT_WRAPPER_1(try_fmt_cap, struct v4l2_format, *);
|
||||
V4L2_INT_WRAPPER_1(queryctrl, struct v4l2_queryctrl, *);
|
||||
V4L2_INT_WRAPPER_1(g_ctrl, struct v4l2_control, *);
|
||||
V4L2_INT_WRAPPER_1(s_ctrl, struct v4l2_control, *);
|
||||
V4L2_INT_WRAPPER_1(cropcap, struct v4l2_cropcap, *);
|
||||
V4L2_INT_WRAPPER_1(g_crop, struct v4l2_crop, *);
|
||||
V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *);
|
||||
V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *);
|
||||
V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *);
|
||||
V4L2_INT_WRAPPER_1(querystd, v4l2_std_id, *);
|
||||
V4L2_INT_WRAPPER_1(s_std, v4l2_std_id, *);
|
||||
V4L2_INT_WRAPPER_1(s_video_routing, struct v4l2_routing, *);
|
||||
|
||||
V4L2_INT_WRAPPER_0(dev_init);
|
||||
V4L2_INT_WRAPPER_0(dev_exit);
|
||||
V4L2_INT_WRAPPER_1(s_power, enum v4l2_power, );
|
||||
V4L2_INT_WRAPPER_1(g_priv, void, *);
|
||||
V4L2_INT_WRAPPER_1(g_ifparm, struct v4l2_ifparm, *);
|
||||
V4L2_INT_WRAPPER_1(g_needs_reset, void, *);
|
||||
V4L2_INT_WRAPPER_1(enum_framesizes, struct v4l2_frmsizeenum, *);
|
||||
V4L2_INT_WRAPPER_1(enum_frameintervals, struct v4l2_frmivalenum, *);
|
||||
|
||||
V4L2_INT_WRAPPER_0(reset);
|
||||
V4L2_INT_WRAPPER_0(init);
|
||||
|
||||
#endif
|
320
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-ioctl.h
Normal file
320
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-ioctl.h
Normal file
|
@ -0,0 +1,320 @@
|
|||
/*
|
||||
*
|
||||
* V 4 L 2 D R I V E R H E L P E R A P I
|
||||
*
|
||||
* Moved from videodev2.h
|
||||
*
|
||||
* Some commonly needed functions for drivers (v4l2-common.o module)
|
||||
*/
|
||||
#ifndef _V4L2_IOCTL_H
|
||||
#define _V4L2_IOCTL_H
|
||||
|
||||
#if 0
|
||||
#include <linux/poll.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/compiler.h> /* need __user */
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
#include "videodev2.h"
|
||||
|
||||
struct v4l2_fh;
|
||||
|
||||
struct v4l2_ioctl_ops {
|
||||
/* ioctl callbacks */
|
||||
|
||||
/* VIDIOC_QUERYCAP handler */
|
||||
int (*vidioc_querycap)(void *fh, struct v4l2_capability *cap);
|
||||
|
||||
/* Priority handling */
|
||||
int (*vidioc_g_priority) (void *fh,
|
||||
enum v4l2_priority *p);
|
||||
int (*vidioc_s_priority) (void *fh,
|
||||
enum v4l2_priority p);
|
||||
|
||||
/* VIDIOC_ENUM_FMT handlers */
|
||||
int (*vidioc_enum_fmt_vid_cap) (void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_vid_overlay) (void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_vid_out) (void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_vid_cap_mplane)(void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_vid_out_mplane)(void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
|
||||
/* VIDIOC_G_FMT handlers */
|
||||
int (*vidioc_g_fmt_vid_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vid_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vid_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vid_out_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vbi_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vbi_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_sliced_vbi_cap)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_sliced_vbi_out)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vid_cap_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_vid_out_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
/* VIDIOC_S_FMT handlers */
|
||||
int (*vidioc_s_fmt_vid_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vid_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vid_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vid_out_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vbi_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vbi_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_sliced_vbi_cap)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_sliced_vbi_out)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vid_cap_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_vid_out_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
/* VIDIOC_TRY_FMT handlers */
|
||||
int (*vidioc_try_fmt_vid_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vid_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vid_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vid_out_overlay)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vbi_cap) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vbi_out) (void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_sliced_vbi_cap)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_sliced_vbi_out)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vid_cap_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_vid_out_mplane)(void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
/* Buffer handlers */
|
||||
int (*vidioc_reqbufs) (void *fh, struct v4l2_requestbuffers *b);
|
||||
int (*vidioc_querybuf)(void *fh, struct v4l2_buffer *b);
|
||||
int (*vidioc_qbuf) (void *fh, struct v4l2_buffer *b);
|
||||
int (*vidioc_expbuf) (void *fh,
|
||||
struct v4l2_exportbuffer *e);
|
||||
int (*vidioc_dqbuf) (void *fh, struct v4l2_buffer *b);
|
||||
|
||||
int (*vidioc_create_bufs)(void *fh, struct v4l2_create_buffers *b);
|
||||
int (*vidioc_prepare_buf)(void *fh, struct v4l2_buffer *b);
|
||||
|
||||
int (*vidioc_overlay) (void *fh, unsigned int i);
|
||||
int (*vidioc_g_fbuf) (void *fh,
|
||||
struct v4l2_framebuffer *a);
|
||||
int (*vidioc_s_fbuf) (void *fh,
|
||||
const struct v4l2_framebuffer *a);
|
||||
|
||||
/* Stream on/off */
|
||||
int (*vidioc_streamon) (void *fh, enum v4l2_buf_type i);
|
||||
int (*vidioc_streamoff)(void *fh, enum v4l2_buf_type i);
|
||||
|
||||
/* Standard handling
|
||||
ENUMSTD is handled by videodev.c
|
||||
*/
|
||||
int (*vidioc_g_std) (void *fh, v4l2_std_id *norm);
|
||||
int (*vidioc_s_std) (void *fh, v4l2_std_id norm);
|
||||
int (*vidioc_querystd) (void *fh, v4l2_std_id *a);
|
||||
|
||||
/* Input handling */
|
||||
int (*vidioc_enum_input)(void *fh,
|
||||
struct v4l2_input *inp);
|
||||
int (*vidioc_g_input) (void *fh, unsigned int *i);
|
||||
int (*vidioc_s_input) (void *fh, unsigned int i);
|
||||
|
||||
/* Output handling */
|
||||
int (*vidioc_enum_output) (void *fh,
|
||||
struct v4l2_output *a);
|
||||
int (*vidioc_g_output) (void *fh, unsigned int *i);
|
||||
int (*vidioc_s_output) (void *fh, unsigned int i);
|
||||
|
||||
/* Control handling */
|
||||
int (*vidioc_queryctrl) (void *fh,
|
||||
struct v4l2_queryctrl *a);
|
||||
int (*vidioc_g_ctrl) (void *fh,
|
||||
struct v4l2_control *a);
|
||||
int (*vidioc_s_ctrl) (void *fh,
|
||||
struct v4l2_control *a);
|
||||
int (*vidioc_g_ext_ctrls) (void *fh,
|
||||
struct v4l2_ext_controls *a);
|
||||
int (*vidioc_s_ext_ctrls) (void *fh,
|
||||
struct v4l2_ext_controls *a);
|
||||
int (*vidioc_try_ext_ctrls) (void *fh,
|
||||
struct v4l2_ext_controls *a);
|
||||
int (*vidioc_querymenu) (void *fh,
|
||||
struct v4l2_querymenu *a);
|
||||
|
||||
/* Audio ioctls */
|
||||
int (*vidioc_enumaudio) (void *fh,
|
||||
struct v4l2_audio *a);
|
||||
int (*vidioc_g_audio) (void *fh,
|
||||
struct v4l2_audio *a);
|
||||
int (*vidioc_s_audio) (void *fh,
|
||||
const struct v4l2_audio *a);
|
||||
|
||||
/* Audio out ioctls */
|
||||
int (*vidioc_enumaudout) (void *fh,
|
||||
struct v4l2_audioout *a);
|
||||
int (*vidioc_g_audout) (void *fh,
|
||||
struct v4l2_audioout *a);
|
||||
int (*vidioc_s_audout) (void *fh,
|
||||
const struct v4l2_audioout *a);
|
||||
int (*vidioc_g_modulator) (void *fh,
|
||||
struct v4l2_modulator *a);
|
||||
int (*vidioc_s_modulator) (void *fh,
|
||||
const struct v4l2_modulator *a);
|
||||
/* Crop ioctls */
|
||||
int (*vidioc_cropcap) (void *fh,
|
||||
struct v4l2_cropcap *a);
|
||||
int (*vidioc_g_crop) (void *fh,
|
||||
struct v4l2_crop *a);
|
||||
int (*vidioc_s_crop) (void *fh,
|
||||
const struct v4l2_crop *a);
|
||||
int (*vidioc_g_selection) (void *fh,
|
||||
struct v4l2_selection *s);
|
||||
int (*vidioc_s_selection) (void *fh,
|
||||
struct v4l2_selection *s);
|
||||
/* Compression ioctls */
|
||||
int (*vidioc_g_jpegcomp) (void *fh,
|
||||
struct v4l2_jpegcompression *a);
|
||||
int (*vidioc_s_jpegcomp) (void *fh,
|
||||
const struct v4l2_jpegcompression *a);
|
||||
int (*vidioc_g_enc_index) ( void *fh,
|
||||
struct v4l2_enc_idx *a);
|
||||
int (*vidioc_encoder_cmd) (void *fh,
|
||||
struct v4l2_encoder_cmd *a);
|
||||
int (*vidioc_try_encoder_cmd) (void *fh,
|
||||
struct v4l2_encoder_cmd *a);
|
||||
int (*vidioc_decoder_cmd) (void *fh,
|
||||
struct v4l2_decoder_cmd *a);
|
||||
int (*vidioc_try_decoder_cmd) (void *fh,
|
||||
struct v4l2_decoder_cmd *a);
|
||||
|
||||
/* Stream type-dependent parameter ioctls */
|
||||
int (*vidioc_g_parm) (void *fh,
|
||||
struct v4l2_streamparm *a);
|
||||
int (*vidioc_s_parm) (void *fh,
|
||||
struct v4l2_streamparm *a);
|
||||
|
||||
/* Tuner ioctls */
|
||||
int (*vidioc_g_tuner) (void *fh,
|
||||
struct v4l2_tuner *a);
|
||||
int (*vidioc_s_tuner) (void *fh,
|
||||
const struct v4l2_tuner *a);
|
||||
int (*vidioc_g_frequency) (void *fh,
|
||||
struct v4l2_frequency *a);
|
||||
int (*vidioc_s_frequency) (void *fh,
|
||||
const struct v4l2_frequency *a);
|
||||
int (*vidioc_enum_freq_bands) (void *fh,
|
||||
struct v4l2_frequency_band *band);
|
||||
|
||||
/* Sliced VBI cap */
|
||||
int (*vidioc_g_sliced_vbi_cap) (void *fh,
|
||||
struct v4l2_sliced_vbi_cap *a);
|
||||
|
||||
/* Log status ioctl */
|
||||
int (*vidioc_log_status) ( void *fh);
|
||||
|
||||
int (*vidioc_s_hw_freq_seek) (void *fh,
|
||||
const struct v4l2_hw_freq_seek *a);
|
||||
|
||||
/* Debugging ioctls */
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
int (*vidioc_g_register) (void *fh,
|
||||
struct v4l2_dbg_register *reg);
|
||||
int (*vidioc_s_register) (void *fh,
|
||||
const struct v4l2_dbg_register *reg);
|
||||
|
||||
int (*vidioc_g_chip_info) (void *fh,
|
||||
struct v4l2_dbg_chip_info *chip);
|
||||
#endif
|
||||
|
||||
int (*vidioc_enum_framesizes) (void *fh,
|
||||
struct v4l2_frmsizeenum *fsize);
|
||||
|
||||
int (*vidioc_enum_frameintervals) (void *fh,
|
||||
struct v4l2_frmivalenum *fival);
|
||||
|
||||
/* DV Timings IOCTLs */
|
||||
int (*vidioc_s_dv_timings) (void *fh,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*vidioc_g_dv_timings) (void *fh,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*vidioc_query_dv_timings) ( void *fh,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*vidioc_enum_dv_timings) (void *fh,
|
||||
struct v4l2_enum_dv_timings *timings);
|
||||
int (*vidioc_dv_timings_cap) (void *fh,
|
||||
struct v4l2_dv_timings_cap *cap);
|
||||
|
||||
int (*vidioc_subscribe_event) (struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub);
|
||||
int (*vidioc_unsubscribe_event)(struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub);
|
||||
|
||||
/* For other private ioctls */
|
||||
long (*vidioc_default) (void *fh,
|
||||
bool valid_prio, unsigned int cmd, void *arg);
|
||||
};
|
||||
|
||||
|
||||
/* v4l debugging and diagnostics */
|
||||
|
||||
/* Debug bitmask flags to be used on V4L2 */
|
||||
#define V4L2_DEBUG_IOCTL 0x01
|
||||
#define V4L2_DEBUG_IOCTL_ARG 0x02
|
||||
|
||||
/* Video standard functions */
|
||||
extern const char *v4l2_norm_to_name(v4l2_std_id id);
|
||||
extern void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod);
|
||||
extern int v4l2_video_std_construct(struct v4l2_standard *vs,
|
||||
int id, const char *name);
|
||||
/* Prints the ioctl in a human-readable format. If prefix != NULL,
|
||||
then do printk(KERN_DEBUG "%s: ", prefix) first. */
|
||||
extern void v4l_printk_ioctl(const char *prefix, unsigned int cmd);
|
||||
|
||||
/* Internal use only: get the mutex (if any) that we need to lock for the
|
||||
given command. */
|
||||
struct video_device;
|
||||
extern _Mutex *v4l2_ioctl_get_lock(struct video_device *vdev, unsigned cmd);
|
||||
|
||||
/* names for fancy debug output */
|
||||
extern const char *v4l2_field_names[];
|
||||
extern const char *v4l2_type_names[];
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
/* 32 Bits compatibility layer for 64 bits processors */
|
||||
extern long v4l2_compat_ioctl32(unsigned int cmd, unsigned long arg);
|
||||
#endif
|
||||
|
||||
typedef long (*v4l2_kioctl)(unsigned int cmd, void *arg);
|
||||
|
||||
/* Include support for obsoleted stuff */
|
||||
extern long video_usercopy(unsigned int cmd, unsigned long arg, v4l2_kioctl func);
|
||||
|
||||
/* Standard handlers for V4L ioctl's */
|
||||
extern long video_ioctl2(unsigned int cmd, unsigned long arg);
|
||||
|
||||
#endif /* _V4L2_IOCTL_H */
|
112
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-mediabus.h
Normal file
112
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-mediabus.h
Normal file
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* Media Bus API header
|
||||
*
|
||||
* Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef V4L2_MEDIABUS_H
|
||||
#define V4L2_MEDIABUS_H
|
||||
|
||||
#include "v4l2-mediabus.h"
|
||||
|
||||
|
||||
/* Parallel flags */
|
||||
/*
|
||||
* Can the client run in master or in slave mode. By "Master mode" an operation
|
||||
* mode is meant, when the client (e.g., a camera sensor) is producing
|
||||
* horizontal and vertical synchronisation. In "Slave mode" the host is
|
||||
* providing these signals to the slave.
|
||||
*/
|
||||
#define V4L2_MBUS_MASTER (1 << 0)
|
||||
#define V4L2_MBUS_SLAVE (1 << 1)
|
||||
/*
|
||||
* Signal polarity flags
|
||||
* Note: in BT.656 mode HSYNC, FIELD, and VSYNC are unused
|
||||
* V4L2_MBUS_[HV]SYNC* flags should be also used for specifying
|
||||
* configuration of hardware that uses [HV]REF signals
|
||||
*/
|
||||
#define V4L2_MBUS_HSYNC_ACTIVE_HIGH (1 << 2)
|
||||
#define V4L2_MBUS_HSYNC_ACTIVE_LOW (1 << 3)
|
||||
#define V4L2_MBUS_VSYNC_ACTIVE_HIGH (1 << 4)
|
||||
#define V4L2_MBUS_VSYNC_ACTIVE_LOW (1 << 5)
|
||||
#define V4L2_MBUS_PCLK_SAMPLE_RISING (1 << 6)
|
||||
#define V4L2_MBUS_PCLK_SAMPLE_FALLING (1 << 7)
|
||||
#define V4L2_MBUS_DATA_ACTIVE_HIGH (1 << 8)
|
||||
#define V4L2_MBUS_DATA_ACTIVE_LOW (1 << 9)
|
||||
/* FIELD = 0/1 - Field1 (odd)/Field2 (even) */
|
||||
#define V4L2_MBUS_FIELD_EVEN_HIGH (1 << 10)
|
||||
/* FIELD = 1/0 - Field1 (odd)/Field2 (even) */
|
||||
#define V4L2_MBUS_FIELD_EVEN_LOW (1 << 11)
|
||||
/* Active state of Sync-on-green (SoG) signal, 0/1 for LOW/HIGH respectively. */
|
||||
#define V4L2_MBUS_VIDEO_SOG_ACTIVE_HIGH (1 << 12)
|
||||
#define V4L2_MBUS_VIDEO_SOG_ACTIVE_LOW (1 << 13)
|
||||
|
||||
/* Serial flags */
|
||||
/* How many lanes the client can use */
|
||||
#define V4L2_MBUS_CSI2_1_LANE (1 << 0)
|
||||
#define V4L2_MBUS_CSI2_2_LANE (1 << 1)
|
||||
#define V4L2_MBUS_CSI2_3_LANE (1 << 2)
|
||||
#define V4L2_MBUS_CSI2_4_LANE (1 << 3)
|
||||
/* On which channels it can send video data */
|
||||
#define V4L2_MBUS_CSI2_CHANNEL_0 (1 << 4)
|
||||
#define V4L2_MBUS_CSI2_CHANNEL_1 (1 << 5)
|
||||
#define V4L2_MBUS_CSI2_CHANNEL_2 (1 << 6)
|
||||
#define V4L2_MBUS_CSI2_CHANNEL_3 (1 << 7)
|
||||
/* Does it support only continuous or also non-continuous clock mode */
|
||||
#define V4L2_MBUS_CSI2_CONTINUOUS_CLOCK (1 << 8)
|
||||
#define V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK (1 << 9)
|
||||
|
||||
#define V4L2_MBUS_CSI2_LANES (V4L2_MBUS_CSI2_1_LANE | V4L2_MBUS_CSI2_2_LANE | \
|
||||
V4L2_MBUS_CSI2_3_LANE | V4L2_MBUS_CSI2_4_LANE)
|
||||
#define V4L2_MBUS_CSI2_CHANNELS (V4L2_MBUS_CSI2_CHANNEL_0 | V4L2_MBUS_CSI2_CHANNEL_1 | \
|
||||
V4L2_MBUS_CSI2_CHANNEL_2 | V4L2_MBUS_CSI2_CHANNEL_3)
|
||||
|
||||
/**
|
||||
* v4l2_mbus_type - media bus type
|
||||
* @V4L2_MBUS_PARALLEL: parallel interface with hsync and vsync
|
||||
* @V4L2_MBUS_BT656: parallel interface with embedded synchronisation, can
|
||||
* also be used for BT.1120
|
||||
* @V4L2_MBUS_CSI2: MIPI CSI-2 serial interface
|
||||
*/
|
||||
enum v4l2_mbus_type {
|
||||
V4L2_MBUS_PARALLEL,
|
||||
V4L2_MBUS_BT656,
|
||||
V4L2_MBUS_CSI2,
|
||||
};
|
||||
|
||||
/**
|
||||
* v4l2_mbus_config - media bus configuration
|
||||
* @type: in: interface type
|
||||
* @flags: in / out: configuration flags, depending on @type
|
||||
*/
|
||||
struct v4l2_mbus_config {
|
||||
enum v4l2_mbus_type type;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
#if 0
|
||||
static inline void v4l2_fill_pix_format(struct v4l2_pix_format *pix_fmt,
|
||||
const struct v4l2_mbus_framefmt *mbus_fmt)
|
||||
{
|
||||
pix_fmt->width = mbus_fmt->width;
|
||||
pix_fmt->height = mbus_fmt->height;
|
||||
pix_fmt->field = mbus_fmt->field;
|
||||
pix_fmt->colorspace = mbus_fmt->colorspace;
|
||||
}
|
||||
|
||||
static inline void v4l2_fill_mbus_format(struct v4l2_mbus_framefmt *mbus_fmt,
|
||||
const struct v4l2_pix_format *pix_fmt,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
{
|
||||
mbus_fmt->width = pix_fmt->width;
|
||||
mbus_fmt->height = pix_fmt->height;
|
||||
mbus_fmt->field = pix_fmt->field;
|
||||
mbus_fmt->colorspace = pix_fmt->colorspace;
|
||||
mbus_fmt->code = code;
|
||||
}
|
||||
#endif
|
||||
#endif
|
846
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-osdep.h
Normal file
846
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-osdep.h
Normal file
|
@ -0,0 +1,846 @@
|
|||
#ifndef _V4L2_OSDEP_H_
|
||||
#define _V4L2_OSDEP_H_
|
||||
|
||||
#include "platform/platform_stdlib.h"
|
||||
#include "basic_types.h"
|
||||
#include "osdep_api.h"
|
||||
#include "usb_defs.h"
|
||||
#include "errno.h"
|
||||
//#include "hal_util.h"
|
||||
#include "dlist.h"
|
||||
|
||||
#define V4L2_LAYER_DEBUG 0
|
||||
#if V4L2_LAYER_DEBUG
|
||||
#define V4L2_PRINTF(fmt, args...) printf("\n\r%s: " fmt, __FUNCTION__, ## args)
|
||||
#define V4L2_ERROR(fmt, args...) printf("\n\r%s: " fmt, __FUNCTION__, ## args)
|
||||
#else
|
||||
#define V4L2_PRINTF(fmt, args...)
|
||||
#define V4L2_ERROR(fmt, args...) printf("\n\r%s: " fmt, __FUNCTION__, ## args)
|
||||
#endif
|
||||
|
||||
/* misc items */
|
||||
#ifndef ssize_t
|
||||
#define ssize_t SSIZE_T
|
||||
#endif
|
||||
#ifndef size_t
|
||||
#define size_t SIZE_T
|
||||
#endif
|
||||
|
||||
#ifndef __user
|
||||
#define __user
|
||||
#endif
|
||||
|
||||
#ifndef loff_t
|
||||
#define loff_t long
|
||||
#endif
|
||||
#ifndef __u8
|
||||
#define __u8 u8
|
||||
#endif
|
||||
#ifndef __u16
|
||||
#define __u16 u16
|
||||
#endif
|
||||
#ifndef __u32
|
||||
#define __u32 u32
|
||||
#endif
|
||||
#ifndef __u64
|
||||
#define __u64 u64
|
||||
#endif
|
||||
#ifndef __s8
|
||||
#define __s8 s8
|
||||
#endif
|
||||
#ifndef __s16
|
||||
#define __s16 s16
|
||||
#endif
|
||||
#ifndef __s32
|
||||
#define __s32 s32
|
||||
#endif
|
||||
#ifndef __s64
|
||||
#define __s64 s64
|
||||
#endif
|
||||
|
||||
#ifndef spinlock_t
|
||||
#define spinlock_t _Lock
|
||||
#endif
|
||||
|
||||
#ifndef gfp_t
|
||||
#define gfp_t u32
|
||||
#endif
|
||||
|
||||
#ifndef _atomic_spin_lock_irqsave
|
||||
#define _atomic_spin_lock_irqsave(p, flags) SaveAndCli()
|
||||
#endif
|
||||
#ifndef _atomic_spin_unlock_irqrestore
|
||||
#define _atomic_spin_unlock_irqrestore(p, flags) RestoreFlags()
|
||||
#endif
|
||||
#ifndef local_irq_save
|
||||
#define local_irq_save(flags) SaveAndCli()
|
||||
#endif
|
||||
#ifndef local_irq_restore
|
||||
#define local_irq_restore(flags) RestoreFlags()
|
||||
#endif
|
||||
#ifndef cris_atomic_save
|
||||
#define cris_atomic_save(addr, flags) local_irq_save(flags)
|
||||
#endif
|
||||
#ifndef cris_atomic_restore
|
||||
#define cris_atomic_restore(addr, flags) local_irq_restore(flags)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* abs() handles unsigned and signed longs, ints, shorts and chars. For all
|
||||
* input types abs() returns a signed long.
|
||||
* abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
|
||||
* for those.
|
||||
*/
|
||||
|
||||
#ifndef abs
|
||||
#define abs(x) ((x >= 0) ? (x) : (x * -1))
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(x, y) ((x) < (y) ? (x) : (y))
|
||||
#endif
|
||||
#ifndef max
|
||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||
#endif
|
||||
#ifndef min_t
|
||||
#define min_t(type, x, y) ({ \
|
||||
type __min1 = (x); \
|
||||
type __min2 = (y); \
|
||||
(__min1 < __min2) ? (__min1) : (__min2); })
|
||||
#endif
|
||||
#ifndef max_t
|
||||
#define max_t(type, x, y) ({ \
|
||||
type __max1 = (x); \
|
||||
type __max2 = (y); \
|
||||
(__max1 > __max2) ? (__max1) : (__max2); })
|
||||
#endif
|
||||
#ifndef max_tt
|
||||
#define max_tt(ret,type,x,y) do{ \
|
||||
type __max1 = (x); \
|
||||
type __max2 = (y); \
|
||||
ret = (__max1 > __max2) ? (__max1) : (__max2); }while(0)
|
||||
#endif
|
||||
#ifndef min_tt
|
||||
#define min_tt(ret,type, x, y) do{ \
|
||||
type __min1 = (x); \
|
||||
type __min2 = (y); \
|
||||
ret = (__min1 < __min2) ? (__min1) : (__min2); }while(0)
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* container_of - cast a member of a structure out to the containing structure
|
||||
* @p(ptr): the pointer to the member.
|
||||
* @t(type): the type of the container struct this is embedded in.
|
||||
* @m(member): the name of the member within the struct.
|
||||
*
|
||||
*/
|
||||
#ifndef container_of
|
||||
#define container_of(ptr, type, member) \
|
||||
((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* list_next_entry - get the next element in list
|
||||
* @pos: the type * to cursor
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
|
||||
#define list_next_entry(pos, member, type) \
|
||||
list_entry((pos)->member.next, type, member)
|
||||
|
||||
/**
|
||||
* list_for_each_entry_continue - continue iteration over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*
|
||||
* Continue to iterate over list of given type, continuing after
|
||||
* the current position.
|
||||
*/
|
||||
|
||||
#define list_for_each_entry_continue(pos, head, member, type) \
|
||||
for (pos = list_next_entry(pos, member, type); \
|
||||
&pos->member != (head); \
|
||||
pos = list_next_entry(pos, member, type))
|
||||
|
||||
|
||||
/* spin lock */
|
||||
#ifndef spin_lock_init
|
||||
#define spin_lock_init(plock) RtlSpinlockInit((plock))
|
||||
#endif
|
||||
#ifndef spin_lock_free
|
||||
#define spin_lock_free(plock) RtlSpinlockFree((plock))
|
||||
#endif
|
||||
#ifndef spin_lock
|
||||
#define spin_lock(plock) RtlSpinlock((plock))
|
||||
#endif
|
||||
#ifndef spin_unlock
|
||||
#define spin_unlock(plock) RtlSpinunlock((plock))
|
||||
#endif
|
||||
|
||||
|
||||
/* mutex */
|
||||
#ifndef Mutex
|
||||
#define Mutex _Mutex
|
||||
#endif
|
||||
#ifndef mutex_init
|
||||
#define mutex_init(pmutex) RtlMutexInit((pmutex))
|
||||
#endif
|
||||
#ifndef mutex_lock
|
||||
#define mutex_lock(pmutex) RtlDownSema((pmutex))
|
||||
#endif
|
||||
#ifndef mutex_unlock
|
||||
#define mutex_unlock(pmutex) RtlUpSema((pmutex))
|
||||
#endif
|
||||
#ifndef mutex_destory
|
||||
#define mutex_destory(pmutex) RtlMutexFree((pmutex))
|
||||
#endif
|
||||
|
||||
/* semaphore */
|
||||
#ifndef Sema
|
||||
#define Sema _Sema
|
||||
#endif
|
||||
#ifndef Sema_Init
|
||||
#define Sema_Init(pmutex, pval) RtlInitSema(pmutex, pval)
|
||||
#endif
|
||||
#ifndef Sema_Free
|
||||
#define Sema_Free(pmutex) RtlFreeSema(pmutex)
|
||||
#endif
|
||||
#ifndef Sema_Up
|
||||
#define Sema_Up(pmutex) RtlUpSema(pmutex)
|
||||
#endif
|
||||
#ifndef Sema_Down
|
||||
#define Sema_Down(pmutex) RtlDownSema(pmutex)
|
||||
#endif
|
||||
#ifndef Sema_Sown_WithTimeout
|
||||
#define Sema_Down_WithTimeout(pmutex,ptimeout) RtlDownSemaWithTimeout(pmutex,ptimeout) //
|
||||
#endif
|
||||
|
||||
/* Atomic integer operations */
|
||||
#ifndef atomic_set
|
||||
#define atomic_set(v, i) RTL_ATOMIC_SET((v), (i))
|
||||
#endif
|
||||
#ifndef atomic_read
|
||||
#define atomic_read(v) RTL_ATOMIC_READ((v))
|
||||
#endif
|
||||
#ifndef atomic_add
|
||||
#define atomic_add(v, i) RTL_ATOMIC_ADD((v), (i))
|
||||
#endif
|
||||
#ifndef atomic_sub
|
||||
#define atomic_sub(v, i) RTL_ATOMIC_SUB((v), (i))
|
||||
#endif
|
||||
#ifndef atomic_inc
|
||||
#define atomic_inc(v) RTL_ATOMIC_INC((v))
|
||||
#endif
|
||||
#ifndef atomic_dec
|
||||
#define atomic_dec(v) RTL_ATOMIC_DEC((v))
|
||||
#endif
|
||||
|
||||
|
||||
// IOCTL ...
|
||||
#ifndef _IOC_NRBITS
|
||||
#define _IOC_NRBITS (8)
|
||||
#endif
|
||||
#ifndef _IOC_TYPEBITS
|
||||
#define _IOC_TYPEBITS (8)
|
||||
#endif
|
||||
#ifndef _IOC_SIZEBITS
|
||||
#define _IOC_SIZEBITS (14)
|
||||
#endif
|
||||
#ifndef _IOC_DIRBITS
|
||||
#define _IOC_DIRBITS (2)
|
||||
#endif
|
||||
#ifndef _IOC_NRMASK
|
||||
#define _IOC_NRMASK ((1 << _IOC_NRBITS) - 1)
|
||||
#endif
|
||||
#ifndef _IOC_TYPEMASK
|
||||
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS) - 1)
|
||||
#endif
|
||||
#ifndef _IOC_SIZEMASK
|
||||
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS) - 1)
|
||||
#endif
|
||||
#ifndef _IOC_DIRMASK
|
||||
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS) - 1)
|
||||
#endif
|
||||
#ifndef _IOC_NRSHIFT
|
||||
#define _IOC_NRSHIFT (0)
|
||||
#endif
|
||||
#ifndef _IOC_TYPESHIFT
|
||||
#define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS)
|
||||
#endif
|
||||
#ifndef _IOC_SIZESHIFT
|
||||
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS)
|
||||
#endif
|
||||
#ifndef _IOC_DIRSHIFT
|
||||
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Direction bits.
|
||||
*/
|
||||
#ifndef _IOC_NONE
|
||||
#define _IOC_NONE (0U)
|
||||
#endif
|
||||
#ifndef _IOC_WRITE
|
||||
#define _IOC_WRITE (1U)
|
||||
#endif
|
||||
#ifndef _IOC_READ
|
||||
#define _IOC_READ (2U)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* combine the four dir,type,nr,size parameters to one cmd parameter
|
||||
*
|
||||
*/
|
||||
#ifndef _IOC
|
||||
#define _IOC(dir,type,nr,size) \
|
||||
(((dir) << _IOC_DIRSHIFT) | \
|
||||
((type) << _IOC_TYPESHIFT) | \
|
||||
((nr) << _IOC_NRSHIFT) | \
|
||||
((size) << _IOC_SIZESHIFT))
|
||||
#endif
|
||||
/*
|
||||
* used to create IOCTL cmd
|
||||
*/
|
||||
#ifndef _IO
|
||||
#define _IO(type,nr) _IOC(_IOC_NONE,(type), (nr), 0)
|
||||
#endif
|
||||
#ifndef _IOR
|
||||
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type), (nr), sizeof(size))
|
||||
#endif
|
||||
#ifndef _IOW
|
||||
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type), (nr), sizeof(size))
|
||||
#endif
|
||||
#ifndef _IOWR
|
||||
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE, (type), (nr), sizeof(size))
|
||||
#endif
|
||||
/*
|
||||
* used to decode ioctl infoations..
|
||||
*/
|
||||
#ifndef _IOC_DIR
|
||||
#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
|
||||
#endif
|
||||
#ifndef _IOC_TYPE
|
||||
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
|
||||
#endif
|
||||
#ifndef _IOC_NR
|
||||
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
|
||||
#endif
|
||||
#ifndef _IOC_SIZE
|
||||
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
|
||||
#endif
|
||||
/* ...and for the drivers/sound files... */
|
||||
#ifndef IOC_IN
|
||||
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
|
||||
#endif
|
||||
#ifndef IOC_OUT
|
||||
#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
|
||||
#endif
|
||||
#ifndef IOC_INOUT
|
||||
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
|
||||
#endif
|
||||
#ifndef IOCSIZE_MASK
|
||||
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
|
||||
#endif
|
||||
#ifndef IOCSIZE_SHIFT
|
||||
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
|
||||
#endif
|
||||
|
||||
#ifndef DIV_ROUND_UP
|
||||
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
||||
#endif
|
||||
#ifndef BITS_PER_LONG
|
||||
#define BITS_PER_LONG (32)
|
||||
#endif
|
||||
#ifndef BITS_PER_LONG_LONG
|
||||
#define BITS_PER_LONG_LONG (32)
|
||||
#endif
|
||||
#ifndef BIT
|
||||
#define BIT(nr) (1UL << (nr))
|
||||
#endif
|
||||
#ifndef BIT_ULL
|
||||
#define BIT_ULL(nr) (1ULL << (nr))
|
||||
#endif
|
||||
#ifndef BIT_MASK
|
||||
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
|
||||
#endif
|
||||
#ifndef BIT_WORD
|
||||
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
|
||||
#endif
|
||||
#ifndef BIT_ULL_MASK
|
||||
#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG))
|
||||
#endif
|
||||
#ifndef BIT_ULL_WORD
|
||||
#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG)
|
||||
#endif
|
||||
#ifndef BITS_PER_BYTE
|
||||
#define BITS_PER_BYTE (8)
|
||||
#endif
|
||||
#ifndef BITS_TO_LONGS
|
||||
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
|
||||
#endif
|
||||
|
||||
/* __ffs to find out the first exist 1 offset, from bit 0 ~ 31 */
|
||||
#ifndef ffz
|
||||
#define ffz(x) __ffs(~(x))
|
||||
#endif
|
||||
/* __builtin_constant_p is gcc build-in function to check the parameter is const or not */
|
||||
#ifndef small_const_nbits
|
||||
#define small_const_nbits(nbits) \
|
||||
(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
|
||||
#endif
|
||||
/**
|
||||
* __ffs - find first bit in word.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no bit exists, so code should check against 0 first.
|
||||
*/
|
||||
static inline unsigned long __ffs(unsigned long word)
|
||||
{
|
||||
int num = 0;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
if ((word & 0xffffffff) == 0) {
|
||||
num += 32;
|
||||
word >>= 32;
|
||||
}
|
||||
#endif
|
||||
if ((word & 0xffff) == 0) {
|
||||
num += 16;
|
||||
word >>= 16;
|
||||
}
|
||||
if ((word & 0xff) == 0) {
|
||||
num += 8;
|
||||
word >>= 8;
|
||||
}
|
||||
if ((word & 0xf) == 0) {
|
||||
num += 4;
|
||||
word >>= 4;
|
||||
}
|
||||
if ((word & 0x3) == 0) {
|
||||
num += 2;
|
||||
word >>= 2;
|
||||
}
|
||||
if ((word & 0x1) == 0)
|
||||
num += 1;
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
/**
|
||||
* __fls - find last (most-significant) set bit in a long word
|
||||
* @word: the word to search
|
||||
*
|
||||
* Undefined if no set bit exists, so code should check against 0 first.
|
||||
*/
|
||||
static inline unsigned long __fls(unsigned long word)
|
||||
{
|
||||
int num = BITS_PER_LONG - 1;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
if (!(word & (~0ul << 32))) {
|
||||
num -= 32;
|
||||
word <<= 32;
|
||||
}
|
||||
#endif
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
|
||||
num -= 16;
|
||||
word <<= 16;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
|
||||
num -= 8;
|
||||
word <<= 8;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
|
||||
num -= 4;
|
||||
word <<= 4;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
|
||||
num -= 2;
|
||||
word <<= 2;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-1))))
|
||||
num -= 1;
|
||||
return num;
|
||||
}
|
||||
|
||||
/**
|
||||
* test_bit - Determine whether a bit is set
|
||||
* @nr: bit number to test
|
||||
* @addr: Address to start counting from
|
||||
*/
|
||||
static inline int test_bit(int nr, const volatile unsigned long *addr)
|
||||
{
|
||||
return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Find the first cleared bit in a memory region.
|
||||
*/
|
||||
static inline unsigned long find_first_zero_bit(
|
||||
const unsigned long *addr, unsigned long size)
|
||||
{
|
||||
const unsigned long *p = addr;
|
||||
unsigned long result = 0;
|
||||
unsigned long tmp;
|
||||
|
||||
while (size & ~(BITS_PER_LONG-1)) {
|
||||
if (~(tmp = *(p++)))
|
||||
goto found;
|
||||
result += BITS_PER_LONG;
|
||||
size -= BITS_PER_LONG;
|
||||
}
|
||||
if (!size)
|
||||
return result;
|
||||
|
||||
tmp = (*p) | (~0UL << size);
|
||||
if (tmp == ~0UL) /* Are any bits zero? */
|
||||
return result + size; /* Nope. */
|
||||
found:
|
||||
|
||||
return result + ffz(tmp);
|
||||
//tmp = 0;
|
||||
//return result;
|
||||
|
||||
}
|
||||
|
||||
static inline unsigned long find_next_zero_bit(
|
||||
const unsigned long *addr,unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned long *p = addr + BIT_WORD(offset); // offset位于p指向的long地址32位空?
|
||||
unsigned long result = offset & ~(BITS_PER_LONG-1); // offset是第result?4字?
|
||||
unsigned long tmp;
|
||||
|
||||
if (offset >= size)
|
||||
return size;
|
||||
size -= result; // ?整32位整倍?上
|
||||
offset %= BITS_PER_LONG; // offset位于32位的第几位
|
||||
if (offset) { // offset不在一?long?据的第0位上,在1-31位中[luther.gliethttp]
|
||||
tmp = *(p++);
|
||||
tmp |= ~0UL >> (BITS_PER_LONG - offset); // ?0-offset?据填充上1.
|
||||
if (size < BITS_PER_LONG) // 不足32bits
|
||||
goto found_first;
|
||||
if (~tmp) // 取非非0?明含有0值
|
||||
goto found_middle;
|
||||
size -= BITS_PER_LONG; // 如果上面~tmp等于0,那么?明?*p?据?32位全1.[luther.gliethttp]
|
||||
result += BITS_PER_LONG;
|
||||
}
|
||||
while (size & ~(BITS_PER_LONG-1)) { // 好了,?行到?里,我?的offset已??在4字?的第0位上,下面?行
|
||||
if (~(tmp = *(p++))) // 4字?快速查?.如果~tmp非0,?明?32位?据中含有0?据,找到.[luther.gliethttp]
|
||||
goto found_middle;
|
||||
result += BITS_PER_LONG; // 到下一?4字?空?
|
||||
size -= BITS_PER_LONG; // ?少4字??据
|
||||
}
|
||||
if (!size) // size等于0,?明首先size等于4字?整倍?,其次所有?据已?查完,
|
||||
return result; // 所有?据全部?1,?有??0位,result等于size.[luther.gliethttp]
|
||||
tmp = *p; // size不是32位整倍?,?剩几?bit?有?查,???行下面?查工作.[luther.gliethtp]
|
||||
|
||||
found_first:
|
||||
tmp |= ~0UL << size; // ?在0-size?有效?据,size-31?未使用空?,所以先?size-31置成全1.
|
||||
if (tmp == ~0UL) /* Are any bits zero? */ // 如果tmp全1,那么?明就?找找1?
|
||||
return result + size; /* Nope. */ // result+size就等于函??入的??size大小.[luther.gliethttp]
|
||||
found_middle:
|
||||
return result + ffz(tmp); // 我?在32位?据的0-31中??必定存在0位值,?算他是第几位.[luther.gliethttp]
|
||||
}
|
||||
|
||||
//int find_next_zero_bit(const void * p, int size, int offset);
|
||||
//int find_first_bit(const unsigned long *p, unsigned size);
|
||||
//int find_next_bit(const unsigned long *p, int size, int offset);
|
||||
/**
|
||||
* set_bit - Atomically set a bit in memory
|
||||
* @nr: the bit to set
|
||||
* @addr: the address to start counting from
|
||||
*
|
||||
* This function is atomic and may not be reordered. See __set_bit()
|
||||
* if you do not require the atomic guarantees.
|
||||
*
|
||||
* Note: there are no guarantees that this function will not be reordered
|
||||
* on non x86 architectures, so if you are writing portable code,
|
||||
* make sure not to rely on its reordering guarantees.
|
||||
*
|
||||
* Note that @nr may be almost arbitrarily large; this function is not
|
||||
* restricted to acting on a single-word quantity.
|
||||
*/
|
||||
static inline void set_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long flags;
|
||||
|
||||
//taskENTER_CRITICAL();
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
*p |= mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
//taskEXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/**
|
||||
* clear_bit - Clears a bit in memory
|
||||
* @nr: Bit to clear
|
||||
* @addr: Address to start counting from
|
||||
*
|
||||
* clear_bit() is atomic and may not be reordered. However, it does
|
||||
* not contain a memory barrier, so if it is used for locking purposes,
|
||||
* you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
|
||||
* in order to ensure changes are visible on other processors.
|
||||
*/
|
||||
static inline void clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long flags;
|
||||
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
//taskENTER_CRITICAL();
|
||||
*p &= ~mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
//taskEXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/**
|
||||
* change_bit - Toggle a bit in memory
|
||||
* @nr: Bit to change
|
||||
* @addr: Address to start counting from
|
||||
*
|
||||
* change_bit() is atomic and may not be reordered. It may be
|
||||
* reordered on other architectures than x86.
|
||||
* Note that @nr may be almost arbitrarily large; this function is not
|
||||
* restricted to acting on a single-word quantity.
|
||||
*/
|
||||
static inline void change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long flags;
|
||||
|
||||
//taskENTER_CRITICAL();
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
*p ^= mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
//taskEXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/**
|
||||
* test_and_set_bit - Set a bit and return its old value
|
||||
* @nr: Bit to set
|
||||
* @addr: Address to count from
|
||||
*
|
||||
* This operation is atomic and cannot be reordered.
|
||||
* It may be reordered on other architectures than x86.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long old;
|
||||
//unsigned long flags;
|
||||
|
||||
//taskENTER_CRITICAL();
|
||||
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
old = *p;
|
||||
*p = old | mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
//taskEXIT_CRITICAL();
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* test_and_clear_bit - Clear a bit and return its old value
|
||||
* @nr: Bit to clear
|
||||
* @addr: Address to count from
|
||||
*
|
||||
* This operation is atomic and cannot be reordered.
|
||||
* It can be reorderdered on other architectures other than x86.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long old;
|
||||
unsigned long flags;
|
||||
|
||||
//taskENTER_CRITICAL();
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
old = *p;
|
||||
*p = old & ~mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
//taskEXIT_CRITICAL();
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
/**
|
||||
* test_and_change_bit - Change a bit and return its old value
|
||||
* @nr: Bit to change
|
||||
* @addr: Address to count from
|
||||
*
|
||||
* This operation is atomic and cannot be reordered.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
unsigned long old;
|
||||
unsigned long flags;
|
||||
|
||||
|
||||
_atomic_spin_lock_irqsave(p, flags);
|
||||
old = *p;
|
||||
*p = old ^ mask;
|
||||
_atomic_spin_unlock_irqrestore(p, flags);
|
||||
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
|
||||
|
||||
static inline int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, int bits)
|
||||
{
|
||||
int k;
|
||||
int nr = BITS_TO_LONGS(bits);
|
||||
unsigned long result = 0;
|
||||
|
||||
for (k = 0; k < nr; k++)
|
||||
result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
|
||||
return result != 0;
|
||||
}
|
||||
|
||||
static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
|
||||
const unsigned long *src2, int nbits)
|
||||
{
|
||||
// if (small_const_nbits(nbits))
|
||||
// return (*dst = *src1 & ~(*src2)) != 0;
|
||||
return __bitmap_andnot(dst, src1, src2, nbits);
|
||||
}
|
||||
|
||||
static inline int atomic_inc_return(volatile atomic_t *v)
|
||||
{
|
||||
unsigned long flags;
|
||||
int retval;
|
||||
cris_atomic_save(v, flags);
|
||||
retval = ++(v->counter);
|
||||
cris_atomic_restore(v, flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
typedef __u16 __le16;
|
||||
typedef __u16 __be16;
|
||||
typedef __u32 __le32;
|
||||
typedef __u32 __be32;
|
||||
typedef __u64 __le64;
|
||||
typedef __u64 __be64;
|
||||
typedef __u16 __sum16;
|
||||
typedef __u32 __wsum;
|
||||
|
||||
#ifndef __GFP_WAIT
|
||||
#define __GFP_WAIT (0x10u)
|
||||
#endif
|
||||
#ifndef __GFP_HIGH
|
||||
#define __GFP_HIGH (0x20u)
|
||||
#endif
|
||||
#ifndef __GFP_IO
|
||||
#define __GFP_IO (0x40u)
|
||||
#endif
|
||||
#ifndef __GFP_FS
|
||||
#define __GFP_FS (0x80u)
|
||||
#endif
|
||||
#ifndef GFP_NOIO
|
||||
#define GFP_NOIO (0x10u)
|
||||
#endif
|
||||
#ifndef __GFP_NOWARN
|
||||
#define __GFP_NOWARN (0x200u)
|
||||
#endif
|
||||
#ifndef GFP_KERNEL
|
||||
#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS)
|
||||
#endif
|
||||
|
||||
#ifndef copy_from_user
|
||||
#define copy_from_user(to, from, sz) _memcpy((to), (from), (sz))
|
||||
#endif
|
||||
#ifndef copy_to_user
|
||||
#define copy_to_user(to, from, sz) _memcpy((to), (from), (sz))
|
||||
#endif
|
||||
|
||||
#if 0 /*comment since we are not using polling*/
|
||||
/* These are specified by iBCS2 */
|
||||
#ifndef POLLIN
|
||||
#define POLLIN 0x0001
|
||||
#endif
|
||||
#ifndef POLLPRI
|
||||
#define POLLPRI 0x0002
|
||||
#endif
|
||||
#ifndef POLLOUT
|
||||
#define POLLOUT 0x0004
|
||||
#endif
|
||||
#ifndef POLLERR
|
||||
#define POLLERR 0x0008
|
||||
#endif
|
||||
#ifndef POLLHUP
|
||||
#define POLLHUP 0x0010
|
||||
#endif
|
||||
#ifndef POLLNVAL
|
||||
#define POLLNVAL 0x0020
|
||||
#endif
|
||||
/* The rest seem to be more-or-less nonstandard. Check them! */
|
||||
#ifndef POLLRDNORM
|
||||
#define POLLRDNORM 0x0040
|
||||
#endif
|
||||
#ifndef POLLRDBAND
|
||||
#define POLLRDBAND 0x0080
|
||||
#endif
|
||||
#ifndef POLLWRNORM
|
||||
#define POLLWRNORM 0x0100
|
||||
#endif
|
||||
#ifndef POLLWRBAND
|
||||
#define POLLWRBAND 0x0200
|
||||
#endif
|
||||
#ifndef POLLMSG
|
||||
#define POLLMSG 0x0400
|
||||
#endif
|
||||
#ifndef POLLREMOVE
|
||||
#define POLLREMOVE 0x1000
|
||||
#endif
|
||||
#ifndef POLLRDHUP
|
||||
#define POLLRDHUP 0x2000
|
||||
#endif
|
||||
#ifndef POLLFREE
|
||||
#define POLLFREE 0x4000 /* currently only for epoll */
|
||||
#endif
|
||||
#ifndef POLL_BUSY_LOOP
|
||||
#define POLL_BUSY_LOOP 0x8000
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct __wait_queue_head {
|
||||
_Sema lock;
|
||||
struct list_head task_list;
|
||||
};
|
||||
|
||||
typedef struct __wait_queue_head wait_queue_head_t;
|
||||
|
||||
static inline void __init_waitqueue_head(wait_queue_head_t *q)
|
||||
{
|
||||
//spin_lock_init(&q->lock);
|
||||
RtlInitSema(&q->lock,0);
|
||||
INIT_LIST_HEAD(&q->task_list);
|
||||
}
|
||||
#ifndef init_waitqueue_head
|
||||
#define init_waitqueue_head(q) \
|
||||
do { \
|
||||
__init_waitqueue_head((q)); \
|
||||
} while (0)
|
||||
#endif
|
||||
#ifndef DEFAULT_POLLMASK
|
||||
#define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
|
||||
#endif
|
||||
|
||||
#endif /*_V4L2_OSDEP_H_*/
|
700
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-subdev.h
Normal file
700
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2-subdev.h
Normal file
|
@ -0,0 +1,700 @@
|
|||
/*
|
||||
V4L2 sub-device support header.
|
||||
|
||||
Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl>
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _V4L2_SUBDEV_H
|
||||
#define _V4L2_SUBDEV_H
|
||||
|
||||
#if 0
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
#include "v4l2-subdev.h"
|
||||
#include "media-entity.h"
|
||||
#include "v4l2-async.h"
|
||||
#include "v4l2-common.h"
|
||||
#include "v4l2-dev.h"
|
||||
#include "v4l2-fh.h"
|
||||
#include "v4l2-mediabus.h"
|
||||
|
||||
|
||||
/* generic v4l2_device notify callback notification values */
|
||||
#define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
|
||||
#define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001
|
||||
#define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002
|
||||
#define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004
|
||||
#define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008
|
||||
|
||||
#define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32)
|
||||
#define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001
|
||||
|
||||
struct v4l2_device;
|
||||
struct v4l2_ctrl_handler;
|
||||
struct v4l2_event_subscription;
|
||||
struct v4l2_fh;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_subdev_fh;
|
||||
//struct tuner_setup;
|
||||
struct v4l2_mbus_frame_desc;
|
||||
|
||||
/* decode_vbi_line */
|
||||
struct v4l2_decode_vbi_line {
|
||||
u32 is_second_field; /* Set to 0 for the first (odd) field,
|
||||
set to 1 for the second (even) field. */
|
||||
u8 *p; /* Pointer to the sliced VBI data from the decoder.
|
||||
On exit points to the start of the payload. */
|
||||
u32 line; /* Line number of the sliced VBI data (1-23) */
|
||||
u32 type; /* VBI service type (V4L2_SLICED_*). 0 if no service found */
|
||||
};
|
||||
|
||||
/* Sub-devices are devices that are connected somehow to the main bridge
|
||||
device. These devices are usually audio/video muxers/encoders/decoders or
|
||||
sensors and webcam controllers.
|
||||
|
||||
Usually these devices are controlled through an i2c bus, but other busses
|
||||
may also be used.
|
||||
|
||||
The v4l2_subdev struct provides a way of accessing these devices in a
|
||||
generic manner. Most operations that these sub-devices support fall in
|
||||
a few categories: core ops, audio ops, video ops and tuner ops.
|
||||
|
||||
More categories can be added if needed, although this should remain a
|
||||
limited set (no more than approx. 8 categories).
|
||||
|
||||
Each category has its own set of ops that subdev drivers can implement.
|
||||
|
||||
A subdev driver can leave the pointer to the category ops NULL if
|
||||
it does not implement them (e.g. an audio subdev will generally not
|
||||
implement the video category ops). The exception is the core category:
|
||||
this must always be present.
|
||||
|
||||
These ops are all used internally so it is no problem to change, remove
|
||||
or add ops or move ops from one to another category. Currently these
|
||||
ops are based on the original ioctls, but since ops are not limited to
|
||||
one argument there is room for improvement here once all i2c subdev
|
||||
drivers are converted to use these ops.
|
||||
*/
|
||||
|
||||
/* Core ops: it is highly recommended to implement at least these ops:
|
||||
|
||||
log_status
|
||||
g_register
|
||||
s_register
|
||||
|
||||
This provides basic debugging support.
|
||||
|
||||
The ioctl ops is meant for generic ioctl-like commands. Depending on
|
||||
the use-case it might be better to use subdev-specific ops (currently
|
||||
not yet implemented) since ops provide proper type-checking.
|
||||
*/
|
||||
|
||||
/* Subdevice external IO pin configuration */
|
||||
#define V4L2_SUBDEV_IO_PIN_DISABLE (1 << 0) /* ENABLE assumed */
|
||||
#define V4L2_SUBDEV_IO_PIN_OUTPUT (1 << 1)
|
||||
#define V4L2_SUBDEV_IO_PIN_INPUT (1 << 2)
|
||||
#define V4L2_SUBDEV_IO_PIN_SET_VALUE (1 << 3) /* Set output value */
|
||||
#define V4L2_SUBDEV_IO_PIN_ACTIVE_LOW (1 << 4) /* ACTIVE HIGH assumed */
|
||||
|
||||
struct v4l2_subdev_io_pin_config {
|
||||
u32 flags; /* V4L2_SUBDEV_IO_PIN_* flags for this pin's config */
|
||||
u8 pin; /* Chip external IO pin to configure */
|
||||
u8 function; /* Internal signal pad/function to route to IO pin */
|
||||
u8 value; /* Initial value for pin - e.g. GPIO output value */
|
||||
u8 strength; /* Pin drive strength */
|
||||
};
|
||||
|
||||
/*
|
||||
s_io_pin_config: configure one or more chip I/O pins for chips that
|
||||
multiplex different internal signal pads out to IO pins. This function
|
||||
takes a pointer to an array of 'n' pin configuration entries, one for
|
||||
each pin being configured. This function could be called at times
|
||||
other than just subdevice initialization.
|
||||
|
||||
init: initialize the sensor registers to some sort of reasonable default
|
||||
values. Do not use for new drivers and should be removed in existing
|
||||
drivers.
|
||||
|
||||
load_fw: load firmware.
|
||||
|
||||
reset: generic reset command. The argument selects which subsystems to
|
||||
reset. Passing 0 will always reset the whole chip. Do not use for new
|
||||
drivers without discussing this first on the linux-media mailinglist.
|
||||
There should be no reason normally to reset a device.
|
||||
|
||||
s_gpio: set GPIO pins. Very simple right now, might need to be extended with
|
||||
a direction argument if needed.
|
||||
|
||||
s_power: puts subdevice in power saving mode (on == 0) or normal operation
|
||||
mode (on == 1).
|
||||
|
||||
interrupt_service_routine: Called by the bridge chip's interrupt service
|
||||
handler, when an interrupt status has be raised due to this subdev,
|
||||
so that this subdev can handle the details. It may schedule work to be
|
||||
performed later. It must not sleep. *Called from an IRQ context*.
|
||||
*/
|
||||
struct v4l2_subdev_core_ops {
|
||||
int (*log_status)(struct v4l2_subdev *sd);
|
||||
int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
|
||||
struct v4l2_subdev_io_pin_config *pincfg);
|
||||
int (*init)(struct v4l2_subdev *sd, u32 val);
|
||||
int (*load_fw)(struct v4l2_subdev *sd);
|
||||
int (*reset)(struct v4l2_subdev *sd, u32 val);
|
||||
int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
|
||||
int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
|
||||
int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
|
||||
int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
|
||||
int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
|
||||
int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
|
||||
int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
|
||||
int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
|
||||
int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm);
|
||||
int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
|
||||
long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
|
||||
int (*s_register)(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg);
|
||||
#endif
|
||||
int (*s_power)(struct v4l2_subdev *sd, int on);
|
||||
int (*interrupt_service_routine)(struct v4l2_subdev *sd,
|
||||
u32 status, bool *handled);
|
||||
int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub);
|
||||
int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub);
|
||||
};
|
||||
|
||||
/* s_radio: v4l device was opened in radio mode.
|
||||
|
||||
g_frequency: freq->type must be filled in. Normally done by video_ioctl2
|
||||
or the bridge driver.
|
||||
|
||||
g_tuner:
|
||||
s_tuner: vt->type must be filled in. Normally done by video_ioctl2 or the
|
||||
bridge driver.
|
||||
|
||||
s_type_addr: sets tuner type and its I2C addr.
|
||||
|
||||
s_config: sets tda9887 specific stuff, like port1, port2 and qss
|
||||
*/
|
||||
struct v4l2_subdev_tuner_ops {
|
||||
int (*s_radio)(struct v4l2_subdev *sd);
|
||||
int (*s_frequency)(struct v4l2_subdev *sd, const struct v4l2_frequency *freq);
|
||||
int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
|
||||
int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
|
||||
int (*s_tuner)(struct v4l2_subdev *sd, const struct v4l2_tuner *vt);
|
||||
int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
|
||||
int (*s_modulator)(struct v4l2_subdev *sd, const struct v4l2_modulator *vm);
|
||||
//edit by Ian
|
||||
//int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
|
||||
//int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
|
||||
};
|
||||
|
||||
/* s_clock_freq: set the frequency (in Hz) of the audio clock output.
|
||||
Used to slave an audio processor to the video decoder, ensuring that
|
||||
audio and video remain synchronized. Usual values for the frequency
|
||||
are 48000, 44100 or 32000 Hz. If the frequency is not supported, then
|
||||
-EINVAL is returned.
|
||||
|
||||
s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard
|
||||
way to select I2S clock used by driving digital audio streams at some
|
||||
board designs. Usual values for the frequency are 1024000 and 2048000.
|
||||
If the frequency is not supported, then -EINVAL is returned.
|
||||
|
||||
s_routing: used to define the input and/or output pins of an audio chip,
|
||||
and any additional configuration data.
|
||||
Never attempt to use user-level input IDs (e.g. Composite, S-Video,
|
||||
Tuner) at this level. An i2c device shouldn't know about whether an
|
||||
input pin is connected to a Composite connector, become on another
|
||||
board or platform it might be connected to something else entirely.
|
||||
The calling driver is responsible for mapping a user-level input to
|
||||
the right pins on the i2c device.
|
||||
*/
|
||||
struct v4l2_subdev_audio_ops {
|
||||
int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
||||
int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
||||
int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
|
||||
int (*s_stream)(struct v4l2_subdev *sd, int enable);
|
||||
};
|
||||
|
||||
/* Indicates the @length field specifies maximum data length. */
|
||||
#define V4L2_MBUS_FRAME_DESC_FL_LEN_MAX (1U << 0)
|
||||
/* Indicates user defined data format, i.e. non standard frame format. */
|
||||
#define V4L2_MBUS_FRAME_DESC_FL_BLOB (1U << 1)
|
||||
|
||||
/**
|
||||
* struct v4l2_mbus_frame_desc_entry - media bus frame description structure
|
||||
* @flags: V4L2_MBUS_FRAME_DESC_FL_* flags
|
||||
* @pixelcode: media bus pixel code, valid if FRAME_DESC_FL_BLOB is not set
|
||||
* @length: number of octets per frame, valid for compressed or unspecified
|
||||
* formats
|
||||
*/
|
||||
struct v4l2_mbus_frame_desc_entry {
|
||||
u16 flags;
|
||||
u32 pixelcode;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
#define V4L2_FRAME_DESC_ENTRY_MAX 4
|
||||
|
||||
/**
|
||||
* struct v4l2_mbus_frame_desc - media bus data frame description
|
||||
* @entry: frame descriptors array
|
||||
* @num_entries: number of entries in @entry array
|
||||
*/
|
||||
struct v4l2_mbus_frame_desc {
|
||||
struct v4l2_mbus_frame_desc_entry entry[V4L2_FRAME_DESC_ENTRY_MAX];
|
||||
unsigned short num_entries;
|
||||
};
|
||||
|
||||
/*
|
||||
s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
|
||||
video input devices.
|
||||
|
||||
g_std_output: get current standard for video OUTPUT devices. This is ignored
|
||||
by video input devices.
|
||||
|
||||
g_tvnorms_output: get v4l2_std_id with all standards supported by video
|
||||
OUTPUT device. This is ignored by video input devices.
|
||||
|
||||
s_crystal_freq: sets the frequency of the crystal used to generate the
|
||||
clocks in Hz. An extra flags field allows device specific configuration
|
||||
regarding clock frequency dividers, etc. If not used, then set flags
|
||||
to 0. If the frequency is not supported, then -EINVAL is returned.
|
||||
|
||||
g_input_status: get input status. Same as the status field in the v4l2_input
|
||||
struct.
|
||||
|
||||
s_routing: see s_routing in audio_ops, except this version is for video
|
||||
devices.
|
||||
|
||||
s_dv_timings(): Set custom dv timings in the sub device. This is used
|
||||
when sub device is capable of setting detailed timing information
|
||||
in the hardware to generate/detect the video signal.
|
||||
|
||||
g_dv_timings(): Get custom dv timings in the sub device.
|
||||
|
||||
enum_mbus_fmt: enumerate pixel formats, provided by a video data source
|
||||
|
||||
g_mbus_fmt: get the current pixel format, provided by a video data source
|
||||
|
||||
try_mbus_fmt: try to set a pixel format on a video data source
|
||||
|
||||
s_mbus_fmt: set a pixel format on a video data source
|
||||
|
||||
g_mbus_config: get supported mediabus configurations
|
||||
|
||||
s_mbus_config: set a certain mediabus configuration. This operation is added
|
||||
for compatibility with soc-camera drivers and should not be used by new
|
||||
software.
|
||||
|
||||
s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev
|
||||
can adjust @size to a lower value and must not write more data to the
|
||||
buffer starting at @data than the original value of @size.
|
||||
*/
|
||||
struct v4l2_subdev_video_ops {
|
||||
int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
|
||||
int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
|
||||
int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
|
||||
int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
|
||||
int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
|
||||
int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
|
||||
int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
|
||||
int (*s_stream)(struct v4l2_subdev *sd, int enable);
|
||||
int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
|
||||
int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
|
||||
int (*s_crop)(struct v4l2_subdev *sd, const struct v4l2_crop *crop);
|
||||
int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
|
||||
int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
|
||||
// edit by Ian
|
||||
#if 0
|
||||
int (*g_frame_interval)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_frame_interval *interval);
|
||||
int (*s_frame_interval)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_frame_interval *interval);
|
||||
#endif
|
||||
int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
|
||||
int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
|
||||
int (*s_dv_timings)(struct v4l2_subdev *sd,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*g_dv_timings)(struct v4l2_subdev *sd,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*enum_dv_timings)(struct v4l2_subdev *sd,
|
||||
struct v4l2_enum_dv_timings *timings);
|
||||
int (*query_dv_timings)(struct v4l2_subdev *sd,
|
||||
struct v4l2_dv_timings *timings);
|
||||
int (*dv_timings_cap)(struct v4l2_subdev *sd,
|
||||
struct v4l2_dv_timings_cap *cap);
|
||||
#if 0
|
||||
int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code);
|
||||
int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
|
||||
struct v4l2_frmsizeenum *fsize);
|
||||
int (*g_mbus_fmt)(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_framefmt *fmt);
|
||||
int (*try_mbus_fmt)(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_framefmt *fmt);
|
||||
int (*s_mbus_fmt)(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_framefmt *fmt);
|
||||
int (*g_mbus_config)(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_config *cfg);
|
||||
int (*s_mbus_config)(struct v4l2_subdev *sd,
|
||||
const struct v4l2_mbus_config *cfg);
|
||||
#endif
|
||||
int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf,
|
||||
unsigned int *size);
|
||||
};
|
||||
|
||||
/*
|
||||
decode_vbi_line: video decoders that support sliced VBI need to implement
|
||||
this ioctl. Field p of the v4l2_sliced_vbi_line struct is set to the
|
||||
start of the VBI data that was generated by the decoder. The driver
|
||||
then parses the sliced VBI data and sets the other fields in the
|
||||
struct accordingly. The pointer p is updated to point to the start of
|
||||
the payload which can be copied verbatim into the data field of the
|
||||
v4l2_sliced_vbi_data struct. If no valid VBI data was found, then the
|
||||
type field is set to 0 on return.
|
||||
|
||||
s_vbi_data: used to generate VBI signals on a video signal.
|
||||
v4l2_sliced_vbi_data is filled with the data packets that should be
|
||||
output. Note that if you set the line field to 0, then that VBI signal
|
||||
is disabled. If no valid VBI data was found, then the type field is
|
||||
set to 0 on return.
|
||||
|
||||
g_vbi_data: used to obtain the sliced VBI packet from a readback register.
|
||||
Not all video decoders support this. If no data is available because
|
||||
the readback register contains invalid or erroneous data -EIO is
|
||||
returned. Note that you must fill in the 'id' member and the 'field'
|
||||
member (to determine whether CC data from the first or second field
|
||||
should be obtained).
|
||||
|
||||
s_raw_fmt: setup the video encoder/decoder for raw VBI.
|
||||
|
||||
g_sliced_fmt: retrieve the current sliced VBI settings.
|
||||
|
||||
s_sliced_fmt: setup the sliced VBI settings.
|
||||
*/
|
||||
struct v4l2_subdev_vbi_ops {
|
||||
int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
|
||||
int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
|
||||
int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
|
||||
int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
|
||||
int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
|
||||
int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
|
||||
int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_subdev_sensor_ops - v4l2-subdev sensor operations
|
||||
* @g_skip_top_lines: number of lines at the top of the image to be skipped.
|
||||
* This is needed for some sensors, which always corrupt
|
||||
* several top lines of the output image, or which send their
|
||||
* metadata in them.
|
||||
* @g_skip_frames: number of frames to skip at stream start. This is needed for
|
||||
* buggy sensors that generate faulty frames when they are
|
||||
* turned on.
|
||||
*/
|
||||
struct v4l2_subdev_sensor_ops {
|
||||
int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
|
||||
int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
|
||||
};
|
||||
|
||||
/*
|
||||
[rt]x_g_parameters: Get the current operating parameters and state of the
|
||||
the IR receiver or transmitter.
|
||||
|
||||
[rt]x_s_parameters: Set the current operating parameters and state of the
|
||||
the IR receiver or transmitter. It is recommended to call
|
||||
[rt]x_g_parameters first to fill out the current state, and only change
|
||||
the fields that need to be changed. Upon return, the actual device
|
||||
operating parameters and state will be returned. Note that hardware
|
||||
limitations may prevent the actual settings from matching the requested
|
||||
settings - e.g. an actual carrier setting of 35,904 Hz when 36,000 Hz
|
||||
was requested. An exception is when the shutdown parameter is true.
|
||||
The last used operational parameters will be returned, but the actual
|
||||
state of the hardware be different to minimize power consumption and
|
||||
processing when shutdown is true.
|
||||
|
||||
rx_read: Reads received codes or pulse width data.
|
||||
The semantics are similar to a non-blocking read() call.
|
||||
|
||||
tx_write: Writes codes or pulse width data for transmission.
|
||||
The semantics are similar to a non-blocking write() call.
|
||||
*/
|
||||
|
||||
enum v4l2_subdev_ir_mode {
|
||||
V4L2_SUBDEV_IR_MODE_PULSE_WIDTH, /* uses struct ir_raw_event records */
|
||||
};
|
||||
|
||||
struct v4l2_subdev_ir_parameters {
|
||||
/* Either Rx or Tx */
|
||||
unsigned int bytes_per_data_element; /* of data in read or write call */
|
||||
enum v4l2_subdev_ir_mode mode;
|
||||
|
||||
bool enable;
|
||||
bool interrupt_enable;
|
||||
bool shutdown; /* true: set hardware to low/no power, false: normal */
|
||||
|
||||
bool modulation; /* true: uses carrier, false: baseband */
|
||||
u32 max_pulse_width; /* ns, valid only for baseband signal */
|
||||
unsigned int carrier_freq; /* Hz, valid only for modulated signal*/
|
||||
unsigned int duty_cycle; /* percent, valid only for modulated signal*/
|
||||
bool invert_level; /* invert signal level */
|
||||
|
||||
/* Tx only */
|
||||
bool invert_carrier_sense; /* Send 0/space as a carrier burst */
|
||||
|
||||
/* Rx only */
|
||||
u32 noise_filter_min_width; /* ns, min time of a valid pulse */
|
||||
unsigned int carrier_range_lower; /* Hz, valid only for modulated sig */
|
||||
unsigned int carrier_range_upper; /* Hz, valid only for modulated sig */
|
||||
u32 resolution; /* ns */
|
||||
};
|
||||
|
||||
struct v4l2_subdev_ir_ops {
|
||||
/* Receiver */
|
||||
int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
|
||||
ssize_t *num);
|
||||
|
||||
int (*rx_g_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
int (*rx_s_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
|
||||
/* Transmitter */
|
||||
int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
|
||||
ssize_t *num);
|
||||
|
||||
int (*tx_g_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
int (*tx_s_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
|
||||
* @get_frame_desc: get the current low level media bus frame parameters.
|
||||
* @get_frame_desc: set the low level media bus frame parameters, @fd array
|
||||
* may be adjusted by the subdev driver to device capabilities.
|
||||
*/
|
||||
struct v4l2_subdev_pad_ops {
|
||||
|
||||
#if 0
|
||||
int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_mbus_code_enum *code);
|
||||
int (*enum_frame_size)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse);
|
||||
int (*enum_frame_interval)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_interval_enum *fie);
|
||||
int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format);
|
||||
int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format);
|
||||
int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_crop *crop);
|
||||
int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_crop *crop);
|
||||
int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_selection *sel);
|
||||
int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_selection *sel);
|
||||
int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
|
||||
int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
|
||||
struct v4l2_subdev_format *source_fmt,
|
||||
struct v4l2_subdev_format *sink_fmt);
|
||||
#endif /* CONFIG_MEDIA_CONTROLLER */
|
||||
#endif
|
||||
int (*get_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
|
||||
struct v4l2_mbus_frame_desc *fd);
|
||||
int (*set_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
|
||||
struct v4l2_mbus_frame_desc *fd);
|
||||
};
|
||||
|
||||
struct v4l2_subdev_ops {
|
||||
const struct v4l2_subdev_core_ops *core;
|
||||
const struct v4l2_subdev_tuner_ops *tuner;
|
||||
const struct v4l2_subdev_audio_ops *audio;
|
||||
const struct v4l2_subdev_video_ops *video;
|
||||
const struct v4l2_subdev_vbi_ops *vbi;
|
||||
const struct v4l2_subdev_ir_ops *ir;
|
||||
const struct v4l2_subdev_sensor_ops *sensor;
|
||||
const struct v4l2_subdev_pad_ops *pad;
|
||||
};
|
||||
|
||||
/*
|
||||
* Internal ops. Never call this from drivers, only the v4l2 framework can call
|
||||
* these ops.
|
||||
*
|
||||
* registered: called when this subdev is registered. When called the v4l2_dev
|
||||
* field is set to the correct v4l2_device.
|
||||
*
|
||||
* unregistered: called when this subdev is unregistered. When called the
|
||||
* v4l2_dev field is still set to the correct v4l2_device.
|
||||
*
|
||||
* open: called when the subdev device node is opened by an application.
|
||||
*
|
||||
* close: called when the subdev device node is closed.
|
||||
*/
|
||||
struct v4l2_subdev_internal_ops {
|
||||
int (*registered)(struct v4l2_subdev *sd);
|
||||
void (*unregistered)(struct v4l2_subdev *sd);
|
||||
int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
|
||||
int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
|
||||
};
|
||||
|
||||
#define V4L2_SUBDEV_NAME_SIZE 32
|
||||
|
||||
/* Set this flag if this subdev is a i2c device. */
|
||||
#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
|
||||
/* Set this flag if this subdev is a spi device. */
|
||||
#define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
|
||||
/* Set this flag if this subdev needs a device node. */
|
||||
#define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2)
|
||||
/* Set this flag if this subdev generates events. */
|
||||
#define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3)
|
||||
|
||||
/* Each instance of a subdev driver should create this struct, either
|
||||
stand-alone or embedded in a larger struct.
|
||||
*/
|
||||
struct v4l2_subdev {
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER)
|
||||
struct media_entity entity;
|
||||
#endif
|
||||
struct list_head list;
|
||||
//struct module *owner;
|
||||
u32 flags;
|
||||
struct v4l2_device *v4l2_dev;
|
||||
const struct v4l2_subdev_ops *ops;
|
||||
/* Never call these internal ops from within a sub_dev driver! */
|
||||
const struct v4l2_subdev_internal_ops *internal_ops;
|
||||
/* The control handler of this subdev. May be NULL. */
|
||||
struct v4l2_ctrl_handler *ctrl_handler;
|
||||
/* name must be unique */
|
||||
char name[V4L2_SUBDEV_NAME_SIZE];
|
||||
/* can be used to group similar subdevs, value is driver-specific */
|
||||
u32 grp_id;
|
||||
/* pointer to private data */
|
||||
void *dev_priv;
|
||||
void *host_priv;
|
||||
/* subdev device node */
|
||||
struct video_device *devnode;
|
||||
/* pointer to the physical device, if any */
|
||||
//struct device *dev;
|
||||
const char *dev_init_name; /* initial name of the device */
|
||||
void *dev_prive_date;
|
||||
|
||||
/* Links this subdev to a global subdev_list or @notifier->done list. */
|
||||
struct list_head async_list;
|
||||
/* Pointer to respective struct v4l2_async_subdev. */
|
||||
struct v4l2_async_subdev *asd;
|
||||
/* Pointer to the managing notifier. */
|
||||
struct v4l2_async_notifier *notifier;
|
||||
};
|
||||
|
||||
#define media_entity_to_v4l2_subdev(ent) \
|
||||
container_of(ent, struct v4l2_subdev, entity)
|
||||
#define vdev_to_v4l2_subdev(vdev) \
|
||||
((struct v4l2_subdev *)video_get_drvdata(vdev))
|
||||
|
||||
/*
|
||||
* Used for storing subdev information per file handle
|
||||
*/
|
||||
struct v4l2_subdev_fh {
|
||||
struct v4l2_fh vfh;
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
struct {
|
||||
struct v4l2_mbus_framefmt try_fmt;
|
||||
struct v4l2_rect try_crop;
|
||||
struct v4l2_rect try_compose;
|
||||
} *pad;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define to_v4l2_subdev_fh(fh) \
|
||||
container_of(fh, struct v4l2_subdev_fh, vfh)
|
||||
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
#define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name) \
|
||||
static inline struct rtype * \
|
||||
v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh, \
|
||||
unsigned int pad) \
|
||||
{ \
|
||||
BUG_ON(unlikely(pad >= vdev_to_v4l2_subdev( \
|
||||
fh->vfh.vdev)->entity.num_pads)); \
|
||||
return &fh->pad[pad].field_name; \
|
||||
}
|
||||
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_compose)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)
|
||||
#endif
|
||||
|
||||
extern const struct v4l2_file_operations v4l2_subdev_fops;
|
||||
|
||||
static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
|
||||
{
|
||||
sd->dev_priv = p;
|
||||
}
|
||||
|
||||
static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
|
||||
{
|
||||
return sd->dev_priv;
|
||||
}
|
||||
|
||||
static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
|
||||
{
|
||||
sd->host_priv = p;
|
||||
}
|
||||
|
||||
static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
|
||||
{
|
||||
return sd->host_priv;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd,
|
||||
struct media_link *link,
|
||||
struct v4l2_subdev_format *source_fmt,
|
||||
struct v4l2_subdev_format *sink_fmt);
|
||||
int v4l2_subdev_link_validate(struct media_link *link);
|
||||
#endif /* CONFIG_MEDIA_CONTROLLER */
|
||||
void v4l2_subdev_init(struct v4l2_subdev *sd,
|
||||
const struct v4l2_subdev_ops *ops);
|
||||
|
||||
/* Call an ops of a v4l2_subdev, doing the right checks against
|
||||
NULL pointers.
|
||||
|
||||
Example: err = v4l2_subdev_call(sd, core, s_std, norm);
|
||||
*/
|
||||
#define v4l2_subdev_call(sd, o, f, args...) \
|
||||
(!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
|
||||
(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
|
||||
|
||||
/* Send a notification to v4l2_device. */
|
||||
#define v4l2_subdev_notify(sd, notification, arg) \
|
||||
((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
|
||||
(sd)->v4l2_dev->notify((sd), (notification), (arg)))
|
||||
|
||||
#define v4l2_subdev_has_op(sd, o, f) \
|
||||
((sd)->ops->o && (sd)->ops->o->f)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#ifndef V4L2_DRIVER_H
|
||||
#define V4L2_DRIVER_H /*structure needed for video caputure*/
|
||||
|
||||
#include <platform/platform_stdlib.h>
|
||||
#include "dlist.h"
|
||||
#include "basic_types.h"
|
||||
|
||||
#endif //V4L2_DRIVER_H
|
24
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2_intf.h
Normal file
24
RTL00_SDKV35a/component/common/video/v4l2/inc/v4l2_intf.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
#ifndef _V4L2_INTF_H_
|
||||
#define _V4L2_INTF_H_
|
||||
|
||||
#define VIDEO_NUM_DEVICES 4//should be aligned with value in v4l2-dev.c
|
||||
|
||||
typedef enum _streaming_state streaming_state;
|
||||
enum _streaming_state {
|
||||
STREAMING_OFF = 0,
|
||||
STREAMING_ON = 1,
|
||||
STREAMING_PAUSED = 2,
|
||||
STREAMING_READY = 3,
|
||||
};
|
||||
|
||||
long v4l_usr_ioctl(int fd, unsigned int cmd, void *arg);
|
||||
int v4l_dev_open();
|
||||
void v4l_dev_release();
|
||||
void stop_capturing();
|
||||
int start_capturing();
|
||||
void uninit_v4l2_device ();
|
||||
int init_v4l2_device ();
|
||||
int v4l_set_param(u32 format_type, int *width, int *height, int *frame_rate, int *compression_ratio);
|
||||
int v4l_getset_usb_ctrl(u8 bRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, void *data, int timeout, int set);
|
||||
extern void spec_v4l2_probe();
|
||||
#endif
|
522
RTL00_SDKV35a/component/common/video/v4l2/inc/videobuf2-core.h
Normal file
522
RTL00_SDKV35a/component/common/video/v4l2/inc/videobuf2-core.h
Normal file
|
@ -0,0 +1,522 @@
|
|||
/*
|
||||
* videobuf2-core.h - V4L2 driver helper framework
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics
|
||||
*
|
||||
* Author: Pawel Osciak <pawel@osciak.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef _MEDIA_VIDEOBUF2_CORE_H
|
||||
#define _MEDIA_VIDEOBUF2_CORE_H
|
||||
#if 0
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/dma-buf.h>
|
||||
#endif
|
||||
#include "v4l2-osdep.h"
|
||||
#include "videodev2.h"
|
||||
|
||||
|
||||
typedef int _LOCK_T;
|
||||
struct vb2_alloc_ctx;
|
||||
struct vb2_fileio_data;
|
||||
|
||||
/**
|
||||
* struct vb2_mem_ops - memory handling/memory allocator operations
|
||||
* @alloc: allocate video memory and, optionally, allocator private data,
|
||||
* return NULL on failure or a pointer to allocator private,
|
||||
* per-buffer data on success; the returned private structure
|
||||
* will then be passed as buf_priv argument to other ops in this
|
||||
* structure. Additional gfp_flags to use when allocating the
|
||||
* are also passed to this operation. These flags are from the
|
||||
* gfp_flags field of vb2_queue.
|
||||
* @put: inform the allocator that the buffer will no longer be used;
|
||||
* usually will result in the allocator freeing the buffer (if
|
||||
* no other users of this buffer are present); the buf_priv
|
||||
* argument is the allocator private per-buffer structure
|
||||
* previously returned from the alloc callback
|
||||
* @get_userptr: acquire userspace memory for a hardware operation; used for
|
||||
* USERPTR memory types; vaddr is the address passed to the
|
||||
* videobuf layer when queuing a video buffer of USERPTR type;
|
||||
* should return an allocator private per-buffer structure
|
||||
* associated with the buffer on success, NULL on failure;
|
||||
* the returned private structure will then be passed as buf_priv
|
||||
* argument to other ops in this structure
|
||||
* @put_userptr: inform the allocator that a USERPTR buffer will no longer
|
||||
* be used
|
||||
* @attach_dmabuf: attach a shared struct dma_buf for a hardware operation;
|
||||
* used for DMABUF memory types; alloc_ctx is the alloc context
|
||||
* dbuf is the shared dma_buf; returns NULL on failure;
|
||||
* allocator private per-buffer structure on success;
|
||||
* this needs to be used for further accesses to the buffer
|
||||
* @detach_dmabuf: inform the exporter of the buffer that the current DMABUF
|
||||
* buffer is no longer used; the buf_priv argument is the
|
||||
* allocator private per-buffer structure previously returned
|
||||
* from the attach_dmabuf callback
|
||||
* @map_dmabuf: request for access to the dmabuf from allocator; the allocator
|
||||
* of dmabuf is informed that this driver is going to use the
|
||||
* dmabuf
|
||||
* @unmap_dmabuf: releases access control to the dmabuf - allocator is notified
|
||||
* that this driver is done using the dmabuf for now
|
||||
* @prepare: called every time the buffer is passed from userspace to the
|
||||
* driver, useful for cache synchronisation, optional
|
||||
* @finish: called every time the buffer is passed back from the driver
|
||||
* to the userspace, also optional
|
||||
* @vaddr: return a kernel virtual address to a given memory buffer
|
||||
* associated with the passed private structure or NULL if no
|
||||
* such mapping exists
|
||||
* @cookie: return allocator specific cookie for a given memory buffer
|
||||
* associated with the passed private structure or NULL if not
|
||||
* available
|
||||
* @num_users: return the current number of users of a memory buffer;
|
||||
* return 1 if the videobuf layer (or actually the driver using
|
||||
* it) is the only user
|
||||
* @mmap: setup a userspace mapping for a given memory buffer under
|
||||
* the provided virtual memory region
|
||||
*
|
||||
* Required ops for USERPTR types: get_userptr, put_userptr.
|
||||
* Required ops for MMAP types: alloc, put, num_users, mmap.
|
||||
* Required ops for read/write access types: alloc, put, num_users, vaddr
|
||||
* Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf,
|
||||
* unmap_dmabuf.
|
||||
*/
|
||||
struct vb2_mem_ops {
|
||||
void *(*alloc)(void *alloc_ctx, unsigned long size, gfp_t gfp_flags);
|
||||
void (*put)(void *buf_priv);
|
||||
struct dma_buf *(*get_dmabuf)(void *buf_priv);
|
||||
|
||||
void *(*get_userptr)(void *alloc_ctx, unsigned long vaddr,
|
||||
unsigned long size, int write);
|
||||
void (*put_userptr)(void *buf_priv);
|
||||
|
||||
void (*prepare)(void *buf_priv);
|
||||
void (*finish)(void *buf_priv);
|
||||
|
||||
void *(*attach_dmabuf)(void *alloc_ctx, struct dma_buf *dbuf,
|
||||
unsigned long size, int write);
|
||||
void (*detach_dmabuf)(void *buf_priv);
|
||||
int (*map_dmabuf)(void *buf_priv);
|
||||
void (*unmap_dmabuf)(void *buf_priv);
|
||||
|
||||
void *(*vaddr)(void *buf_priv);
|
||||
void *(*cookie)(void *buf_priv);
|
||||
|
||||
unsigned int (*num_users)(void *buf_priv);
|
||||
|
||||
int (*mmap)(void *buf_priv);
|
||||
};
|
||||
|
||||
struct vb2_plane {
|
||||
void *mem_priv;
|
||||
struct dma_buf *dbuf;
|
||||
unsigned int dbuf_mapped;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum vb2_io_modes - queue access methods
|
||||
* @VB2_MMAP: driver supports MMAP with streaming API
|
||||
* @VB2_USERPTR: driver supports USERPTR with streaming API
|
||||
* @VB2_READ: driver supports read() style access
|
||||
* @VB2_WRITE: driver supports write() style access
|
||||
* @VB2_DMABUF: driver supports DMABUF with streaming API
|
||||
*/
|
||||
enum vb2_io_modes {
|
||||
VB2_MMAP = (1 << 0),
|
||||
VB2_USERPTR = (1 << 1),
|
||||
VB2_READ = (1 << 2),
|
||||
VB2_WRITE = (1 << 3),
|
||||
VB2_DMABUF = (1 << 4),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum vb2_fileio_flags - flags for selecting a mode of the file io emulator,
|
||||
* by default the 'streaming' style is used by the file io emulator
|
||||
* @VB2_FILEIO_READ_ONCE: report EOF after reading the first buffer
|
||||
* @VB2_FILEIO_WRITE_IMMEDIATELY: queue buffer after each write() call
|
||||
*/
|
||||
enum vb2_fileio_flags {
|
||||
VB2_FILEIO_READ_ONCE = (1 << 0),
|
||||
VB2_FILEIO_WRITE_IMMEDIATELY = (1 << 1),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum vb2_buffer_state - current video buffer state
|
||||
* @VB2_BUF_STATE_DEQUEUED: buffer under userspace control
|
||||
* @VB2_BUF_STATE_PREPARED: buffer prepared in videobuf and by the driver
|
||||
* @VB2_BUF_STATE_QUEUED: buffer queued in videobuf, but not in driver
|
||||
* @VB2_BUF_STATE_ACTIVE: buffer queued in driver and possibly used
|
||||
* in a hardware operation
|
||||
* @VB2_BUF_STATE_DONE: buffer returned from driver to videobuf, but
|
||||
* not yet dequeued to userspace
|
||||
* @VB2_BUF_STATE_ERROR: same as above, but the operation on the buffer
|
||||
* has ended with an error, which will be reported
|
||||
* to the userspace when it is dequeued
|
||||
*/
|
||||
enum vb2_buffer_state {
|
||||
VB2_BUF_STATE_DEQUEUED,
|
||||
VB2_BUF_STATE_PREPARED,
|
||||
VB2_BUF_STATE_QUEUED,
|
||||
VB2_BUF_STATE_ACTIVE,
|
||||
VB2_BUF_STATE_DONE,
|
||||
VB2_BUF_STATE_ERROR,
|
||||
};
|
||||
|
||||
struct vb2_queue;
|
||||
|
||||
/**
|
||||
* struct vb2_buffer - represents a video buffer
|
||||
* @v4l2_buf: struct v4l2_buffer associated with this buffer; can
|
||||
* be read by the driver and relevant entries can be
|
||||
* changed by the driver in case of CAPTURE types
|
||||
* (such as timestamp)
|
||||
* @v4l2_planes: struct v4l2_planes associated with this buffer; can
|
||||
* be read by the driver and relevant entries can be
|
||||
* changed by the driver in case of CAPTURE types
|
||||
* (such as bytesused); NOTE that even for single-planar
|
||||
* types, the v4l2_planes[0] struct should be used
|
||||
* instead of v4l2_buf for filling bytesused - drivers
|
||||
* should use the vb2_set_plane_payload() function for that
|
||||
* @vb2_queue: the queue to which this driver belongs
|
||||
* @num_planes: number of planes in the buffer
|
||||
* on an internal driver queue
|
||||
* @state: current buffer state; do not change
|
||||
* @queued_entry: entry on the queued buffers list, which holds all
|
||||
* buffers queued from userspace
|
||||
* @done_entry: entry on the list that stores all buffers ready to
|
||||
* be dequeued to userspace
|
||||
* @planes: private per-plane information; do not change
|
||||
*/
|
||||
struct vb2_buffer {
|
||||
struct v4l2_buffer v4l2_buf;
|
||||
struct v4l2_plane v4l2_planes[VIDEO_MAX_PLANES];
|
||||
|
||||
struct vb2_queue *vb2_queue;
|
||||
|
||||
unsigned int num_planes;
|
||||
|
||||
/* Private: internal use only */
|
||||
enum vb2_buffer_state state;
|
||||
|
||||
struct list_head queued_entry;
|
||||
struct list_head done_entry;
|
||||
|
||||
struct vb2_plane planes[VIDEO_MAX_PLANES];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct vb2_ops - driver-specific callbacks
|
||||
*
|
||||
* @queue_setup: called from VIDIOC_REQBUFS and VIDIOC_CREATE_BUFS
|
||||
* handlers before memory allocation, or, if
|
||||
* *num_planes != 0, after the allocation to verify a
|
||||
* smaller number of buffers. Driver should return
|
||||
* the required number of buffers in *num_buffers, the
|
||||
* required number of planes per buffer in *num_planes; the
|
||||
* size of each plane should be set in the sizes[] array
|
||||
* and optional per-plane allocator specific context in the
|
||||
* alloc_ctxs[] array. When called from VIDIOC_REQBUFS,
|
||||
* fmt == NULL, the driver has to use the currently
|
||||
* configured format and *num_buffers is the total number
|
||||
* of buffers, that are being allocated. When called from
|
||||
* VIDIOC_CREATE_BUFS, fmt != NULL and it describes the
|
||||
* target frame format (if the format isn't valid the
|
||||
* callback must return -EINVAL). In this case *num_buffers
|
||||
* are being allocated additionally to q->num_buffers.
|
||||
* @wait_prepare: release any locks taken while calling vb2 functions;
|
||||
* it is called before an ioctl needs to wait for a new
|
||||
* buffer to arrive; required to avoid a deadlock in
|
||||
* blocking access type
|
||||
* @wait_finish: reacquire all locks released in the previous callback;
|
||||
* required to continue operation after sleeping while
|
||||
* waiting for a new buffer to arrive
|
||||
* @buf_init: called once after allocating a buffer (in MMAP case)
|
||||
* or after acquiring a new USERPTR buffer; drivers may
|
||||
* perform additional buffer-related initialization;
|
||||
* initialization failure (return != 0) will prevent
|
||||
* queue setup from completing successfully; optional
|
||||
* @buf_prepare: called every time the buffer is queued from userspace
|
||||
* and from the VIDIOC_PREPARE_BUF ioctl; drivers may
|
||||
* perform any initialization required before each hardware
|
||||
* operation in this callback; drivers that support
|
||||
* VIDIOC_CREATE_BUFS must also validate the buffer size;
|
||||
* if an error is returned, the buffer will not be queued
|
||||
* in driver; optional
|
||||
* @buf_finish: called before every dequeue of the buffer back to
|
||||
* userspace; drivers may perform any operations required
|
||||
* before userspace accesses the buffer; optional
|
||||
* @buf_cleanup: called once before the buffer is freed; drivers may
|
||||
* perform any additional cleanup; optional
|
||||
* @start_streaming: called once to enter 'streaming' state; the driver may
|
||||
* receive buffers with @buf_queue callback before
|
||||
* @start_streaming is called; the driver gets the number
|
||||
* of already queued buffers in count parameter; driver
|
||||
* can return an error if hardware fails or not enough
|
||||
* buffers has been queued, in such case all buffers that
|
||||
* have been already given by the @buf_queue callback are
|
||||
* invalidated.
|
||||
* @stop_streaming: called when 'streaming' state must be disabled; driver
|
||||
* should stop any DMA transactions or wait until they
|
||||
* finish and give back all buffers it got from buf_queue()
|
||||
* callback; may use vb2_wait_for_all_buffers() function
|
||||
* @buf_queue: passes buffer vb to the driver; driver may start
|
||||
* hardware operation on this buffer; driver should give
|
||||
* the buffer back by calling vb2_buffer_done() function;
|
||||
* it is allways called after calling STREAMON ioctl;
|
||||
* might be called before start_streaming callback if user
|
||||
* pre-queued buffers before calling STREAMON
|
||||
*/
|
||||
struct vb2_ops {
|
||||
int (*queue_setup)(struct vb2_queue *q, const struct v4l2_format *fmt,
|
||||
unsigned int *num_buffers, unsigned int *num_planes,
|
||||
unsigned int sizes[], void *alloc_ctxs[]);
|
||||
|
||||
void (*wait_prepare)(struct vb2_queue *q);
|
||||
void (*wait_finish)(struct vb2_queue *q);
|
||||
|
||||
int (*buf_init)(struct vb2_buffer *vb);
|
||||
//int (*buf_prepare)(struct vb2_buffer *vb);
|
||||
int (*buf_prepare)(struct vb2_buffer *vb, unsigned int index);
|
||||
int (*buf_finish)(struct vb2_buffer *vb);
|
||||
void (*buf_cleanup)(struct vb2_buffer *vb);
|
||||
|
||||
int (*start_streaming)(struct vb2_queue *q, unsigned int count);
|
||||
int (*stop_streaming)(struct vb2_queue *q);
|
||||
|
||||
void (*buf_queue)(struct vb2_buffer *vb);
|
||||
};
|
||||
|
||||
struct v4l2_fh;
|
||||
|
||||
/**
|
||||
* struct vb2_queue - a videobuf queue
|
||||
*
|
||||
* @type: queue type (see V4L2_BUF_TYPE_* in linux/videodev2.h
|
||||
* @io_modes: supported io methods (see vb2_io_modes enum)
|
||||
* @io_flags: additional io flags (see vb2_fileio_flags enum)
|
||||
* @lock: pointer to a mutex that protects the vb2_queue struct. The
|
||||
* driver can set this to a mutex to let the v4l2 core serialize
|
||||
* the queuing ioctls. If the driver wants to handle locking
|
||||
* itself, then this should be set to NULL. This lock is not used
|
||||
* by the videobuf2 core API.
|
||||
* @owner: The filehandle that 'owns' the buffers, i.e. the filehandle
|
||||
* that called reqbufs, create_buffers or started fileio.
|
||||
* This field is not used by the videobuf2 core API, but it allows
|
||||
* drivers to easily associate an owner filehandle with the queue.
|
||||
* @ops: driver-specific callbacks
|
||||
* @mem_ops: memory allocator specific callbacks
|
||||
* @drv_priv: driver private data
|
||||
* @buf_struct_size: size of the driver-specific buffer structure;
|
||||
* "0" indicates the driver doesn't want to use a custom buffer
|
||||
* structure type, so sizeof(struct vb2_buffer) will is used
|
||||
* @gfp_flags: additional gfp flags used when allocating the buffers.
|
||||
* Typically this is 0, but it may be e.g. GFP_DMA or __GFP_DMA32
|
||||
* to force the buffer allocation to a specific memory zone.
|
||||
*
|
||||
* @memory: current memory type used
|
||||
* @bufs: videobuf buffer structures
|
||||
* @num_buffers: number of allocated/used buffers
|
||||
* @queued_list: list of buffers currently queued from userspace
|
||||
* @queued_count: number of buffers owned by the driver
|
||||
* @done_list: list of buffers ready to be dequeued to userspace
|
||||
* @done_lock: lock to protect done_list list
|
||||
* @done_wq: waitqueue for processes waiting for buffers ready to be dequeued
|
||||
* @alloc_ctx: memory type/allocator-specific contexts for each plane
|
||||
* @streaming: current streaming state
|
||||
* @fileio: file io emulator internal data, used only if emulator is active
|
||||
*/
|
||||
struct vb2_queue {
|
||||
enum v4l2_buf_type type;
|
||||
unsigned int io_modes;
|
||||
unsigned int io_flags;
|
||||
//struct mutex *lock;
|
||||
_Mutex *lock;
|
||||
|
||||
struct v4l2_fh *owner;
|
||||
|
||||
const struct vb2_ops *ops;
|
||||
const struct vb2_mem_ops *mem_ops;
|
||||
void *drv_priv;
|
||||
unsigned int buf_struct_size;
|
||||
u32 timestamp_type;
|
||||
gfp_t gfp_flags;
|
||||
|
||||
/* private: internal use only */
|
||||
enum v4l2_memory memory;
|
||||
struct vb2_buffer *bufs[VIDEO_MAX_FRAME];
|
||||
unsigned int num_buffers;
|
||||
|
||||
struct list_head queued_list;
|
||||
|
||||
atomic_t queued_count;
|
||||
struct list_head done_list;
|
||||
//spinlock_t done_lock;
|
||||
//_LOCK_T done_lock;
|
||||
_Mutex done_lock;
|
||||
//wait_queue_head_t done_wq;
|
||||
_Sema done_wq; //counting semaphore
|
||||
|
||||
void *alloc_ctx[VIDEO_MAX_PLANES];
|
||||
unsigned int plane_sizes[VIDEO_MAX_PLANES];
|
||||
|
||||
//unsigned int streaming:1;
|
||||
|
||||
unsigned int streaming;
|
||||
//unsigned int start_streaming_called;//added by Ian
|
||||
|
||||
struct vb2_fileio_data *fileio;
|
||||
};
|
||||
|
||||
void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no);
|
||||
void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no);
|
||||
|
||||
void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state);
|
||||
int vb2_wait_for_all_buffers(struct vb2_queue *q);
|
||||
|
||||
int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b);
|
||||
int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req);
|
||||
|
||||
int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create);
|
||||
int vb2_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b);
|
||||
|
||||
int vb2_queue_init(struct vb2_queue *q);
|
||||
|
||||
void vb2_queue_release(struct vb2_queue *q);
|
||||
|
||||
int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b);
|
||||
int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb);
|
||||
int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking);
|
||||
|
||||
int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type);
|
||||
int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type);
|
||||
|
||||
int vb2_mmap(struct vb2_queue *q);
|
||||
#ifndef CONFIG_MMU
|
||||
unsigned long vb2_get_unmapped_area(struct vb2_queue *q,
|
||||
unsigned long addr,
|
||||
unsigned long len,
|
||||
unsigned long pgoff,
|
||||
unsigned long flags);
|
||||
#endif
|
||||
#if 0
|
||||
unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait);
|
||||
size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
size_t vb2_write(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
#endif
|
||||
/**
|
||||
* vb2_is_streaming() - return streaming status of the queue
|
||||
* @q: videobuf queue
|
||||
*/
|
||||
static inline bool vb2_is_streaming(struct vb2_queue *q)
|
||||
{
|
||||
return q->streaming;
|
||||
}
|
||||
|
||||
/**
|
||||
* vb2_is_busy() - return busy status of the queue
|
||||
* @q: videobuf queue
|
||||
*
|
||||
* This function checks if queue has any buffers allocated.
|
||||
*/
|
||||
static inline bool vb2_is_busy(struct vb2_queue *q)
|
||||
{
|
||||
return (q->num_buffers > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* vb2_get_drv_priv() - return driver private data associated with the queue
|
||||
* @q: videobuf queue
|
||||
*/
|
||||
static inline void *vb2_get_drv_priv(struct vb2_queue *q)
|
||||
{
|
||||
return q->drv_priv;
|
||||
}
|
||||
|
||||
/**
|
||||
* vb2_set_plane_payload() - set bytesused for the plane plane_no
|
||||
* @vb: buffer for which plane payload should be set
|
||||
* @plane_no: plane number for which payload should be set
|
||||
* @size: payload in bytes
|
||||
*/
|
||||
static inline void vb2_set_plane_payload(struct vb2_buffer *vb,
|
||||
unsigned int plane_no, unsigned long size)
|
||||
{
|
||||
if (plane_no < vb->num_planes)
|
||||
vb->v4l2_planes[plane_no].bytesused = size;
|
||||
}
|
||||
|
||||
/**
|
||||
* vb2_get_plane_payload() - get bytesused for the plane plane_no
|
||||
* @vb: buffer for which plane payload should be set
|
||||
* @plane_no: plane number for which payload should be set
|
||||
* @size: payload in bytes
|
||||
*/
|
||||
static inline unsigned long vb2_get_plane_payload(struct vb2_buffer *vb,
|
||||
unsigned int plane_no)
|
||||
{
|
||||
if (plane_no < vb->num_planes)
|
||||
return vb->v4l2_planes[plane_no].bytesused;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* vb2_plane_size() - return plane size in bytes
|
||||
* @vb: buffer for which plane size should be returned
|
||||
* @plane_no: plane number for which size should be returned
|
||||
*/
|
||||
static inline unsigned long
|
||||
vb2_plane_size(struct vb2_buffer *vb, unsigned int plane_no)
|
||||
{
|
||||
if (plane_no < vb->num_planes)
|
||||
return vb->v4l2_planes[plane_no].length;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following functions are not part of the vb2 core API, but are simple
|
||||
* helper functions that you can use in your struct v4l2_file_operations,
|
||||
* struct v4l2_ioctl_ops and struct vb2_ops. They will serialize if vb2_queue->lock
|
||||
* or video_device->lock is set, and they will set and test vb2_queue->owner
|
||||
* to check if the calling filehandle is permitted to do the queuing operation.
|
||||
*/
|
||||
|
||||
/* struct v4l2_ioctl_ops helpers */
|
||||
|
||||
int vb2_ioctl_reqbufs(void *priv, struct v4l2_requestbuffers *p);
|
||||
int vb2_ioctl_create_bufs(void *priv, struct v4l2_create_buffers *p);
|
||||
int vb2_ioctl_prepare_buf(void *priv, struct v4l2_buffer *p);
|
||||
int vb2_ioctl_querybuf(void *priv, struct v4l2_buffer *p);
|
||||
int vb2_ioctl_qbuf(void *priv, struct v4l2_buffer *p);
|
||||
int vb2_ioctl_dqbuf(void *priv, struct v4l2_buffer *p);
|
||||
int vb2_ioctl_streamon(void *priv, enum v4l2_buf_type i);
|
||||
int vb2_ioctl_streamoff(void *priv, enum v4l2_buf_type i);
|
||||
int vb2_ioctl_expbuf(void *priv, struct v4l2_exportbuffer *p);
|
||||
|
||||
/* struct v4l2_file_operations helpers */
|
||||
|
||||
int vb2_fop_mmap();
|
||||
int vb2_fop_release();
|
||||
#if 0
|
||||
ssize_t vb2_fop_write(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos);
|
||||
ssize_t vb2_fop_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos);
|
||||
unsigned int vb2_fop_poll(struct file *file, poll_table *wait);
|
||||
#endif
|
||||
#ifndef CONFIG_MMU
|
||||
unsigned long vb2_fop_get_unmapped_area(unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff, unsigned long flags);
|
||||
#endif
|
||||
|
||||
/* struct vb2_ops helpers, only use if vq->lock is non-NULL. */
|
||||
|
||||
void vb2_ops_wait_prepare(struct vb2_queue *vq);
|
||||
void vb2_ops_wait_finish(struct vb2_queue *vq);
|
||||
|
||||
#endif /* _MEDIA_VIDEOBUF2_CORE_H */
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* videobuf2-memops.h - generic memory handling routines for videobuf2
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics
|
||||
*
|
||||
* Author: Pawel Osciak <pawel@osciak.com>
|
||||
* Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _MEDIA_VIDEOBUF2_MEMOPS_H
|
||||
#define _MEDIA_VIDEOBUF2_MEMOPS_H
|
||||
|
||||
#include "videobuf2-core.h"
|
||||
|
||||
|
||||
/**
|
||||
* vb2_vmarea_handler - common vma refcount tracking handler
|
||||
* @refcount: pointer to refcount entry in the buffer
|
||||
* @put: callback to function that decreases buffer refcount
|
||||
* @arg: argument for @put callback
|
||||
*/
|
||||
struct vb2_vmarea_handler {
|
||||
atomic_t *refcount;
|
||||
void (*put)(void *arg);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
extern const struct vm_operations_struct vb2_common_vm_ops;
|
||||
|
||||
int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size,
|
||||
struct vm_area_struct **res_vma, dma_addr_t *res_pa);
|
||||
|
||||
struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma);
|
||||
void vb2_put_vma(struct vm_area_struct *vma);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* videobuf2-vmalloc.h - vmalloc memory allocator for videobuf2
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics
|
||||
*
|
||||
* Author: Pawel Osciak <pawel@osciak.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _MEDIA_VIDEOBUF2_VMALLOC_H
|
||||
#define _MEDIA_VIDEOBUF2_VMALLOC_H
|
||||
|
||||
#include "videobuf2-core.h"
|
||||
|
||||
|
||||
extern const struct vb2_mem_ops vb2_vmalloc_memops;
|
||||
|
||||
#endif
|
62
RTL00_SDKV35a/component/common/video/v4l2/inc/videodev2.h
Normal file
62
RTL00_SDKV35a/component/common/video/v4l2/inc/videodev2.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Video for Linux Two header file
|
||||
*
|
||||
* Copyright (C) 1999-2012 the contributors
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Alternatively you can redistribute this file under the terms of the
|
||||
* BSD license as stated below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. The names of its contributors may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Header file for v4l or V4L2 drivers and applications
|
||||
* with public API.
|
||||
* All kernel-specific stuff were moved to media/v4l2-dev.h, so
|
||||
* no #if __KERNEL tests are allowed here
|
||||
*
|
||||
* See http://linuxtv.org for more info
|
||||
*
|
||||
* Author: Bill Dirks <bill@thedirks.org>
|
||||
* Justin Schoeman
|
||||
* Hans Verkuil <hverkuil@xs4all.nl>
|
||||
* et al.
|
||||
*/
|
||||
#ifndef __LINUX_VIDEODEV2_H
|
||||
#define __LINUX_VIDEODEV2_H
|
||||
|
||||
//#include <linux/time.h> /* need struct timeval */
|
||||
#include "uapi_videodev2.h"
|
||||
|
||||
#endif /* __LINUX_VIDEODEV2_H */
|
Loading…
Add table
Add a link
Reference in a new issue