Compilação de driver USB Linux

Compilação de driver USB Linux

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:

  1. vá para /home/v/Downloads/xr21v141x-lnx-3.5-pak/
  2. abra vizzini.c
  3. vá para a linha 1104
  4. deveria haver algo comowhatever->whatever
  5. se não, poste a linha aqui
  6. se sim, mude para whatever.whatevere 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.cindica que está sendo utilizada uma variável do tipo estrutura. Olhando para a fonte, é tty->termiosaqui que ttyestá 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->termiospara tty.termiostodo 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.

informação relacionada