Компиляция драйвера USB для Linux

Компиляция драйвера USB для Linux

Я использую 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

Обычно я сначала пытаюсь найти какой-нибудь форум на их сайте и спросить там. Если это не работает, я пытаюсь исправить это сам, но обычно таких ошибок становится больше, и я сдаюсь после нескольких из них.

Чтобы исправить это:

  1. перейти в /home/v/Downloads/xr21v141x-lnx-3.5-pak/
  2. открыть vizzini.c
  3. перейти к строке 1104
  4. должно быть что-то вродеwhatever->whatever
  5. если нет, то опубликуйте строку здесь
  6. если да, измените его на 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.

Связанный контент