1 /* am7xxx - communication with AM7XXX based USB Pico Projectors and DPFs
3 * Copyright (C) 2012 Antonio Ospite <ospite@studenti.unina.it>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * Public libam7xxx API.
33 * @typedef am7xxx_context
35 * An opaque data type representing a context.
37 struct _am7xxx_context;
38 typedef struct _am7xxx_context am7xxx_context;
41 * @typedef am7xxx_device
43 * An opaque data type representing an am7xxx device.
45 struct _am7xxx_device;
46 typedef struct _am7xxx_device am7xxx_device;
49 * A struct describing device specific properties.
51 * A user program may want to inspect these before providing data to the
52 * device. For instance, when sending an image the user may want to rescale it
53 * to the device native width and height in order to be sure the image will be
54 * displayed in its entirety.
57 unsigned int native_width; /**< The device native width. */
58 unsigned int native_height; /**< The device native height. */
62 * The verbosity level of logging messages.
64 * This can be set with am7xxx_set_log_level() and the level will be used
65 * internally by libam7xxx to adjust the granularity of the information
66 * exposed to the user about the internal library operations.
69 AM7XXX_LOG_FATAL = 0, /**< Fatal messages, the user application should stop if it gets one of this. */
70 AM7XXX_LOG_ERROR = 1, /**< Error messages, typically they describe API functions failures. */
71 AM7XXX_LOG_WARNING = 2, /**< Warnings about conditions worth mentioning to the user. */
72 AM7XXX_LOG_INFO = 3, /**< Informations about the device operations. */
73 AM7XXX_LOG_DEBUG = 4, /**< Informations about the library internals. */
74 AM7XXX_LOG_TRACE = 5, /**< Verbose informations about the communication with the hardware. */
78 * The image formats accepted by the device.
81 AM7XXX_IMAGE_FORMAT_JPEG = 1, /**< JPEG format. */
82 AM7XXX_IMAGE_FORMAT_NV12 = 2, /**< Raw YUV in the NV12 variant. */
83 } am7xxx_image_format;
86 * The device power modes.
88 * An am7xxx device can operate in several power modes. A certain power mode
89 * may have effect on the display brightness or on the device power
92 * @note Most am7xxx devices come with a Y-shaped USB cable with a Master and
93 * a Slave connector, higher power modes may require that both connectors are
94 * plugged in to the host system for the device to work properly.
96 * @note At higher power modes some devices may use a fan to cool down the
97 * internal hardware components, and hence may be noisier in this case.
100 AM7XXX_POWER_OFF = 0, /**< Display is powered off, no image shown. */
101 AM7XXX_POWER_LOW = 1, /**< Low power consumption but also low brightness. */
102 AM7XXX_POWER_MIDDLE = 2, /**< Middle level of brightness. This and upper modes need both the Master and Slave USB connectors plugged. */
103 AM7XXX_POWER_HIGH = 3, /**< More brightness, but more power consumption. */
104 AM7XXX_POWER_TURBO = 4, /**< Max brightness and power consumption. */
108 * The display zoom modes.
110 * An am7xxx device can display images using several zoom modes.
112 * @note Changing the zoom mode can change the aspect ratio of the displayed
115 * @note On the zoom test screen the version of the firmware running on the
116 * device is shown as well (e.g SPI_V21.0.0_2011.03.18).
119 AM7XXX_ZOOM_ORIGINAL = 0, /**< Original Size, as retrieved via #am7xxx_device_info. */
120 AM7XXX_ZOOM_H = 1, /**< Zoom 1: H Scale (changes aspect ratio). */
121 AM7XXX_ZOOM_H_V = 2, /**< Zoom 2: H/V Scale (changes aspect ratio). */
122 AM7XXX_ZOOM_TEST = 3, /**< Zoom test screen, the firmware version is shown as well. */
126 * Initialize the library context and data structures, and scan for devices.
128 * @param[out] ctx A pointer to the context the library will be used in.
130 * @return 0 on success, a negative value on error
132 int am7xxx_init(am7xxx_context **ctx);
135 * Cleanup the library data structures and free the context.
137 * @param[in,out] ctx The context to free.
139 void am7xxx_shutdown(am7xxx_context *ctx);
142 * Set verbosity level of log messages.
144 * @note The level is per-context.
146 * @note Messages of level AM7XXX_LOG_FATAL are always shown, regardless
147 * of the value of the log_level parameter.
149 * @param[in] ctx The context to set the log level for
150 * @param[in] log_level The verbosity level to use in the context (see @link am7xxx_log_level @endlink)
152 void am7xxx_set_log_level(am7xxx_context *ctx, am7xxx_log_level log_level);
155 * Open an am7xxx_device according to a index.
157 * The semantics of the 'device_index' argument follows the order
158 * of the devices as found when scanning the bus at am7xxx_init() time.
160 * @note When the user tries to open a device already opened the function
161 * returns -EBUSY and the device is left open.
163 * @param[in] ctx The context to open the device in
164 * @param[out] dev A pointer to the structure representing the device to open
165 * @param[in] device_index The index of the device on the bus
167 * @return 0 on success, a negative value on error
169 int am7xxx_open_device(am7xxx_context *ctx,
171 unsigned int device_index);
174 * Close an am7xxx_device.
176 * Close an am7xxx_device so that it becomes available for some other
177 * user/process to open it.
179 * @param[in] dev A pointer to the structure representing the device to close
181 * @return 0 on success, a negative value on error
183 int am7xxx_close_device(am7xxx_device *dev);
186 * Get info about an am7xxx device.
188 * Get information about a device, in the form of a
189 * @link am7xxx_device_info @endlink structure.
191 * @param[in] dev A pointer to the structure representing the device to get info of
192 * @param[out] device_info A pointer to the structure where to store the device info (see @link am7xxx_device_info @endlink)
194 * @return 0 on success, a negative value on error
196 int am7xxx_get_device_info(am7xxx_device *dev,
197 am7xxx_device_info *device_info);
200 * Calculate the dimensions of an image to be shown on an am7xxx device.
202 * Before sending images bigger than the device native dimensions the user
203 * needs to rescale them, this utility function does the calculation in a way
204 * that the original image aspect ratio is preserved.
206 * @param[in] dev A pointer to the structure representing the device to get info of
207 * @param[in] upscale Whether to calculate scaled dimensions for images smaller than the native dimensions
208 * @param[in] original_width The width of the original image
209 * @param[in] original_height The height of the original image
210 * @param[out] scaled_width The width the rescaled image should have
211 * @param[out] scaled_height The height the rescaled image should have
213 * @return 0 on success, a negative value on error
215 int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
216 unsigned int upscale,
217 unsigned int original_width,
218 unsigned int original_height,
219 unsigned int *scaled_width,
220 unsigned int *scaled_height);
222 * Send an image for display on an am7xxx device.
224 * This is the function that actually makes the device display something.
225 * Static pictures can be sent just once and the device will keep showing them
226 * until another image get sent or some command resets or turns off the display.
228 * @param[in] dev A pointer to the structure representing the device to get info of
229 * @param[in] format The format the image is in (see @link am7xxx_image_format @endlink enum)
230 * @param[in] width The width of the image
231 * @param[in] height The height of the image
232 * @param[in] image A buffer holding data in the format specified by the format parameter
233 * @param[in] image_size The size in bytes of the image buffer
235 * @return 0 on success, a negative value on error
237 int am7xxx_send_image(am7xxx_device *dev,
238 am7xxx_image_format format,
241 unsigned char *image,
242 unsigned int image_size);
245 * Queue transfer of an image for display on an am7xxx device and return immediately.
247 * This is the function that actually makes the device display something.
248 * Static pictures can be sent just once and the device will keep showing them
249 * until another image get sent or some command resets or turns off the display.
251 * @note This _async() variant makes a copy of the image buffer, so the caller
252 * is free to reuse the buffer just after the function returns.
254 * @param[in] dev A pointer to the structure representing the device to get info of
255 * @param[in] format The format the image is in (see @link am7xxx_image_format @endlink enum)
256 * @param[in] width The width of the image
257 * @param[in] height The height of the image
258 * @param[in] image A buffer holding data in the format specified by the format parameter
259 * @param[in] image_size The size in bytes of the image buffer
261 * @return 0 on success, a negative value on error
263 int am7xxx_send_image_async(am7xxx_device *dev,
264 am7xxx_image_format format,
267 unsigned char *image,
268 unsigned int image_size);
271 * Set the power mode of an am7xxx device.
273 * @note When setting the mode to AM7XXX_POWER_OFF the display can't be turned
274 * on again by using only am7xxx_set_power_mode(), am7xxx_set_zoom_mode() has
275 * to be called first, the current guess is that the latter performs some
276 * other resets beside setting the zoom mode.
278 * @param[in] dev A pointer to the structure representing the device to set power mode to
279 * @param[in] power The power mode to put the device in (see #am7xxx_power_mode enum)
281 * @return 0 on success, a negative value on error
284 int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power);
287 * Set the zoom mode of an am7xxx device.
289 * @note When setting the mode to AM7XXX_ZOOM_TEST, the calling program might
290 * want to skip displaying actual images.
292 * @note It looks like that power mode and zoom mode are related somehow wrt.
293 * resetting the operational mode after AM7XXX_POWER_OFF, applications can
294 * restore the display properly using this combination:
295 * - Off: power mode 0, zoom mode 3
296 * - On: power mode != 0, zoom mode != 3
298 * @param[in] dev A pointer to the structure representing the device to set zoom mode to
299 * @param[in] zoom The zoom mode to put the device in (see #am7xxx_zoom_mode enum)
301 * @return 0 on success, a negative value on error
304 int am7xxx_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom);
310 #endif /* __AM7XXX_H */