2014-10-08 9 views
1

Я портирую код драйвера платформы на вариант PCIe, и я не понимаю, почему я не получаю запись /dev/. Код драйвера платформы, которая была модифицирована:Почему вызов device_create() не создает/dev/entry?

static dev_t first; 
static struct class * class; 
ATTRIBUTE_GROUPS(my); 
static int __init my_pci_init(void) 
{ 

    int ret; 
    /* Create a class entry in sysfs */ 
    if ((class = class_create(THIS_MODULE, "test_driver")) == NULL) { 
     pr_err("Couldn't create 'struct class' structure."); 
     ret = -ENODEV; 
     goto exit; 
    } 
    class->dev_groups = my_groups; 
    /* Create the /dev/ file system entry */ 
    /* return value ignored: there's a 'struct class' to 'struct device' mapping */ 
    if (device_create(class, NULL, first, NULL, KBUILD_MODNAME) == NULL) { 
     pr_err("Couldn't create entry in '/dev/' file system."); 
     ret = -ENODEV; 
     goto exit; 
    } else { 
     pr_info("Created a /dev/ entry."); 
    } 

    if ((ret = pci_register_driver(&pci_driver)) < 0) { 
     pr_err("Couldn't register pci driver."); 
    } 
exit: 
    if (ret < 0) { 
     my_pci_exit(); 
     pr_err(" ret = %d", ret); 
    } 
    return ret; 
} 

module_init(my_pci_init); 

Если имя модуля «cz_tdm», я надеялся, что приведенный выше код будет создать запись /dev/cz_tdm. По крайней мере, это было, когда я компилировал это как драйвер платформы.

Водитель перебирает просто отлично, выход lspci показывает, что драйвер был загружен и просматривал sysfs показывает, что все мои атрибуты в /sys/devices/virtual/... то, где я бы ожидать, что они будут.

Что дает?

ответ

2

Упс.

Потому что это тоже не предполагается. Избыточное удаление кода вырвало этот необходимый элемент:

/* Add the char device to the system. */ 
cdev_init(&cdev, &fops); 
if ((ret = cdev_add(&cdev, first, DEV_MINOR_NUMBER_COUNT)) < 0) { 
    pr_err("Couldn't add device to system: %d", ret); 
    ret = -ENODEV; 
    goto exit; 
}