आपण मागील भागात कँरेक्टर डिव्हाईस ड्रायव्हर म्हणजे काय ते पहिले आता त्या डिव्हाईस ड्रायव्हर बरोबर डाटा ऑपरेशन्स कशी करावीत ते आपण या भागात पाहूया.
कँरेक्टर डिव्हाईस ड्रायव्हर हा त्याचा फाईलला जोडला गेलेला असतो.
आपली सर्व कामे तो फाईल्स च्या माध्यमातून पूर्ण करतो.
फाईल ऑपरेशन्स या स्ट्रक्चर मध्ये पण फाईल ची सर्व फंक्शन्स डिक्लेअर करून आपण तो फाईल ओपन, कोल्ज, रीड ,राईट करू शकतो.
प्रत्येक फंक्शन मध्ये सध्या आपण त्या फंक्शन चे प्रिंट करून नाव देऊ.त्यामुळे करेक्टर डिव्हाईस ड्रायव्हर चा बेसिक प्रोग्राम खालील प्रमाणे होईल.
|
|
[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 :-)
Filed under: Char Device Driver File operations, x-All Tablets

























