Драйверы для Linux и device.h - PullRequest
       15

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

3 голосов
/ 13 апреля 2011

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

Ошибка такова:

./src/esdcan_pci.c:353:9: error: ‘struct device’ has no member named ‘driver_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 Ответ

5 голосов
/ 13 апреля 2011

Модель драйвера переключилась на использование 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_*.

...