2 * @file fres_acpi_cpu.c
3 * @author Dario Faggioli <faggioli@gandalf.sssup.it>
4 * Michael Trimarchi <trimarchimichael@yahoo.it>
6 * @brief Implementation of LCD related ACPI functions.
10 #include "fra_acpi_lcd.h"
12 static unsigned long bright[3];
14 static lcd_type_t lcd_initialized = NONE;
16 static int __parse_proc_brightness(FILE *fd)
19 int bright_buf[100], n_bright = 0;
20 char *token, *ptr = buffer;
22 if (!fscanf(fd, "levels:%[^\n]", buffer))
25 while ((token = strtok(ptr, " ")) > 0 &&
27 bright_buf[n_bright] = atoi(token);
33 bright[0] = bright_buf[n_bright];
34 bright[1] = bright_buf[((int)ceil((double)n_bright / 2.0f))];
35 bright[3] = bright_buf[0];
40 static inline int __setup_lcd_type()
45 if (lcd_initialized != NONE)
48 fd = fopen(PROC_LCD_PATH_1 "/brightness", "r");
50 ret = __parse_proc_brightness(fd);
53 lcd_initialized = PROC_1;
58 fd = fopen(PROC_LCD_PATH_2 "/brightness", "r");
60 ret = __parse_proc_brightness(fd);
63 lcd_initialized = PROC_2;
68 fd = fopen(SYS_LCD_PATH_1 "/brightness", "r");
70 /* @TODO: to be done! */
72 lcd_initialized = SYS_1;
77 fd = popen("smartdimmer -g", "r");
81 fprintf(stderr, "Problems using smartdimmer\n");
100 static int __set_proc_brightness(FILE *fd, int level)
104 ret = fprintf(fd, "%d", bright[level]);
107 "Could not set brightness level %d\n",
115 static int __set_lcd_brightness(int level)
121 if (lcd_initialized == NONE)
124 if (lcd_initialized == PROC_1) {
125 fd = fopen(PROC_LCD_PATH_1 "/brightness", "w");
129 ret = __set_proc_brightness(fd, level);
132 } else if (lcd_initialized == PROC_2) {
133 fd = fopen(PROC_LCD_PATH_2 "/brightness", "w");
137 ret = __set_proc_brightness(fd, level);
140 } else if (lcd_initialized == SYS_1) {
141 /* @TODO: to be done! */
142 } else if (lcd_initialized == NV) {
143 sprintf(str, "smartdimmer -s %lu", bright[level]);
144 fd = popen(str, "r");
147 "Could not set brightness level %d\n",
158 int fra_LCD_power_init(int lcd)
160 return __setup_lcd_type();
163 int fra_LCD_get_power(int lcd, int *level)
166 * @TODO: to be implemented!
171 int fra_LCD_set_power(int lcd, int level)
173 return __set_lcd_brightness(level);
176 int fra_LCD_get_speed(int lcd, int level, double *ratio)
178 if (lcd_initialized == NONE || level >= 3)
181 *ratio = bright[level]/bright[0];