Linux Learing

लिनक्स डिव्हाईस ड्रायव्हर मराठीतून :भाग १०:डिस्प्ले डिव्हाईस ड्रायव्हर बेसिक.


आपल्या कॉम्प्युटर मधील ग्राफिक्स कार्ड किंवा प्रोसेसर मधील ग्राफिक्स संबंधीत चिपसेट यास व्हिडिओ डिव्हाईस असे म्हणतात.यांचा वापर करून आपल्या कॉम्प्युटरच्या स्क्रीनवर प्रोसेसर मार्फत चित्र पाठवले जाते.

व्हिडिओ डिव्हाईस हे डिस्प्लेवर दाखवण्यासाठी व्हिज्युअल आउटपुट डाटा तयार करतात.

लिनक्स व्हिडिओ सिस्टीम हि फ्रेम बफर लेयर्स तयार करून देऊन हार्डवेअर चेंजेस वर डिपेंडेबल नसणारी सिस्टीम सुविधा तयार करून देते.

व्हिडीओ ग्राफिक्स कार्ड चे हार्डवेअर हे वेगवेगळ्या प्रकारचे असते.त्या मेले आपणस वेगवेगळे कोडिंग करावे लागू शकते हा प्रोब्लेम टाळण्यासाठी लिनक्स मध्ये फ्रेम बफर चा लेयर तयार केला जातो.

त्याचा वापर करून अँप्लिकेशनमध्ये कोणताही बदल न करता अँप्लिकेशन्स वेगवेगळ्या हार्डवेअरवर चालू शकते.

आपण वापरात असलेले काही वेब ब्राऊजर ,व्हिडीओ प्लेयर्स अशी अँप्लिकेशन्स डायरेक्ट फ्रेमबफर वापरून ग्राफिक्स हार्डवेअरशी डाटा ट्रान्सफर ऑपरेशन करतात.

फ्रेम बफर कन्सेप्ट:

खालील चित्रात दाखवल्या प्रमाणे मुव्ही प्लेयर कॉमन फ्रेम बफर ए. पी. आय. चा वापर करून वेगवेळ्या व्हिडीओ कार्ड बरोबर डाटा ट्रान्सफर करतात.यावरून आपणास फ्रेम बफर चा फायदा काय आहे ते समजले असेलच.

x-windows सारखी काही अँप्लिकेशन्स APIचा वापर न करता डायरेक्ट हार्डवेअर शी संभाषण साधू शकतात.

फ्रेम बफर कन्सेप्ट

फ्रेम बफर कन्सेप्ट

आपल्या टर्मिनस विंडोमध्ये आपण fbset हि कमांड दिली असतात आपल्या फ्रेमबफर ड्रायव्हर मार्फत डिस्प्ले ची सेटिंग्ज आपणास पहावयास मिळतील.

यात रिझोल्यूशन ,फ्रिक्वेंसी,टायमिंग ,व्हर्टिकल सिंक ,हॉरीझोन्टल सिंक यांची सविस्तर माहिती मिळेल.

फ्रेम बफर API:

फ्रेम बफर API चा वापर करताना काही मुख्य डाटा स्ट्रक्चर माहित असणे गरजेचे आहे ती पुढीलप्रमाणे:

1)   struct fb_var_screeninfo.:या स्ट्रक्चर मध्ये डिस्प्ले स्क्रीन ची काही बदलता येणाऱ्या गोष्टी ठेवलेल्या असतात उदा:रिझोल्यूशन,मार्जिन हि सेटिंग्ज प्रोग्रामर बदलू शकतो.

2)   struct fb_fix_screeninfo :या डाटा स्ट्रक्चर मध्ये व्हिडीओ हार्डवेअर ची फिक्स माहिती ठेवलेली असते जसे कि फ्रेमबफर मेमरीचा साईझ,स्टार्टींग चा अँड्रेस.

3)   fb_cmap :हे स्ट्रक्चर फ्रेम बफरचा कलर मँप ठरवते.युजर यामार्फत रेड,ब्लु,ग्रीन [RGB]या कलर्स च्या संख्या ठरवू शकतो.

तसेच यात ट्रान्सपरन्सी सेट करण्याची हि सुविधा आहे.

फ्रेमबफर ड्रायव्हर:

आपण आपल्या डिस्प्ले बरोबर फ्रेमबफर ड्रायव्हर ने संभाषण करणार आहोत.

यात आपण फ्रेम बफर मेमरी लोकेशन बरोबर इंटरअँक्ट करणे म्हणजे डिस्प्ले वर दिसणाऱ्या कंटेंट मध्ये बदल घडवणे कारण याच फ्रेमबफर मेमेरीतील डाटा हा आपणास स्क्रीनवर दिसत असतो.

 डाटा स्ट्रक्चर्स:

struct fb_info :हे फ्रेमबफर डिव्हाईस ड्रायव्हर मधील प्रमुख डाटा स्ट्रक्चर आहे.हे स्ट्रक्चर include/linux/fb.h येथे डिफाईन केलेले असते.

struct fb_info {

/* … */

struct fb_var_screeninfo var; /* Variable screen information.

struct fb_fix_screeninfo fix; /* Fixed screen information.

/* … */

struct fb_cmap cmap; /* Color map.

/* … */

struct fb_ops *fbops; /* Driver operations.

/* … */

char __iomem *screen_base; /* Frame buffer’s virtual address */

unsigned long screen_size; /* Frame buffer’s size */

/* … */

/* From here on everything is device dependent */

void *par; /* Private area */

};

वरील स्ट्रक्चर मध्ये आपण शिकलेली स्क्रीन फिक्स इन्फो,स्क्रीन व्हेरिएबल इन्फो ,कलर मँप हे डाटा स्ट्रक्चर डिफाईन केले आहेत तसेच फाईल ऑपरेशन साठी वापरण्यात येणार fb_ops हे स्ट्रक्चर सुद्दा आहे.

स्कीन बफर चा साईझ आणि बेस अँड्रेस डिफाईन केले आहेत.

यात आपल्या डिव्हाईसशी निगडीत असलेला डाटा हा par या पोईंटरमध्ये ठेवलेला असतो.

framebuffer_alloc() हि मेथड वापरून fb_info साठी मेमरी अलोकेट केली जाते. 

fb_ops हे स्ट्रक्चर:

struct fb_ops

