1

/dev/プラットフォーム ドライバー コードを PCIe バリアントに移植していますが、エントリが表示されない理由がわかりません。変更されたプラットフォーム ドライバー コード:

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/...が期待どおりの場所にあることが示されます。

何を与える?

4

1 に答える 1

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;
}
于 2014-10-08T17:06:37.160 に答える