xref: /qemu/include/hw/misc/led.h (revision c1b29826279b7405990ccb521d1fb5a24db2e58e)
1*c1b29826SPhilippe Mathieu-Daudé /*
2*c1b29826SPhilippe Mathieu-Daudé  * QEMU single LED device
3*c1b29826SPhilippe Mathieu-Daudé  *
4*c1b29826SPhilippe Mathieu-Daudé  * Copyright (C) 2020 Philippe Mathieu-Daudé <f4bug@amsat.org>
5*c1b29826SPhilippe Mathieu-Daudé  *
6*c1b29826SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: GPL-2.0-or-later
7*c1b29826SPhilippe Mathieu-Daudé  */
8*c1b29826SPhilippe Mathieu-Daudé #ifndef HW_MISC_LED_H
9*c1b29826SPhilippe Mathieu-Daudé #define HW_MISC_LED_H
10*c1b29826SPhilippe Mathieu-Daudé 
11*c1b29826SPhilippe Mathieu-Daudé #include "qom/object.h"
12*c1b29826SPhilippe Mathieu-Daudé 
13*c1b29826SPhilippe Mathieu-Daudé #define TYPE_LED "led"
14*c1b29826SPhilippe Mathieu-Daudé 
15*c1b29826SPhilippe Mathieu-Daudé /**
16*c1b29826SPhilippe Mathieu-Daudé  * LEDColor: Color of a LED
17*c1b29826SPhilippe Mathieu-Daudé  *
18*c1b29826SPhilippe Mathieu-Daudé  * This set is restricted to physically available LED colors.
19*c1b29826SPhilippe Mathieu-Daudé  *
20*c1b29826SPhilippe Mathieu-Daudé  * LED colors from 'Table 1. Product performance of LUXEON Rebel Color
21*c1b29826SPhilippe Mathieu-Daudé  * Line' of the 'DS68 LUXEON Rebel Color Line' datasheet available at:
22*c1b29826SPhilippe Mathieu-Daudé  * https://www.lumileds.com/products/color-leds/luxeon-rebel-color/
23*c1b29826SPhilippe Mathieu-Daudé  */
24*c1b29826SPhilippe Mathieu-Daudé typedef enum {          /* Coarse wavelength range */
25*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_VIOLET,   /* 425 nm */
26*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_BLUE,     /* 475 nm */
27*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_CYAN,     /* 500 nm */
28*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_GREEN,    /* 535 nm */
29*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_AMBER,    /* 590 nm */
30*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_ORANGE,   /* 615 nm */
31*c1b29826SPhilippe Mathieu-Daudé     LED_COLOR_RED,      /* 630 nm */
32*c1b29826SPhilippe Mathieu-Daudé } LEDColor;
33*c1b29826SPhilippe Mathieu-Daudé 
34*c1b29826SPhilippe Mathieu-Daudé struct LEDState {
35*c1b29826SPhilippe Mathieu-Daudé     /* Private */
36*c1b29826SPhilippe Mathieu-Daudé     DeviceState parent_obj;
37*c1b29826SPhilippe Mathieu-Daudé     /* Public */
38*c1b29826SPhilippe Mathieu-Daudé 
39*c1b29826SPhilippe Mathieu-Daudé     uint8_t intensity_percent;
40*c1b29826SPhilippe Mathieu-Daudé 
41*c1b29826SPhilippe Mathieu-Daudé     /* Properties */
42*c1b29826SPhilippe Mathieu-Daudé     char *description;
43*c1b29826SPhilippe Mathieu-Daudé     char *color;
44*c1b29826SPhilippe Mathieu-Daudé };
45*c1b29826SPhilippe Mathieu-Daudé typedef struct LEDState LEDState;
46*c1b29826SPhilippe Mathieu-Daudé DECLARE_INSTANCE_CHECKER(LEDState, LED, TYPE_LED)
47*c1b29826SPhilippe Mathieu-Daudé 
48*c1b29826SPhilippe Mathieu-Daudé /**
49*c1b29826SPhilippe Mathieu-Daudé  * led_set_intensity: Set the intensity of a LED device
50*c1b29826SPhilippe Mathieu-Daudé  * @s: the LED object
51*c1b29826SPhilippe Mathieu-Daudé  * @intensity_percent: intensity as percentage in range 0 to 100.
52*c1b29826SPhilippe Mathieu-Daudé  */
53*c1b29826SPhilippe Mathieu-Daudé void led_set_intensity(LEDState *s, unsigned intensity_percent);
54*c1b29826SPhilippe Mathieu-Daudé 
55*c1b29826SPhilippe Mathieu-Daudé /**
56*c1b29826SPhilippe Mathieu-Daudé  * led_get_intensity:
57*c1b29826SPhilippe Mathieu-Daudé  * @s: the LED object
58*c1b29826SPhilippe Mathieu-Daudé  *
59*c1b29826SPhilippe Mathieu-Daudé  * Returns: The LED intensity as percentage in range 0 to 100.
60*c1b29826SPhilippe Mathieu-Daudé  */
61*c1b29826SPhilippe Mathieu-Daudé unsigned led_get_intensity(LEDState *s);
62*c1b29826SPhilippe Mathieu-Daudé 
63*c1b29826SPhilippe Mathieu-Daudé /**
64*c1b29826SPhilippe Mathieu-Daudé  * led_set_state: Set the state of a LED device
65*c1b29826SPhilippe Mathieu-Daudé  * @s: the LED object
66*c1b29826SPhilippe Mathieu-Daudé  * @is_emitting: boolean indicating whether the LED is emitting
67*c1b29826SPhilippe Mathieu-Daudé  *
68*c1b29826SPhilippe Mathieu-Daudé  * This utility is meant for LED connected to GPIO.
69*c1b29826SPhilippe Mathieu-Daudé  */
70*c1b29826SPhilippe Mathieu-Daudé void led_set_state(LEDState *s, bool is_emitting);
71*c1b29826SPhilippe Mathieu-Daudé 
72*c1b29826SPhilippe Mathieu-Daudé /**
73*c1b29826SPhilippe Mathieu-Daudé  * led_create_simple: Create and realize a LED device
74*c1b29826SPhilippe Mathieu-Daudé  * @parentobj: the parent object
75*c1b29826SPhilippe Mathieu-Daudé  * @color: color of the LED
76*c1b29826SPhilippe Mathieu-Daudé  * @description: description of the LED (optional)
77*c1b29826SPhilippe Mathieu-Daudé  *
78*c1b29826SPhilippe Mathieu-Daudé  * Create the device state structure, initialize it, and
79*c1b29826SPhilippe Mathieu-Daudé  * drop the reference to it (the device is realized).
80*c1b29826SPhilippe Mathieu-Daudé  *
81*c1b29826SPhilippe Mathieu-Daudé  * Returns: The newly allocated and instantiated LED object.
82*c1b29826SPhilippe Mathieu-Daudé  */
83*c1b29826SPhilippe Mathieu-Daudé LEDState *led_create_simple(Object *parentobj,
84*c1b29826SPhilippe Mathieu-Daudé                             LEDColor color,
85*c1b29826SPhilippe Mathieu-Daudé                             const char *description);
86*c1b29826SPhilippe Mathieu-Daudé 
87*c1b29826SPhilippe Mathieu-Daudé #endif /* HW_MISC_LED_H */
88