लिनक्स डिव्हाईस ड्रायव्हर मराठीतून :भाग ७ :कँरेक्टर डिव्हाईस ड्रायव्हर फाईल ऑपरेशन्स.


आपण मागील भागात कँरेक्टर डिव्हाईस ड्रायव्हर म्हणजे काय ते पहिले आता त्या डिव्हाईस ड्रायव्हर बरोबर डाटा ऑपरेशन्स कशी करावीत ते आपण या भागात पाहूया.

कँरेक्टर डिव्हाईस ड्रायव्हर हा त्याचा फाईलला जोडला गेलेला असतो.

आपली सर्व कामे तो फाईल्स च्या माध्यमातून पूर्ण करतो.

फाईल ऑपरेशन्स या स्ट्रक्चर मध्ये पण फाईल ची सर्व फंक्शन्स डिक्लेअर करून आपण तो फाईल ओपन, कोल्ज, रीड ,राईट करू शकतो.

प्रत्येक फंक्शन मध्ये सध्या आपण त्या फंक्शन चे प्रिंट करून नाव देऊ.त्यामुळे करेक्टर डिव्हाईस ड्रायव्हर चा बेसिक प्रोग्राम खालील प्रमाणे होईल.

#include <linux/module.h>

#include <linux/version.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/device.h>

#include <linux/cdev.h>

static dev_t first;  //globle variable for the device no

static struct cdev c_dev; //globle var for char struct

static struct class *cl; //globle var for device class

static int my_open(struct inode *i, struct file *f)

{

printk(KERN_INFO “Driver : open()\n”);

return 0;

}

static int my_close(struct inode *i , struct file *f)

{

printk(KERN_INFO “Driver:close()\n”);

return 0;

}

static ssize_t my_read(struct file *f,char __user *buf,size_t len,loff_t *off)

{

printk(KERN_INFO “Driver:read()\n”);

return 0;

}

static int my_write(struct file *f,const char __user *buf,size_t len,loff_t *off)

{

printk(KERN_INFO “Driver:write()\n”);

return len;

}

static struct file_operations pugs_fops=

{

.owner = THIS_MODULE,

.open = my_open,

.release =my_close,

.read =my_read,

.write =my_write

};

 

static int __init ofcd_init(void) /*const*/

{

printk(KERN_INFO “NAMSAKAR:ofd reg”);

if (alloc_chrdev_region(&first, 0, 3, “Mahesh”) < 0)

{

return -1;

}

if ((cl = class_create(THIS_MODULE, “chardrv”)) == NULL)

{

unregister_chrdev_region(first, 1);

return -1;

}

if (device_create(cl, NULL ,first, NULL, “mynull”) == NULL)

{

class_destroy(cl);

unregister_chrdev_region(first, 1);

return -1;

}

cdev_init(&c_dev, &pugs_fops);

if (cdev_add(&c_dev, first, 1)== -1)

{

device_destroy(cl,first);

class_destroy(cl);

unregister_chrdev_region(first,1);

return -1;

}

return 0;

}

static void __exit ofcd_exit(void)/*Destructor*/

{

cdev_del(&c_dev);

device_destroy(cl, first);

class_destroy(cl);

unregister_chrdev_region(first,1);

printk(KERN_INFO “by Gn:ofd unreg”);

}

module_init(ofcd_init);

module_exit(ofcd_exit);

MODULE_LICENSE(“GPL”);

MODULE_AUTHOR(“MJ”);

MODULE_DESCRIPTION(“OUR FIRST character DRIVER:automatic”);

     [REF:Linux for you magazine]

 कोणती .h फाईल कधी इन्क्लुड करावी:

#include <linux/init.h> : बेसिक इनिशियलायझेशन

#include <linux/module.h> :कोणतेही मोड्यूल्स लिहताना

#include <linux/version.h> :लिनक्स व्हर्जनचा डाटा मिळवण्यासाठी.

#include <linux/kernel.h> : prinitk() हे फंक्शन वापरता येण्यासाठी.

#include <linux/fs.h> :फाईल्स च्या निगडीत ऑपरेशन्स करण्यासाठी

#include <linux/device.h> : डिव्हाईस शी निगडीत ऑपरेशन करताना.

#include <linux/cdev.h> :मेजर व मायनर नंबरसह करेक्टर डिव्हाईस तयार करण्यासाठी.

#include <linux/slab.h> :kmalloc() हे फंक्शन वापरण्यासाठी.

#include <linux/errno.h> :एरर्स चा कोड या फाईल मध्ये असतो.

#include <linux/types.h> :size_t ,dev_t या सारखे डाटा टाईप सपोर्ट साठी.

#include <linux/fcntl.h> : o_accmode साठी

#include <asm/system.h> :cli(), _flags वापरण्यासाठी

#include <asm/uaccess.h> :copy_from /to _users या सारखी फंक्शन्स वापरताना.

 module.h मधील फंक्शन्सची माहिती :

MODULE_ALIAS(_alias) युजर स्पेस मध्ये मोड्युलचे नाव व माहितीदेण्यासाठी.
MODULE_LICENSE(_license) मोड्युल कोणते लायसन्स वापरणार आहे त्याचे नाव.
MODULE_AUTHOR() मोड्युलचा लेखक.
MODULE_DESCRIPTION() मोड्युलच्या कामविषयक थोडक्यात माहिती
MODULE_PARAM() मोड्युल लोड करताना पास केले जाणारी पँरामिटर
MODULE_VERSION() वापरल्या जाणाऱ्या मोड्यूल चे व्हर्जन

आपण modinfo मोड्युलचे नाव .ko अशी कमांड दिली असता वरील सर्व मोड्युल शी निगडीत माहिती आपणस मिळते.

फाईल ऑपरेशन्सच्या काही महत्त्वाच्या गोष्टी:

वरील कोड मध्ये ओपन आणि क्लोज फंक्शन int रिटर्न करतात ,० म्हणजे यशस्वीपणे पार पडले आणि निगेटिव्ह म्हणजे काही तरी प्रोब्लेम आहे.पण रीड आणि राईट हे फंक्शन्स काही पोझिटिव्ह नंबर रिटर्न करतात ते म्हणजे किती बाईट डाटा रीड किंवा राईट झाला म्हणूनच त्या फंक्शन्स चा रिटर्न टाईप ssize_t आहे.

तसेच आणखी एक मस्त गोष्ट आहे…read() हे फंक्शन len बाईट्स इतका डाटा buf या बफर मध्ये लिहिते आणि किती बाईट्स लिहिलेत ती संख्या रिटर्न व्हेल्यू म्हणून पाठवते.म्हणजेच रीड फंक्शन हे युजर स्पेसिफिक बफर मध्ये डाटा लिहिते कारण तो युजरला वाचता व वापरता यावा…आहे ना गंमत रीड फंक्शन्स बफर मध्ये राईट करते….

काही महत्त्वाचे कोडचे भाग:

loff_t (*llseek) (struct file *, loff_t, int);

यात llseek हि मेथड फाईल ची चालू रीड राईट पोझिशन बदलतो , loff_t म्हणजे लोंग ऑफसेट.

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

हे फंक्शन डिव्हाईस कडून डा टा घेताना वापरतात जर या ठिकाणी काहीच डा टा नसेल तर ते –EINVAL म्हणजेच इन्व्हेलीड अर्ग्युमेंट म्हणून एरर दर्शविते.

int (*open) (struct inode *, struct file *);

डिव्हाईस ओपन करणे हि डिव्हाईस फाईल वर केली जाणारी पहिली क्रिया.

struct module *owner

हे आपल्या मोड्युल ला पोईंट करते आणि जर आपले मोड्यूल कामत असेल तर ते काढून टाकण्यास प्रतिबंध करते.

बयाचदा यास THIS_MODULE हे  नाव राहते याची डेफिनेशन <linux/module.h> मध्ये असते.

ओपन मेथड :

ओपन मेथड पुढील काम करते:

  • डिव्हाईस तयार आहे का नाही ते पाहणे आणि त्या निगडीत काही एरर्स आहेत का ते पाहणे.
  • जर डिव्हाईस प्रथमच ओपन हॉट अहेल तर त्याचे  इनिशियलायझेशन करणे.
  • f_op पोईंटर अपडेट करणे.
  • file->private_data मध्ये ठेवण्यात येणाऱ्या डाटा स्ट्रक्चर साठी राखीव जागा करून त्यात तो ठेवणे.

रिलीज मेथड:

रिलीज मेथड पुढील काम करते:

  • ओपन मेथडने file->private_data मध्ये ठेवलेली जागा काढून घेणे.
  • डिव्हाईस बंद करणे.

रीड आणि राईट मेथड:

  • ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
  • ssize_t write(struct file *filp, const char __user *buff,size_t count, loff_t *offp);
  • यात flip हा फाईलचा पोईंटर असतो.
  • count म्हणजे ट्रान्सफर करणाऱ्या डाटाची साईझ.
  • buff म्हणजे युजरचा बफर ज्यात रीड आणि राईट करताना डाटा ठेवला जातो.
  • offp [लोंग ऑफसेट टाईप पोईंटर] युजर वापरात असणर्‍या फाईलची पोझिशन दर्शवते.
  • रिटर्न व्हेल्यू ssize_t म्हणजेच signed size type.

हे अधिक स्पष्ट होण्यासाठी पुढील आकृती पहा:

कँरेक्टर डिव्हाईस ड्रायव्हर फाईल ऑपरेशन्स

कँरेक्टर डिव्हाईस ड्रायव्हर फाईल ऑपरेशन्स

   [Ref:Linux Device Driver Book]

रीड आणि राईट मेथड साठी नियम:

जर रिटर्न संख्या हि फंक्शन मधील count या अंके इतकी असेल तर तितके बाईट्स पाठवले जातात.

जात रिटर्न संख्या हि पोझिटिव्ह असेल आणि count पेक्षा कमी असेल तर तितकाच डाटा पाठवला जातो

जर रिटर्न संख्या हो शून्य असेल तर फाईल संपली असे मानले जाते .

निगेटिव्ह रिटर्न संख्या म्हणजे एरर याचा नंबर <linux/errno.h>या फाईल मध्ये असतो यात –EINTR [interrupt system call],-EFAULT [bad address]यांचा समावेश होतो.

 

डिव्हाईस ड्रायव्हरचा बेसिक सारांश.

क्रिया

युजर फंक्शन्स

कर्नेल फंक्शन्स

मोड्युल लोड करणे. [load] insmod module_init()
डिव्हाईस उघडणे. [open] fopen file_operations:open
डिव्हाईस मधून वाचणे.[close] fread file_operations:read
डिव्हाईस मध्ये लिहणे.[read] fwrite file_operations:write
डिव्हाईस बंद करणे.[write] fclose file_operations:release
मोड्यूल काढून टाकणे.[remove] rmmod module_exit()

[Ref:FreeSoftwareMagazine]

 आता आपण सर्व बेसिक फाईल ऑपरेशन्स शिकला आहात..मजा आली ना…आता..पुढील भागात आपण पी सी आय डिव्हाईस ड्रायव्हर ची महिती घेवूया.

आपणास हा भाग कसा वाटला ते नक्की कळवा.

“लिनक्स मराठीतून “ च्या पुढील भागाला भेट देण्यासाठी येथे टिचकी मारा:

भाग १]लिनक्सची ओळख आणि उबुंटू इन्स्टॉलेशन.

भाग २]लिनक्सची जान आणि शान टर्मिनलची ओळख आणि vi एडीटर.

भाग 3]लिनक्स कर्नेल आणि डिव्हाईस ड्रायव्हर ची ओळख.

भाग ४]डिव्हाईस ड्रायव्हरचा हँलो वल्ड प्रोग्रम.

भाग ५]डिव्हाईस ड्रायव्हरचा पँरामिटर पासिंग व प्रोसेस संबन्धित प्रोग्रम.

भाग ६ ]कँरेक्टर डिव्हाईस ड्रायव्हर बेसिक

भाग ७] कँरेक्टर डिव्हाईस ड्रायव्हर फाईल ऑपरेशन्स.

भाग ८ ]पी. सी. आय. डिव्हाईस ड्रायव्हर बेसिक

धन्यवाद -MJ :-)

तुमचा अभिप्राय नोंदवा

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / बदल )

Twitter picture

You are commenting using your Twitter account. Log Out / बदल )

Facebook photo

You are commenting using your Facebook account. Log Out / बदल )

Google+ photo

You are commenting using your Google+ account. Log Out / बदल )

Connecting to %s