فهرست منبع

修复led heartbeat驱动

liu qidong [url ssh://qidong.liu@10.2.90.253:29418/] 1 ماه پیش
والد
کامیت
549a427321
2فایلهای تغییر یافته به همراه9 افزوده شده و 25 حذف شده
  1. 9 18
      led_heartbeat.c
  2. 0 7
      test_app/setled.c

+ 9 - 18
led_heartbeat.c

@@ -181,13 +181,11 @@ static int oem_ec_write_ram(uint8_t page, uint8_t offset, uint8_t data)
 static void heart_led_turn_on(void)
 {
     oem_ec_write_ram(1, OFFSET_TURNOFF_CTL, 0x00);
-    printk("%s %s %d.\n", __FILE__, __FUNCTION__, __LINE__);
 }
 
 static void heart_led_turn_off(void)
 {
     oem_ec_write_ram(1, OFFSET_TURNOFF_CTL, 0x01);
-    printk("%s %s %d.\n", __FILE__, __FUNCTION__, __LINE__);
 }
 
 static int led_set_color(led_color_t color)
@@ -258,7 +256,6 @@ static ssize_t led_heartbeat_write(struct file *filp, const char __user *buf, si
     led_color = kbuff[0];
     led_blink_flag = kbuff[1];
     led_blink_speed = kbuff[2];
-    printk("%02x %02x %02x\n", kbuff[0], kbuff[1], kbuff[2]);
 
     if(led_color == 0x00)
     {
@@ -277,14 +274,15 @@ static ssize_t led_heartbeat_write(struct file *filp, const char __user *buf, si
         led_set_color(LED_GREEN);
     }
 
-    led_set_blink(led_blink_flag, kbuff[2]);
-    return count;
+    // led_set_blink(led_blink_flag, kbuff[2]);
+    // return count;
 
+    // The following code is reserved because the blink cycle of EC is incorrect. If the EC cannot be changed, we have to delay the work queue.
     if(led_blink_flag)
     {
-        led_set_blink(1, led_blink_speed);
-        // blink_count = 0;
-        // schedule_delayed_work(&delay_work1, msecs_to_jiffies(1000*led_blink_speed));        
+        // led_set_blink(1, led_blink_speed);
+        blink_count = 0;
+        schedule_delayed_work(&delay_work1, msecs_to_jiffies(1000*led_blink_speed));
     }
     return count;
 }
@@ -302,6 +300,7 @@ static void led_heartbeat_work_func(struct work_struct *work)
 
     if(led_blink_flag)
     {
+        blink_count++;
         if(blink_count%2 == 0)
         {
             if(led_color == 0x40)
@@ -317,10 +316,8 @@ static void led_heartbeat_work_func(struct work_struct *work)
         }
         else
         {
-            printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
             heart_led_turn_off();
         }
-        blink_count++;
         schedule_delayed_work(&delay_work1, msecs_to_jiffies(1000*led_blink_speed));
     }
 }
@@ -330,18 +327,14 @@ int led_heartbeat_init(void)
     dev_t dev_num;
     int ret;
 
-    // 使用指定的主设备号和次设备号
     dev_num = MKDEV(led_heartbeat_MAJOR, led_heartbeat_MINOR);
-    
-    // 注册设备号
+
     ret = register_chrdev_region(dev_num, 1, DEVICE_NAME);
     if (ret < 0) {
         pr_err("Failed_heartbeat to register device number %d:%d\n", led_heartbeat_MAJOR, led_heartbeat_MINOR);
         return ret;
     }
-    pr_info("led_heartbeat driver loaded, device number = %d:%d\n", led_heartbeat_MAJOR, led_heartbeat_MINOR);
 
-    // 初始化 cdev 并添加到系统
     cdev_init(&led_heartbeat_cdev, &led_heartbeat_fops);
     led_heartbeat_cdev.owner = THIS_MODULE;
     ret = cdev_add(&led_heartbeat_cdev, dev_num, 1);
@@ -351,7 +344,6 @@ int led_heartbeat_init(void)
         return ret;
     }
 
-    // 创建设备类
     led_heartbeat_class = class_create(THIS_MODULE, CLASS_NAME);
     if (IS_ERR(led_heartbeat_class)) {
         pr_err("Failed_heartbeat to create class\n");
@@ -360,7 +352,6 @@ int led_heartbeat_init(void)
         return PTR_ERR(led_heartbeat_class);
     }
 
-    // 创建设备节点
     led_heartbeat_device = device_create(led_heartbeat_class, NULL, dev_num, NULL, DEVICE_NAME);
     if (IS_ERR(led_heartbeat_device)) {
         pr_err("Failed_heartbeat to create device\n");
@@ -372,13 +363,13 @@ int led_heartbeat_init(void)
 
     INIT_DELAYED_WORK(&delay_work1, led_heartbeat_work_func);
 
-    pr_info("led_heartbeat driver initialized successfully\n");
     return 0;
 }
 
 void led_heartbeat_exit(void)
 {
     dev_t dev_num = MKDEV(led_heartbeat_MAJOR, led_heartbeat_MINOR);
+    cancel_delayed_work_sync(&delay_work1);
 
     device_destroy(led_heartbeat_class, dev_num);
     class_destroy(led_heartbeat_class);

+ 0 - 7
test_app/setled.c

@@ -28,7 +28,6 @@ int main(int argc, char *argv[])
     char buff[3];
     if (argc == 2)
     {
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
         if(strcmp(argv[1], "off") == 0)
         {
             buff[0] = 0x00;
@@ -38,7 +37,6 @@ int main(int argc, char *argv[])
     }
     else if (argc == 3)
     {
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
         if(strcmp(argv[1], "red") == 0)
         {
             buff[0] = 0x40;
@@ -66,7 +64,6 @@ int main(int argc, char *argv[])
     }
     else if (argc == 4)
     {
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
         if(strcmp(argv[1], "red") == 0)
         {
             buff[0] = 0x40;
@@ -96,12 +93,10 @@ int main(int argc, char *argv[])
     }
     else
     {
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
         usage();
         return -1;
     }
 
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
     fd = open(DEVICE_PATH, O_RDWR);
     if (fd < 0)
     {
@@ -109,7 +104,6 @@ int main(int argc, char *argv[])
         return -1;
     }
 
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
     ret = write(fd, buff, sizeof(buff));
     if (ret < 0)
     {
@@ -118,7 +112,6 @@ int main(int argc, char *argv[])
         return -1;
     }
 
-        printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
     close(fd);
     return 0;
 }