{

struct module *owner;

/* ड्रायव्हर ओपन करणे */

int (*fb_open)(struct fb_info *info, int user);

/* ड्रायव्हर कोल्ज करणे */

int (*fb_release)(struct fb_info *info, int user);

/* व्हेरिएबल स्क्रीन इन्फो वापरून डिव्हाईसचे पेरामीटर व्यवस्थीत आहेत का नाहीत ते चेक करणे.*/

int (*fb_check_var)(struct fb_var_screeninfo *var,

struct fb_info *info);

/* व्हिडीओ कंट्रोलर चे रेजिस्टंर सेट करणे*/

int (*fb_set_par)(struct fb_info *info);

/* कलर रेजिस्टर पँरामीटर सेट करणे. */

int (*fb_setcolreg)(unsigned regno, unsigned red,

unsigned green, unsigned blue,

unsigned transp, struct fb_info *info);

/* डिस्प्ले ब्लाँक करणे */

int (*fb_blank)(int blank, struct fb_info *info);

/* पुढील मेथड या ग्राफिक्स कार्ड चा वापर करतात. */

/* रेक्टअँगल चौकोनी एरिया हा पिक्सेलने भरून घेतो. */

void (*fb_fillrect)(struct fb_info *info,const struct fb_fillrect *rect);

/* चोकोनाचा काही भाग एका भागाकडून दुसरीकडे कॉपी करण्यासाठी */

void (*fb_copyarea)(struct fb_info *info,const struct fb_copyarea *region);

/* डिस्प्ले वर चित्र काढण्यासाठी */

void (*fb_imageblit)(struct fb_info *info,const struct fb_image *image);

/* डिस्प्ले रोटेट करण्यासाठी */

void (*fb_rotate)(struct fb_info *info, int angle);

/* डिव्हाईसशी संबंधित आय ओ सिलेक्ट इंटरफेस कमांड */

int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,

unsigned long arg);

/* … */

};

fb_ops हे स्ट्रक्चर हे फ्रेम बरफ ड्रायव्हरसाठी एन्ट्री पोईंट देतात.पहिले काही फंक्शन हे ड्रायव्हर फंक्शन रन होण्यास जरुरी असतात तर काही ऑप्शनल असतात हे फंक्शन ग्राफिक्सशी संबधित असतात.

fb_ops याचे स्ट्रक्चर पुढीलप्रमाणे आहे. 

पँरामीटर चेक आणि सेट करणे:

fb_check_var() :हि मेथड डिव्हाईस वर बेसिक चेक ऑपरेशन करते ते रिझोल्यूशन बीट पर पिक्सेल ह्या व्हेल्यू चेक करते RGB फोर्मेट सेट करते.

fb_set_par():हि मेथड एल सी डी कंट्रोलरच्या  रेजिस्टरच्या सेटिंग सेट करते.यात मार्जिन सेटिंग येते.तसेच size_reg मध्ये रेझोल्यूशन सेटिंग,आणि DMA_REGमध्ये डी.एम.ए. सेट केला जातो, ज्याचा वापर डायरेक्ट मेमरी एक्सेस् साठी होतो.

कलर मोड:

सुडो [psudo] कलर आणि ट्रु [true]कलर हे दोन प्रकराचे कलर मोड आहेत.पिक्सेल व्हेल्यू पेक्षा कलर व्हेल्युला इंडेक्स केले असता आपण आपल्या फ्रेम बफर मेमरीची जागा वाचवू शकतो.

त्यासाठी आपणस आपले हार्डवेअर कलर सेट [palette]ला सपोर्ट देणारे हवे.

एल सी डी मध्ये १६ बीट /पिक्सेल आणि RGB565 फोर्मेट वापरतात याचा अर्थ fb_check_var() फंक्शन बीट ऑफसेट व्हेल्यू रेड, ग्रीन ,ब्ल्यू साठी अनुक्रमे ११,५,० असे घेतात .

[०-५ (५): ब्ल्यू,५-११(६): ग्रीन,११-१६[५]:रेड]

fb_set_par() फंक्शन्स अल्फा ब्लेंडिंग चा वापर करून पिक्सेल व्हेल्यू आणि बँकग्राउंड हे मिक्स करते.

RGB नी एनकोडिंगसाठी वापरलेली बीट लेन्थ [५+६+५=१६] यास कलर डेप्थ म्हणतात.याचा वापर करून फ्रेमबफर ड्रायव्हर आपल्या कॉम्प्युटर मधील बुट लोगो इमेज डिस्प्लेवर दाखवतात.

स्क्रीन ब्लेन्किंग:

fb_blank() हे फंक्शन डिस्प्ले ब्लेन्किंग आणि अन –ब्लेन्किंगला सपोर्ट करते.हि सुविधा पॉवर मेनेजमेंट साठी वापरली जाते.

आपला डिस्प्ले १० मिनिटासाठी ब्लेंक ठेवण्यासाठी setterm -blank 10 हि कमांड वापरावी.

हि कमांड CTRL_REG मध्ये ब्लेन्किंग साठीची व्हेल्यू सेट करून fb_blank() हे फंक्शन कॉल करते.आणि डिस्प्ले ब्लेंक करते.

एक्सेलीरेटेड मेथड:

एक्सेलीरेटेड मेथड या मेथड व्हिडीओ आणि ग्राफिक्स ची मोठी मोठी ऑपरेशन्स करण्यासाठी वापरतात.

सिस्टिम मध्ये डिस्प्ले वर ब्लेंडिंग ,स्ट्रेचिंग ,बीट मेप मुव्ह करणे या सारख्या गोष्टी करण्यासाठी ग्राफिक्स हार्डवेअर असणे गरजेचे आहे.

fb_ops या स्ट्रक्चर मध्ये आपण एक्सेलीरेटेड मेथड ची लिस्ट पहिली आहेच.

यामध्ये ग्राफिक्स कार्ड चे स्पेशल सुविधा आणि सुधारणांचा वापर करून अधिक चांगले चित्र स्क्रीनवर पाहता येते.

fb_imageblit() मेथड डिस्प्लेवर इमेज तयार करते जर आपल्या सिस्टीम मध्ये ग्राफिक्स कार्ड नसेल तर फेम बफर ड्रायव्हर cfb_imageblit() हे त्याच मेथड साधे फंक्शन रन करतो.

हे फंक्शन पण तेच काम करते पण हे ग्राफिक्स हार्डवेअर ची पॉवर वापरात नाही.आपल्या स्क्रीनवर बुट इमेज आणताना हे फंक्शन वापरले जाते.

