Драйверы Linux и device.h

#c #linux-kernel #drivers

#c #linux-ядро #Пилоты

Вопрос:

У меня есть несколько драйверов Linux для некоторых аппаратных средств canbus напрямую от производителя, но они устарели (по крайней мере, для моего ядра), что оставляет меня на произвол судьбы. После прохождения нескольких этапов я остановился на единственной ошибке при компиляции, но, похоже, от нее я не могу избавиться.

Ошибка заключается в следующем:

 ./src/esdcan_pci.c:353:9: error: ‘struct devicehas no member nameddriver_data  

После долгих поисков в Интернете я почти уверен, что это связано с заголовочным файлом для моего ядра device.h. Я открыл заголовок и взглянул на структуру, и, конечно же, там нет элемента с именем driver_data . В чем я не уверен, так это в том, какой элемент был бы эквивалентен, или есть ли он вообще. Вот версия структуры в моем заголовочном файле:

 struct device {
    struct device       *parent;

    struct device_private   *p;

    struct kobject kobj;
    const char      *init_name; /* initial name of the device */
    struct device_type  *type;

    struct mutex        mutex;  /* mutex to synchronize calls to
                     * its driver.
                     */

    struct bus_type *bus;       /* type of bus device is on */
    struct device_driver *driver;   /* which driver has allocated this
                       device */
    void        *platform_data; /* Platform specific data, device
                       core doesn't touch it */
    struct dev_pm_info  power;

#ifdef CONFIG_NUMA
    int     numa_node;  /* NUMA node this device is close to */
#endif
    u64     *dma_mask;  /* dma mask (if dma'able device) */
    u64     coherent_dma_mask;/* Like dma_mask, but for
                         alloc_coherent mappings as
                         not all hardware supports
                         64 bit addresses for consistent
                         allocations such descriptors. */

    struct device_dma_parameters *dma_parms;

    struct list_head    dma_pools;  /* dma pools (if dma'ble) */

    struct dma_coherent_mem *dma_mem; /* internal for coherent mem
                         override */
    /* arch specific additions */
    struct dev_archdata archdata;
#ifdef CONFIG_OF
    struct device_node  *of_node;
#endif

    dev_t           devt;   /* dev_t, creates the sysfs "dev" */

    spinlock_t      devres_lock;
    struct list_head    devres_head;

    struct klist_node   knode_class;
    struct class        *class;
    const struct attribute_group **groups;  /* optional groups */

    void    (*release)(struct device *dev);
};
  

Поскольку я впервые компилирую драйвер Linux, я не уверен, на что я смотрю. Есть ли у кого-нибудь опыт в такого рода области, который мог бы дать несколько советов? Спасибо.

Комментарии:

1. Было бы полезно включить версию ядра, ожидаемую драйвером, и версию, которую вы используете.

2. Я использую 2.6.35.12-88.fc14.x86_64. Я понятия не имею, чего ожидает драйвер. Лучшая ссылка, которая у меня есть, — это то, что в документации указано, что для ядер выше 2.6.0 вам необходимо иметь root-доступ для компиляции, поэтому я предполагаю, что это, по крайней мере, ожидает 2.6.0.

Ответ №1:

Модель драйверов переключилась на использование void * dev_get_drvdata( const struct device *dev ) и void dev_set_drvdata( struct device *dev, void * data) , а не на прямое манипулирование struct device элементами. Прототипы этих функций вы найдете в include/linux/device.h Почти каждый драйвер устройства использует эти вызовы, поэтому у вас не возникнет проблем с поиском примеров.

Однако следует отметить одну вещь: несколько подсистем (включая PCI) имеют то, что выглядит как версии этих функций, специфичные для конкретной подсистемы: pci_get_drvdata() . Однако это всего лишь оболочки вокруг dev_* функций.

Комментарии:

1. Идеальный. Теперь заменим все эти макросы. Приветствия!