/* * C-programmet eks5.c */ #include #include #include #include /* kmalloc() */ #include /* copy_from_user() */ #include /* file_operations */ #include /* misc_register() */ #include /* EIO osv. */ #include /* outb() */ #define EKS5_MINOR 200 /* andrehÄnds enhetsnummer */ #define EKS5_BUFLEN 64*1024 /* 64K buffer */ #define PORTADRESSE 0x378 /* 0x378, evt. 0x278 */ /* prototyper for funksjoner som er definert lenger ned */ ssize_t eks5_write(struct file *filp, const char *buffer, size_t count, loff_t *f_pos); int eks5_open(struct inode* ino, struct file* filp); int eks5_release(struct inode* ino, struct file* filp); static char *kjernebuffer; struct file_operations eks5_fops = { owner: THIS_MODULE, write: eks5_write, open: eks5_open, release: eks5_release }; struct miscdevice eks5_dev = { EKS5_MINOR, "eks5", &eks5_fops }; /* * Funksjonen som henter dataene som brukerprogrammet har sendt til * systemkallet write() */ ssize_t eks5_write(struct file *filp, const char *brukerbuffer, size_t antall_tegn, loff_t *f_pos) { /* dersom flere enn EKS5_BUFLEN tegn tilbys, les kun inn EKS5_BUFLEN tegn */ if (antall_tegn > EKS5_BUFLEN) antall_tegn = EKS5_BUFLEN; printk("eks5: leser fra brukerrom\n"); if (copy_from_user(kjernebuffer, brukerbuffer, antall_tegn) != 0) return 0; if (kjernebuffer[0] == '1') { outb(1, PORTADRESSE); printk("eks5: datalinje 0 satt til 1\n"); } else { outb(0, PORTADRESSE); printk("eks5: datalinje 0 satt til 0\n"); } /* la det virtuelle filsystemet tro at det er snakk om en stor fil som vi skriver mere og mere data inn i */ f_pos += antall_tegn; return antall_tegn; } /* * Motsvarer open() */ int eks5_open(struct inode* ino, struct file* filp) { printk("eks5: i open()\n"); kjernebuffer = (char *) kmalloc(EKS5_BUFLEN, GFP_KERNEL); if (!kjernebuffer) return -1; return 0; } /* * Motsvarer close() */ int eks5_release(struct inode* ino, struct file* filp) { printk("eks5: i release()\n"); kfree(kjernebuffer); return 0; } /* * Modul-spesifikk kode */ static int eks5_init(void) { if (misc_register(&eks5_dev)) { printk("eks5: misc_register feilet, avslutter ...\n"); return -EIO; } else printk("eks5: init ok\n"); return 0; } static void eks5_exit(void) { if (misc_deregister(&eks5_dev) != 0) printk("eks5: misc_deregister feilet\n"); else printk("eks5: exit ok\n"); } module_init(eks5_init); module_exit(eks5_exit); MODULE_LICENSE("PUBLIC DOMAIN"); MODULE_AUTHOR("UNIVERSITETET I OSLO");