fb_copyarea() हे फंक्शन स्क्रीनचा काही भाग एका भागाकडून दुसरीकडे कॉपी करण्यास वापरले जाते. fb_fillrect()हे फंक्शन स्कीनचा काही भाग पिक्सेल रेषांनी भारावला जातो.

फ्रेमबफर कडून डायरेक्ट मेमरी एक्सेस :

DMA इंजिन सिस्टीम मेमरीवरून फ्रेमचा डाटा घेवून प्रोसेसर मार्फत प्रोसेस करून तो ग्राफिक्स डाटा स्क्रीनवर दाखवला जातो.

डिस्प्ले च्या रिफ्रेश रेट वर DMA चा रेट अवलंबून असतो.

फ्रेमबफर कोहरंट DMA अक्सेस राखून ठेवल्यासाठी myfb_probe()फंक्शन मध्ये dma_alloc_coherent()मेथड वापरली जाते.

myfb_set_par() मेथडने DMA चा अड्रेस कंट्रोलरच्या DMA_REG या रेजिस्टंर मध्ये लिहिला जातो .

जेंव्हा ड्रायव्हर myfb_enable_controller() फंक्शन वापरून DMA चालू करतो तेंव्हा कंट्रोलर डायरेक्ट मेमरी अक्सेस चा वापर करून पिक्सेल डाटा फ्रेमबफर कडून घेऊन डिस्प्लेवर दाखवतो.

कॉन्ट्रास्ट आणि ब्राईटनेस :

एल सी डी कंट्रोलर CONTRAST_REG रेजिस्टर चा वापर करून  कॉन्ट्रास्ट कंट्रोल करतो.

प्रोसेसर जनरल पर्पज इन्पुट आउटपुट लाईन चा वापर करून ब्राईटनेस कंट्रोल करतो.

backlight_device_register() या रेजिस्टर चा वापर करून बेक लाईट कंट्रोल करता येते.

