瀏覽代碼

1、修复bug。2、添加ec version

liu qidong [url ssh://qidong.liu@10.2.90.253:29418/] 3 周之前
父節點
當前提交
e8f25a8015
共有 6 個文件被更改,包括 231 次插入27 次删除
  1. 6 1
      backlight.c
  2. 1 1
      buzzer.h
  3. 1 1
      cash_drawers.h
  4. 85 7
      ec_version.c
  5. 22 0
      include/gpioregs.h
  6. 116 17
      main.c

+ 6 - 1
backlight.c

@@ -166,7 +166,9 @@ static struct attribute_group backlight_attr_group = {
 int backlight_init(void)
 {
     int ret;
-
+#ifndef C181
+    return 0;
+#endif
     max_brightness_val = read_max_brightness();
     if(max_brightness_val <= 0)
     {
@@ -194,6 +196,9 @@ int backlight_init(void)
 
 void backlight_exit(void)
 {
+#ifndef C181
+    return ;
+#endif
     sysfs_remove_group(backlight_kobj, &backlight_attr_group);
     kobject_put(backlight_kobj);
 }

+ 1 - 1
buzzer.h

@@ -1,6 +1,6 @@
 #ifndef __BUZZER_H__
 #define __BUZZER_H__
 
-void buzzer_init(void);
+int buzzer_init(void);
 void buzzer_exit(void);
 #endif

+ 1 - 1
cash_drawers.h

@@ -1,7 +1,7 @@
 #ifndef __CASH_DRAWERS_H__
 #define __CASH_DRAWERS_H__
 
-void cashd_init(void);
+int cashd_init(void);
 void cashd_exit(void);
 
 #endif

+ 85 - 7
ec_version.c

@@ -15,31 +15,109 @@
 #include <linux/poll.h>
 #include <linux/mutex.h>
 #include <linux/delay.h>
-#include "light_ring.h"
+#include <asm/io.h>
+#include "gpioregs.h"
+
+
 
 
 extern struct kobject *vfiec_kobj;
 
 
+static int wait_ibf(void)
+{
+    int i = 0;
+    while (inb(EC_CMD_PORT) & EC_IBF)
+    {
+        if (++i > TIMEOUT_LOOPS)
+        {
+            return -1;
+        }
+        udelay(1);
+    }
+    return 0;
+}
+
+static int wait_obf(void)
+{
+    int i = 0;
+    while (!(inb(EC_CMD_PORT) & EC_OBF))
+    {
+        if (++i > TIMEOUT_LOOPS)
+        {
+            return -1;
+        }
+        udelay(1);
+    }
+    return 0;
+}
+
+static int oem_ec_read_ram(uint8_t page, uint8_t offset, uint8_t *data)
+{
+    unsigned char WEC, REC;
+    switch(page)
+    {
+        case 0:
+        {
+            WEC = 0x96;
+            REC = 0x95;
+            break;
+        }
+        
+        case 1:
+        {
+            WEC = 0x98;
+            REC = 0x97;
+            break;
+        }
+        
+        default:
+        {
+            WEC = EC_VERSION_WEC;
+            REC = EC_VERSION_REC;
+            break;
+        }
+    }    
+    if (wait_ibf() < 0)
+        return -1;
+    outb(REC, EC_CMD_PORT);
+
+    if (wait_ibf() < 0)
+        return -1;
+    outb(offset, EC_DATA_PORT);
+
+    if (wait_obf() < 0)
+        return -1;
+    *data = inb(EC_DATA_PORT);
+
+    return 0;
+}
 /* ==================== mode ==================== */
 static ssize_t fw_version_show(struct kobject *kobj, struct kobj_attribute *attr,
                          char *buf)
 {
+    unsigned char data[4] = {0};
+    int i = 0;
+
+    for(i = 0; i < 4; i++)
+    {
+        oem_ec_read_ram(2, i, &data[i]);
+    }
     // 这里待完善,获取真实的,版本号
-    memcpy(buf, "VF3965U.0x21", strlen("VF3965U.0x21"));
+    sprintf(buf, "%02x%02x%02x%02x", data[0], data[1], data[2], data[3]);
 
-    return strlen("VF3965U.0x21");
+    return 8;
 }
 
-static ssize_t mode_store(struct kobject *kobj, struct kobj_attribute *attr,
+static ssize_t fw_version_store(struct kobject *kobj, struct kobj_attribute *attr,
                           const char *buf, size_t count)
 {
-    printk("mode_store kernel rev:%s\n", buf);
+    printk("fw_version_store kernel rev:%s\n", buf);
     return count;
 }
 
 static struct kobj_attribute ec_version_attr =
-    __ATTR(fw_version, 0444, fw_version_show, mode_store);
+    __ATTR(fw_version, 0444, fw_version_show, fw_version_store);
 
 /* ==================== 属性组 ==================== */
 static struct attribute *ec_version_attrs[] = {
@@ -53,7 +131,7 @@ static struct attribute_group ec_version_attr_group = {
 
 int ec_version_init(void)
 {
-    int ret;
+    int ret = 0;
 
     /* 创建属性文件 */
     ret = sysfs_create_group(vfiec_kobj, &ec_version_attr_group);

+ 22 - 0
include/gpioregs.h

@@ -12,4 +12,26 @@
 
 
 #define SSEGMENT_POINT 0xFD6A0960
+
+#define EC_CMD_PORT 0x66
+#define EC_DATA_PORT 0x62
+
+#define EC_VERSION_WEC 0x81
+#define EC_VERSION_REC 0x80
+
+
+#define EC_OBF 0x01 // Output Buffer Full
+#define EC_IBF 0x02 // Input Buffer Full
+
+#define CMD_READ_RAM 0x97
+#define CMD_WRITE_RAM 0x98
+
+#define OFFSET_COLOR_CTL 0x01
+#define OFFSET_BLINK_TIME 0x02
+#define OFFSET_BLINK_CTL 0x03
+#define OFFSET_TURNOFF_CTL 0x04
+
+#define BIT0 (1 << 0)
+#define TIMEOUT_LOOPS 100000
+
 #endif

+ 116 - 17
main.c

@@ -41,24 +41,123 @@ static int __init all_driver_init(void)
     if (!vfiec_kobj)
     {
         ret = -ENOMEM;
+        return ret;
     }
 
-    backlight_init();
-    switches_init();
-    power_init();
-    watchdog_init();
-    batteryled_init();
-    cashd_init();
-    myname_init();
-    writeprotect_init();
-    fan_init();
-    buzzer_init();
-    ec_version_init();
-    light_ring_init();
-    led_init();
-    ssegment_init();
+    ret = backlight_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "backlight_init failed\n");
+        goto out_kobject_put;
+    }
+    ret = switches_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "switches_init failed\n");
+        goto out_backlight;
+    }
+    ret = power_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "power_init failed\n");
+        goto out_switches;
+    }
+    ret = watchdog_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "watchdog_init failed\n");
+        goto out_power;
+    }
+    ret = batteryled_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "batteryled_init failed\n");
+        goto out_watchdog;
+    }
+    ret = cashd_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "cashd_init failed\n");
+        goto out_batteryled;
+    }
+    ret = myname_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "myname_init failed\n");
+        goto out_cashd;
+    }
+    ret = writeprotect_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "writeprotect_init failed\n");
+        goto out_myname;
+    }
+    ret = fan_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "fan_init failed\n");
+        goto out_writeprotect;
+    }
+    ret = buzzer_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "buzzer_init failed\n");
+        goto out_fan;
+    }
+    ret = ec_version_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "ec_version_init failed\n");
+        goto out_buzzer;
+    }
+    ret = light_ring_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "light_ring_init failed\n");
+        goto out_ec_version;
+    }
+    ret = led_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "led_init failed\n");
+        goto out_light_ring;
+    }
+    ret = ssegment_init();
+    if(ret != 0)
+    {
+        printk(KERN_ERR "sssegment_init failed\n");
+        goto out_led;
+    }
     printk(KERN_INFO "all_driver_init\n");
-
+    return ret;
+out_led:
+    led_exit();
+out_light_ring:
+    light_ring_exit();
+out_ec_version:
+    ec_version_exit();
+out_buzzer:
+    buzzer_exit();
+out_fan:
+    fan_exit();
+out_writeprotect:
+    writeprotect_exit();
+out_myname:
+    myname_exit();
+out_cashd:
+    cashd_exit();
+out_batteryled:
+    batteryled_exit();
+out_watchdog:
+    watchdog_exit();
+out_power:
+    power_exit();
+out_switches:
+    switches_exit();
+out_backlight:
+    backlight_exit();
+out_kobject_put:
+    kobject_put(vfiec_kobj);
     return ret;
 }
 
@@ -75,9 +174,9 @@ static void __exit all_driver_exit(void)
     fan_exit();
     buzzer_exit();
     ec_version_exit();
-    ssegment_exit();
-    led_exit();
     light_ring_exit();
+    led_exit();
+    ssegment_exit();
     kobject_put(vfiec_kobj);
 }