नोट: मैं इस समस्या को आज सूचीबद्ध कर रहा हूं जैसा कि आज है, मैं कार्यान्वयन को बदलने के लिए विरोध नहीं कर रहा हूं (उदाहरण के लिए कक्षा के निर्माण को सामान्य क्षेत्र में ले जाना) यदि यह चीजों को आसान बनाता है ... मुझे यकीन नहीं है कि यह कैसे करें। : एंड नोटलिनक्स में, आप मौजूदा वर्ग के भीतर device_create का उपयोग कैसे करते हैं?
मेरे पास दो लिनक्स कर्नेल मॉड्यूल हैं और मैं उनके लिए/sys प्रविष्टियों को अपडेट करने का प्रयास कर रहा हूं। गूगल और अन्य स्रोतों पर चारों ओर सर्च कर रहे हैं, मैं की तर्ज पर कोड के बहुत सारे देखा है:
static dev_t MyDev;
static struct class *c1;
static int __init start_func(void)
{
...
MyDev = MKDEV(nMajor, MINOR_VERSION);
register_chrdev_region(MyDev, 1, MODULE_NAME);
c1 = class_create(THIS_MODULE, "chardrv");
device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
....
और मैं अपनी पहली मॉड्यूल इस कोड काम करता है के लिए पुष्टि कर लें, और इसे सही ढंग बनाता है कि एक:
/sys/class/chardrv/<MODULE_NAME>
प्रविष्टि। मैं क्या जानना चाहता हूं कि आप मौजूदा वर्ग में डिवाइस कैसे बनाते हैं। दूसरे शब्दों में, मेरे मॉड्यूल में से एक ने इस नए chardrv वर्ग को बनाया, अब मैं चाहता हूं कि मेरा अन्य मॉड्यूल उसी डिवाइस के तहत अपने डिवाइस को पंजीकृत करने में सक्षम हो।
मैं class_create() फिर से (दूसरे मॉड्यूल में) कॉल कर सकते हैं नहीं है, क्योंकि वह "chardrv" वर्ग पहले से मौजूद है ...
तो मैं यह देखने के लिए एक जांच चल सकता है या/sys/कक्षा/chardrv मौजूद है, और इससे मुझे यह तय करने में मदद मिल सकती है कि मुझे class_create() को कॉल करने की आवश्यकता है या नहीं, यह कोई समस्या नहीं है।
if (path "/sys/class/chardrv" does not exist)
new_class = class_create("chardrv")
else
new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
तो इस उदाहरण के अनुसार, अगर मेरी कक्षा में पहले से ही मौजूद है, और मैं सिर्फ एक दूसरे मॉड्यूल से यह में मेरी नई डिवाइस जोड़ना चाहते हैं मैं मैं की जरूरत मान: स्पष्ट करने के लिए यहाँ में कुछ छद्म कोड डाल देता है कक्षा संरचना बनाने के लिए और किसी भी तरह से इसे सही "chardrv वर्ग" विशेषताओं के साथ पॉप्युलेट करें, फिर डिवाइस_क्रेट को पहले जैसा कॉल करें, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।
मुझे यकीन नहीं है कि जब आप यहां करने की कोशिश कर रहे हैं तो आप स्पष्ट हैं ... कम से कम यह त्रुटि मेरे प्रश्न को समझ में नहीं आती है। उदाहरण के लिए मैं एक वर्ग "chardrv" बनाना चाहता हूं, उसके बाद एक कर्नेल मॉड्यूल उसमें एक डिवाइस पंजीकृत करता है। "डिवाइस 1" कहें। फिर एक दूसरा कर्नेल मॉड्यूल एक ही डिवाइस "डिवाइस 2" में दूसरे डिवाइस को पंजीकृत करेगा। तो अब/sys/class/chardrv पर एक सूची कमांड चलाकर दोनों डिवाइस दिखाए जाएंगे। क्या आप कह रहे हैं कि लिनक्स में ऐसा करने का कोई तरीका नहीं है? मेरे लिए सही प्रतीत नहीं होता है ... – Mike