#c #linux-kernel #drivers
#c #linux-ядро #Пилоты
Вопрос:
У меня есть несколько драйверов 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. Было бы полезно включить версию ядра, ожидаемую драйвером, и версию, которую вы используете.
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. Идеальный. Теперь заменим все эти макросы. Приветствия!