डिस्प्ले ड्रायव्हरवर पुढे अभ्यास करण्यासाठी पुढील लिंकला भेट द्या.:

  • लिनक्स फ्रेमबफर प्रोजेक्ट ची लिंक:
    •  www.linux-fbdev.org
    • आपल्या लिनक्स सिस्टिम मधील फ्रेमबफर ड्रायव्हर चे लोकेशन:
      •  drivers/video/*fb.c
      • फ्रेमबफर स्केलेटन ड्रायव्हर:
      • linux/drivers/video/skeletonfb.c

डिस्प्ले ड्रायव्हर सारांश:

कर्नेल इंटरफेस साठी लागणारी डिस्प्ले डिव्हाईस ड्रायव्हर ची फंक्शन्स पुढीलप्रमाणे:

register_framebuffer() फ्रेमबफर डिव्हाईस रजिस्टर करणे.
unregister_framebuffer() फ्रेमबफर डिव्हाईस मोकळे करणे.
framebuffer_alloc() fb_info स्ट्रक्चर साठी मेमरी अलोकेट करणे.
framebuffer_release() अलोकेट केलेली मेमरी मोकळी करणे.
fb_alloc_cmap() कलर मँप अलोकेट करणे.
fb_dealloc_cmap() कलर मँप मोकळा करणे
dma_alloc_coherent() DMA चे मँपिंग करून मेमरी अलोकेट करणे.
dma_free_coherent() DMA बफर ची मेमरी मोकळी करणे.

 

अशा तऱ्हेने आपण डिस्प्ले डिव्हाईस ड्रायव्हर बेसिक कन्सेप्ट शिकला आहात आता आपण सर्व बेसिक डिव्हाईस ड्रायव्हर शिकला आहत आता आपणस प्रोग्रमिंग चा उत्साह नक्कीच आला असेल…

अशा तऱ्हेने आपण लिनक्स डिव्हाईस ड्रायव्हर चे १० भाग पूर्ण केले आहेत आता तुम्हाला सर्व डिव्हाईस ड्रायव्हर नक्कीच समजले असतील यात शंका नाही.

या भागाने मी बेसिक लिनक्स डिव्हाईस ड्रायव्हर मराठीतून या प्रकल्पाची सांगता करत आहे.यापुढे सखोल लिनक्स बद्दल लिहणार आहे. आपला असाच उत्स्फूर्त प्रतिसाद राहो ही इच्छा.

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

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

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

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

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

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

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

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

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

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

भाग ९ ]यु. एस. बी. डिव्हाईस ड्रायव्हर बेसिक कन्सेप्ट.

भाग १०]डिस्प्ले डिव्हाईस ड्रायव्हर बेसिक.

धन्यवाद -MJ 🙂

Advertisements

लिनक्स डिव्हाईस ड्रायव्हर मराठीतून :भाग ९:यु. एस. बी. डिव्हाईस ड्रायव्हर बेसिक कन्सेप्ट.


आपण पेन ड्राईव्ह, माउस ,कि बोर्ड ,हेड फोन इत्यादी अनेक डिव्हाईस आपल्या संगणकास जोडण्यासाठी यु.एस बी पोर्ट वापरतो.

या पोर्ट द्वारे आपण आपल्या प्रोसेसर शी संभाषण करीत असतो.हे अनेक डिव्हाईस यु.एस.बी.[युनिव्हर्सल सिरियल बस] या बसचा वापर करून सिरीयल पद्धतीने डाटा ट्रान्सफर करतात.

[यु.एस.बी. २.० आणि ३.० बद्दल जाणून घेण्यासाठी येथे टिचकी मारा]

मागील भागात आपण करेक्टर आणि पी सी आय साठीचे डिव्हाईस ड्रायव्हर पाहिलेत या भागात आपण काहीतरी मस्त शिकणार आहोत एकदम लाईव्ह डिव्हाईस ड्रायव्हर…

यु.एस.बी डिव्हाईस ड्रायव्हरची रचना:

यु.एस.बी होस्ट कंट्रोलर हा प्रमुख असतो आणि तो प्रत्येक यु.एस.बी डिव्हाईसला काही डाटा सेंड करण्यास आहे का ते विचारतो.

कोणताही यु.एस.बी डिव्हाईस हा होस्ट कंट्रोलरला विचारल्याशिवाय डाटा ट्रान्सफर करू शकत नाही.

सिस्टीम मध्ये यु एस बी होस्ट साठी यु एस बी होस्ट कंट्रोलर ड्रायव्हर तर यु एस बी डिव्हाईस साठी यु एस बी क्लाइन्ट ड्रायव्हर असतो.

यु एस बी कोअर हा या दोघांनाही लागणारे रूटीनस् आणि स्ट्रक्चर पुरवतो. यु एस बी कोअर हा ड्रायव्हर सिस्टीमचा कोअर विभाग आहे.

कर्नेलचा हेल्पर थ्रेड khubd हा सर्व पोर्ट वर लक्ष ठेऊन कोणत्या पोर्ट वर काय बदल झालेले आहेत याची माहिती घेत असतो.

युजरस्पेस मधून यु एस बी डिव्हाईस ला अक्सेस करण्यासाठी यु एस बी फाईल सिस्टीम usbfs हि वापरतात.

युजर /dev ,/sys मधून हि यु एस बी डिव्हाईस बद्दल काही माहिती घेवू शकतो.

या संबधी संपूर्ण माहिती दर्शवणारी खालील आकृती पहावी.

यु.एस.बी डिव्हाईस ड्रायव्हरची रचना

यु.एस.बी डिव्हाईस ड्रायव्हरची रचना

यु.एस.बी बस चे काही फीचर्स: व्हिडीओ आणि ऑडीओ डाटा पाठवण्यासाठी डिव्हाईस काही फिक्स बँन्डविड्थ मागवू शकतो.

तसेच यु एस बी प्रोटोकॉल मध्ये जे कॉमन जनरल डिव्हाईस असतात त्यांसाठी काही खास ड्रायव्हर लिहायची गरज नसते.

उदा:कि बोर्ड,माउस,नेटवर्क डिव्हाईस काही खास डिव्हाईस साठी आपणस खास ड्रायव्हर लिहावा लागतो.

लिनक्स सिस्टीम हि दोन प्रकारच्या यु एस बी ड्रायव्हर ला सपोर्ट करते.

  • एक जो सिस्टम मध्ये असतो [यु एस बु डिव्हाईस ड्रायव्हर]
  • दुसरा जो डिव्हाईस मध्ये असतो [यु एस बी गँजेटस् ड्रायव्हर]

आता आपल्या प्रयोगासाठी एक पेन ड्राईव्ह घ्या आणि तो आपल्या संगणकाला जोडा.

आपल्या सिस्टीमला जोडलेले यु एस बी डिव्हाईस ऑपरेटिंग सिस्टिमला कळला का नाही ते  पाहण्यासाठी lsusb कमांड टर्मिनस मध्ये वापरावी.आता तुम्हाला पेन ड्राईव्हची एन्ट्री झालेली दिसेल.

पेन ड्राईव्हची एन्ट्री

पेन ड्राईव्हची एन्ट्री

आपल्या पेन ड्राईव्ह संबधित सर्व माहिती पाहण्यासाठी lsusb –v  हि कमांड वापरावी.

पेन ड्राईव्ह संबधित सर्व माहिती

पेन ड्राईव्ह संबधित सर्व माहिती

यात आपल्या पेन ड्राईव्हचा उत्पादक, त्याचे नाव ,त्याचा आय डी प्रोडक्टचे नाव आणि त्याचा आय डी अशी माहिती मिळेल.

माझ्या पेन ड्राईव्ह चा व्हेंडर आय डी आणि प्रोडक्ट आय डी  0x0781,0x5567 असा मिळाला.याचा वापर आपण ड्रायव्हर लिहण्यास करणार आहोत.

[नोंद :या माहितीत D=डिव्हाईस  ,C=कॉन्फिगरेशन  ,I=इंटरफेस  E =एन्डपोईंट यांचा संदर्भ पुढे येणारच आहे.]

आता आपण आपला पहिला बेसिक यु एस बी ड्रायव्हर लिहूया:

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/usb.h>

static int pen_probe(struct usb_interface *interface, const struct usb_device_id *id)

{

printk (KERN_INFO “Pen drive(%04X:%04X) plugged\n”, id->idVendor, id->idProduct);

return 0;

}

static void pen_disconnect(struct usb_interface *interface)

{

printk(KERN_INFO “PEN drive removed \n”);

}

static struct usb_device_id pen_table[]=

{

{ USB_DEVICE(0x0781,0x5567)},

{}

};

MODULE_DEVICE_TABLE (usb, pen_table);

static struct usb_driver pen_driver =

{

.name = “pen_driver”,

.id_table = pen_table,

.probe = pen_probe,

.disconnect = pen_disconnect,

};

static int __init pen_init(void)

{

return usb_register(&pen_driver);

}

static void __exit pen_exit(void)

{

usb_deregister(&pen_driver);

}

module_init(pen_init);

module_exit(pen_exit);

MODULE_LICENSE(“GPL”);

MODULE_AUTHOR (“MJ”);

MODULE_DESCRIPTION(“USB PEN REGISTRATION DRIVER”);

याचे स्ट्रक्चर करेक्टर डिव्हाईस ड्रायव्हर सारखेच आहे यात डिव्हाईस फाईल मधून रजिस्टर किंवा अन रजिस्टर न् करता आपण हार्डवेअर वापरणार आहोत.त्यासाठी usb_register आणि usb_deregister हे यु एस बी चे API वापरलेल आहेत.

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

डिव्हाईस ऑटोमॅटिक डिटेक्ट होण्यासाठी डिव्हाईस टेबल तयार करून त्यात आपल्या डिव्हाईसचे आय डी पास केले आहेत त्यामुळे आपला डिव्हाईस जोडला कि हा ड्रायव्हर आपोआप चालू होईल.

यु एस बी डिव्हाईस साठी या टेबल मध्ये पहिले पँरामीटर हे usb हे पास करावे लागते.त्यानंतर आपण आपल्या डिव्हाईस आय डी टेबलचे नाव पास करू शकतो.

पेन ड्राईव्ह प्लग केल्यावर प्रोब फंक्शन चालू होइल आणि पेन ड्राईव्ह काढून टाकल्यावर डिस्कनेक्ट फंक्शन रन होईल.

हा प्रोग्राम रन करण्यासाठी प्रथम या प्रोग्रामसाठी मेक फाईल तयार करावी.

नंतर make कमांड वापरून कंपाईल करून .ko फाईल तयार करणे.

lsmod वापरून आपले नवीन मोड्युल लोड करणे.

पण याआधी आपल्या सिस्टीम मध्ये आधीपासूनच असलेले यु एस बी चे मोड्युल [usb-storage] कडून टाकावे लागेल त्यासाठी rmmod usb-storage हि कमांड वापरून ते मोड्युल सिस्टीम मधून काढून टाकावे.

आता आपला पेन ड्राईव्ह कनेक्ट करावा.

आणि dmesg कमांड रन करावी.

नंतर पेन ड्राईव्ह काढून टाकावा आणि परत dmesg कमांड रन करावी.

प्रोब आणि डीसकनेक्ट हे दोन्ही फंक्शन्स रन होऊन आलेले आउटपुट

प्रोब आणि डीसकनेक्ट हे दोन्ही फंक्शन्स रन होऊन आलेले आउटपुट

आपणस आपले प्रोब आणि डीसकनेक्ट हे दोन्ही फंक्शन्स रन होऊन आउटपुट आलेले दिसेल.आता आपणस खरा मस्त काम करणार ड्रायव्हर तयार केल्याची मजा नक्कीच आली असेल…

आता आपण पुढे  यु.एस.बी डिव्हाईस ड्रायव्हरची आणखीन मस्त महिती मिळवून  त्याचा प्रोग्राम लिहण्यासाठी वापर करुया.

त्यासाठी आपण  यु.एस.बी डिव्हाईस च्या अंतर्गत बाबींचा विचार करुया.

 यु.एस.बी डिव्हाईस ड्रायव्हरची रचना:

यु.एस.बी डिव्हाईस ड्रायव्हरची रचना

यु.एस.बी डिव्हाईस ड्रायव्हरची रचना

वरील चित्रात यु एस बी ड्रायव्हर हा कर्नेल ची सिस्टम आणि हार्डवेअर मध्ये असतो.

यु एस बी कोअर हा यु एस बी ड्रायव्हरला हार्डवेअर वापरण्यासाठी एक्सेस देतो.

यु एस बी स्ट्रक्चर बद्दल आपणस माहिती पुढील लिंक वर मिळेल: www.usb.org

आता एक महत्वाची गोष्ट : यु एस बी ड्रायव्हर हे संपूर्ण यु एस बी डिव्हाईसला जोडले न् जाता फक्त यु एस बी इंटरफेसला जोडले जातात.

यु एस बी ऐन्डपोईंट आत[IN endpoint] किंवा बाहेर [out endpoint] डाटा ट्रान्सफर करण्यसाठी वापरतात. हे डाटा ट्रान्सफर एकाच दिशेने पाईप मार्फेत होते.

 

यु एस बी स्ट्रक्चर

यु एस बी स्ट्रक्चर

यु एस बी ऐन्डपोईंटचे चार प्रकार पडतात:

कंट्रोल:डिव्हाईस कॉन्फिगर कारणासाठी व डिव्हाईसची माहिती मिळवण्यासाठी तसेच कमांड पाठवून डिव्हाईसचे स्टेट्स पाहण्यासाठी.शक्यतो डिव्हाईसमध्ये endpoint 0 हा हे काम पार पडतो.हा एकमेव एन्डपोईंट आहे जो दोन्ही दिशांना डाटा पाठवतो.

इंट्रप्ट:हा ऐन्डपोईंट थोडाच डाटा काही ठराविक अंतराने पाठवण्यास होतो हा प्रामुख्याने डाटा पाठवून माउस किबोर्ड सारखे डिव्हाईस कंट्रोल करण्यास्तव वापरतात.

बल्क:हा ऐन्डपोईंट फारच जास्त डाटा ट्रान्सफर करण्यासाठी वापरतात.

जास्त डाटा कोणत्याही डाटाचा लॉस्ट न होता व गरज पडल्यास जास्त वेळ घेऊन डाटा पाठवण्यासाठी हा ऐन्डपोईंट वापरतात.प्रिंटर ,नेटवर्क कार्ड यासाठी हा ऐन्डपोईंट वापरतात .

आयसोक्रोनस:हा ऐन्डपोईंट ऑडीओ व्हिडीओ डिव्हाईस मध्ये जास्त डाटा पाठवण्यासाठी होतो यात डाटा लॉस्ट ची पर्वा न करता सतत डाटा चा प्रवाह चालू ठेवला जातो. इंट्रप्ट व आयसोक्रोनस ऐन्डपोईंट हे काही ठराविक वेळेला डा टा पाठवण्यासाठी सतत सेट केले जातात

यु एस बी ऐन्डपोईंट हे struct usb_host_endpoint या स्ट्रक्चर मध्ये ठेवले जातात व या ऐन्डपोईंट ची माहिती struct usb_endpoint_descriptor मध्ये साठवली जाते.

त्यातील काही महत्त्वाचे फीचर्स:

bEndpointAddress :हा डाटा इनपुट असणार का आउटपुट हे सांगते यावरून डाटा सिस्टिम ला जाणार का डिव्हाईस ला जाणार ते समजते.

bmAttributes :या द्वारे ऐन्डपोईंट हा कंट्रोल ,बल्क ,इंट्रप्ट, आयसोक्रोनस या पैकी कोणता आहे ते समजते.

wMaxPacketSize :या मुळे ऐन्डपोईंट द्वारे जास्तीत जास्त किती साईझ हाताळली जाऊ शकते ते समजते.

bInterval :यामुळे इंट्रप्ट रिक्वेस्ट चा वेळ समजतो.

ऐन्डपोईंटहे एकत्रितपणे इंटरफेसमध्ये गुंडाळलेले असतात.

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

प्रथम इंटरफेस हे प्राथमिक सेटींग्स वापरतात काही वेळा दुसऱ्या पद्धतीने कंट्रोल करण्यासाठी अल्टरनेटिव्ह सिटींग वापरता.

त्याची माहिती usb_interface या स्ट्रक्चरमध्ये ठेवली जाते. हे इंटरफेस कॉन्फिगरेशन च्या रुपात गुंडाळलेले असतात.

रचनात्मक सारांश

रचनात्मक सारांश

सारांशाने कॉन्फिगरेशन म्हणजे डिव्हाईसचे प्रोफाईल ,इंटरफेस हे डिव्हाईसची फंक्शन्स ,एन्ड पोईंट म्हणजे डाटा ट्रान्सफर करणारी पाईप.

  • डिव्हाईसला एक किंवा अनेक कॉन्फिगरेशन असतात.
  • कॉन्फिगरेशनमध्ये एक किंवा अनेक इंटरफेस असतात.
  • इंटरफेसमध्ये एक किंवा अनेक सेटिंग्ज असतात.
  • इंटरफेसमध्ये एक किंवा अनेक एन्डपोईंट असतात. 

यु एस बी डिव्हाईस नंबर:

पहिला यु एस बी डिव्हाईस हा रूटहब असतो त्यास यु एस बी कोअर ने एक नंबर दिलेला आहे.

त्यानंतर येतो तो पोर्ट नंबर ज्या पोर्ट ला डिव्हाईस जोडला आहे तो पोर्ट.

त्यानंतर कॉन्फिगरेशन नंबर आणि नंतर इंटरफेस नंबर

उदा तो पुढीलप्रमाणे दर्शवतात : 2-1:1.0

यु एस बी अर्ब्स :[USB Urbs]

कर्नेल हा यु एस बी डिव्हाईस सोबत यु एस बी रिक्वेस्ट ब्लॉक च्या द्वारे संभाषण करतो.

यु एस बी अर्ब्स हा एन्ड पोईंट सोबत डाटा पाठवण्यासाठी आणि घेण्यासाठी वापरतात.

यु आर बी पुढीलप्रमाणे काम करतात:

  • यु एस बी डिव्हाईस ड्रायव्हर यु आर बी तयार करतात.
  • यु एस बी डिव्हाईसला एन्डपोईंट नेमला जातो.
  • यु आर बी हा डिव्हाईस ड्रायव्हरचा वापर करून यु एस बी कोअर मध्ये नोंद केला जातो.
  • त्यानंतर यु एस बी कोअर  त्याची नोंद यु एस बी होस्ट कंट्रोलर ड्रायव्हर मध्ये करतो
  • यु एस बी होस्ट कंट्रोलर हा प्रोसेस करून यु एस बी डाटा ट्रान्सफर करतो.
  • जेंव्हा यु आर बी पूर्ण होते यु एस बी होस्ट कंट्रोलर हा यु एस बी डिव्हाईस ड्रायव्हरला त्याची नोंद पाठवतो.

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/usb.h>

static struct usb_device *device;

static int pen_probe(struct usb_interface *interface, const struct usb_device_id *id)

{

struct usb_host_interface *iface_desc;

struct usb_endpoint_descriptor *endpoint;

int i;

iface_desc = interface->cur_altsetting;

printk (KERN_INFO “Pen i/f %d now probed:(%04X:%04X)\n”,iface_desc->desc.bInterfaceNumber, id->idVendor, id->idProduct);

printk(KERN_INFO “ID->bNumEndpoints: %02X\n”,iface_desc->desc.bNumEndpoints);

printk(KERN_INFO “ID->bInterfaceclass: %02X\n”, iface_desc->desc.bInterfaceClass);

for(i=0; i < iface_desc->desc.bNumEndpoints; i++)

{

endpoint = &iface_desc->endpoint[i].desc;

printk(KERN_INFO “ED[%d]->bEndpointAddress: 0x%02X\n”,i, endpoint->bEndpointAddress);

printk(KERN_INFO “ED[%d]->bmAttributes: 0x%02X\n”, i, endpoint->bmAttributes);

printk(KERN_INFO “ED[%d]->wMaxPacketSize: 0x%04X (%d)\n”,i, endpoint->wMaxPacketSize, endpoint-> wMaxPacketSize);

}

device = interface_to_usbdev(interface);

return 0;

}

static void pen_disconnect(struct usb_interface *interface)

{

printk(KERN_INFO “Pen i/f %d now disconnected \n”,interface->cur_altsetting->desc.bInterfaceNumber);

}

static struct usb_device_id pen_table[]=

{

{ USB_DEVICE(0x0781,0x5567)},

{}

};

MODULE_DEVICE_TABLE (usb, pen_table);

यु एस बी इन्फोर्मेशन ड्रायव्हर :

static struct usb_driver pen_driver =

{

.name = “pen_driver”,

.id_table = pen_table,

.probe = pen_probe,

.disconnect = pen_disconnect,

};

static int __init pen_init(void)

{

return usb_register(&pen_driver);

}

static void __exit pen_exit(void)

{

usb_deregister(&pen_driver);

}

module_init(pen_init);

module_exit(pen_exit);

MODULE_LICENSE(“GPL”);

MODULE_AUTHOR (“MJ”);

MODULE_DESCRIPTION(“USB PEN Info DRIVER”);

वरील प्रोग्रॅम मध्ये struct usb_interface हा हेन्डेल वरून आपणास हवी ती माहिती घेतली आहे प्रोब आणि डीस कनेक्ट हे सुद्धा प्रती इंटरफेससाठी रन होतात आणि तेच त्यांचे पहिले पँरामीटर असतात.

आणि कंटेनर डिव्हाईस हेंडेल म्हणून  interface_to_usbdev हे फंक्शन वापरतात.

हा प्रोग्राम रन केल्यावर आपणस आपल्या डिव्हाईस संबंधित सर्व डिटेल माहिती उपलब्द होईल.

अशा तऱ्हेने आपण यु. एस. बी. डिव्हाईस ड्रायव्हर बेसिक कन्सेप्ट शिकला आहात आता मस्त प्रोग्रामिंग चालू करा जोमात…

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

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

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

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

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

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

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

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

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

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

धन्यवाद -MJ 🙂

लिनक्स डिव्हाईस ड्रायव्हर मराठीतून :भाग ८ :पी. सी. आय. डिव्हाईस ड्रायव्हर बेसिक.


आपल्या संगणकात ग्राफिक्स कार्ड ,लँन कार्ड सारखी डिव्हाईस जोडण्यासाठी [PCI] पी. सी. आय. बस चा वापर होतो.

पी. सी. आय. बस हि डाटा बस साउथ बस नंतर नॉर्थ ब्रीज द्वारे सी पु यु [प्रोसेसर] ला जोडली जाते.

अशा तऱ्हेने आपण डेस्कटॉपवर व्हिडीओ पाहत असताना किंवा सर्व्हर वर डाटा पाठवत असताना आपल्या नकळत आपण पी. सी. आय. बस वापरताच असतो.

याचा डाटा ट्रान्सफर स्पीड फारच जास्त असतो.PCIe चा डाटा ट्रान्सफर रेट २५० एम. बी. पर लेन आणि जास्तीतजास्त ८ जी. बी. पर्यत आहे.

पी सी आय म्हणजे पेरिफेरल कॉम्पोनंट इंटरकनेक्ट. याचे PCI,PCI Express,PCI Extender,Mini PCI असे अनेक प्रकार आहेत.

पी. सी. आय. डिव्हाईसचा क्लॉक रेट २५ किंवा ३३ Hz पर्यंत असतो.

आपण आपल्या या भागात पी. सी. आय. डिव्हाईस ड्रायव्हर कसा असतो याची माहिती घेवूया. 

पी. सी. आय. डिव्हाईस हे आपल्या व्हेंडर आय डी,डिव्हाईस आय डी आणि क्लास कोड या द्वारे ओळखला जातो.

आपल्या सिस्टममध्ये कोणकोणते पी. सी. आय. डिव्हाईस आहेत हे पाहण्यासाठी पुढील कमांड वापरावी.

lspci

यात आपणस जो पहिला नंबर दिसतो तो आहे पी. सी. आय. बस नंबर  नतंर पी. सी. आय. डिव्हाईस नंबर आणि शेवटचा नंबर फंक्शन दर्शवितो.

पी. सी. आय. डिव्हाईस नंबर

पी. सी. आय. डिव्हाईस नंबर

lspci –t

या कमांडने आपणस आपले पी. सी. आय. डिव्हाईस हे ट्री स्ट्रक्चर मध्ये दिसतील.

याच्या डिव्हाईस ड्रायव्हर साठी प्रोबिंग ची गरज नसते.यात pci_dev हे डाटा स्ट्रक्चर वापरतात.

पी.सी.आय. डिव्हाईस मध्ये तीन अँड्रेस च्या रिजन असतात.

1)  कॉन्फिगरेशन स्पेस,

2)  इनपुट्स आउटपुट पोर्ट

3)  डिव्हाईस मेमरी.

कॉन्फिगरेशन स्पेस एकवेळा ला एकाच स्लॉट वर काम करू शकते आणि इनपुट्स आउटपुट पोर्ट , डिव्हाईस मेमरी लोकेशन हे एकाच पी.सी.आय. बस मधील सर्व डिव्हाईस शेअर करतात.

कॉन्फिगरेशन स्पेस मधील रेजिस्टर वर काम करण्यासाठी कर्नेल ची विशिष्ट फंक्शन्स काम करतात.

प्रत्येक पी सी आय स्लॉट मध्ये ४ इंटरप्ट पिन्स असतात.यातील कोणतीही एक पिन एका वेळी सी.पी.यु. द्वारे वापरली जाऊ शकते.

सिस्टीम बुट होताना पी सी आय डिव्हाईस चे फर्मवेअर हार्डवेअर इनिशियलाईझ करून प्रत्येक रिजन वेगवेगळ्या अँड्रेसला जोडला जातो,आणि ज्या अँड्रेसला चालू रिजन जोडला आहे तो कॉन्फिगरेशन स्पेसमधून वाचला जाऊ शकतो म्हणून डिव्हाईस ड्रायव्हरला डिव्हाईस वापरण्यासाठी शक्यतो प्रोबिंगची गरज भासत नाही.

[नोंद :यु एस बी डिव्हाईस ड्रायव्हरला डिव्हाईस वापरण्यासाठी प्रोबिंगची लागते.]

जेंव्हा पी.सी.आय. डिव्हाईस ला पॉवर दिल्यावर हार्डवेअर पूर्णतः चालू नसते फक्त कॉन्फिगरेशन निगडीत कामाला रिस्पॉन्स देते.फर्मवेअर पी सी आय कंट्रोलर मधील रेजिस्टंर मधील डाटाला रीड राईट करून कॉन्फिगरेशन अँड्रेस पर्यंत पोहचते.बुट होताना फर्मवेअर सर्व पी सी आय डिव्हाईस बरोबर प्रत्येक अँड्रेस रिजनला जागा मिळवून देते आणि तेंव्हाच डिव्हाईस ड्रायव्हर हा डिव्हाईसचा मेमरी रिजन आणि आय ओ रिजन यांची जोडणी पाहतो,

पी सी आय कॉन्फिगरेशन रेजिस्टंर हे खालीलप्रमाणे असतात:

पी सी आय कॉन्फिगरेशन रेजिस्टंर

पी सी आय कॉन्फिगरेशन रेजिस्टंर

 [REF:Essential linux Device Driver-Alan Cox-Pearson]

इनपुट आउटपुट रिजन मध्ये रेजिस्टर असतात तर मेमरी रिजन मध्ये डाटा,व्हिडिओ कार्ड मध्ये  इनपुट आउटपुट स्पेस मध्ये कंट्रोल रेजिस्टर आणि मेमरी रिजन फ्रेम बफर ला जोडलेली असते.

डायरेक्ट मेमरी अक्सेस :[DMA]

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

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

मोड्युल डिव्हाईस टेबल:

pci_device_id हे डाटा स्ट्रक्चर युजरला वापरण्यास देऊन हॉट प्लग सुविधा देता येते तसेच मोड्युल लोड करणाऱ्या सिस्टमला हि हे समजते कि कोणत्या हार्डवेअरला कोणते मोड्युल काम करते.

MODULE_DEVICE_TABLE(pci, i810_ids);

वरील फंक्शन लोकल व्हेरिएबल तयार करून ते pci_device_id डाटा स्ट्रक्चर ला पोईंट करते तसेच त्या मोड्युल शी निगडीत मोड्यूल्स शोधली जातात व modules.pcimap मध्ये टाकली जातात. त्यानंतर नवीन डिव्हाईस हॉट प्लग केल्यावर हॉट प्लग सिस्टिम modules.pcimap याचा वापर करून अनुरूप ड्रायव्हर लोड करते.

 बेसिक पी.सी.आय. डिव्हाईस ड्रायव्हर :

प्रथम डिव्हाईस तयार करावा लागेल त्यासाठी खालील कोड वापरावा.

बेसिक पी.सी.आय. डिव्हाईस ड्रायव्हर कोड:

#include <linux/pci.h>

आपणास लागणारे फंक्शन्स पी.सी.आय. डॉट एच या फाईल मधून घेतली जातात.

#define MY_VENDOR_ID 0xABCD

#define MY_DEVICE_ID_NET 0xEF01

ड्रायव्हर सपोर्ट करत असणारे डिव्हाईस ची नोंद येथे केली जाते

प्रथम डिव्हाईस तयार करावा लागेल त्यासाठी खालील कोड वापरावा

struct pci_device_id network_driver_pci_table[] __devinitdata =

{

{

{ MY_VENDOR_ID, /* Interface chip manufacturer ID */

