Alexander писал(а):Выключение реализовано через вызов
Думаю, что поможет создание в /usr/bin символических ссылок с такими именами на команды в /sbin
P.S. Сказываются особенности дистрибутивов

Да, именно так. Создал ссылки и заработало.
Я опять с дисплеем для покупателей. На данный момент он работает, только если подключени один, без Фр и сканера.
У меня есть устройства:
ФР - подключен через usb, использует модуль ftdi_sio.
Сканер ШК, подключен через переходник usb-com, использует pl2303
Для начала вынимаю все из портов, оставляю только дисплей. После загрузки он использует модуль cdc_adm, вот что говорит про него udev:
- Код: Выделить всё
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/tty/ttyACM0':
KERNEL=="ttyACM0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0':
KERNELS=="2-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="cdc_acm"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="01"
ATTRS{bInterfaceClass}=="02"
ATTRS{bInterfaceSubClass}=="02"
ATTRS{bInterfaceProtocol}=="01"
ATTRS{modalias}=="usb:v058Fp9720d0000dc02dsc00dp00ic02isc02ip01"
ATTRS{supports_autosuspend}=="1"
ATTRS{bmCapabilities}=="6"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 2"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="500mA"
ATTRS{urbnum}=="8"
ATTRS{idVendor}=="058f"
ATTRS{idProduct}=="9720"
ATTRS{bcdDevice}=="0000"
ATTRS{bDeviceClass}=="02"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="2"
ATTRS{devnum}=="2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
Запускаю руками скрипт:
- Код: Выделить всё
#!/bin/bash
/sbin/modprobe -r ftdi_sio pl2303 option cdc_acm usbserial
/sbin/modprobe usbserial vendor=0x058f product=0x9720
/sbin/modprobe ftdi_sio
/sbin/modprobe pl2303
/sbin/modprobe option
После этого udev видит его уже так:
- Код: Выделить всё
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="generic"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1':
KERNELS=="2-1:1.1"
SUBSYSTEMS=="usb"
DRIVERS=="usbserial_generic"
ATTRS{bInterfaceNumber}=="01"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="0a"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v058Fp9720d0000dc02dsc00dp00ic0Aisc00ip00"
ATTRS{supports_autosuspend}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 2"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="500mA"
ATTRS{urbnum}=="8"
ATTRS{idVendor}=="058f"
ATTRS{idProduct}=="9720"
ATTRS{bcdDevice}=="0000"
ATTRS{bDeviceClass}=="02"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="2"
ATTRS{devnum}=="2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
Тут я на всякий случай сохранил вывод udev файл, чтоб потом сравнить:
udevadm info -a -n /dev/ttyUSB0 > ~/pd.txt
Дисплей работает. В настройках стоит USB<>COM1, русский отображается, все хорошо.
Теперь выключаю, добавляю ФР и сканер ШК.
После загрузки дисплей видится как ttyACM0 с драйвером cdc_adm.
Опять запускаю руками скрипт выгрузки-загрузки модулей. В ответ получаю:
FATAL: Module pl2303 is in use.
Устройство /dev/ttyACM0 пропало, но ttyUSB не появилось.
Полностью выключил все, включил, опять руками стартанул скрипт - дисплей опять работает.
Вообщем работает, но не стабильно. В очередной раз выключил-включил, дисплей не работает. Он как ttyUSB0 появился, про него
udev говорит:
- Код: Выделить всё
root@kassa-pava:~# udevadm info -a -n /dev/ttyUSB0|grep DRIVER
DRIVER==""
DRIVERS=="generic"
DRIVERS=="usbserial_generic"
DRIVERS=="usb"
DRIVERS=="usb"
DRIVERS=="uhci_hcd"
DRIVERS==""
Однако ничего на него не выводится и в моменты когда программа пытается на него что-то вывести, все "подвисает".
Почитав манов, сделал так:
В /etc/modprobe.d/usbserial.conf :
- Код: Выделить всё
options usbserial vendor=0x058f product=0x9720
softdep ftdi_sio pre: usbserial
softdep pl2303 pre: ftdi_sio
softdep option pre: pl2303
Указал параметры для usbserial и указал зависимости для модулей, чтоб грузились в нужном порядке.
cdc_amd мне не нужен, модемов нет, поэтому в /etc/modprobe.d/blacklist.conf добавил blacklist cdc_acm.
Дальше "depmod -a", "update-initramfs -u", все выключаю и стартую вновь.
Дисплей определился как ttyUSB0, udev про него говорит:
- Код: Выделить всё
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="generic"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.1':
KERNELS=="2-1:1.1"
SUBSYSTEMS=="usb"
DRIVERS=="usbserial_generic"
ATTRS{bInterfaceNumber}=="01"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="0a"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v058Fp9720d0000dc02dsc00dp00ic0Aisc00ip00"
ATTRS{supports_autosuspend}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 2"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="500mA"
ATTRS{urbnum}=="9"
ATTRS{idVendor}=="058f"
ATTRS{idProduct}=="9720"
ATTRS{bcdDevice}=="0000"
ATTRS{bDeviceClass}=="02"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="2"
ATTRS{devnum}=="2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
Т.е. драйвер оно правильный подключило.
Однако сам дисплей не работает, на нем ничего не отображается и программа подвисает секунд на 30 (например при выборе в главном меню "Настройка драйверов устройств" и выходе обратно в главное меню).
Поскольку я сохранил в файл всю информацию от udev в момент, когда дисплей работал, сравниваю одно с другим:
- Код: Выделить всё
root@kassa-pava:~# udevadm info -a -n /dev/ttyUSB0 > pd-1.txt
root@kassa-pava:~# diff pd.txt pd-1.txt
41c41
< ATTRS{urbnum}=="8"
---
> ATTRS{urbnum}=="13"
67c67
< ATTRS{urbnum}=="33"
---
> ATTRS{urbnum}=="35"
Параметр urbnum это похоже какой-то счетчик, т.к. значения его меняются. Остальные параметры одинаковы.
На данный момент даже как-то идей не осталось, что еще сделать. Вроде драйвер правильный сразу грузит, а не работает.
Подскажите пожалуйста направление, где искать.