Преобразователь TA1-USB-01-C фирмы Элкус в Linux

В комплекте к изделию TA1-USB-01-C поставляются драйвера как для Windows, так и для Linux. Но драйвера Linux только для версий ядра 2.х. Запуск на новых версиях 4.х сопряжен с некоторыми проблемами.

Сначала я нашел в репозиторий, где эти драйвера для ядра 3.х, но в комплекте с сайта производителя для 3.х собрать тоже можно. А вот при сборке на 4.х возникают ошибки. Техподдержка сообщила мне, что в файле tmk1553usb.c перед строкой: #include "tmk1553busb.h" нужно добавить:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)
#include <linux/sched/signal.h>
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
#define wait_queue_t wait_queue_entry_t
#endif

Это устранило ошибки при компиляции и драйвер собрался. Модуль драйвера можно загрузить командой insmod tmk1553busb.ko и выгрузить rmmod tmk1553busb.ko.

Но при подключении устройства в dmesg было видно, что оно захватывается модулем usbtest. Видимо это происходит из-за использования стандартный для преобразователей Cypress VID&PID. Даже если выгрузить модуль usbtest через rmmod, он все равно запускается при подключении изделия.

Я добавил модуль драйвера для запуска при загрузке системы:

  1. В файл /etc/modules-load.d/modules.conf добавить строку с именем модуля (без .ko);
  2. Скопировать модуль в директорию текущей версии ядра /lib/modules/`uname -r`/kernel/drivers/usb/;
  3. Запустить depmod, чтобы найти все зависимости

После перезагрузки при подключении подцепляется нужный драйвер, но работать начинает только после применения команды chmod o+rwx /dev/tmk1553busb1 на появившееся устройство. Это не очень удобно, но решается добавлением правила для udev. Создается файл /etc/udev/rules.d/52-elcus.rules с следующей строкой:

ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="8613", MODE="666"

И выполняются две команды для перезапуска правил:

udevadm control --reload-rules
udevadm trigger

После этого библиотеке удается успешно открыть устройство и работать с ним.