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