Blame view

include/media/v4l2-dv-timings.h 7.76 KB
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * v4l2-dv-timings - Internal header with dv-timings helper functions
   *
   * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
   *
   * This program is free software; you may redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; version 2 of the License.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   *
   */
  
  #ifndef __V4L2_DV_TIMINGS_H
  #define __V4L2_DV_TIMINGS_H
  
  #include <linux/videodev2.h>
fb91aecb9   Mauro Carvalho Chehab   [media] DocBook: ...
25
  /*
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
26
   * v4l2_dv_timings_presets: list of all dv_timings presets.
d1c65ad6a   Hans Verkuil   [media] v4l2-dv-t...
27
28
   */
  extern const struct v4l2_dv_timings v4l2_dv_timings_presets[];
f06606e56   Mauro Carvalho Chehab   [media] v4l2-dv-t...
29
30
  /**
   * typedef v4l2_check_dv_timings_fnc - timings check callback
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
31
   *
b8f0fff42   Hans Verkuil   [media] v4l2-dv-t...
32
33
34
35
36
37
   * @t: the v4l2_dv_timings struct.
   * @handle: a handle from the driver.
   *
   * Returns true if the given timings are valid.
   */
  typedef bool v4l2_check_dv_timings_fnc(const struct v4l2_dv_timings *t, void *handle);
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
38
39
40
41
42
43
44
45
46
47
48
49
  /**
   * v4l2_valid_dv_timings() - are these timings valid?
   *
   * @t:	  the v4l2_dv_timings struct.
   * @cap: the v4l2_dv_timings_cap capabilities.
   * @fnc: callback to check if this timing is OK. May be NULL.
   * @fnc_handle: a handle that is passed on to @fnc.
   *
   * Returns true if the given dv_timings struct is supported by the
   * hardware capabilities and the callback function (if non-NULL), returns
   * false otherwise.
   */
70b654945   Hans Verkuil   [media] v4l2-dv-t...
50
  bool v4l2_valid_dv_timings(const struct v4l2_dv_timings *t,
b8f0fff42   Hans Verkuil   [media] v4l2-dv-t...
51
52
53
  			   const struct v4l2_dv_timings_cap *cap,
  			   v4l2_check_dv_timings_fnc fnc,
  			   void *fnc_handle);
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
54

506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  /**
   * v4l2_enum_dv_timings_cap() - Helper function to enumerate possible DV
   *	 timings based on capabilities
   *
   * @t:	  the v4l2_enum_dv_timings struct.
   * @cap: the v4l2_dv_timings_cap capabilities.
   * @fnc: callback to check if this timing is OK. May be NULL.
   * @fnc_handle: a handle that is passed on to @fnc.
   *
   * This enumerates dv_timings using the full list of possible CEA-861 and DMT
   * timings, filtering out any timings that are not supported based on the
   * hardware capabilities and the callback function (if non-NULL).
   *
   * If a valid timing for the given index is found, it will fill in @t and
   * return 0, otherwise it returns -EINVAL.
   */
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
71
  int v4l2_enum_dv_timings_cap(struct v4l2_enum_dv_timings *t,
b8f0fff42   Hans Verkuil   [media] v4l2-dv-t...
72
73
74
  			     const struct v4l2_dv_timings_cap *cap,
  			     v4l2_check_dv_timings_fnc fnc,
  			     void *fnc_handle);
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
75

506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  /**
   * v4l2_find_dv_timings_cap() - Find the closest timings struct
   *
   * @t:	  the v4l2_enum_dv_timings struct.
   * @cap: the v4l2_dv_timings_cap capabilities.
   * @pclock_delta: maximum delta between t->pixelclock and the timing struct
   *		under consideration.
   * @fnc: callback to check if a given timings struct is OK. May be NULL.
   * @fnc_handle: a handle that is passed on to @fnc.
   *
   * This function tries to map the given timings to an entry in the
   * full list of possible CEA-861 and DMT timings, filtering out any timings
   * that are not supported based on the hardware capabilities and the callback
   * function (if non-NULL).
   *
   * On success it will fill in @t with the found timings and it returns true.
   * On failure it will return false.
   */
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
94
95
  bool v4l2_find_dv_timings_cap(struct v4l2_dv_timings *t,
  			      const struct v4l2_dv_timings_cap *cap,
b8f0fff42   Hans Verkuil   [media] v4l2-dv-t...
96
97
98
  			      unsigned pclock_delta,
  			      v4l2_check_dv_timings_fnc fnc,
  			      void *fnc_handle);
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
99

506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
100
101
102
103
104
105
106
  /**
   * v4l2_match_dv_timings() - do two timings match?
   *
   * @measured:	  the measured timings data.
   * @standard:	  the timings according to the standard.
   * @pclock_delta: maximum delta in Hz between standard->pixelclock and
   * 		the measured timings.
85f9e06c5   Hans Verkuil   [media] v4l2-dv-t...
107
108
   * @match_reduced_fps: if true, then fail if V4L2_DV_FL_REDUCED_FPS does not
   * match.
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
109
110
111
   *
   * Returns true if the two timings match, returns false otherwise.
   */
ef1ed8f5d   Hans Verkuil   [media] v4l2-dv-t...
112
113
  bool v4l2_match_dv_timings(const struct v4l2_dv_timings *measured,
  			   const struct v4l2_dv_timings *standard,
85f9e06c5   Hans Verkuil   [media] v4l2-dv-t...
114
  			   unsigned pclock_delta, bool match_reduced_fps);
257641584   Hans Verkuil   [media] v4l2: mov...
115

