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" 12ddb67f64SPhilippe 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 */ 30*956eb204SPhilippe Mathieu-Daudé LED_COLOR_YELLOW, /* 567 nm */ 31c1b29826SPhilippe Mathieu-Daudé LED_COLOR_AMBER, /* 590 nm */ 32c1b29826SPhilippe Mathieu-Daudé LED_COLOR_ORANGE, /* 615 nm */ 33c1b29826SPhilippe Mathieu-Daudé LED_COLOR_RED, /* 630 nm */ 34c1b29826SPhilippe Mathieu-Daudé } LEDColor; 35c1b29826SPhilippe Mathieu-Daudé 36c1b29826SPhilippe Mathieu-Daudé struct LEDState { 37c1b29826SPhilippe Mathieu-Daudé /* Private */ 38c1b29826SPhilippe Mathieu-Daudé DeviceState parent_obj; 39c1b29826SPhilippe Mathieu-Daudé /* Public */ 40c1b29826SPhilippe Mathieu-Daudé 41c1b29826SPhilippe Mathieu-Daudé uint8_t intensity_percent; 42ddb67f64SPhilippe Mathieu-Daudé qemu_irq irq; 43c1b29826SPhilippe Mathieu-Daudé 44c1b29826SPhilippe Mathieu-Daudé /* Properties */ 45c1b29826SPhilippe Mathieu-Daudé char *description; 46c1b29826SPhilippe Mathieu-Daudé char *color; 47ddb67f64SPhilippe Mathieu-Daudé /* 48ddb67f64SPhilippe Mathieu-Daudé * Determines whether a GPIO is using a positive (active-high) 49ddb67f64SPhilippe Mathieu-Daudé * logic (when used with GPIO, the intensity at reset is related 50ddb67f64SPhilippe Mathieu-Daudé * to the GPIO polarity). 51ddb67f64SPhilippe Mathieu-Daudé */ 52ddb67f64SPhilippe Mathieu-Daudé bool gpio_active_high; 53c1b29826SPhilippe Mathieu-Daudé }; 54c1b29826SPhilippe Mathieu-Daudé typedef struct LEDState LEDState; 55c1b29826SPhilippe Mathieu-Daudé DECLARE_INSTANCE_CHECKER(LEDState, LED, TYPE_LED) 56c1b29826SPhilippe Mathieu-Daudé 57c1b29826SPhilippe Mathieu-Daudé /** 58c1b29826SPhilippe Mathieu-Daudé * led_set_intensity: Set the intensity of a LED device 59c1b29826SPhilippe Mathieu-Daudé * @s: the LED object 60c1b29826SPhilippe Mathieu-Daudé * @intensity_percent: intensity as percentage in range 0 to 100. 61c1b29826SPhilippe Mathieu-Daudé */ 62c1b29826SPhilippe Mathieu-Daudé void led_set_intensity(LEDState *s, unsigned intensity_percent); 63c1b29826SPhilippe Mathieu-Daudé 64c1b29826SPhilippe Mathieu-Daudé /** 65c1b29826SPhilippe Mathieu-Daudé * led_get_intensity: 66c1b29826SPhilippe Mathieu-Daudé * @s: the LED object 67c1b29826SPhilippe Mathieu-Daudé * 68c1b29826SPhilippe Mathieu-Daudé * Returns: The LED intensity as percentage in range 0 to 100. 69c1b29826SPhilippe Mathieu-Daudé */ 70c1b29826SPhilippe Mathieu-Daudé unsigned led_get_intensity(LEDState *s); 71c1b29826SPhilippe Mathieu-Daudé 72c1b29826SPhilippe Mathieu-Daudé /** 73c1b29826SPhilippe Mathieu-Daudé * led_set_state: Set the state of a LED device 74c1b29826SPhilippe Mathieu-Daudé * @s: the LED object 75c1b29826SPhilippe Mathieu-Daudé * @is_emitting: boolean indicating whether the LED is emitting 76c1b29826SPhilippe Mathieu-Daudé * 77c1b29826SPhilippe Mathieu-Daudé * This utility is meant for LED connected to GPIO. 78c1b29826SPhilippe Mathieu-Daudé */ 79c1b29826SPhilippe Mathieu-Daudé void led_set_state(LEDState *s, bool is_emitting); 80c1b29826SPhilippe Mathieu-Daudé 81c1b29826SPhilippe Mathieu-Daudé /** 82c1b29826SPhilippe Mathieu-Daudé * led_create_simple: Create and realize a LED device 83c1b29826SPhilippe Mathieu-Daudé * @parentobj: the parent object 84ddb67f64SPhilippe Mathieu-Daudé * @gpio_polarity: GPIO polarity 85c1b29826SPhilippe Mathieu-Daudé * @color: color of the LED 86c1b29826SPhilippe Mathieu-Daudé * @description: description of the LED (optional) 87c1b29826SPhilippe Mathieu-Daudé * 88c1b29826SPhilippe Mathieu-Daudé * Create the device state structure, initialize it, and 89c1b29826SPhilippe Mathieu-Daudé * drop the reference to it (the device is realized). 90c1b29826SPhilippe Mathieu-Daudé * 91c1b29826SPhilippe Mathieu-Daudé * Returns: The newly allocated and instantiated LED object. 92c1b29826SPhilippe Mathieu-Daudé */ 93c1b29826SPhilippe Mathieu-Daudé LEDState *led_create_simple(Object *parentobj, 94ddb67f64SPhilippe Mathieu-Daudé GpioPolarity gpio_polarity, 95c1b29826SPhilippe Mathieu-Daudé LEDColor color, 96c1b29826SPhilippe Mathieu-Daudé const char *description); 97c1b29826SPhilippe Mathieu-Daudé 98c1b29826SPhilippe Mathieu-Daudé #endif /* HW_MISC_LED_H */ 99