MY_DEVICE_ID_NET, /* Device ID for the network */

PCI_ANY_ID, /* Subvendor ID wild card */

PCI_ANY_ID, /* Subdevice ID wild card */

0, 0, /* class and classmask are unspecified */

network_driver_private_data

}, {0},

};

वरील कोड मध्ये पी सी आय ड्रायव्हरशी निगडीत डाटा दिला जातो.

struct pci_driver network_pci_driver =

{

.name = “ntwrk”, /* Unique name */

.probe = net_driver_probe,

.remove = __devexit_p(net_driver_remove),

.id_table = network_driver_pci_table,

/* suspend() and resume() optional methods*/

};

येथे आपल्या डिव्हाईस ड्रायव्हर चे बेसिक फंक्शन्स डिफाईन केले जातात.यात डिव्हाईस ड्रायव्हर चे नाव जोडणे आणि काढणे या संबंधित फंक्शन आणि आय डी टेबल यांचा समावेश होतो.

static int __init network_driver_init(void)

{

pci_register_driver(&network_pci_driver);

return 0;

}

येथे आपण ड्रायव्हर इनिशियलाईझ केला आहे .यात पी सी आय ड्रायव्हर रजिस्टर केला.

Static void __exit network_driver_exit(void)

{

pci_unregister_driver(&network_pci_driver);

}

