Przeglądaj źródła

修复buzzer问题

liu qidong [url ssh://qidong.liu@10.2.90.253:29418/] 1 miesiąc temu
rodzic
commit
ab9d280041
1 zmienionych plików z 20 dodań i 3 usunięć
  1. 20 3
      buzzer.c

+ 20 - 3
buzzer.c

@@ -42,7 +42,7 @@ static dev_t dev_num;
 
 struct buzzer_dev
 {
-    char *buffer;
+    unsigned char *buffer;
     size_t size;
     struct mutex lock;
     struct cdev cdev;
@@ -160,6 +160,7 @@ static ssize_t buzzer_write(struct file *filp, const char __user *buf,
     int status_flag = 0;
     int freq = 0;
     int duration = 0;    
+    printk("buzzer: write %d bytes\n", count);
 
     if (mutex_lock_interruptible(&dev->lock))
     {
@@ -191,7 +192,13 @@ static ssize_t buzzer_write(struct file *filp, const char __user *buf,
     freq = (dev->buffer[2]<<8) + dev->buffer[1];
     duration = dev->buffer[3];
 
+    if((status_flag==1) && (freq < 2 || (freq > 15 && freq < 100) || freq > 9999))
+    {
+        mutex_unlock(&dev->lock);
+        return -EINVAL;
+    }
 
+    // printk("%02x %02x  %02x  %02x\n", dev->buffer[0], dev->buffer[1], dev->buffer[2], dev->buffer[3]);
 
     if(status_flag == 1)
     {
@@ -202,18 +209,28 @@ static ssize_t buzzer_write(struct file *filp, const char __user *buf,
         }
         BeepOn(freq);
     }
-    else
+    else if(status_flag == 0)
     {
+        printk("buzzer: BeepOff\n");
         BeepOff();
     }
+    else
+    {
+        mutex_unlock(&dev->lock);
+        return -EINVAL;        
+    }
 
 
 out:
     mutex_unlock(&dev->lock);
 
-    if (ret == 0)
+    if (ret == 0 && status_flag == 1)
     {
+#if defined(PROJECT) && (PROJECT == POS)
+        schedule_delayed_work(&dev->delay_work1, msecs_to_jiffies(duration));
+#else
         schedule_delayed_work(&dev->delay_work1, msecs_to_jiffies(duration*1000));
+#endif
     }
     return count;
 }