Преглед на файлове

完善背光功能模块

monkeylqd преди 3 седмици
родител
ревизия
54ef3e6fbf
променени са 1 файла, в които са добавени 124 реда и са изтрити 4 реда
  1. 124 4
      backlight.c

+ 124 - 4
backlight.c

@@ -20,22 +20,133 @@
 
 extern struct kobject *vfiec_kobj;
 static struct kobject *backlight_kobj = NULL;
+static int brightness_val = 0;
+static int max_brightness_val = 1;
 
+#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight/brightness"
+
+
+// 从sysfs读取当前亮度值
+static int read_current_brightness(void)
+{
+    struct file *filp = NULL;
+    char buf[32] = {0};
+    loff_t pos = 0;
+    int ret = -EIO;
+    int brightness = -1;
+    
+    filp = filp_open(BACKLIGHT_PATH, O_RDONLY, 0);
+    if (IS_ERR(filp)) {
+        pr_err("Failed to open backlight file: %ld\n", PTR_ERR(filp));
+        return -EIO;
+    }
+    
+    ret = kernel_read(filp, buf, sizeof(buf) - 1, &pos);
+    if (ret > 0) {
+        buf[ret] = '\0';
+        if (kstrtoint(buf, 10, &brightness) != 0) {
+            pr_err("Failed to parse brightness value\n");
+            brightness = -EINVAL;
+        }
+    }
+    
+    filp_close(filp, NULL);
+    return brightness;
+}
+
+static int read_max_brightness(void)
+{
+    struct file *filp = NULL;
+    loff_t pos = 0;
+    int max_brightness;
+    filp = filp_open("/sys/class/backlight/intel_backlight/max_brightness", O_RDONLY, 0);
+    if (!IS_ERR(filp)) {
+        char max_buf[32] = {0};
+        kernel_read(filp, max_buf, sizeof(max_buf) - 1, &pos);
+        if (kstrtoint(max_buf, 10, &max_brightness) != 0) 
+        {
+                filp_close(filp, NULL);
+                return -EINVAL;
+        }
+        filp_close(filp, NULL);
+    }
+    return max_brightness;
+}
+
+// 向sysfs写入亮度值
+static int write_brightness_value(int value)
+{
+    struct file *filp = NULL;
+    char buf[32] = {0};
+    loff_t pos = 0;
+    int ret = -EIO;
+    int max_brightness;
+    
+    // 先读取最大值进行边界检查
+    filp = filp_open("/sys/class/backlight/intel_backlight/max_brightness", O_RDONLY, 0);
+    if (!IS_ERR(filp)) {
+        char max_buf[32] = {0};
+        kernel_read(filp, max_buf, sizeof(max_buf) - 1, &pos);
+        if (kstrtoint(max_buf, 10, &max_brightness) == 0) {
+            if (value < 0 || value > max_brightness) {
+                pr_err("Brightness value %d out of range [0, %d]\n", value, max_brightness);
+                filp_close(filp, NULL);
+                return -EINVAL;
+            }
+        }
+        filp_close(filp, NULL);
+    }
+    
+    // 写入亮度值
+    filp = filp_open(BACKLIGHT_PATH, O_WRONLY, 0);
+    if (IS_ERR(filp)) {
+        pr_err("Failed to open backlight file for write: %ld\n", PTR_ERR(filp));
+        return -EIO;
+    }
+    
+    snprintf(buf, sizeof(buf), "%d", value);
+    ret = kernel_write(filp, buf, strlen(buf), &pos);
+    
+    filp_close(filp, NULL);
+    
+    return (ret > 0) ? 0 : -EIO;
+}
 
 /* ==================== mode ==================== */
 static ssize_t brightness_show(struct kobject *kobj, struct kobj_attribute *attr,
                          char *buf)
 {
-    static int count = 0;
-    count++;
+    static int val = 0;
+    brightness_val = read_current_brightness();
+    if(max_brightness_val == 0 || max_brightness_val > 960)
+    {
+        max_brightness_val = 960;
+    }
+    val = brightness_val*100/max_brightness_val;
+    if(val > 100)
+    {
+        val = 100;
+    }
 
-    return sprintf(buf, "mode_show count=%d\n", count);
+    return sprintf(buf, "%d\n", val);
 }
 
 static ssize_t brightness_store(struct kobject *kobj, struct kobj_attribute *attr,
                           const char *buf, size_t count)
 {
-    printk("mode_store kernel rev:%s\n", buf);
+    int ret = 0;
+    long val;
+    if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 100)
+    {
+		return -EINVAL;
+    }
+
+    brightness_val = val*max_brightness_val/100;
+    if(brightness_val > 960)
+    {
+        brightness_val = 960;
+    }
+    ret = write_brightness_value(brightness_val);
     return count;
 }
 
@@ -55,6 +166,15 @@ static struct attribute_group backlight_attr_group = {
 int backlight_init(void)
 {
     int ret;
+
+    max_brightness_val = read_max_brightness();
+    if(max_brightness_val <= 0)
+    {
+        pr_err("Failed to read max brightness value\n");
+        return -EIO;
+    }
+
+    brightness_val = read_current_brightness();
         /* 创建 /sys/kernel/vfiec/lightring */
     backlight_kobj = kobject_create_and_add("backlight", vfiec_kobj);
     if (!backlight_kobj)