|
|
@@ -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;
|
|
|
}
|