Ошибка компиляции драйвера USB

В настоящее время я пытаюсь скомпилировать драйвер USB UART для Linux, который представлен здесь: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410

Драйвер состоит из 2 заголовочных файлов и одного большого файла C. Это содержимое Makefile:

obj-m := vizzini.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

EXTRA_CFLAGS    := -DDEBUG=0

all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD)

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions vtty

Это ошибка, которую выдает компилятор, когда я запускаю make:

[sj755@localhost xr21v141x-lnx-2.6.35-pak]$ make
make -C /lib/modules/3.4.9-2.fc16.x86_64/build M=/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak
make[1]: Entering directory `/usr/src/kernels/3.4.9-2.fc16.x86_64'
  LD      /home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/built-in.o
  CC [M]  /home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.o
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1643:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1643:9: warning: (near initialization for ‘vizzini_device.ioctl’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1646:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1646:9: warning: (near initialization for ‘vizzini_device.tiocmget’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1647:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1647:9: warning: (near initialization for ‘vizzini_device.tiocmset’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c: In function ‘vizzini_init’:
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1663:9: error: implicit declaration of function ‘usb_serial_register’ [-Werror=implicit-function-declaration]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1677:9: error: implicit declaration of function ‘usb_serial_deregister’ [-Werror=implicit-function-declaration]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c: In function ‘__check_debug’:
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1698:83: warning: return from incompatible pointer type [enabled by default]
cc1: some warnings being treated as errors
make[2]: *** [/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.o] Error 1
make[1]: *** [_module_/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.4.9-2.fc16.x86_64'
make: *** [all] Error 2

Это заголовки, включенные в основной исходный файл c:

#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/errno.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include <linux/serial.h>
#include <linux/slab.h>
#include <asm/unaligned.h>
#include <asm/uaccess.h>

#include <linux/usb/cdc.h>
#ifndef CDC_DATA_INTERFACE_TYPE
#define CDC_DATA_INTERFACE_TYPE 0x0a
#endif
#ifndef USB_RT_ACM
#define USB_RT_ACM      (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
#define ACM_CTRL_DTR            0x01
#define ACM_CTRL_RTS            0x02
#define ACM_CTRL_DCD            0x01
#define ACM_CTRL_DSR            0x02
#define ACM_CTRL_BRK            0x04
#define ACM_CTRL_RI             0x08
#define ACM_CTRL_FRAMING        0x10
#define ACM_CTRL_PARITY         0x20
#define ACM_CTRL_OVERRUN        0x40
#endif

#include "linux/version.h"

#include "vizzini.h"

Запуск ядра Linux 3.4.9-2.fc16.x86_64

Буду очень признателен за любую помощь в устранении ошибок.

ИЗМЕНИТЬ

Кажется, что usb_serial_register и usb_serial_deregister никогда не были определены в API моего ядра. Однако usb_serial_register_drivers и usb_serial_deregister_drivers есть. Ниже приведены определения:

int usb_serial_register(struct usb_serial_driver *driver);
void usb_serial_deregister(struct usb_serial_driver *device);
int usb_serial_register_drivers(struct usb_driver *udriver,
                                struct usb_serial_driver * const serial_drivers[]);
void usb_serial_deregister_drivers(struct usb_driver *udriver,
                                   struct usb_serial_driver * const serial_drivers[]);

person sj755    schedule 18.01.2013    source источник
comment
Может попробовать #include <linux/kref.h> и #include <linux/mutex.h>? fossies.org/dox/ns-allinone-3.16/   -  person SSH This    schedule 19.01.2013
comment
@SSHThis Это хорошая находка, но у меня такая же ошибка компиляции.   -  person sj755    schedule 19.01.2013
comment
Это просто обеспечивает UART? Вы пробовали аппарат с системой, без кастомного драйвера?   -  person Marc Butler    schedule 19.01.2013
comment
@MarcButler Драйвер должен создавать tty-устройство (ttyUSB [0-4]), когда я подключаю USB-кабель от своего компьютера к, в моем случае, плате FPGA. В Windows новый comport появится в диспетчере устройств, когда я подключусь к своей FPGA.   -  person sj755    schedule 19.01.2013
comment
Я думаю, вы обнаружите, что ядро ​​Linux поставляется с дистрибутивом, который в любом случае появится, поскольку поддержка последовательного порта USB довольно стандартна. Я бы посоветовал вам подключить устройство и посмотреть, появляется ли ttyUSB0 в /dev. Я знаю, что это так, поскольку я использую адаптер rs232-usb больше дней, чем нет.   -  person Marc Butler    schedule 19.01.2013
comment
@MarcButler Ничего нового не появляется в /dev, когда я подключаюсь к порту USB-UART. Кроме того, я включил документацию на плату, которую использую.   -  person sj755    schedule 19.01.2013
comment
@MarcButler см. git. kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/, почему этого драйвера нет в исходной версии Linux.   -  person Karl P    schedule 13.03.2014


Ответы (1)


API внутри ядра (доступные заголовочные файлы, их содержимое, прототипы функций (или если они вообще существуют), ...) не фиксированы (см. Документация/ stable_api_nonsense.txt в ближайшем исходном коде Linux, если вам интересно), поэтому драйвер обычно можно скомпилировать только для довольно узкого диапазона ядер. Проверьте, является ли исходный код (примерно) современником ядра.

Вы также должны проверить, был ли драйвер для этого уже включен в ядро ​​​​либо в качестве официального драйвера, либо в тестовой области. Просмотрите Linux USB, чтобы найти альтернативные драйверы и другие новости. Если больше ничего не помогает, загляните на страницы ядра LWN (поищите там функции, которых нет в текущий источник и обсуждение замены), вероятно, после использования чего-то вроде cscope для создания индекса вашего источника (ядра и драйвера). Пожалуйста, свяжитесь с людьми, ответственными за эту область, чтобы они знали, что вы шарите вокруг, и, возможно, дали несколько советов.

person vonbrand    schedule 20.01.2013
comment
Вы, кажется, правы. Я искал usb_serial_register, но точного совпадения не нашел. Однако появился usb_serial_register_drivers. Я обновил свой вопрос, включив в него определения usb_serial_register (найдено в Google) и usb_serial_register_drivers (найдено в моем файле /lib). Как вы думаете, usb_serial_register_drivers предназначался для замены? - person sj755; 20.01.2013
comment
Как я уже сказал, проверьте страницу ядра LWN. О таких изменениях обычно сообщается там. И Linux-USB тоже должен знать. - person vonbrand; 20.01.2013