Problem in writing block device driver ....

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have written a simple block device driver in which i
m just displaying messages
in read & write part e.g " Device Reading .... " &  "
Device Writing .....".
I have succesfully loaded that module in memory using
"insmod" . 
& then use " mknod " command ...as   : 

                   mknod block_dev b 100 0 
  where , block_dev : name of device
                  b : as i m using block device driver
                100 : major number
                  0 : minor number
   
Even this is also working without error, now after
this command device "block_dev" is created (i have
checked it wit ls command ).
But , now while using "cat" & "echo" i am getting
error as :

                  [root@localhost root]# cat char_devc
                  cat: char_devc: No such device or
address

                  [root@localhost root]# echo "hello"
> char_devc
                  bash: char_devc: No such device or
address

Is it ok to use 'b' in mknod command while working
with block device driver,
as i hav used (shown above).

Im attaching C-code also,so plz help me....if you have
another simple code for block device driver please
send me : [email protected] 

Please tell me what is going wrong in this code.....


	

	
		
__________________________________________________________ 
Yahoo! India Matrimony: Find your partner online. Go to http://yahoo.shaadi.com
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>	
#include <linux/slab.h>		
#include <linux/fs.h>		
#include <linux/errno.h>	
#include <linux/types.h>	
#include <linux/fcntl.h>	
#include <linux/kdev_t.h>


#define DEVICE_NAME "block_dev"
#define MAJOR_NUM 100
MODULE_LICENSE("GPL");
atomic_t Device_Open = ATOMIC_INIT(0);

struct block_dev
{
     struct request_queue *queue ;
     spinlock_t lock;
};

struct block_dev *dev;

static void bdd_request(request_queue_t *q)
{
	struct request *req;
	int write ;
        while ((req = elv_next_request(q)) != NULL) 
	{
		if (! blk_fs_request(req))
	      {
			printk (KERN_ALERT "Skip non-fs request\n");
			end_request(req, 0);
			continue;
		}
            write=rq_data_dir(req);
            if(write==0)
 		      printk(KERN_ALERT "Reading Device .....");
            else
     		      printk(KERN_ALERT "Writing Device .....");
        	end_request(req, 1);
	}
}

static int device_open(struct inode *inode, struct file *file)
{
        printk(KERN_ALERT "OPENING DEVICE.....\n");  
 	atomic_inc(&Device_Open);
	try_module_get(THIS_MODULE);
	return 0;
}

static int device_release(struct inode *inode, struct file *file)
{
	printk(KERN_ALERT "RELEASING DEVICE....\n");
        atomic_dec(&Device_Open);
	module_put(THIS_MODULE);
	return 0;
}


static struct block_device_operations bdd_ops = 
{
	.open     = device_open,
	.release  = device_release,
};

static int init_function(void)
{ 
  int ret_val;
  dev = (struct block_dev*)kmalloc(sizeof(struct block_dev),GFP_KERNEL);
  ret_val=register_blkdev(MAJOR_NUM,DEVICE_NAME);
  if(ret_val<0)
  {	
      printk(KERN_ALERT "Sorry, registering the block device");   
      return ret_val;
  } 
  printk(KERN_ALERT "Initialization\n");
  dev->queue=blk_init_queue(bdd_request,&dev->lock);
  return 0;
}

static void exit_function(void)
{
  int ret_val;
  ret_val=unregister_blkdev(MAJOR_NUM,DEVICE_NAME);
  printk(KERN_ALERT "Exit\n");
  if(ret_val<0)
  {	
      printk(KERN_ALERT "Sorry, Error in Unregistering the block device");   
  } 
}	

module_init(init_function);
module_exit(exit_function);
 


[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux