1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
/*
* V4L2 subdev interface library
*
* Copyright (C) 2010-2011 Ideas on board SPRL
*
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __SUBDEV_H__
#define __SUBDEV_H__
#include <linux/v4l2-subdev.h>
struct media_entity;
/**
* @brief Open a sub-device.
* @param entity - sub-device media entity.
*
* Open the V4L2 subdev device node associated with @a entity. The file
* descriptor is stored in the media_entity structure.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_open(struct media_entity *entity);
/**
* @brief Close a sub-device.
* @param entity - sub-device media entity.
*
* Close the V4L2 subdev device node associated with the @a entity and opened by
* a previous call to v4l2_subdev_open() (either explicit or implicit).
*/
void v4l2_subdev_close(struct media_entity *entity);
/**
* @brief Retrieve the format on a pad.
* @param entity - subdev-device media entity.
* @param format - format to be filled.
* @param pad - pad number.
* @param which - identifier of the format to get.
*
* Retrieve the current format on the @a entity @a pad and store it in the
* @a format structure.
*
* @a which is set to V4L2_SUBDEV_FORMAT_TRY to retrieve the try format stored
* in the file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to retrieve the current
* active format.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_get_format(struct media_entity *entity,
struct v4l2_mbus_framefmt *format, unsigned int pad,
enum v4l2_subdev_format_whence which);
/**
* @brief Set the format on a pad.
* @param entity - subdev-device media entity.
* @param format - format.
* @param pad - pad number.
* @param which - identifier of the format to set.
*
* Set the format on the @a entity @a pad to @a format. The driver is allowed to
* modify the requested format, in which case @a format is updated with the
* modifications.
*
* @a which is set to V4L2_SUBDEV_FORMAT_TRY to set the try format stored in the
* file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to configure the device with an
* active format.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_set_format(struct media_entity *entity,
struct v4l2_mbus_framefmt *format, unsigned int pad,
enum v4l2_subdev_format_whence which);
/**
* @brief Retrieve a selection rectangle on a pad.
* @param entity - subdev-device media entity.
* @param r - rectangle to be filled.
* @param pad - pad number.
* @param target - selection target
* @param which - identifier of the format to get.
*
* Retrieve the @a target selection rectangle on the @a entity @a pad
* and store it in the @a rect structure.
*
* @a which is set to V4L2_SUBDEV_FORMAT_TRY to retrieve the try
* selection rectangle stored in the file handle, or
* V4L2_SUBDEV_FORMAT_ACTIVE to retrieve the current active selection
* rectangle.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_get_selection(struct media_entity *entity,
struct v4l2_rect *rect, unsigned int pad, unsigned int target,
enum v4l2_subdev_format_whence which);
/**
* @brief Set a selection rectangle on a pad.
* @param entity - subdev-device media entity.
* @param rect - crop rectangle.
* @param pad - pad number.
* @param target - selection target
* @param which - identifier of the format to set.
*
* Set the @a target selection rectangle on the @a entity @a pad to @a
* rect. The driver is allowed to modify the requested rectangle, in
* which case @a rect is updated with the modifications.
*
* @a which is set to V4L2_SUBDEV_FORMAT_TRY to set the try crop rectangle
* stored in the file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to configure the
* device with an active crop rectangle.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_set_selection(struct media_entity *entity,
struct v4l2_rect *rect, unsigned int pad, unsigned int target,
enum v4l2_subdev_format_whence which);
/**
* @brief Retrieve the frame interval on a sub-device.
* @param entity - subdev-device media entity.
* @param interval - frame interval to be filled.
*
* Retrieve the current frame interval on subdev @a entity and store it in the
* @a interval structure.
*
* Frame interval retrieving is usually supported only on devices at the
* beginning of video pipelines, such as sensors.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_get_frame_interval(struct media_entity *entity,
struct v4l2_fract *interval);
/**
* @brief Set the frame interval on a sub-device.
* @param entity - subdev-device media entity.
* @param interval - frame interval.
*
* Set the frame interval on subdev @a entity to @a interval. The driver is
* allowed to modify the requested frame interval, in which case @a interval is
* updated with the modifications.
*
* Frame interval setting is usually supported only on devices at the beginning
* of video pipelines, such as sensors.
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_set_frame_interval(struct media_entity *entity,
struct v4l2_fract *interval);
/**
* @brief Parse a string and apply format, crop and frame interval settings.
* @param media - media device.
* @param p - input string
* @param endp - pointer to string p where parsing ended (return)
*
* Parse string @a p and apply format, crop and frame interval settings to a
* subdev pad specified in @a p. @a endp will be written a pointer where
* parsing of @a p ended.
*
* Format strings are separeted by commas (,).
*
* @return 0 on success, or a negative error code on failure.
*/
int v4l2_subdev_parse_setup_formats(struct media_device *media, const char *p);
/**
* @brief Convert media bus pixel code to string.
* @param code - input string
*
* Convert media bus pixel code @a code to a human-readable string.
*
* @return A pointer to a string on success, NULL on failure.
*/
const char *v4l2_subdev_pixelcode_to_string(enum v4l2_mbus_pixelcode code);
/**
* @brief Parse string to media bus pixel code.
* @param string - input string
* @param lenght - length of the string
*
* Parse human readable string @a string to an media bus pixel code.
*
* @return media bus pixelcode on success, -1 on failure.
*/
enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string,
unsigned int length);
#endif
|