Hi,
I am trying to build a simple character device driver which supports only the open, read and release interface. The code compiles fine and the module gets inserted also fine but when I do cat <device name>, the read function is entered multiple times, resulting in multiple and same outputs("we did it" repeated continously). I am using Suse 9.2 with kernel 2.6.8-24.11. The following is the code and outputs.
Thanks
Siddharth
//Building a character device driver
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <asm/uaccess.h>
static int Major; static int devOpen; static char msg[80]; static char*msgPtr; static int moduleOpen(struct inode *,struct file *); static ssize_t moduleRead(struct file *,char *,size_t,loff_t *); static int moduleRelease(struct inode *,struct file *);
#define DEV_NAME "myModule"
static struct file_operations fops = { .read=moduleRead, .open=moduleOpen, .release=moduleRelease };
int startup(void) { printk(KERN_EMERG "I am in\n"); devOpen=0; Major=register_chrdev(0,DEV_NAME,&fops); if (Major <0) { printk(KERN_EMERG "wtf!?\n"); return Major; } printk(KERN_EMERG "Heres ur maj no:%d\n",Major); return 0; }
void cleanup(void) { printk(KERN_EMERG "Have to go..\n"); unregister_chrdev(Major,DEV_NAME); }
static int moduleOpen(struct inode *in,struct file *fi) { if(devOpen==1) return -EBUSY; devOpen++; sprintf(msg,"we did it"); msgPtr=msg; printk(KERN_EMERG "Open seeeaa..\n"); return 0; }
static ssize_t moduleRead(struct file *fi,char *buff, size_t len, loff_t * offs){
static int cnt=8;
printk(KERN_EMERG "Reading %d\n",len);
while(cnt>=0&&len) { put_user(*msgPtr,buff); msgPtr++; buff++; cnt--; } //put_user('\0',buff); return len; }
static int moduleRelease(struct inode *in,struct file* fi) { printk(KERN_EMERG "Release me...\n"); devOpen--; return 0; }
module_init(startup); module_exit(cleanup); MODULE_LICENSE("GPL and additional rights");
--------------------------------------------------------------------------------------------------------------------------------------------------
Output (log messages)
Mar 21 01:19:32 linux kernel: module first_module unsupported by SUSE/Novell, tainting kernel.
Mar 21 01:19:32 linux kernel: I am in
Mar 21 01:19:32 linux kernel: Heres ur maj no:253
Mar 21 01:19:46 linux kernel: Open seeeaa..
Mar 21 01:19:46 linux kernel: Reading 4096
Mar 21 01:19:46 linux last message repeated 177 times
Mar 21 01:19:46 linux kernel: Release me...
Mar 21 01:19:56 linux kernel: Have to go..
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/