On Sat, Sep 25, 2010 at 9:46 PM, Bond <jamesbond.2k.g@xxxxxxxxx> wrote:
Yes, it is possible to pass in 0 for register_chrdev. Please be clear what you want to achieve, from your subject line & the post. The subject line & the first few lines of the post indicates that you need something which prints only the last character. And you go on creating a rucus around here. I have updated the code & attached it. This can only read & write 10 characters. Now, please dont tell us that it is not you wanted or it doesn't work. Please spare us.
On Sun, Sep 26, 2010 at 3:43 AM, Venkatram Tummala <venkatram867@xxxxxxxxx> wrote:
This will print the the last character of the string you wrote.If you would have read the thread from my first post printing the last character is not my objective I am trying to print the complete string.
Yes, it is possible to pass in 0 for register_chrdev. Please be clear what you want to achieve, from your subject line & the post. The subject line & the first few lines of the post indicates that you need something which prints only the last character. And you go on creating a rucus around here. I have updated the code & attached it. This can only read & write 10 characters. Now, please dont tell us that it is not you wanted or it doesn't work. Please spare us.
As a side note, please spare us all with all this non-sense. We have better things to do in our life. Please try your level best to understand things before asking the kernel mailing list. If this BS continues, i am afraid you will get yourself kicked out of the mailing list. Please do yourself a favour by not posting such crap.
Venkatram Tummala
Please read the thread before giving a lecture on kernel newbies.
/* Necessary includes for device drivers */ #include <linux/init.h> //#include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_from/to_user */ MODULE_LICENSE("Dual BSD/GPL"); /* Declaration of memory.c functions */ int memory_open(struct inode *inode, struct file *filp); int memory_release(struct inode *inode, struct file *filp); ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); ssize_t memory_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos); void memory_exit(void); int memory_init(void); /* Structure that declares the usual file */ /* access functions */ struct file_operations memory_fops = { read: memory_read, write: memory_write, open: memory_open, release: memory_release }; /* Declaration of the init and exit functions */ module_init(memory_init); module_exit(memory_exit); /* Buffer to store data */ char *memory_buffer; int result; int memory_init(void) { /* Registering device */ result = register_chrdev(0, "bond", &memory_fops); if (result < 0) { printk(KERN_ALERT "memory: cannot obtain major number \n"); return result; } /* Allocating memory for the buffer */ memory_buffer = kmalloc(10, GFP_KERNEL); if (!memory_buffer) { result = -ENOMEM; goto fail; } memset(memory_buffer, 0, 10); printk(KERN_ALERT "Inserting bond module\n"); return 0; fail: memory_exit(); return result; } void memory_exit(void) { /* Freeing the major number */ unregister_chrdev(result, "bond"); /* Freeing buffer memory */ if (memory_buffer) { kfree(memory_buffer); } printk( KERN_ALERT "Removing bond module\n"); } int memory_open(struct inode *inode, struct file *filp) { /* Success */ return 0; } int memory_release(struct inode *inode, struct file *filp) { /* Success */ return 0; } ssize_t memory_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { if (*f_pos > 0) return 0; if (count > strlen(memory_buffer)) count = strlen(memory_buffer); copy_to_user(buf,memory_buffer,count); *f_pos = *f_pos + count; return count; } ssize_t memory_write( struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { copy_from_user(memory_buffer, buf, count); return count; }