我正在使用 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 加载。