summaryrefslogtreecommitdiff
path: root/src/dlo_mode.h
blob: 9932139d6bc5d1dc9b03eef99fbc2c1a6e67e0ca (plain)
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
/** @file dlo_mode.h
 *
 *  @brief Definitions for the screen mode-related functions.
 *
 *  These functions have been separated-out into a distinct compilation unit so that
 *  it would be possible to build a distribution of the DisplayLink library which
 *  inludes the object(s) associated with this unit as pre-built binaries (i.e.
 *  without the dlo_mode.c source file included).
 *
 *  DisplayLink Open Source Software (libdlo)
 *  Copyright (C) 2009, DisplayLink
 *  www.displaylink.com
 *
 *  This library is free software; you can redistribute it and/or modify it under
 *  the terms of the GNU Library General Public License as published by the Free
 *  Software Foundation; LGPL version 2, dated June 1991.
 *
 *  This library 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 Library General Public License for more
 *  details.
 *
 *  You should have received a copy of the GNU Library General Public License
 *  along with this library; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef DLO_MODE_H
#define DLO_MODE_H        /**< Avoid multiple inclusion. */

#include "dlo_structs.h"


/** Size of an EDID structure, as read from a device (bytes).
 */
#define EDID_STRUCT_SZ (128)


/** An undefined mode number. Used to indicate a failed look-up or an unknown mode.
 */
#define DLO_INVALID_MODE ((dlo_modenum_t)-1)


/** Initialise the screen mode handling functions.
 *
 *  @param  flags  Initialisation flags word (unused flags ignored).
 *
 *  @return  Return code, zero for no error.
 */
extern dlo_retcode_t dlo_mode_init(const dlo_init_t flags);


/** Finalisation call for the screen mode handling functions.
 *
 *  @param  flags  Finalisation flags word (unused flags ignored).
 *
 *  @return  Return code, zero for no error.
 */
extern dlo_retcode_t dlo_mode_final(const dlo_final_t flags);


/** Return a block of mode information for a given mode number.
 *
 *  @param  num  Mode number for best match to the supplied bitmap.
 *
 *  @return  Pointer to mode information block (in static workspace), or NULL if error.
 */
extern dlo_mode_t *dlo_mode_from_number(const dlo_modenum_t num);


/** Select a display mode given a set of parameters.
 *
 *  @param  dev      Pointer to @a dlo_device_t structure.
 *  @param  width    Width of desired display (pixels).
 *  @param  height   Hieght of desired display (pixels) - zero to select first available.
 *  @param  refresh  Desired refresh rate (Hz) - zero to select first available.
 *  @param  bpp      Colour depth (bits per pixel) - zero to select first available.
 *
 *  @return  Return code, zero for no error.
 *
 *  Will find the best match it can from the VESA timings, given the parameters specified.
 *  If no matching mode can be found, an error will be returned and the device's screen
 *  mode will not be changed.
 */
extern dlo_modenum_t dlo_mode_lookup(dlo_device_t * const dev, const uint16_t width, const uint16_t height, const uint8_t refresh, uint8_t bpp);


/** Perform a mode change into the specified mode number.
 *
 *  @param  dev   Pointer to @a dlo_device_t structure.
 *  @param  desc  Pointer to mode description structure.
 *  @param  mode  Mode number for best match to the mode descriptor (or @a DLO_INVALID_MODE if not known).
 *
 *  @return  Return code, zero for no error.
 *
 *  This call will change the screen mode into the specified mode number (if one was given)
 *  or look for one which matches the specified mode description. Chaging mode does not imply
 *  clearing the screen!
 *
 *  Note: this call will cause any buffered commands to be sent to the device.
 */
extern dlo_retcode_t dlo_mode_change(dlo_device_t * const dev, const dlo_mode_t * const desc, dlo_modenum_t mode);


/** Parse the EDID structure read from a display device and build a list of supported modes.
 *
 *  @param  dev   Pointer to @a dlo_device_t structure.
 *  @param  ptr   Pointer to EDID structure.
 *  @param  size  Size of EDID structure (bytes).
 *
 *  @return  Return code, zero for no error.
 *
 *  This call updates the @a dlo_device_t structure by constructing a list of supported
 *  modes. Any modes which were not supplied in the EDID structure will be refused for
 *  that device.
 */
extern dlo_retcode_t dlo_mode_parse_edid(dlo_device_t * const dev, const uint8_t * const ptr, const size_t size);


/** Reset the supported modes array for a device to include all of the default VESA mode timings.
 *
 *  @param  dev  Pointer to @a dlo_device_t structure.
 */
extern void use_default_modes(dlo_device_t * const dev);


#endif