私は Linux Mint 15 を使用しています。ここで提供されているカーネル v3.5.0 以降の EXAR UART ドライバー ファイル バージョンをコンパイルしようとすると、次のようになります。 http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410
次のエラーが発生します:
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
このエラーを解決するにはどうすればよいですか?
答え1
私は通常、まずウェブサイト上のフォーラムを探して、そこで質問します。これがうまくいかない場合は、自分で修正しようとしますが、通常、このようなエラーがさらに発生し、数回発生したら諦めてしまいます。
これを修正するには:
- /home/v/Downloads/xr21v141x-lnx-3.5-pak/ に移動します。
- vizzini.c を開く
- 1104行目へ
- 次のようなものがあるはずだ
whatever->whatever
- そうでない場合は、ここにその行を投稿してください
- はいの場合は、変更して
whatever.whatever
再度makeを試してください。
ところで、なぜ root としてビルドするのですか?
答え2
Linuxカーネルのインターフェースは頻繁に変更されます。
- コードをカーネルに戻し、その後互換性を壊した人がドライバーを修正する必要があります。
- または、互換性のないインターフェースの変更に対応するためにドライバーを進化させる必要があります。
xr21v1410ドライバはLinux 3.5用に作成されました。1104行目のメッセージは、vizzini.c
構造体型の変数が使用されていることを示しています。ソースを見ると、ここはtty->termios
型tty
です。tty_struct
Linux 3.6 あたりで、ポインターは別の構造体内の構造体になるように変更されました。
tty->termios
コード全体をに変更することで、この問題を修正できますtty.termios
。ただし、これが唯一の問題である可能性は低いです。製造元に連絡して、更新されたドライバーを要求する必要があります。
答え3
あなたの回答をテストしたところ、実際にこの行を書き直すと問題は解決しました。
// cflag = tty->termios->c_cflag;
cflag = tty->termios.c_cflag;
vizzini.ko ドライバーは正常にコンパイルされ、insmod でロードできます。