येथे आपण ड्रायव्हर कडून टाकल्यावर अन रजिस्टर फंक्शन डिफाईन केले आहे.

module_init(network_driver_init);

module_exit(network_driver_exit);

MODULE_DEVICE_TABLE(pci, network_driver_pci_table);

 

प्रोबिंग फंक्शनमध्ये पुढील कामे केली जातात.:

  • पी सी आय डिव्हाईस एनेबल करणे.
  • रिसोर्सची माहिती शोधणे :इनपुट आउटपुट बस अँड्रेस,इंट्रप्ट रिक्वेस्ट.
  • ड्रायव्हर शी निगडीत डाटा स्ट्रक्चर नेमून दिले जाते.
  • स्वतःला रजिस्टर करणे.

पी सी आय डिव्हाईस ड्रायव्हरचे काही महत्त्वाचे कोडचे पार्ट:

#include <linux/pci.h> हा हेडर पी सी आय संबधित रेजिस्टर आणि आय डी साठी सपोर्ट करतो.
struct pci_dev; या स्ट्रक्चरमध्ये कर्नेल मधील पी सी आय डिव्हाईस दर्शवितो
struct pci_driver; हा स्ट्रक्चर पी सी आय डिव्हाईस ड्रायव्हर दर्शवितो.
struct pci_device_id; आपल्या ड्रायव्हरला सपोर्ट करणारे पी सी आय डिव्हाईस ची माहिती देतो
int pci_register_driver(struct pci_driver *drv); पी सी आय डिव्हाईस हे पी सी आय कोअर ला रजिस्टर करतो.
int pci_module_init(struct pci_driver *drv); मोड्युल इनिशियेट करतो.
void pci_unregister_driver(struct pci_driver *drv); ड्रायव्हर अन लोड करतो आणि ड्रायव्हरला जोडलेले पी सी आय डिव्हाईस कडून टाकतो.
int pci_enable_device(struct pci_dev *dev); प्रोब फंक्शन मध्ये हे फंक्शन वापरतात. डिव्हाईस चालू होऊन इंट्रप्ट व इनपुट ,आउटपुट रिजन नेमून दिला जातो.
int pci_read_config_byte(struct pci_dev *dev, int where, u8 *val); कॉन्फिगरेशन स्पेस मधील डाटा वर काम करण्यासाठी हि फंक्शन्स वापरतात.हि फंक्शन्स अंतर्गत pci_busहि बसशी निगडीत फंक्शन्स वापरतात.फंक्शन्स मधील शब्दांचे अर्थ:८ बीट डाटा ट्रान्सफर = byte१६ बीट डाटा ट्रान्सफर = word३२ बीट डाटा ट्रान्सफर = dwordपीसीआय कॉन्फिगरेशन स्पेसमधून वाचण्यासाठी= readपीसीआय कॉन्फिगरेशन स्पेस मध्ये लिहण्यासाठी= writeकॉन्फिगरेशन स्पेसच्या सुरवातीपासूनचा ऑफसेट = whereएरर कोड रिटर्न करणारी संख्या = val

