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