aboutsummaryrefslogtreecommitdiff
path: root/1/fopdrv.c
diff options
context:
space:
mode:
Diffstat (limited to '1/fopdrv.c')
-rw-r--r--1/fopdrv.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/1/fopdrv.c b/1/fopdrv.c
index 2c74fea..e0ad41c 100644
--- a/1/fopdrv.c
+++ b/1/fopdrv.c
@@ -2,13 +2,29 @@
// 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>, %lu, <ppos>)\n", __PRETTY_FUNCTION__, count);
+ printk("%s(<file>, <buf>, %u, <ppos>)\n", __PRETTY_FUNCTION__, count);
return 0;
}
// driver/char/mem.c write_null
ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {
- printk("%s(<file>, <buf>, %lu, <ppos>)\n", __PRETTY_FUNCTION__, count);
+ printk("%s(<file>, <buf>, %u, <ppos>)\n", __PRETTY_FUNCTION__, count);
+
+ // only allow single character as input
+ if (count != 1) return count;
+
+ // copy buffer for reading (see [kernel-labs-chrdev] in ../readme.md)
+ char input_buf[10];
+ if (copy_from_user(input_buf + *ppos, buf, count))
+ return -EFAULT;
+
+ if (input_buf[0] == '0') {
+ printk("TODO: TURN OFF OUTPUT\n");
+ }
+ if (input_buf[0] == '1') {
+ printk("TODO: TURN ON OUTPUT\n");
+ }
+
return count;
}