Error de compilation del controller USB

Actualmente estoy intentando comstackr un controller UART USB de Linux, que se proporciona aquí: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410

El controller consta de 2 files de cabecera y un gran file C. Estos son los contenidos del 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 

Este es el error que está lanzando el comstackdor cuando ejecuto 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 

Estos son los encabezados incluidos en el file fuente c principal:

 #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" 

Ejecutando Linux Kernel 3.4.9-2.fc16.x86_64

Agradecería mucho cualquier ayuda para resolver los errores.

La API dentro del kernel está lejos de ser estable, por lo tanto, a less que el controller sea más o less contemporáneo con la fuente del kernel, simplemente no funcionará (y las advertencias / posts de error que das apuntan en esa dirección). Y la mayoría de los conductores fuera de tree son códigos horribles, así que tome ese con un grano (o palada) de sal. Mire si eso es respaldado por los kernels actuales, ya sea oficialmente o en etapas de los controlleres. Compruebe Linux-USB , allí puede encontrar algunos pointers.

En versiones más recientes del kernel de Linux, las funciones usb_serial_register y usb_serial_deregister han convertido en estáticas. Por lo tanto, las funciones solo existen como text en los files de objects del kernel. Los usb_serial_register_drivers y usb_serial_deregister_drivers se pueden usar en su lugar.

Aquí están las definiciones de los dos sets de funciones:

 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 toma una matriz de pointers NULL con los controlleres usb-serial para ser registrados y un usb_driver usado para hacer coincidir dispositivos / interfaces. Los detalles de los dos sets de funciones se pueden leer aquí:

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

Dentro del código fuente del controller, líneas como esta:

 retval = usb_serial_register(&vizzini_device); 

fueron reemplazados con esto:

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

vizzini_driver y vizzini_device se definieron en otro lugar del código como el siguiente:

 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, };