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


आपल्या संगणकात ग्राफिक्स कार्ड ,लँन कार्ड सारखी डिव्हाईस जोडण्यासाठी [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 :-)

 

2 comments

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

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