Estou usando o Linux Mint 15. Quando tento compilar a versão do arquivo do driver EXAR UART para o kernel v3.5.0 e posterior fornecido aqui: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410
Estou tendo o erro a seguir:
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
Como posso resolver esse erro?
Responder1
Normalmente tento primeiro encontrar algum fórum no site deles e perguntar lá. Se isso não funcionar, tento consertar sozinho, mas geralmente há mais erros como esse e desisto depois de vários deles.
Para corrigir este:
- vá para /home/v/Downloads/xr21v141x-lnx-3.5-pak/
- abra vizzini.c
- vá para a linha 1104
- deveria haver algo como
whatever->whatever
- se não, poste a linha aqui
- se sim, mude para
whatever.whatever
e tente novamente fazer
A propósito, por que você constrói como root?
Responder2
As interfaces do kernel Linux mudam frequentemente. Cabe aos escritores de drivers
- ou contribuem com seu código de volta para o kernel, após o qual quem quebrar a compatibilidade terá que consertar o driver;
- ou fazer seu driver evoluir para acompanhar alterações de interface incompatíveis.
O driver xr21v1410 foi escrito para Linux 3.5. A mensagem referente à linha 1104 in vizzini.c
indica que está sendo utilizada uma variável do tipo estrutura. Olhando para a fonte, é tty->termios
aqui que tty
está do tipotty_struct
. Por volta do Linux 3.6, o ponteiro mudou para se tornar uma estrutura dentro de outra estrutura.
Você pode tentar corrigir isso alterando tty->termios
para tty.termios
todo o código. No entanto, é pouco provável que este seja o único problema. Você deve entrar em contato com o fabricante e solicitar um driver atualizado.
Responder3
Testei suas respostas e, de fato, reescrever esta linha resolve o problema:
// cflag = tty->termios->c_cflag;
cflag = tty->termios.c_cflag;
O driver vizzini.ko compila bem e pode ser carregado com insmod.