18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * uledmon.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This program creates a new userspace LED class device and monitors it. A 68c2ecf20Sopenharmony_ci * timestamp and brightness value is printed each time the brightness changes. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Usage: uledmon <device-name> 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * <device-name> is the name of the LED class device to be created. Pressing 118c2ecf20Sopenharmony_ci * CTRL+C will exit. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <fcntl.h> 158c2ecf20Sopenharmony_ci#include <stdio.h> 168c2ecf20Sopenharmony_ci#include <string.h> 178c2ecf20Sopenharmony_ci#include <time.h> 188c2ecf20Sopenharmony_ci#include <unistd.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/uleds.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ciint main(int argc, char const *argv[]) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci struct uleds_user_dev uleds_dev; 258c2ecf20Sopenharmony_ci int fd, ret; 268c2ecf20Sopenharmony_ci int brightness; 278c2ecf20Sopenharmony_ci struct timespec ts; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (argc != 2) { 308c2ecf20Sopenharmony_ci fprintf(stderr, "Requires <device-name> argument\n"); 318c2ecf20Sopenharmony_ci return 1; 328c2ecf20Sopenharmony_ci } 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci strncpy(uleds_dev.name, argv[1], LED_MAX_NAME_SIZE); 358c2ecf20Sopenharmony_ci uleds_dev.max_brightness = 100; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci fd = open("/dev/uleds", O_RDWR); 388c2ecf20Sopenharmony_ci if (fd == -1) { 398c2ecf20Sopenharmony_ci perror("Failed to open /dev/uleds"); 408c2ecf20Sopenharmony_ci return 1; 418c2ecf20Sopenharmony_ci } 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci ret = write(fd, &uleds_dev, sizeof(uleds_dev)); 448c2ecf20Sopenharmony_ci if (ret == -1) { 458c2ecf20Sopenharmony_ci perror("Failed to write to /dev/uleds"); 468c2ecf20Sopenharmony_ci close(fd); 478c2ecf20Sopenharmony_ci return 1; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci while (1) { 518c2ecf20Sopenharmony_ci ret = read(fd, &brightness, sizeof(brightness)); 528c2ecf20Sopenharmony_ci if (ret == -1) { 538c2ecf20Sopenharmony_ci perror("Failed to read from /dev/uleds"); 548c2ecf20Sopenharmony_ci close(fd); 558c2ecf20Sopenharmony_ci return 1; 568c2ecf20Sopenharmony_ci } 578c2ecf20Sopenharmony_ci clock_gettime(CLOCK_MONOTONIC, &ts); 588c2ecf20Sopenharmony_ci printf("[%ld.%09ld] %u\n", ts.tv_sec, ts.tv_nsec, brightness); 598c2ecf20Sopenharmony_ci } 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci close(fd); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci return 0; 648c2ecf20Sopenharmony_ci} 65