Я использую Linux Mint 15. Когда я пытаюсь скомпилировать файл драйвера EXAR UART версии для ядра v3.5.0 и более поздних версий, представленных здесь: 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
и повторите попытку
Кстати, почему вы выполняете сборку как 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.