1 /*
2 * Copyright (c) 2022-2023 Jamie McCrae
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /**
8 * @file
9 * @brief Public API for auxiliary (textual/non-graphical) display drivers
10 */
11
12 #ifndef ZEPHYR_INCLUDE_DRIVERS_AUXDISPLAY_H_
13 #define ZEPHYR_INCLUDE_DRIVERS_AUXDISPLAY_H_
14
15 /**
16 * @brief Auxiliary (Text) Display Interface
17 * @defgroup auxdisplay_interface Text Display Interface
18 * @since 3.4
19 * @version 0.1.0
20 * @ingroup io_interfaces
21 * @{
22 */
23
24 #include <stdint.h>
25 #include <stddef.h>
26 #include <zephyr/kernel.h>
27 #include <zephyr/device.h>
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /** @brief Used for minimum and maximum brightness/backlight values if not supported */
34 #define AUXDISPLAY_LIGHT_NOT_SUPPORTED 0
35
36 /** @brief Used to describe the mode of an auxiliary (text) display */
37 typedef uint32_t auxdisplay_mode_t;
38
39 /** @brief Used for moving the cursor or display position */
40 enum auxdisplay_position {
41 /** Moves to specified X,Y position */
42 AUXDISPLAY_POSITION_ABSOLUTE = 0,
43
44 /** Shifts current position by +/- X,Y position, does not take display direction into
45 * consideration
46 */
47 AUXDISPLAY_POSITION_RELATIVE,
48
49 /** Shifts current position by +/- X,Y position, takes display direction into
50 * consideration
51 */
52 AUXDISPLAY_POSITION_RELATIVE_DIRECTION,
53
54 AUXDISPLAY_POSITION_COUNT,
55 };
56
57 /** @brief Used for setting character append position */
58 enum auxdisplay_direction {
59 /** Each character will be placed to the right of existing characters */
60 AUXDISPLAY_DIRECTION_RIGHT = 0,
61
62 /** Each character will be placed to the left of existing characters */
63 AUXDISPLAY_DIRECTION_LEFT,
64
65 AUXDISPLAY_DIRECTION_COUNT,
66 };
67
68 /** @brief Light levels for brightness and/or backlight. If not supported by a
69 * display/driver, both minimum and maximum will be AUXDISPLAY_LIGHT_NOT_SUPPORTED.
70 */
71 struct auxdisplay_light {
72 /** Minimum light level supported */
73 uint8_t minimum;
74
75 /** Maximum light level supported */
76 uint8_t maximum;
77 };
78
79 /** @brief Structure holding display capabilities. */
80 struct auxdisplay_capabilities {
81 /** Number of character columns */
82 uint16_t columns;
83
84 /** Number of character rows */
85 uint16_t rows;
86
87 /** Display-specific data (e.g. 4-bit or 8-bit mode for HD44780-based displays) */
88 auxdisplay_mode_t mode;
89
90 /** Brightness details for display (if supported) */
91 struct auxdisplay_light brightness;
92
93 /** Backlight details for display (if supported) */
94 struct auxdisplay_light backlight;
95
96 /** Number of custom characters supported by display (0 if unsupported) */
97 uint8_t custom_characters;
98
99 /** Width (in pixels) of a custom character, supplied custom characters should match. */
100 uint8_t custom_character_width;
101
102 /** Height (in pixels) of a custom character, supplied custom characters should match. */
103 uint8_t custom_character_height;
104 };
105
106 /** @brief Structure for a custom command. This may be extended by specific drivers. */
107 struct auxdisplay_custom_data {
108 /** Raw command data to be sent */
109 uint8_t *data;
110
111 /** Length of supplied data */
112 uint16_t len;
113
114 /** Display-driver specific options for command */
115 uint32_t options;
116 };
117
118 /** @brief Structure for a custom character. */
119 struct auxdisplay_character {
120 /** Custom character index on the display */
121 uint8_t index;
122
123 /** Custom character pixel data, a character must be valid for a display consisting
124 * of a uint8 array of size character width by character height, values should be
125 * 0x00 for pixel off or 0xff for pixel on, if a display supports shades then values
126 * between 0x00 and 0xff may be used (display driver dependent).
127 */
128 uint8_t *data;
129
130 /** Will be updated with custom character index to use in the display write function to
131 * disaplay this custom character
132 */
133 uint8_t character_code;
134 };
135
136 /**
137 * @cond INTERNAL_HIDDEN
138 *
139 * For internal use only, skip these in public documentation.
140 */
141
142 /**
143 * @typedef auxdisplay_display_on_t
144 * @brief Callback API to turn display on
145 * See auxdisplay_display_on() for argument description
146 */
147 typedef int (*auxdisplay_display_on_t)(const struct device *dev);
148
149 /**
150 * @typedef auxdisplay_display_off_t
151 * @brief Callback API to turn display off
152 * See auxdisplay_display_off() for argument description
153 */
154 typedef int (*auxdisplay_display_off_t)(const struct device *dev);
155
156 /**
157 * @typedef auxdisplay_cursor_set_enabled_t
158 * @brief Callback API to turn display cursor visibility on or off
159 * See auxdisplay_cursor_set_enabled() for argument description
160 */
161 typedef int (*auxdisplay_cursor_set_enabled_t)(const struct device *dev, bool enabled);
162
163 /**
164 * @typedef auxdisplay_position_blinking_set_enabled_t
165 * @brief Callback API to turn the current position blinking on or off
166 * See auxdisplay_position_blinking_set_enabled() for argument description
167 */
168 typedef int (*auxdisplay_position_blinking_set_enabled_t)(const struct device *dev,
169 bool enabled);
170
171 /**
172 * @typedef auxdisplay_cursor_shift_set_t
173 * @brief Callback API to set how the cursor shifts after a character is written
174 * See auxdisplay_cursor_shift_set() for argument description
175 */
176 typedef int (*auxdisplay_cursor_shift_set_t)(const struct device *dev, uint8_t direction,
177 bool display_shift);
178
179 /**
180 * @typedef auxdisplay_cursor_position_set_t
181 * @brief Callback API to set the cursor position
182 * See auxdisplay_cursor_position_set() for argument description
183 */
184 typedef int (*auxdisplay_cursor_position_set_t)(const struct device *dev,
185 enum auxdisplay_position type,
186 int16_t x, int16_t y);
187
188 /**
189 * @typedef auxdisplay_cursor_position_get_t
190 * @brief Callback API to get the cursor position
191 * See auxdisplay_cursor_position_get() for argument description
192 */
193 typedef int (*auxdisplay_cursor_position_get_t)(const struct device *dev, int16_t *x,
194 int16_t *y);
195
196 /**
197 * @typedef auxdisplay_display_position_set_t
198 * @brief Callback API to set the current position of the display
199 * See auxdisplay_display_position_set() for argument description
200 */
201 typedef int (*auxdisplay_display_position_set_t)(const struct device *dev,
202 enum auxdisplay_position type,
203 int16_t x, int16_t y);
204
205 /**
206 * @typedef auxdisplay_display_position_get_t
207 * @brief Callback API to get the current position of the display
208 * See auxdisplay_display_position_get() for argument description
209 */
210 typedef int (*auxdisplay_display_position_get_t)(const struct device *dev, int16_t *x,
211 int16_t *y);
212
213 /**
214 * @typedef auxdisplay_capabilities_get_t
215 * @brief Callback API to get details on the display
216 * See auxdisplay_capabilities_get() for argument description
217 */
218 typedef int (*auxdisplay_capabilities_get_t)(const struct device *dev,
219 struct auxdisplay_capabilities *capabilities);
220
221 /**
222 * @typedef auxdisplay_clear_t
223 * @brief Callback API to clear the contents of the display
224 * See auxdisplay_clear() for argument description
225 */
226 typedef int (*auxdisplay_clear_t)(const struct device *dev);
227
228 /**
229 * @typedef auxdisplay_brightness_get_t
230 * @brief Callback API to get the current and minimum/maximum supported
231 * brightness settings of the display
232 * See auxdisplay_brightness_get_api() for argument description
233 */
234 typedef int (*auxdisplay_brightness_get_t)(const struct device *dev, uint8_t *brightness);
235
236 /**
237 * @typedef auxdisplay_brightness_set_t
238 * @brief Callback API to set the brightness of the display
239 * See auxdisplay_brightness_set_api() for argument description
240 */
241 typedef int (*auxdisplay_brightness_set_t)(const struct device *dev, uint8_t brightness);
242
243 /**
244 * @typedef auxdisplay_backlight_get_t
245 * @brief Callback API to get the current and minimum/maximum supported
246 * backlight settings of the display
247 * See auxdisplay_backlight_set() for argument description
248 */
249 typedef int (*auxdisplay_backlight_get_t)(const struct device *dev, uint8_t *backlight);
250
251 /**
252 * @typedef auxdisplay_backlight_set_t
253 * @brief Callback API to set the backlight status
254 * See auxdisplay_backlight_set() for argument description
255 */
256 typedef int (*auxdisplay_backlight_set_t)(const struct device *dev, uint8_t backlight);
257
258 /**
259 * @typedef auxdisplay_is_busy_t
260 * @brief Callback API to check if the display is busy with an operation
261 * See auxdisplay_is_busy() for argument description
262 */
263 typedef int (*auxdisplay_is_busy_t)(const struct device *dev);
264
265 /**
266 * @typedef auxdisplay_custom_character_set_t
267 * @brief Callback API to set a customer character on the display for usage
268 * See auxdisplay_custom_character_set() for argument description
269 */
270 typedef int (*auxdisplay_custom_character_set_t)(const struct device *dev,
271 struct auxdisplay_character *character);
272
273 /**
274 * @typedef auxdisplay_write_t
275 * @brief Callback API to write text to the display
276 * See auxdisplay_write() for argument description
277 */
278 typedef int (*auxdisplay_write_t)(const struct device *dev, const uint8_t *data, uint16_t len);
279
280 /**
281 * @typedef auxdisplay_custom_command_t
282 * @brief Callback API to send a custom command to the display
283 * See auxdisplay_custom_command() for argument description
284 */
285 typedef int (*auxdisplay_custom_command_t)(const struct device *dev,
286 struct auxdisplay_custom_data *command);
287
288 __subsystem struct auxdisplay_driver_api {
289 auxdisplay_display_on_t display_on;
290 auxdisplay_display_off_t display_off;
291 auxdisplay_cursor_set_enabled_t cursor_set_enabled;
292 auxdisplay_position_blinking_set_enabled_t position_blinking_set_enabled;
293 auxdisplay_cursor_shift_set_t cursor_shift_set;
294 auxdisplay_cursor_position_set_t cursor_position_set;
295 auxdisplay_cursor_position_get_t cursor_position_get;
296 auxdisplay_display_position_set_t display_position_set;
297 auxdisplay_display_position_get_t display_position_get;
298 auxdisplay_capabilities_get_t capabilities_get;
299 auxdisplay_clear_t clear;
300 auxdisplay_brightness_get_t brightness_get;
301 auxdisplay_brightness_set_t brightness_set;
302 auxdisplay_backlight_get_t backlight_get;
303 auxdisplay_backlight_set_t backlight_set;
304 auxdisplay_is_busy_t is_busy;
305 auxdisplay_custom_character_set_t custom_character_set;
306 auxdisplay_write_t write;
307 auxdisplay_custom_command_t custom_command;
308 };
309
310 /**
311 * @endcond
312 */
313
314 /**
315 * @brief Turn display on.
316 *
317 * @param dev Auxiliary display device instance
318 *
319 * @retval 0 on success.
320 * @retval -ENOSYS if not supported/implemented.
321 * @retval -errno Negative errno code on other failure.
322 */
323 __syscall int auxdisplay_display_on(const struct device *dev);
324
z_impl_auxdisplay_display_on(const struct device * dev)325 static inline int z_impl_auxdisplay_display_on(const struct device *dev)
326 {
327 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
328
329 if (!api->display_on) {
330 return -ENOSYS;
331 }
332
333 return api->display_on(dev);
334 }
335
336 /**
337 * @brief Turn display off.
338 *
339 * @param dev Auxiliary display device instance
340 *
341 * @retval 0 on success.
342 * @retval -ENOSYS if not supported/implemented.
343 * @retval -errno Negative errno code on other failure.
344 */
345 __syscall int auxdisplay_display_off(const struct device *dev);
346
z_impl_auxdisplay_display_off(const struct device * dev)347 static inline int z_impl_auxdisplay_display_off(const struct device *dev)
348 {
349 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
350
351 if (!api->display_off) {
352 return -ENOSYS;
353 }
354
355 return api->display_off(dev);
356 }
357
358 /**
359 * @brief Set cursor enabled status on an auxiliary display
360 *
361 * @param dev Auxiliary display device instance
362 * @param enabled True to enable cursor, false to disable
363 *
364 * @retval 0 on success.
365 * @retval -ENOSYS if not supported/implemented.
366 * @retval -errno Negative errno code on other failure.
367 */
368 __syscall int auxdisplay_cursor_set_enabled(const struct device *dev,
369 bool enabled);
370
z_impl_auxdisplay_cursor_set_enabled(const struct device * dev,bool enabled)371 static inline int z_impl_auxdisplay_cursor_set_enabled(const struct device *dev,
372 bool enabled)
373 {
374 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
375
376 if (!api->cursor_set_enabled) {
377 return -ENOSYS;
378 }
379
380 return api->cursor_set_enabled(dev, enabled);
381 }
382
383 /**
384 * @brief Set cursor blinking status on an auxiliary display
385 *
386 * @param dev Auxiliary display device instance
387 * @param enabled Set to true to enable blinking position, false to disable
388 *
389 * @retval 0 on success.
390 * @retval -ENOSYS if not supported/implemented.
391 * @retval -errno Negative errno code on other failure.
392 */
393 __syscall int auxdisplay_position_blinking_set_enabled(const struct device *dev,
394 bool enabled);
395
z_impl_auxdisplay_position_blinking_set_enabled(const struct device * dev,bool enabled)396 static inline int z_impl_auxdisplay_position_blinking_set_enabled(const struct device *dev,
397 bool enabled)
398 {
399 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
400
401 if (!api->position_blinking_set_enabled) {
402 return -ENOSYS;
403 }
404
405 return api->position_blinking_set_enabled(dev, enabled);
406 }
407
408 /**
409 * @brief Set cursor shift after character write and display shift
410 *
411 * @param dev Auxiliary display device instance
412 * @param direction Sets the direction of the display when characters are written
413 * @param display_shift If true, will shift the display when characters are written
414 * (which makes it look like the display is moving, not the cursor)
415 *
416 * @retval 0 on success.
417 * @retval -ENOSYS if not supported/implemented.
418 * @retval -EINVAL if provided argument is invalid.
419 * @retval -errno Negative errno code on other failure.
420 */
421 __syscall int auxdisplay_cursor_shift_set(const struct device *dev,
422 uint8_t direction, bool display_shift);
423
z_impl_auxdisplay_cursor_shift_set(const struct device * dev,uint8_t direction,bool display_shift)424 static inline int z_impl_auxdisplay_cursor_shift_set(const struct device *dev,
425 uint8_t direction,
426 bool display_shift)
427 {
428 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
429
430 if (!api->cursor_shift_set) {
431 return -ENOSYS;
432 }
433
434 if (direction >= AUXDISPLAY_DIRECTION_COUNT) {
435 return -EINVAL;
436 }
437
438 return api->cursor_shift_set(dev, direction, display_shift);
439 }
440
441 /**
442 * @brief Set cursor (and write position) on an auxiliary display
443 *
444 * @param dev Auxiliary display device instance
445 * @param type Type of move, absolute or offset
446 * @param x Exact or offset X position
447 * @param y Exact or offset Y position
448 *
449 * @retval 0 on success.
450 * @retval -ENOSYS if not supported/implemented.
451 * @retval -EINVAL if provided argument is invalid.
452 * @retval -errno Negative errno code on other failure.
453 */
454 __syscall int auxdisplay_cursor_position_set(const struct device *dev,
455 enum auxdisplay_position type,
456 int16_t x, int16_t y);
457
z_impl_auxdisplay_cursor_position_set(const struct device * dev,enum auxdisplay_position type,int16_t x,int16_t y)458 static inline int z_impl_auxdisplay_cursor_position_set(const struct device *dev,
459 enum auxdisplay_position type,
460 int16_t x, int16_t y)
461 {
462 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
463
464 if (!api->cursor_position_set) {
465 return -ENOSYS;
466 } else if (type >= AUXDISPLAY_POSITION_COUNT) {
467 return -EINVAL;
468 } else if (type == AUXDISPLAY_POSITION_ABSOLUTE && (x < 0 || y < 0)) {
469 return -EINVAL;
470 }
471
472 return api->cursor_position_set(dev, type, x, y);
473 }
474
475 /**
476 * @brief Get current cursor on an auxiliary display
477 *
478 * @param dev Auxiliary display device instance
479 * @param x Will be updated with the exact X position
480 * @param y Will be updated with the exact Y position
481 *
482 * @retval 0 on success.
483 * @retval -ENOSYS if not supported/implemented.
484 * @retval -EINVAL if provided argument is invalid.
485 * @retval -errno Negative errno code on other failure.
486 */
487 __syscall int auxdisplay_cursor_position_get(const struct device *dev,
488 int16_t *x, int16_t *y);
489
z_impl_auxdisplay_cursor_position_get(const struct device * dev,int16_t * x,int16_t * y)490 static inline int z_impl_auxdisplay_cursor_position_get(const struct device *dev,
491 int16_t *x, int16_t *y)
492 {
493 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
494
495 if (!api->cursor_position_get) {
496 return -ENOSYS;
497 }
498
499 return api->cursor_position_get(dev, x, y);
500 }
501
502 /**
503 * @brief Set display position on an auxiliary display
504 *
505 * @param dev Auxiliary display device instance
506 * @param type Type of move, absolute or offset
507 * @param x Exact or offset X position
508 * @param y Exact or offset Y position
509 *
510 * @retval 0 on success.
511 * @retval -ENOSYS if not supported/implemented.
512 * @retval -EINVAL if provided argument is invalid.
513 * @retval -errno Negative errno code on other failure.
514 */
515 __syscall int auxdisplay_display_position_set(const struct device *dev,
516 enum auxdisplay_position type,
517 int16_t x, int16_t y);
518
z_impl_auxdisplay_display_position_set(const struct device * dev,enum auxdisplay_position type,int16_t x,int16_t y)519 static inline int z_impl_auxdisplay_display_position_set(const struct device *dev,
520 enum auxdisplay_position type,
521 int16_t x, int16_t y)
522 {
523 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
524
525 if (!api->display_position_set) {
526 return -ENOSYS;
527 } else if (type >= AUXDISPLAY_POSITION_COUNT) {
528 return -EINVAL;
529 } else if (type == AUXDISPLAY_POSITION_ABSOLUTE && (x < 0 || y < 0)) {
530 return -EINVAL;
531 }
532
533 return api->display_position_set(dev, type, x, y);
534 }
535
536 /**
537 * @brief Get current display position on an auxiliary display
538 *
539 * @param dev Auxiliary display device instance
540 * @param x Will be updated with the exact X position
541 * @param y Will be updated with the exact Y position
542 *
543 * @retval 0 on success.
544 * @retval -ENOSYS if not supported/implemented.
545 * @retval -EINVAL if provided argument is invalid.
546 * @retval -errno Negative errno code on other failure.
547 */
548 __syscall int auxdisplay_display_position_get(const struct device *dev,
549 int16_t *x, int16_t *y);
550
z_impl_auxdisplay_display_position_get(const struct device * dev,int16_t * x,int16_t * y)551 static inline int z_impl_auxdisplay_display_position_get(const struct device *dev,
552 int16_t *x, int16_t *y)
553 {
554 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
555
556 if (!api->display_position_get) {
557 return -ENOSYS;
558 }
559
560 return api->display_position_get(dev, x, y);
561 }
562
563 /**
564 * @brief Fetch capabilities (and details) of auxiliary display
565 *
566 * @param dev Auxiliary display device instance
567 * @param capabilities Will be updated with the details of the auxiliary display
568 *
569 * @retval 0 on success.
570 * @retval -errno Negative errno code on other failure.
571 */
572 __syscall int auxdisplay_capabilities_get(const struct device *dev,
573 struct auxdisplay_capabilities *capabilities);
574
z_impl_auxdisplay_capabilities_get(const struct device * dev,struct auxdisplay_capabilities * capabilities)575 static inline int z_impl_auxdisplay_capabilities_get(const struct device *dev,
576 struct auxdisplay_capabilities *capabilities)
577 {
578 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
579
580 return api->capabilities_get(dev, capabilities);
581 }
582
583 /**
584 * @brief Clear display of auxiliary display and return to home position (note that
585 * this does not reset the display configuration, e.g. custom characters and
586 * display mode will persist).
587 *
588 * @param dev Auxiliary display device instance
589 *
590 * @retval 0 on success.
591 * @retval -errno Negative errno code on other failure.
592 */
593 __syscall int auxdisplay_clear(const struct device *dev);
594
z_impl_auxdisplay_clear(const struct device * dev)595 static inline int z_impl_auxdisplay_clear(const struct device *dev)
596 {
597 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
598
599 return api->clear(dev);
600 }
601
602 /**
603 * @brief Get the current brightness level of an auxiliary display
604 *
605 * @param dev Auxiliary display device instance
606 * @param brightness Will be updated with the current brightness
607 *
608 * @retval 0 on success.
609 * @retval -ENOSYS if not supported/implemented.
610 * @retval -errno Negative errno code on other failure.
611 */
612 __syscall int auxdisplay_brightness_get(const struct device *dev,
613 uint8_t *brightness);
614
z_impl_auxdisplay_brightness_get(const struct device * dev,uint8_t * brightness)615 static inline int z_impl_auxdisplay_brightness_get(const struct device *dev,
616 uint8_t *brightness)
617 {
618 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
619
620 if (!api->brightness_get) {
621 return -ENOSYS;
622 }
623
624 return api->brightness_get(dev, brightness);
625 }
626
627 /**
628 * @brief Update the brightness level of an auxiliary display
629 *
630 * @param dev Auxiliary display device instance
631 * @param brightness The brightness level to set
632 *
633 * @retval 0 on success.
634 * @retval -ENOSYS if not supported/implemented.
635 * @retval -EINVAL if provided argument is invalid.
636 * @retval -errno Negative errno code on other failure.
637 */
638 __syscall int auxdisplay_brightness_set(const struct device *dev,
639 uint8_t brightness);
640
z_impl_auxdisplay_brightness_set(const struct device * dev,uint8_t brightness)641 static inline int z_impl_auxdisplay_brightness_set(const struct device *dev,
642 uint8_t brightness)
643 {
644 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
645
646 if (!api->brightness_set) {
647 return -ENOSYS;
648 }
649
650 return api->brightness_set(dev, brightness);
651 }
652
653 /**
654 * @brief Get the backlight level details of an auxiliary display
655 *
656 * @param dev Auxiliary display device instance
657 * @param backlight Will be updated with the current backlight level
658 *
659 * @retval 0 on success.
660 * @retval -ENOSYS if not supported/implemented.
661 * @retval -errno Negative errno code on other failure.
662 */
663 __syscall int auxdisplay_backlight_get(const struct device *dev,
664 uint8_t *backlight);
665
z_impl_auxdisplay_backlight_get(const struct device * dev,uint8_t * backlight)666 static inline int z_impl_auxdisplay_backlight_get(const struct device *dev,
667 uint8_t *backlight)
668 {
669 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
670
671 if (!api->backlight_get) {
672 return -ENOSYS;
673 }
674
675 return api->backlight_get(dev, backlight);
676 }
677
678 /**
679 * @brief Update the backlight level of an auxiliary display
680 *
681 * @param dev Auxiliary display device instance
682 * @param backlight The backlight level to set
683 *
684 * @retval 0 on success.
685 * @retval -ENOSYS if not supported/implemented.
686 * @retval -EINVAL if provided argument is invalid.
687 * @retval -errno Negative errno code on other failure.
688 */
689 __syscall int auxdisplay_backlight_set(const struct device *dev,
690 uint8_t backlight);
691
z_impl_auxdisplay_backlight_set(const struct device * dev,uint8_t backlight)692 static inline int z_impl_auxdisplay_backlight_set(const struct device *dev,
693 uint8_t backlight)
694 {
695 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
696
697 if (!api->backlight_set) {
698 return -ENOSYS;
699 }
700
701 return api->backlight_set(dev, backlight);
702 }
703
704 /**
705 * @brief Check if an auxiliary display driver is busy
706 *
707 * @param dev Auxiliary display device instance
708 *
709 * @retval 1 on success and display busy.
710 * @retval 0 on success and display not busy.
711 * @retval -ENOSYS if not supported/implemented.
712 * @retval -errno Negative errno code on other failure.
713 */
714 __syscall int auxdisplay_is_busy(const struct device *dev);
715
z_impl_auxdisplay_is_busy(const struct device * dev)716 static inline int z_impl_auxdisplay_is_busy(const struct device *dev)
717 {
718 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
719
720 if (!api->is_busy) {
721 return -ENOSYS;
722 }
723
724 return api->is_busy(dev);
725 }
726
727 /**
728 * @brief Sets a custom character in the display, the custom character struct
729 * must contain the pixel data for the custom character to add and valid
730 * custom character index, if successful then the character_code variable
731 * in the struct will be set to the character code that can be used with
732 * the auxdisplay_write() function to show it.
733 *
734 * A character must be valid for a display consisting of a uint8 array of
735 * size character width by character height, values should be 0x00 for
736 * pixel off or 0xff for pixel on, if a display supports shades then
737 * values between 0x00 and 0xff may be used (display driver dependent).
738 *
739 * @param dev Auxiliary display device instance
740 * @param character Pointer to custom character structure
741 *
742 * @retval 0 on success.
743 * @retval -ENOSYS if not supported/implemented.
744 * @retval -EINVAL if provided argument is invalid.
745 * @retval -errno Negative errno code on other failure.
746 */
747 __syscall int auxdisplay_custom_character_set(const struct device *dev,
748 struct auxdisplay_character *character);
749
z_impl_auxdisplay_custom_character_set(const struct device * dev,struct auxdisplay_character * character)750 static inline int z_impl_auxdisplay_custom_character_set(const struct device *dev,
751 struct auxdisplay_character *character)
752 {
753 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
754
755 if (!api->custom_character_set) {
756 return -ENOSYS;
757 }
758
759 return api->custom_character_set(dev, character);
760 }
761
762 /**
763 * @brief Write data to auxiliary display screen at current position
764 *
765 * @param dev Auxiliary display device instance
766 * @param data Text data to write
767 * @param len Length of text data to write
768 *
769 * @retval 0 on success.
770 * @retval -EINVAL if provided argument is invalid.
771 * @retval -errno Negative errno code on other failure.
772 */
773 __syscall int auxdisplay_write(const struct device *dev, const uint8_t *data,
774 uint16_t len);
775
z_impl_auxdisplay_write(const struct device * dev,const uint8_t * data,uint16_t len)776 static inline int z_impl_auxdisplay_write(const struct device *dev,
777 const uint8_t *data, uint16_t len)
778 {
779 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
780
781 return api->write(dev, data, len);
782 }
783
784 /**
785 * @brief Send a custom command to the display (if supported by driver)
786 *
787 * @param dev Auxiliary display device instance
788 * @param data Custom command structure (this may be extended by specific drivers)
789 *
790 * @retval 0 on success.
791 * @retval -ENOSYS if not supported/implemented.
792 * @retval -EINVAL if provided argument is invalid.
793 * @retval -errno Negative errno code on other failure.
794 */
795 __syscall int auxdisplay_custom_command(const struct device *dev,
796 struct auxdisplay_custom_data *data);
797
z_impl_auxdisplay_custom_command(const struct device * dev,struct auxdisplay_custom_data * data)798 static inline int z_impl_auxdisplay_custom_command(const struct device *dev,
799 struct auxdisplay_custom_data *data)
800 {
801 struct auxdisplay_driver_api *api = (struct auxdisplay_driver_api *)dev->api;
802
803 if (!api->custom_command) {
804 return -ENOSYS;
805 }
806
807 return api->custom_command(dev, data);
808 }
809
810 #ifdef __cplusplus
811 }
812 #endif
813
814 /**
815 * @}
816 */
817
818 #include <zephyr/syscalls/auxdisplay.h>
819
820 #endif /* ZEPHYR_INCLUDE_DRIVERS_AUXDISPLAY_H_ */
821