Estoy usando Linux Mint 15. Cuando intento compilar la versión del archivo del controlador EXAR UART para el kernel v3.5.0 y posteriores, se proporciona aquí: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410
Obtuve el siguiente error:
v@lenovo-linux ~/Downloads/xr21v141x-lnx-3.5-pak $ sudo make
make -C /lib/modules/3.8.0-19-generic/build M=/home/v/Downloads/xr21v141x-lnx-3.5-pak
make[1]: Entering directory `/usr/src/linux-headers-3.8.0-19-generic'
LD /home/v/Downloads/xr21v141x-lnx-3.5-pak/built-in.o
CC [M] /home/v/Downloads/xr21v141x-lnx-3.5-pak/vizzini.o
/home/v/Downloads/xr21v141x-lnx-3.5-pak/vizzini.c: In function ‘xr21v141x_tty_set_termios’:
/home/v/Downloads/xr21v141x-lnx-3.5-pak/vizzini.c:1104:22: error: invalid type argument of ‘->’ (have ‘struct ktermios’)
make[2]: *** [/home/v/Downloads/xr21v141x-lnx-3.5-pak/vizzini.o] Error 1
make[1]: *** [_module_/home/v/Downloads/xr21v141x-lnx-3.5-pak] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.8.0-19-generic'
make: *** [all] Error 2
¿Cómo puedo resolver este error?
Respuesta1
Por lo general, primero intento encontrar algún foro en su sitio web y preguntar allí. Si esto no funciona intento arreglarlo yo mismo, pero normalmente hay más errores como este y me rindo después de varios de ellos.
Para arreglar este:
- vaya a /home/v/Descargas/xr21v141x-lnx-3.5-pak/
- abrir vizzini.c
- ir a la línea 1104
- debería haber algo como
whatever->whatever
- si no, publique la línea aquí
- En caso afirmativo, cámbielo
whatever.whatever
y vuelva a intentarlo.
Por cierto, ¿por qué construyes como root?
Respuesta2
Las interfaces del kernel de Linux cambian con frecuencia. Depende de los escritores de conductores
- o contribuyen con su código al kernel, después de lo cual quien rompa la compatibilidad tiene que arreglar el controlador;
- o hacer que su controlador evolucione para mantenerse al día con cambios de interfaz incompatibles.
El controlador xr21v1410 fue escrito para Linux 3.5. El mensaje que hace referencia a la línea 1104 vizzini.c
indica que se está utilizando una variable de un tipo de estructura. Mirando la fuente, aquí es tty->termios
donde tty
está el tipo.tty_struct
. Alrededor de Linux 3.6, el puntero cambió para convertirse en una estructura dentro de otra estructura.
Puede intentar solucionar este problema cambiando tty->termios
a tty.termios
todo el código. Sin embargo, es poco probable que éste sea el único problema. Debe comunicarse con el fabricante y solicitar un controlador actualizado.
Respuesta3
He probado sus respuestas y, de hecho, reescribir esta línea soluciona el problema:
// cflag = tty->termios->c_cflag;
cflag = tty->termios.c_cflag;
El controlador vizzini.ko se compila bien y se puede cargar con insmod.