Linux USB-Treiberkompilierung

Linux USB-Treiberkompilierung

Ich verwende Linux Mint 15. Wenn ich versuche, die EXAR UART-Treiberdateiversion für Kernel v3.5.0 und höher zu kompilieren, wird sie hier bereitgestellt: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410

Ich erhalte die folgende Fehlermeldung:

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

Wie kann ich diesen Fehler beheben?

Antwort1

Normalerweise versuche ich zuerst, ein Forum auf ihrer Website zu finden und dort nachzufragen. Wenn das nicht funktioniert, versuche ich, das Problem selbst zu beheben, aber normalerweise treten mehr Fehler dieser Art auf und nach mehreren davon gebe ich auf.

So beheben Sie das Problem:

  1. gehe zu /home/v/Downloads/xr21v141x-lnx-3.5-pak/
  2. öffne vizzini.c
  3. gehe zu Zeile 1104
  4. da müsste sowas stehen wiewhatever->whatever
  5. wenn nicht, poste die Zeile hier
  6. wenn ja, ändern Sie es in whatever.whateverund versuchen Sie es erneut

Übrigens, warum erstellen Sie als Root?

Antwort2

Linux-Kernel-Schnittstellen ändern sich häufig. Es liegt an den Treiberautoren,

  • entweder ihren Code wieder zum Kernel beitragen, wonach derjenige, der die Kompatibilität verletzt, den Treiber reparieren muss;
  • oder ihre Treiber weiterentwickeln, um mit inkompatiblen Schnittstellenänderungen Schritt zu halten.

Der Treiber xr21v1410 wurde für Linux 3.5 geschrieben. Die Meldung in Zeile 1104 vizzini.czeigt an, dass eine Variable eines Strukturtyps verwendet wird. In der Quelle ist dies tty->termiosder ttyTyptty_struct. Ab Linux 3.6 wurde der Zeiger zu einer Struktur innerhalb einer anderen Struktur.

Sie können versuchen, dies zu beheben, indem Sie im gesamten Code Folgendes ändern tty->termios. tty.termiosDies ist jedoch wahrscheinlich nicht das einzige Problem. Sie sollten sich an den Hersteller wenden und einen aktualisierten Treiber anfordern.

Antwort3

Ich habe Ihre Antworten getestet und tatsächlich behebt das Umschreiben dieser Zeile das Problem:

//  cflag = tty->termios->c_cflag;
cflag = tty->termios.c_cflag;

Der vizzini.ko-Treiber wird problemlos kompiliert und kann mit insmod geladen werden.

verwandte Informationen