2013-07-29 15:40:55 +04:00
/*
* 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>
2015-10-01 15:35:01 +03:00
/*
2015-08-22 14:36:13 +03:00
* v4l2_dv_timings_presets : list of all dv_timings presets .
2013-08-19 17:19:54 +04:00
*/
extern const struct v4l2_dv_timings v4l2_dv_timings_presets [ ] ;
2016-08-31 02:11:11 +03:00
/**
* typedef v4l2_check_dv_timings_fnc - timings check callback
2015-08-22 14:36:13 +03:00
*
2013-08-19 18:21:50 +04:00
* @ 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 ) ;
2015-08-22 14:36:13 +03:00
/**
* 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 .
*/
2013-08-19 17:23:33 +04:00
bool v4l2_valid_dv_timings ( const struct v4l2_dv_timings * t ,
2013-08-19 18:21:50 +04:00
const struct v4l2_dv_timings_cap * cap ,
v4l2_check_dv_timings_fnc fnc ,
void * fnc_handle ) ;
2013-07-29 15:40:55 +04:00
2015-08-22 14:36:13 +03:00
/**
* 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 .
*/
2013-07-29 15:40:55 +04:00
int v4l2_enum_dv_timings_cap ( struct v4l2_enum_dv_timings * t ,
2013-08-19 18:21:50 +04:00
const struct v4l2_dv_timings_cap * cap ,
v4l2_check_dv_timings_fnc fnc ,
void * fnc_handle ) ;
2013-07-29 15:40:55 +04:00
2015-08-22 14:36:13 +03:00
/**
* 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 .
*/
2013-07-29 15:40:55 +04:00
bool v4l2_find_dv_timings_cap ( struct v4l2_dv_timings * t ,
const struct v4l2_dv_timings_cap * cap ,
2013-08-19 18:21:50 +04:00
unsigned pclock_delta ,
v4l2_check_dv_timings_fnc fnc ,
void * fnc_handle ) ;
2013-07-29 15:40:55 +04:00
2016-07-14 13:59:12 +03:00
/**
* v4l2_find_dv_timings_cea861_vic ( ) - find timings based on CEA - 861 VIC
* @ t : the timings data .
* @ vic : CEA - 861 VIC code
*
* On success it will fill in @ t with the found timings and it returns true .
* On failure it will return false .
*/
bool v4l2_find_dv_timings_cea861_vic ( struct v4l2_dv_timings * t , u8 vic ) ;
2015-08-22 14:36:13 +03:00
/**
* 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
2016-07-14 13:59:12 +03:00
* the measured timings .
2015-11-13 14:46:26 +03:00
* @ match_reduced_fps : if true , then fail if V4L2_DV_FL_REDUCED_FPS does not
* match .
2015-08-22 14:36:13 +03:00
*
* Returns true if the two timings match , returns false otherwise .
*/
2013-08-15 15:28:47 +04:00
bool v4l2_match_dv_timings ( const struct v4l2_dv_timings * measured ,
const struct v4l2_dv_timings * standard ,
2015-11-13 14:46:26 +03:00
unsigned pclock_delta , bool match_reduced_fps ) ;
2013-07-29 15:40:56 +04:00
2015-08-22 14:36:13 +03:00
/**
* 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 .
*/
2013-08-15 15:02:40 +04:00
void v4l2_print_dv_timings ( const char * dev_prefix , const char * prefix ,
const struct v4l2_dv_timings * t , bool detailed ) ;
2015-08-22 14:36:13 +03:00
/**
* v4l2_detect_cvt - detect if the given timings follow the CVT standard
*
2015-09-15 15:36:01 +03:00
* @ 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
2015-06-10 19:51:42 +03:00
* information is needed only in case of version 2 of reduced blanking .
* In other cases , this parameter does not have any effect on timings .
2015-09-15 15:36:01 +03:00
* @ polarities : the horizontal and vertical polarities ( same as struct
2013-07-29 15:40:56 +04:00
* v4l2_bt_timings polarities ) .
2015-09-15 15:36:01 +03:00
* @ interlaced : if this flag is true , it indicates interlaced format
* @ fmt : the resulting timings .
2013-07-29 15:40:56 +04:00
*
* 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 ,
2015-06-10 19:51:42 +03:00
unsigned active_width , u32 polarities , bool interlaced ,
struct v4l2_dv_timings * fmt ) ;
2013-07-29 15:40:56 +04:00
2015-08-22 14:36:13 +03:00
/**
* v4l2_detect_gtf - detect if the given timings follow the GTF standard
*
2015-09-15 15:36:01 +03:00
* @ 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
2013-07-29 15:40:56 +04:00
* v4l2_bt_timings polarities ) .
2015-09-15 15:36:01 +03:00
* @ interlaced : if this flag is true , it indicates interlaced format
* @ aspect : preferred aspect ratio . GTF has no method of determining the
2013-07-29 15:40:56 +04:00
* 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 .
2015-09-15 15:36:01 +03:00
* @ fmt : the resulting timings .
2013-07-29 15:40:56 +04:00
*
* 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 ,
2015-05-22 08:27:34 +03:00
u32 polarities , bool interlaced , struct v4l2_fract aspect ,
2013-07-29 15:40:56 +04:00
struct v4l2_dv_timings * fmt ) ;
2015-08-22 14:36:13 +03:00
/**
* v4l2_calc_aspect_ratio - calculate the aspect ratio based on bytes
2013-07-29 15:40:56 +04:00
* 0x15 and 0x16 from the EDID .
2015-08-22 14:36:13 +03:00
*
2015-09-15 15:36:01 +03:00
* @ hor_landscape : byte 0x15 from the EDID .
* @ vert_portrait : byte 0x16 from the EDID .
2013-07-29 15:40:56 +04:00
*
* 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 ) ;
2016-07-14 13:59:12 +03:00
/**
* v4l2_dv_timings_aspect_ratio - calculate the aspect ratio based on the
* v4l2_dv_timings information .
*
* @ t : the timings data .
*/
struct v4l2_fract v4l2_dv_timings_aspect_ratio ( const struct v4l2_dv_timings * t ) ;
2015-09-22 17:27:28 +03:00
/*
* 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 ;
}
2013-07-29 15:40:55 +04:00
# endif