Bladeren bron

优化batteryLED功能

qidong.liu 1 maand geleden
bovenliggende
commit
770a1e2280
4 gewijzigde bestanden met toevoegingen van 91 en 12 verwijderingen
  1. 42 0
      batteryled.c
  2. 11 11
      main.c
  3. 31 1
      smart_battery.c
  4. 7 0
      smart_battery.h

+ 42 - 0
batteryled.c

@@ -21,6 +21,7 @@
 #include <linux/workqueue.h>
 
 #include "gpioregs.h"
+#include "smart_battery.h"
 
 // blue is charge
 // white is health
@@ -41,6 +42,7 @@ static struct kobject *batteryled_kobj;
 static unsigned int led_charge_val = 0;
 static unsigned int led_health_val = 0;
 static struct delayed_work delay_work1;
+static struct delayed_work delay_work2;
 
 
 static int wait_ibf(void)
@@ -277,6 +279,42 @@ static struct attribute_group batteryled_attr_group = {
     .attrs = batteryled_attrs,
 };
 
+static void delay_work_func2(struct work_struct *work)
+{
+    struct smart_battery_info info;
+    int ret = 0;
+    ret = get_battery_info(&info);
+    if(ret == 0)
+    {
+        if(info.capacity >= 50)
+        {
+            led_health_val = 0x2;
+        }
+        else if(info.capacity < 50 && info.capacity >= 20)
+        {
+            led_health_val = 0x1;
+        }
+        else
+        {
+            led_health_val = 0x3;
+        }
+
+        if(info.status == 0x00)
+        {
+            led_charge_val = 0x0;
+            led_health_val = 0x0;
+        }
+        else if(info.status == 0x01)
+        {
+            led_charge_val = 0x4;
+        }
+        else if(info.status == 0x02)
+        {
+            led_charge_val = 0x2;            
+        }
+    }
+    schedule_delayed_work(&delay_work2, msecs_to_jiffies(5000));
+}
 static void delay_work_func(struct work_struct *work)
 {
     static uint8_t blink_flag = 0;
@@ -387,6 +425,7 @@ int batteryled_init(void)
 {
     int ret;
     INIT_DELAYED_WORK(&delay_work1, delay_work_func);
+    INIT_DELAYED_WORK(&delay_work2, delay_work_func2);
 
         /* Create /sys/kernel/vfiec/batteryled */
     batteryled_kobj = kobject_create_and_add("batteryled", vfiec_kobj);
@@ -403,6 +442,9 @@ int batteryled_init(void)
         pr_err("Failed to create sysfs group: %d\n", ret);
         goto free_batteryled_kobj;
     }
+    
+    schedule_delayed_work(&delay_work1, msecs_to_jiffies(100));
+    schedule_delayed_work(&delay_work2, msecs_to_jiffies(100));
     return 0;
 
 free_batteryled_kobj:

+ 11 - 11
main.c

@@ -85,17 +85,17 @@ static int __init all_driver_init(void)
         printk(KERN_ERR "watchdog_init failed\n");
         goto out_power;
     }
-    ret = batteryled_init();
+    ret = battery_acpi_driver_init();
     if(ret != 0)
     {
-        printk(KERN_ERR "batteryled_init failed\n");
+        printk(KERN_ERR "battery_acpi_driver_init failed\n");
         goto out_watchdog;
     }
     ret = cashd_init();
     if(ret != 0)
     {
         printk(KERN_ERR "cashd_init failed\n");
-        goto out_batteryled;
+        goto out_battery_acpi;
     }
     ret = myname_init();
     if(ret != 0)
@@ -158,18 +158,18 @@ static int __init all_driver_init(void)
         goto out_gensor;
     }
 
-    ret = battery_acpi_driver_init();
+    ret = batteryled_init();
     if(ret != 0)
     {
-        printk(KERN_ERR "battery_acpi_driver_init failed\n");
-        goto out_lcd;
+        printk(KERN_ERR "batteryled_init failed\n");
+        goto out_gensor;
     }
 
     ret = voltage_sysfs_init();
     if(ret != 0)
     {
         printk(KERN_ERR "voltage_sysfs_init failed\n");
-        goto out_battery_acpi;
+        goto out_batteryled;
     }
 
     ret = led_heartbeat_init();
@@ -212,8 +212,8 @@ out_led_heartbeat:
     led_heartbeat_exit();
 out_voltage_sysfs:
     voltage_sysfs_exit();
-out_battery_acpi:
-    battery_acpi_driver_exit();
+out_batteryled:
+    batteryled_exit();
 out_lcd:
     lcd2x20_exit();
 out_gensor:
@@ -236,8 +236,8 @@ out_myname:
     myname_exit();
 out_cashd:
     cashd_exit();
-out_batteryled:
-    batteryled_exit();
+out_battery_acpi:
+    battery_acpi_driver_exit();
 out_watchdog:
     watchdog_exit();
 out_power:

+ 31 - 1
smart_battery.c

@@ -9,6 +9,8 @@
 #include <linux/power_supply.h>
 #include <linux/mutex.h>
 
+#include "smart_battery.h"
+
 #define DEVICE_NAME "smart_battery"
 #define CLASS_NAME "battery_acpi_class"
 
@@ -46,7 +48,7 @@ struct battery_acpi_device {
     unsigned int ioctl_count;
 };
 
-static struct battery_acpi_device *g_battery_dev;
+static struct battery_acpi_device *g_battery_dev = NULL;
 
 static const char* find_battery_name(void)
 {
@@ -265,6 +267,34 @@ static int battery_release(struct inode *inode, struct file *file)
     return 0;
 }
 
+int get_battery_info(struct smart_battery_info *info)
+{
+    if(info == NULL)
+        return -1;
+    
+    if(g_battery_dev == NULL)
+        return -1;
+    update_battery_data(g_battery_dev);
+    if(g_battery_dev->present == 0)
+    {
+        info->status = 0;
+        return 0;
+    }
+
+    if(g_battery_dev->status == POWER_SUPPLY_STATUS_CHARGING)
+    {
+        info->status = 1;
+    }
+    else
+    {
+        info->status = 2;
+    }
+
+    info->capacity = g_battery_dev->capacity;
+
+    return 0;
+}
+
 static ssize_t battery_read(struct file *file, char __user *buf, 
                            size_t count, loff_t *f_pos)
 {

+ 7 - 0
smart_battery.h

@@ -1,6 +1,13 @@
 #ifndef __SMART_BATTERY_H__
 #define __SMART_BATTERY_H__
 
+struct smart_battery_info
+{
+    unsigned char status;         // 0-NOT PRESENT, 1-CHARGING, 2-NOT CHARGED
+    unsigned char capacity;       // 0-100
+};
+
+int get_battery_info(struct smart_battery_info *info);
 int battery_acpi_driver_init(void);
 void battery_acpi_driver_exit(void);