पर विफल होने वाले लिनक्स में एक साधारण चार ड्राइवर को डीबग करना मैंने एक साधारण चार ड्राइवर लिखा था और अब इसे कक्षाओं का उपयोग करके udev में स्वचालित रूप से पंजीकृत करना चाहते हैं। मेरे कोड में init
फ़ंक्शन होता है जिसे ड्राइवर लोड किया जाता है और probe
फ़ंक्शन कहा जाता है जब ड्राइवर अपने डिवाइस लोड कर रहा है (और निश्चित रूप से उनके काउंटर समकक्ष exit
और remove
)। समस्या: device_create
कमांड निष्पादित करते समय एक नया डिवाइस जोड़ा जाने पर मेरा probe
फ़ंक्शन विफल हो जाता है। अब मैं सोच रहा हूं कि क्यों:Linux_create()
यह आदेश संभवतः अधिक जानकारी प्राप्त कैसे कर सकता है कि यह आदेश विफल क्यों होता है (इसके अलावा यह विफल रहता है)? कोई भी तर्क गुम है (जैसे fooClass
की वैश्विक घोषणा के साथ कोई समस्या है, क्या मुझे इसे probe
फ़ंक्शन पर ले जाना चाहिए, जो मेरी आंखों में संवेदना नहीं करता है लेकिन कई उदाहरणों में दिखाया गया है)? या कोई अन्य विदेशी त्रुटि?
मेरे कोड के बाद मैंने अधिकांश रिटर्न सत्यापन (जैसे IS_ERR()
) को हटा दिया और पठनीयता के लिए कार्यों को साफ किया। यह दो चर विश्व स्तर पर परिभाषित कर रहे हैं:
static int foo_majNbr;
static struct class *fooClass;
init
समारोह:
static int __init foo_init(void)
{
int rv;
dev_t devNbr;
/* Registering driver */
rv = pci_register_driver(&foo_driver);
/* ----> see answer below for correct order <---- */
/* Create device class */
fooClass = class_create(THIS_MODULE, CLASS_NAME);
/* Allocate device number, just one device for the moment */
rv = alloc_chrdev_region(&devNbr, 0, 1, DEVICE_NAME);
foo_majNbr = MAJOR(devNbr);
...
}
और probe
समारोह:
static int __devinit foo_probe(struct pci_dev *dev,
const struct pci_device_id *devId)
{
struct foo_dev *foo_dev = 0;
int rv = 0;
/* Allocate memory in Kernel (for parameters) */
foo_dev = kzalloc(sizeof(*foo_dev), GFP_KERNEL);
foo_dev->pci_dev = dev;
pci_set_drvdata(dev, foo_dev);
foo_dev->devNbr = MKDEV(foo_majNbr, 1);
/* Add class to device */
foo_dev->dev = device_create(fooClass, NULL, foo_dev->devNbr,
foo_dev, DEVICE_NAME);
if (IS_ERR(foo_dev->dev)) {
/* ----> INDICATES FAILURE HERE <---- */
}
/* Add char device */
cdev_init(&foo_dev->cdev, &foo_fops);
rv = cdev_add(&foo_dev->cdev, foo_dev->devNbr, 1);
/* Enabling device */
rv = pci_enable_device(dev);
...
}
धन्यवाद, वास्तव में जो मैं खोज रहा था और इससे समस्या को खोजने में मदद मिली :) - मैंने समाधान को नीचे दिए गए एक अलग उत्तर में पोस्ट किया। – lorenzli