LINUX.ORG.RU

Вопрос по поведению libusb


0

0

Меня интересует следующее:

Почему во время всего аптайма машины, при подключении одного и того же устройства (например флешка) меняется ее номер Device

Например, втыкаю флешку:

Bus 007 Device 004: ID 058f:9380 Alcor Micro Corp. Flash Drive
Потом вынимаю и втыкаю заново:
Bus 007 Device 005: ID 058f:9380 Alcor Micro Corp. Flash Drive
Как видно, к номеру прибавилась единица.

На самом деле с флешкой это всего лишь пример. А проблема вся в вендовой программе для сканера - http://sanetwain.ozuzo.net

Сканер (МФУ) подключен к «серверу» на котором поднят SANE, «расшаривающий» сканер в сеть.

Линуксовый клиент, он же sane-backends, настроен на сетевой сканер и все работает просто замечательно.

А вот вендовая программа при выключении и последующем включении сканера напарывается на этот измененный на единицу Device. От этого сама SaneTwain с начала сильно глючит и ругается, а так же всякие ABBYY FineReader'ы начинают впадать в истерику.

Можно не выключать МФУ из розетки. Но это не решение проблемы.

Может как-то можно закрепить номер устройства за МФУ?

★★★

Я не совсем понял при чем здесь libusb, и с SANE дела практически не имел, но когда нужно что-то «закрепить», то использую udev. DeviceID для USB каждый раз создает ядро. И оно так всегда создавало. На самом деле не сильно поможет его закрепление, потому что если ты всунешь в другой разьем - то поменяется BusID, и это уж точно никак не пофиксить. Так что попробуй создать линк через удев /dev/scanner например, и как то застать sane использовать его. Но повторюсь, sane не использовал, и не знаю, можно ли ему сказать использовать конкретный дивайс, или он сам постоянно что-то ищет.

anonymous
()
Ответ на: комментарий от anonymous

Посмотрел чуть манов и конфигов. Кажется можно через линк и yдев. Только с /dev/scanner я погорячился, он для SCSI устройств. Лучше /dev/myscanner и прописать его в конфиг соотвестующего бекенда, при этом возможно отключив usb VENDOR PRODUCТ, чтоб автодетект не срабатывал.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо.

Но я что-то не врубаюсь пока что.

Sane-backends обращается к сканеру напрямую через libusb, т.е. без всякого модуля как например usblp для принтеров.

А как же тогда создать устройство /dev/myscanner с привязкой его Bus и Device. Ведь насколько мне известно udev этот myscanner удалит при перезагрузке, или я ошибаюсь?

Вот что у меня в /etc/udev/rules.d/70-libsane.rules :

# Samsung SCX-4200                                                                                         
ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="341b", MODE="0664", GROUP="scanner", ENV{libsane_matched}="yes"
Т.е. тут ему важно вендор и ID.

В /etc/sane.d/xerox_mfp.conf :

usb 0x04E8 0x341B

В /etc/sane.d/dll.conf :

xerox_mfp

И обращение к сканеру происходит вот так:

xerox_mfp:libusb:001:007
Первым идет Bus, вторым Device

В настройке и создании правил udev я не очень разбираюсь, но сдается мне сделать в моем случае ничего нельзя.

yaba ★★★
() автор топика

Нашел решение в FAQ программы SaneTwain.

Цитирую:

For udev, create a new rule file /etc/udev/rules.d/10-my_scanner.rules with content:

SUBSYSTEMS=="usb",ATTRS{idVendor}=="VVVV",ATTRS{idProduct}=="PPPP",RUN+="/lib/udev/my_scanner" 

(again, with VVVV and PPPP the vendor and product IDs respectively. Now create a script /lib/udev/my_scanner, containing the following (fill in the appropriate name of the backend, in the example epson):

#!/bin/bash
SANEBACKEND=epson

BUS=$(echo ${DEVPATH} | sed 's:.*usbdev\([0-9]*\).\([0-9]*\).*:\1:')
NUM=$(echo ${DEVPATH} | sed 's:.*usbdev\([0-9]*\).\([0-9]*\).*:\2:')
DEVICE=$(printf '%s:libusb:%.03d:%.03d' ${SANEBACKEND} ${BUS} ${NUM})

ALIASFILE=/etc/sane.d/dll.aliases
echo "alias MyScanner $DEVICE" > $ALIASFILE
После запуска этого скрипта, по определению подключенного МФУ к системе, он создает псевдоним и в венде все программы использующие сканер работают без ошибок.

yaba ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.