Monday 26 May 2014

Writing a simple character driver implementing the basic calls,Write simple character driver with open, release, read, write, using misc driver interface.

A   ssignment   9

Q.1). Writing a simple character driver implementing the basic calls
open, release, read, write.
Ans 1 →

→ char.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/major.h>
#include <linux/capability.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
static ssize_t sample_char_read(struct file * file, char __user * buf,
size_t count, loff_t *ppos)
{
printk("sample_char_read size(%ld)\n", count);
return 0;
}
static ssize_t sample_char_write(struct file *filp, const char *buf,
size_t size, loff_t *offp)
{
printk("sample_char_write size(%ld)\n", size);
return size;
}
int sample_char_open(struct inode *inode, struct file *filp)
{
printk("sample_char_open\n");
return 0;
}
int sample_char_release(struct inode *inode, struct file *filp)
{
printk("sample_char_release\n");
return 0; Untitled Document
}
static struct file_operations sample_char_fops = {
read: sample_char_read,
write: sample_char_write,
open: sample_char_open,
release: sample_char_release,
};
#define sample_major_number 249
#define max_minors 1
static struct cdev char_cdev;
static dev_t dev;
int init_module(void)
{
int ret = 0;
dev = MKDEV(sample_major_number, 0);
printk("\nLoading the sample char device driver\n");
ret = register_chrdev_region(dev, max_minors, "sample_char");
if (ret)
{
printk("register_chrdev_region Error\n");
goto error;
}
cdev_init(&char_cdev, &sample_char_fops);
ret = cdev_add(&char_cdev, dev, max_minors);
if (ret) {
printk("cdev_add Error\n");
goto error_region;
}
return 0;
error_region:
unregister_chrdev_region(dev, max_minors);
error:
return ret;
}
void cleanup_module(void)
{
cdev_del(&char_cdev);
unregister_chrdev_region(dev, max_minors);
printk("\nUnloading the sample char device driver\n");
}
→  app.c
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc ,char *argv[])
{
int fd = open("/dev/Sample_char", O_RDWR);
write(fd,"hello",10);
close(fd);
return 0;
}
OUTPUT:
– Insert module
– make character driver name “Sample_char” in /dev directory using
“mknod” command.
– check /dev directory for checking of driver inclusion.
– type “dmesg” to see kernel messages.


Q.2). Write simple character driver with open, release, read, write, using
misc driver interface.
Ans 2 →
→ misc.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/major.h>
#include <linux/capability.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#define DRIVER_NAME "sample_misc"
static ssize_t sample_char_read(struct file * file, char __user * buf,size_t
count, loff_t *ppos)
{
printk("sample_char_read size(%ld)\n", count);
return 0;
}
static ssize_t sample_char_write(struct file *filp, const char *buf, size_t size,
loff_t *offp)
{
printk("sample_char_write size(%ld)\n", size);
return size;
}
int sample_char_open(struct inode *inode, struct file *filp)
{
printk("sample_char_open\n");
return 0;
}
int sample_char_release(struct inode *inode, struct file *filp)
{
printk("sample_char_release\n");
return 0;
}
static struct file_operations sample_char_fops = {
read: sample_char_read,
write: sample_char_write,
open: sample_char_open,
release: sample_char_release,
};
static struct miscdevice bfin_otp_misc_device = {
.minor = MISC_DYNAMIC_MINOR,
.name = DRIVER_NAME,
.fops = &sample_char_fops,
};
static struct cdev char_cdev;
static dev_t dev;
int init_module(void)
{
int ret = 0;
printk("\nLoading the sample misc device driver\n");
ret = misc_register(&bfin_otp_misc_device);
if (ret)
{
printk("register_chrdev_region Error\n");
goto error;
}
return 0;
error:
return ret;
}
void cleanup_module(void)
{
misc_deregister(&bfin_otp_misc_device);
printk("\nUnloading the sample misc device driver\n");
}
→ app.c
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
voidmain()
{
int fd = open("/dev/sample_misc", O_RDWR);
write(fd,"hello",10);
close(fd);
return 0;
}
OUTPUT –
– Insert module
– check this driver inside /dev directory “sample_misc”
– Dmesg output

No comments: