Преглед изворни кода

1、修钱箱状态打印。2、修复myname换行

qidong.liu пре 4 недеља
родитељ
комит
651bae5cfb
2 измењених фајлова са 22 додато и 15 уклоњено
  1. 13 6
      cash_drawers.c
  2. 9 9
      myname.c

+ 13 - 6
cash_drawers.c

@@ -35,12 +35,12 @@ struct cashd_device {
     unsigned int in_status;
     unsigned int status_changed;
     int last_status;
-    int read_flag;
+    int first_read;
     struct delayed_work delay_work1;
     struct delayed_work delay_work2;
     void __iomem *gpio_ctl_reg_base;
     void __iomem *gpio_status_reg_base;
-    // int count; // debug code
+    int count; // debug code
 };
 
 static int cashd_major = 0;
@@ -106,7 +106,7 @@ static int cashd_open(struct inode *inode, struct file *filp)
     }
 
     filp->private_data = dev;
-    dev->read_flag = 0;
+    dev->first_read = 0;
     pr_info("cashd: Device /dev/cashd%d opened\n", minor);
     
     return 0;
@@ -125,17 +125,23 @@ static ssize_t cashd_read(struct file *filp, char __user *buf,
     struct cashd_device *dev = filp->private_data;
     ssize_t bytes_read = 0;
     int ret = 0;
+    int nonblock = filp->f_flags & O_NONBLOCK;
 
     if (!dev)
         return -EINVAL;
     
     if (!buf || count == 0)
         return -EINVAL;
-    if(dev->read_flag >= 1)
+    if(dev->first_read == 0)
     {
-        return 0;
+        dev->first_read = 1;
+    }
+    else if (wait_event_interruptible(dev->read_wait, dev->status_changed))
+    {
+            // 被信号中断
+            printk(KERN_INFO "gpio_monitor: wait interrupted by signal\n");
+            return -ERESTARTSYS;
     }
-    dev->read_flag++;
     dev->in_status = readl(dev->gpio_status_reg_base);
 
     if(dev->in_status & 0x2)
@@ -239,6 +245,7 @@ static int __init cashd_init_device(struct cashd_device *dev, int minor)
     dev->buffer_size = BUFFER_SIZE;
     dev->dev_major = cashd_major;
     dev->dev_minor = minor;
+    dev->last_status = -1;
     
     init_waitqueue_head(&dev->read_wait);
     

+ 9 - 9
myname.c

@@ -193,25 +193,25 @@ int get_board_id(void)
     }
     if(board_id == 0)
     {
-        memcpy(dev->buffer, "ci (Ruby Ci)", strlen("ci (Ruby Ci)"));
-        dev->size = strlen("ci (Ruby Ci)");
+        memcpy(dev->buffer, "ci (Ruby Ci)\n", strlen("ci (Ruby Ci)\n"));
+        dev->size = strlen("ci (Ruby Ci)\n");
     }
     else if(board_id >= 1 && board_id <= 7)
     {
-        memcpy(dev->buffer, "python (c18)", strlen("python (c18)"));
-        dev->size = strlen("python (c18)");
+        memcpy(dev->buffer, "python (c18)\n", strlen("python (c18)\n"));
+        dev->size = strlen("python (c18)\n");
     }
     else if(board_id >= 8 && board_id <= 11)
     {
-        memcpy(dev->buffer, "selene", strlen("selene"));
-        dev->size = strlen("selene");
+        memcpy(dev->buffer, "selene\n", strlen("selene\n"));
+        dev->size = strlen("selene\n");
     }
     else if(board_id >= 12 && board_id <= 15)
     {
-        memcpy(dev->buffer, "cobra (Commander Ci)", strlen("cobra (Commander Ci)"));
-        dev->size = strlen("cobra (Commander Ci)");
+        memcpy(dev->buffer, "cobra (Commander Ci)\n", strlen("cobra (Commander Ci)\n"));
+        dev->size = strlen("cobra (Commander Ci)\n");
     }
-    printk(KERN_ERR "myname: board_id = %d\n", board_id);
+    // printk(KERN_ERR "myname: board_id = %d\n", board_id);
     return board_id;
 }