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


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

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

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

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

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

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

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

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

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

कर्नेलचा हेल्पर थ्रेड 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 :-)

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

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