Line data Source code
1 1 : /*
2 : * Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public API for display drivers and applications
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_DISPLAY_H_
13 : #define ZEPHYR_INCLUDE_DRIVERS_DISPLAY_H_
14 :
15 : /**
16 : * @brief Display Interface
17 : * @defgroup display_interface Display Interface
18 : * @since 1.14
19 : * @version 0.8.0
20 : * @ingroup io_interfaces
21 : * @{
22 : */
23 :
24 : #include <zephyr/device.h>
25 : #include <errno.h>
26 : #include <stddef.h>
27 : #include <zephyr/types.h>
28 : #include <zephyr/dt-bindings/display/panel.h>
29 :
30 : #ifdef __cplusplus
31 : extern "C" {
32 : #endif
33 :
34 : /**
35 : * @brief Display pixel formats
36 : *
37 : * Display pixel format enumeration.
38 : *
39 : * In case a pixel format consists out of multiple bytes the byte order is
40 : * big endian.
41 : */
42 1 : enum display_pixel_format {
43 : PIXEL_FORMAT_RGB_888 = BIT(0), /**< 24-bit RGB */
44 : PIXEL_FORMAT_MONO01 = BIT(1), /**< Monochrome (0=Black 1=White) */
45 : PIXEL_FORMAT_MONO10 = BIT(2), /**< Monochrome (1=Black 0=White) */
46 : PIXEL_FORMAT_ARGB_8888 = BIT(3), /**< 32-bit ARGB */
47 : PIXEL_FORMAT_RGB_565 = BIT(4), /**< 16-bit RGB */
48 : PIXEL_FORMAT_BGR_565 = BIT(5), /**< 16-bit BGR */
49 : };
50 :
51 : /**
52 : * @brief Bits required per pixel for display format
53 : *
54 : * This macro expands to the number of bits required for a given display
55 : * format. It can be used to allocate a framebuffer based on a given
56 : * display format type
57 : */
58 1 : #define DISPLAY_BITS_PER_PIXEL(fmt) \
59 : ((((fmt & PIXEL_FORMAT_RGB_888) >> 0) * 24U) + \
60 : (((fmt & PIXEL_FORMAT_MONO01) >> 1) * 1U) + \
61 : (((fmt & PIXEL_FORMAT_MONO10) >> 2) * 1U) + \
62 : (((fmt & PIXEL_FORMAT_ARGB_8888) >> 3) * 32U) + \
63 : (((fmt & PIXEL_FORMAT_RGB_565) >> 4) * 16U) + \
64 : (((fmt & PIXEL_FORMAT_BGR_565) >> 5) * 16U))
65 :
66 : /**
67 : * @brief Display screen information
68 : */
69 1 : enum display_screen_info {
70 : /**
71 : * If selected, one octet represents 8 pixels ordered vertically,
72 : * otherwise ordered horizontally.
73 : */
74 : SCREEN_INFO_MONO_VTILED = BIT(0),
75 : /**
76 : * If selected, the MSB represents the first pixel,
77 : * otherwise MSB represents the last pixel.
78 : */
79 : SCREEN_INFO_MONO_MSB_FIRST = BIT(1),
80 : /**
81 : * Electrophoretic Display.
82 : */
83 : SCREEN_INFO_EPD = BIT(2),
84 : /**
85 : * Screen has two alternating ram buffers
86 : */
87 : SCREEN_INFO_DOUBLE_BUFFER = BIT(3),
88 : /**
89 : * Screen has x alignment constrained to width.
90 : */
91 : SCREEN_INFO_X_ALIGNMENT_WIDTH = BIT(4),
92 : };
93 :
94 : /**
95 : * @brief Enumeration with possible display orientation
96 : */
97 1 : enum display_orientation {
98 : DISPLAY_ORIENTATION_NORMAL, /**< No rotation */
99 : DISPLAY_ORIENTATION_ROTATED_90, /**< Rotated 90 degrees clockwise */
100 : DISPLAY_ORIENTATION_ROTATED_180, /**< Rotated 180 degrees clockwise */
101 : DISPLAY_ORIENTATION_ROTATED_270, /**< Rotated 270 degrees clockwise */
102 : };
103 :
104 : /** @brief Structure holding display capabilities. */
105 1 : struct display_capabilities {
106 : /** Display resolution in the X direction */
107 1 : uint16_t x_resolution;
108 : /** Display resolution in the Y direction */
109 1 : uint16_t y_resolution;
110 : /** Bitwise or of pixel formats supported by the display */
111 1 : uint32_t supported_pixel_formats;
112 : /** Information about display panel */
113 1 : uint32_t screen_info;
114 : /** Currently active pixel format for the display */
115 1 : enum display_pixel_format current_pixel_format;
116 : /** Current display orientation */
117 1 : enum display_orientation current_orientation;
118 : };
119 :
120 : /** @brief Structure to describe display data buffer layout */
121 1 : struct display_buffer_descriptor {
122 : /** Data buffer size in bytes */
123 1 : uint32_t buf_size;
124 : /** Data buffer row width in pixels */
125 1 : uint16_t width;
126 : /** Data buffer column height in pixels */
127 1 : uint16_t height;
128 : /** Number of pixels between consecutive rows in the data buffer */
129 1 : uint16_t pitch;
130 : /** Indicates that this is not the last write buffer of the frame */
131 1 : bool frame_incomplete;
132 : };
133 :
134 : /**
135 : * @typedef display_blanking_on_api
136 : * @brief Callback API to turn on display blanking
137 : * See display_blanking_on() for argument description
138 : */
139 1 : typedef int (*display_blanking_on_api)(const struct device *dev);
140 :
141 : /**
142 : * @typedef display_blanking_off_api
143 : * @brief Callback API to turn off display blanking
144 : * See display_blanking_off() for argument description
145 : */
146 1 : typedef int (*display_blanking_off_api)(const struct device *dev);
147 :
148 : /**
149 : * @typedef display_write_api
150 : * @brief Callback API for writing data to the display
151 : * See display_write() for argument description
152 : */
153 1 : typedef int (*display_write_api)(const struct device *dev, const uint16_t x,
154 : const uint16_t y,
155 : const struct display_buffer_descriptor *desc,
156 : const void *buf);
157 :
158 : /**
159 : * @typedef display_read_api
160 : * @brief Callback API for reading data from the display
161 : * See display_read() for argument description
162 : */
163 1 : typedef int (*display_read_api)(const struct device *dev, const uint16_t x,
164 : const uint16_t y,
165 : const struct display_buffer_descriptor *desc,
166 : void *buf);
167 :
168 : /**
169 : * @typedef display_get_framebuffer_api
170 : * @brief Callback API to get framebuffer pointer
171 : * See display_get_framebuffer() for argument description
172 : */
173 1 : typedef void *(*display_get_framebuffer_api)(const struct device *dev);
174 :
175 : /**
176 : * @typedef display_set_brightness_api
177 : * @brief Callback API to set display brightness
178 : * See display_set_brightness() for argument description
179 : */
180 1 : typedef int (*display_set_brightness_api)(const struct device *dev,
181 : const uint8_t brightness);
182 :
183 : /**
184 : * @typedef display_set_contrast_api
185 : * @brief Callback API to set display contrast
186 : * See display_set_contrast() for argument description
187 : */
188 1 : typedef int (*display_set_contrast_api)(const struct device *dev,
189 : const uint8_t contrast);
190 :
191 : /**
192 : * @typedef display_get_capabilities_api
193 : * @brief Callback API to get display capabilities
194 : * See display_get_capabilities() for argument description
195 : */
196 1 : typedef void (*display_get_capabilities_api)(const struct device *dev,
197 : struct display_capabilities *
198 : capabilities);
199 :
200 : /**
201 : * @typedef display_set_pixel_format_api
202 : * @brief Callback API to set pixel format used by the display
203 : * See display_set_pixel_format() for argument description
204 : */
205 1 : typedef int (*display_set_pixel_format_api)(const struct device *dev,
206 : const enum display_pixel_format
207 : pixel_format);
208 :
209 : /**
210 : * @typedef display_set_orientation_api
211 : * @brief Callback API to set orientation used by the display
212 : * See display_set_orientation() for argument description
213 : */
214 1 : typedef int (*display_set_orientation_api)(const struct device *dev,
215 : const enum display_orientation
216 : orientation);
217 :
218 : /**
219 : * @brief Display driver API
220 : * API which a display driver should expose
221 : */
222 1 : __subsystem struct display_driver_api {
223 0 : display_blanking_on_api blanking_on;
224 0 : display_blanking_off_api blanking_off;
225 0 : display_write_api write;
226 0 : display_read_api read;
227 0 : display_get_framebuffer_api get_framebuffer;
228 0 : display_set_brightness_api set_brightness;
229 0 : display_set_contrast_api set_contrast;
230 0 : display_get_capabilities_api get_capabilities;
231 0 : display_set_pixel_format_api set_pixel_format;
232 0 : display_set_orientation_api set_orientation;
233 : };
234 :
235 : /**
236 : * @brief Write data to display
237 : *
238 : * @param dev Pointer to device structure
239 : * @param x x Coordinate of the upper left corner where to write the buffer
240 : * @param y y Coordinate of the upper left corner where to write the buffer
241 : * @param desc Pointer to a structure describing the buffer layout
242 : * @param buf Pointer to buffer array
243 : *
244 : * @retval 0 on success else negative errno code.
245 : */
246 1 : static inline int display_write(const struct device *dev, const uint16_t x,
247 : const uint16_t y,
248 : const struct display_buffer_descriptor *desc,
249 : const void *buf)
250 : {
251 : struct display_driver_api *api =
252 : (struct display_driver_api *)dev->api;
253 :
254 : return api->write(dev, x, y, desc, buf);
255 : }
256 :
257 : /**
258 : * @brief Read data from display
259 : *
260 : * @param dev Pointer to device structure
261 : * @param x x Coordinate of the upper left corner where to read from
262 : * @param y y Coordinate of the upper left corner where to read from
263 : * @param desc Pointer to a structure describing the buffer layout
264 : * @param buf Pointer to buffer array
265 : *
266 : * @retval 0 on success else negative errno code.
267 : * @retval -ENOSYS if not implemented.
268 : */
269 1 : static inline int display_read(const struct device *dev, const uint16_t x,
270 : const uint16_t y,
271 : const struct display_buffer_descriptor *desc,
272 : void *buf)
273 : {
274 : struct display_driver_api *api =
275 : (struct display_driver_api *)dev->api;
276 :
277 : if (api->read == NULL) {
278 : return -ENOSYS;
279 : }
280 :
281 : return api->read(dev, x, y, desc, buf);
282 : }
283 :
284 : /**
285 : * @brief Get pointer to framebuffer for direct access
286 : *
287 : * @param dev Pointer to device structure
288 : *
289 : * @retval Pointer to frame buffer or NULL if direct framebuffer access
290 : * is not supported
291 : *
292 : */
293 1 : static inline void *display_get_framebuffer(const struct device *dev)
294 : {
295 : struct display_driver_api *api =
296 : (struct display_driver_api *)dev->api;
297 :
298 : if (api->get_framebuffer == NULL) {
299 : return NULL;
300 : }
301 :
302 : return api->get_framebuffer(dev);
303 : }
304 :
305 : /**
306 : * @brief Turn display blanking on
307 : *
308 : * This function blanks the complete display.
309 : * The content of the frame buffer will be retained while blanking is enabled
310 : * and the frame buffer will be accessible for read and write operations.
311 : *
312 : * In case backlight control is supported by the driver the backlight is
313 : * turned off. The backlight configuration is retained and accessible for
314 : * configuration.
315 : *
316 : * In case the driver supports display blanking the initial state of the driver
317 : * would be the same as if this function was called.
318 : *
319 : * @param dev Pointer to device structure
320 : *
321 : * @retval 0 on success else negative errno code.
322 : * @retval -ENOSYS if not implemented.
323 : */
324 1 : static inline int display_blanking_on(const struct device *dev)
325 : {
326 : struct display_driver_api *api =
327 : (struct display_driver_api *)dev->api;
328 :
329 : if (api->blanking_on == NULL) {
330 : return -ENOSYS;
331 : }
332 :
333 : return api->blanking_on(dev);
334 : }
335 :
336 : /**
337 : * @brief Turn display blanking off
338 : *
339 : * Restore the frame buffer content to the display.
340 : * In case backlight control is supported by the driver the backlight
341 : * configuration is restored.
342 : *
343 : * @param dev Pointer to device structure
344 : *
345 : * @retval 0 on success else negative errno code.
346 : * @retval -ENOSYS if not implemented.
347 : */
348 1 : static inline int display_blanking_off(const struct device *dev)
349 : {
350 : struct display_driver_api *api =
351 : (struct display_driver_api *)dev->api;
352 :
353 : if (api->blanking_off == NULL) {
354 : return -ENOSYS;
355 : }
356 :
357 : return api->blanking_off(dev);
358 : }
359 :
360 : /**
361 : * @brief Set the brightness of the display
362 : *
363 : * Set the brightness of the display in steps of 1/256, where 255 is full
364 : * brightness and 0 is minimal.
365 : *
366 : * @param dev Pointer to device structure
367 : * @param brightness Brightness in steps of 1/256
368 : *
369 : * @retval 0 on success else negative errno code.
370 : * @retval -ENOSYS if not implemented.
371 : */
372 1 : static inline int display_set_brightness(const struct device *dev,
373 : uint8_t brightness)
374 : {
375 : struct display_driver_api *api =
376 : (struct display_driver_api *)dev->api;
377 :
378 : if (api->set_brightness == NULL) {
379 : return -ENOSYS;
380 : }
381 :
382 : return api->set_brightness(dev, brightness);
383 : }
384 :
385 : /**
386 : * @brief Set the contrast of the display
387 : *
388 : * Set the contrast of the display in steps of 1/256, where 255 is maximum
389 : * difference and 0 is minimal.
390 : *
391 : * @param dev Pointer to device structure
392 : * @param contrast Contrast in steps of 1/256
393 : *
394 : * @retval 0 on success else negative errno code.
395 : * @retval -ENOSYS if not implemented.
396 : */
397 1 : static inline int display_set_contrast(const struct device *dev, uint8_t contrast)
398 : {
399 : struct display_driver_api *api =
400 : (struct display_driver_api *)dev->api;
401 :
402 : if (api->set_contrast == NULL) {
403 : return -ENOSYS;
404 : }
405 :
406 : return api->set_contrast(dev, contrast);
407 : }
408 :
409 : /**
410 : * @brief Get display capabilities
411 : *
412 : * @param dev Pointer to device structure
413 : * @param capabilities Pointer to capabilities structure to populate
414 : */
415 1 : static inline void display_get_capabilities(const struct device *dev,
416 : struct display_capabilities *
417 : capabilities)
418 : {
419 : struct display_driver_api *api =
420 : (struct display_driver_api *)dev->api;
421 :
422 : api->get_capabilities(dev, capabilities);
423 : }
424 :
425 : /**
426 : * @brief Set pixel format used by the display
427 : *
428 : * @param dev Pointer to device structure
429 : * @param pixel_format Pixel format to be used by display
430 : *
431 : * @retval 0 on success else negative errno code.
432 : * @retval -ENOSYS if not implemented.
433 : */
434 : static inline int
435 1 : display_set_pixel_format(const struct device *dev,
436 : const enum display_pixel_format pixel_format)
437 : {
438 : struct display_driver_api *api =
439 : (struct display_driver_api *)dev->api;
440 :
441 : if (api->set_pixel_format == NULL) {
442 : return -ENOSYS;
443 : }
444 :
445 : return api->set_pixel_format(dev, pixel_format);
446 : }
447 :
448 : /**
449 : * @brief Set display orientation
450 : *
451 : * @param dev Pointer to device structure
452 : * @param orientation Orientation to be used by display
453 : *
454 : * @retval 0 on success else negative errno code.
455 : * @retval -ENOSYS if not implemented.
456 : */
457 1 : static inline int display_set_orientation(const struct device *dev,
458 : const enum display_orientation
459 : orientation)
460 : {
461 : struct display_driver_api *api =
462 : (struct display_driver_api *)dev->api;
463 :
464 : if (api->set_orientation == NULL) {
465 : return -ENOSYS;
466 : }
467 :
468 : return api->set_orientation(dev, orientation);
469 : }
470 :
471 : #ifdef __cplusplus
472 : }
473 : #endif
474 :
475 : /**
476 : * @}
477 : */
478 :
479 : #endif /* ZEPHYR_INCLUDE_DRIVERS_DISPLAY_H_ */
|