पी सी आय डिव्हाईस पोईंटर = dev

int pci_read_config_word(struct pci_dev *dev, int where, u16 *val);
int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);
int pci_write_config_byte (struct pci_dev *dev, int where, u8 *val);
int pci_write_config_word (struct pci_dev *dev, int where, u16 *val);
int pci_write_config_dword (struct pci_dev *dev, int where, u32 *val);
pci_resource_start() हे फंक्शन्स इनपुट आउटपुट व मेमरी रिजन वर काम करतात.पुढील फंक्शन्स अनुक्रमे अशी माहिती मिळवतात:बेस अँड्रेस ,लेन्थ, शेवटचा अँड्रेस,कंट्रोल फ्लँग
pci_resource_len()
pci_resource_end()
pci_resource_flags()

 या भागात आपण पी सी आय डिव्हाईस साठी बेसिक ड्रायव्हर कसा लिहावा ते पाहिलेत.

पी सी आय चा ऑपरेटर सिस्टीम मध्ये चालणारा कोड पुढील लोकेशन ला मिळेल:

drivers/net/, drivers/scsi/, drivers/video/

लिनक्स सिस्टीम मध्ये पी सी आय डिव्हाईस ड्रायव्हरची माहिती मिळवण्यासाठी लोकेशन : Documentation/pci.txt

पी सी आय हा इंटरफेस मदर बोर्ड ला कनेक्टेड असतो त्यामुळे आपणस या द्वारे आपनास ग्राफिक्स कार्ड नेटवर्क कार्ड या सारख्या डिव्हाईससाठी ड्रायव्हर लिहिता येतो.

पुढील भागात आपण यु एस बी साठी डिव्हाईस ड्रायव्हर लिहणार आहोत.

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

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

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

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

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

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

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

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

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

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

धन्यवाद -MJ 🙂