Ошибка компиляции драйвера 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

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

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

В более поздних версиях ядра linux функции usb_serial_register и usb_serial_deregister были сделаны статическими. Таким образом, функции существуют только как текст в объектных файлах ядра. usb_serial_register_drivers этого можно использовать 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[]); 

usb_serial_register_drivers принимает NULL завершенный массив указателей на usb-последовательные драйверы для регистрации и usb_driver, используемые для сопоставления устройств / интерфейсов. Подробности двух наборов функций можно прочитать здесь:

http://lxr.free-electrons.com/source/drivers/usb/serial/usb-serial.c?v=3.4#L1379

http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/usb/serial/usb-serial.c#L1337

В исходном коде для драйвера такие строки, как:

 retval = usb_serial_register(&vizzini_device); 

были заменены следующим:

 struct usb_serial_driver *serial_drivers[2] = {&vizzini_device,NULL}; retval = usb_serial_register_drivers(&vizzini_driver,serial_drivers); 

vizzini_driver и vizzini_device были определены в другом месте кода следующим образом:

 static struct usb_driver vizzini_driver = { .name = "vizzini", .probe = usb_serial_probe, .disconnect = vizzini_disconnect, .id_table = id_table, .no_dynamic_id = 1, }; static struct usb_serial_driver vizzini_device = { .driver = { .owner = THIS_MODULE, .name = "vizzini", }, .usb_driver = &vizzini_driver, .description = "Vizzini USB serial port", .id_table = id_table, .calc_num_ports = vizzini_calc_num_ports, .probe = vizzini_probe, .open = vizzini_open, .close = vizzini_close, .write = vizzini_write, .write_room = vizzini_write_room, .ioctl = vizzini_ioctl, .set_termios = vizzini_set_termios, .break_ctl = vizzini_break_ctl, .tiocmget = vizzini_tiocmget, .tiocmset = vizzini_tiocmset, .attach = vizzini_attach, .disconnect = vizzini_serial_disconnect, .release = vizzini_serial_release, .read_int_callback = vizzini_int_callback, };