|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/workqueue.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
|
|
|
|
#include "gpioregs.h"
|
|
#include "gpioregs.h"
|
|
|
|
|
+#include "smart_battery.h"
|
|
|
|
|
|
|
|
// blue is charge
|
|
// blue is charge
|
|
|
// white is health
|
|
// white is health
|
|
@@ -41,6 +42,7 @@ static struct kobject *batteryled_kobj;
|
|
|
static unsigned int led_charge_val = 0;
|
|
static unsigned int led_charge_val = 0;
|
|
|
static unsigned int led_health_val = 0;
|
|
static unsigned int led_health_val = 0;
|
|
|
static struct delayed_work delay_work1;
|
|
static struct delayed_work delay_work1;
|
|
|
|
|
+static struct delayed_work delay_work2;
|
|
|
|
|
|
|
|
|
|
|
|
|
static int wait_ibf(void)
|
|
static int wait_ibf(void)
|
|
@@ -277,6 +279,42 @@ static struct attribute_group batteryled_attr_group = {
|
|
|
.attrs = batteryled_attrs,
|
|
.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 void delay_work_func(struct work_struct *work)
|
|
|
{
|
|
{
|
|
|
static uint8_t blink_flag = 0;
|
|
static uint8_t blink_flag = 0;
|
|
@@ -387,6 +425,7 @@ int batteryled_init(void)
|
|
|
{
|
|
{
|
|
|
int ret;
|
|
int ret;
|
|
|
INIT_DELAYED_WORK(&delay_work1, delay_work_func);
|
|
INIT_DELAYED_WORK(&delay_work1, delay_work_func);
|
|
|
|
|
+ INIT_DELAYED_WORK(&delay_work2, delay_work_func2);
|
|
|
|
|
|
|
|
/* Create /sys/kernel/vfiec/batteryled */
|
|
/* Create /sys/kernel/vfiec/batteryled */
|
|
|
batteryled_kobj = kobject_create_and_add("batteryled", vfiec_kobj);
|
|
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);
|
|
pr_err("Failed to create sysfs group: %d\n", ret);
|
|
|
goto free_batteryled_kobj;
|
|
goto free_batteryled_kobj;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ schedule_delayed_work(&delay_work1, msecs_to_jiffies(100));
|
|
|
|
|
+ schedule_delayed_work(&delay_work2, msecs_to_jiffies(100));
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
free_batteryled_kobj:
|
|
free_batteryled_kobj:
|