506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
116
117
118
119
120
121
122
  /**
   * v4l2_print_dv_timings() - log the contents of a dv_timings struct
   * @dev_prefix:device prefix for each log line.
   * @prefix:	additional prefix for each log line, may be NULL.
   * @t:		the timings data.
   * @detailed:	if true, give a detailed log.
   */
0216dc2fe   Hans Verkuil   [media] v4l2-dv-t...
123
124
  void v4l2_print_dv_timings(const char *dev_prefix, const char *prefix,
  			   const struct v4l2_dv_timings *t, bool detailed);
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
125
126
127
  /**
   * v4l2_detect_cvt - detect if the given timings follow the CVT standard
   *
fd4b0d751   Geliang Tang   [media] media: fi...
128
129
130
131
   * @frame_height: the total height of the frame (including blanking) in lines.
   * @hfreq: the horizontal frequency in Hz.
   * @vsync: the height of the vertical sync in lines.
   * @active_width: active width of image (does not include blanking). This
5fea1bb70   Prashant Laddha   [media] v4l2-dv-t...
132
133
   * information is needed only in case of version 2 of reduced blanking.
   * In other cases, this parameter does not have any effect on timings.
fd4b0d751   Geliang Tang   [media] media: fi...
134
   * @polarities: the horizontal and vertical polarities (same as struct
257641584   Hans Verkuil   [media] v4l2: mov...
135
   *		v4l2_bt_timings polarities).
fd4b0d751   Geliang Tang   [media] media: fi...
136
137
   * @interlaced: if this flag is true, it indicates interlaced format
   * @fmt: the resulting timings.
257641584   Hans Verkuil   [media] v4l2: mov...
138
139
140
141
142
143
   *
   * This function will attempt to detect if the given values correspond to a
   * valid CVT format. If so, then it will return true, and fmt will be filled
   * in with the found CVT timings.
   */
  bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync,
5fea1bb70   Prashant Laddha   [media] v4l2-dv-t...
144
145
  		unsigned active_width, u32 polarities, bool interlaced,
  		struct v4l2_dv_timings *fmt);
257641584   Hans Verkuil   [media] v4l2: mov...
146

506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
147
148
149
  /**
   * v4l2_detect_gtf - detect if the given timings follow the GTF standard
   *
fd4b0d751   Geliang Tang   [media] media: fi...
150
151
152
153
   * @frame_height: the total height of the frame (including blanking) in lines.
   * @hfreq: the horizontal frequency in Hz.
   * @vsync: the height of the vertical sync in lines.
   * @polarities: the horizontal and vertical polarities (same as struct
257641584   Hans Verkuil   [media] v4l2: mov...
154
   *		v4l2_bt_timings polarities).
fd4b0d751   Geliang Tang   [media] media: fi...
155
156
   * @interlaced: if this flag is true, it indicates interlaced format
   * @aspect: preferred aspect ratio. GTF has no method of determining the
257641584   Hans Verkuil   [media] v4l2: mov...
157
158
159
160
   *		aspect ratio in order to derive the image width from the
   *		image height, so it has to be passed explicitly. Usually
   *		the native screen aspect ratio is used for this. If it
   *		is not filled in correctly, then 16:9 will be assumed.
fd4b0d751   Geliang Tang   [media] media: fi...
161
   * @fmt: the resulting timings.
257641584   Hans Verkuil   [media] v4l2: mov...
162
163
164
165
166
167
   *
   * This function will attempt to detect if the given values correspond to a
   * valid GTF format. If so, then it will return true, and fmt will be filled
   * in with the found GTF timings.
   */
  bool v4l2_detect_gtf(unsigned frame_height, unsigned hfreq, unsigned vsync,
061ddda68   Prashant Laddha   [media] v4l2-dv-t...
168
  		u32 polarities, bool interlaced, struct v4l2_fract aspect,
257641584   Hans Verkuil   [media] v4l2: mov...
169
  		struct v4l2_dv_timings *fmt);
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
170
171
  /**
   * v4l2_calc_aspect_ratio - calculate the aspect ratio based on bytes
257641584   Hans Verkuil   [media] v4l2: mov...
172
   *	0x15 and 0x16 from the EDID.
506bb54bd   Mauro Carvalho Chehab   [media] v4l-dv-ti...
173
   *
fd4b0d751   Geliang Tang   [media] media: fi...
174
175
   * @hor_landscape: byte 0x15 from the EDID.
   * @vert_portrait: byte 0x16 from the EDID.
257641584   Hans Verkuil   [media] v4l2: mov...
176
177
178
179
180
181
   *
   * Determines the aspect ratio from the EDID.
   * See VESA Enhanced EDID standard, release A, rev 2, section 3.6.2:
   * "Horizontal and Vertical Screen Size or Aspect Ratio"
   */
  struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait);
8d7322f4f   Prashant Laddha   [media] v4l2-dv-t...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
  /*
   * reduce_fps - check if conditions for reduced fps are true.
   * bt - v4l2 timing structure
   * For different timings reduced fps is allowed if following conditions
   * are met -
   * For CVT timings: if reduced blanking v2 (vsync == 8) is true.
   * For CEA861 timings: if V4L2_DV_FL_CAN_REDUCE_FPS flag is true.
   */
  static inline  bool can_reduce_fps(struct v4l2_bt_timings *bt)
  {
  	if ((bt->standards & V4L2_DV_BT_STD_CVT) && (bt->vsync == 8))
  		return true;
  
  	if ((bt->standards & V4L2_DV_BT_STD_CEA861) &&
  	    (bt->flags & V4L2_DV_FL_CAN_REDUCE_FPS))
  		return true;
  
  	return false;
  }
b18787ed1   Hans Verkuil   [media] v4l2-dv-t...
201
  #endif