aboutsummaryrefslogtreecommitdiff
path: root/1
diff options
context:
space:
mode:
Diffstat (limited to '1')
-rw-r--r--1/fopdrv.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/1/fopdrv.c b/1/fopdrv.c
index d048f15..18a1d35 100644
--- a/1/fopdrv.c
+++ b/1/fopdrv.c
@@ -3,17 +3,37 @@
#include "fopdrv.h"
#include "config.h"
+bool printed = false;
+
// driver/char/mem.c read_null (/dev/null)
ssize_t fop_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
printk("%s(<file>, <buf>, %u, <ppos>)\n", __PRETTY_FUNCTION__, count);
- return 0;
+
+ if (count < 2) return 0;
+ if (printed) return 0;
+
+ ti_am335x_word_t* gpio1 = ioremap(TI_AM335X_GPIO1_ADDR, GPIO_REG_SIZE);
+ barrier();
+
+ ti_am335x_word_t gpio = ioread32(gpio1 + GPIO_DATAIN); rmb();
+ bool on = (gpio & (1<<PIN)) > 0;
+
+ char output[10];
+ snprintf(output, 10, "%d\n", on);
+
+ if (copy_to_user(buf, output + *ppos, 2))
+ return -EFAULT;
+ *ppos += 2;
+ printed = true;
+ return 2;
}
ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {
printk("%s(<file>, <buf>, %u, <ppos>)\n", __PRETTY_FUNCTION__, count);
// only allow single character as input
- if (count != 1) return count;
+ if (count < 1) return count;
+ if (count > 2) return count;
// copy buffer for reading (see [kernel-labs-chrdev] in ../readme.md)
char input_buf[10];
@@ -39,6 +59,7 @@ ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_
int fop_open(struct inode * inode, struct file * file) {
printk("%s(<inode>, <file>)\n", __PRETTY_FUNCTION__);
+ printed = false;
return 0;
// 0 seems to be a safe return value as it's used in driver/char/mem.c. The
// manual page for open(2) says that the system call returns a nonnegative