Изменение нескольких ttyACMx USB-модема после переподключения

Я подключаю модем Gemalto (Cinterion) через USB к своему встроенному Linux (2.6.31), работающему с BusyBox и mdev.

Модем создает ttyACM [0-6], где '0' используется для pppd. Время от времени я получаю отказы и повторные подключения (1 час, 1 день...). Вся система сложнее - к модему по интерфейсу RS232 подключается другое встроенное устройство, бла-бла-бла.

Моя проблема:

Когда происходит отключение и повторное подключение, pppd не успевает завершить работу и освободить ttyACM0, поэтому создаются ttyACM [1-7]. В следующий раз это может быть [0, 2-7] или [3-8], без конкретного алгоритма.

Я пытался обновить симлинк (на /dev/ttyMyModem), но та же самая проблема "нет конкретного алгоритма"... все интерфейсы одинаковые - CDC-ACM (не так ли???) .

Мой текущий подход:

Сценарий bash, обертывающий pppd, с бесконечным циклом, ожидающим выхода из pppd (который остается на переднем плане, «nodetach» в моем файле параметров). Когда pppd умирает, я удаляю драйвер (modprobe -r cdc_acm), удаляю все узлы (rm /dev/ttyACM*), переустанавливаю драйвер (modprobe cdc_acm) и запускаю pppd. Я ставлю 1-2 секунды задержки между тем, что нужно.

Это решение требует 2-4 итераций для повторного подключения (не знаю, почему оно не работает на первом), но кажется стабильным.

Мой вопрос:

  • Я изобретаю колесо?
  • Является ли это решение стабильным? Подходит для производства?
  • Я пропустил «модное слово» при поиске в Google?

Пожалуйста, не будь суров со мной...


person Rami Rosenbaum    schedule 13.07.2015    source источник


Ответы (1)


У меня недостаточно представителей, чтобы задать вопрос в разделе комментариев, поэтому я должен спросить об этом здесь. Когда вы говорите, что обновляете символическую ссылку, вы имеете в виду правила udev? У меня такая же проблема с принтерами, сканерами и прочим. В моей программе я использую «udevadm info --export-db», чтобы прочитать правильный путь разработки для моих устройств, как только я получаю ошибку записи/чтения. Я закрываю дескриптор файла и снова открываю его на новом устройстве. Вы пытались остановить отключение? Я не смог сделать это сам, но вы можете попробовать отключить autosusped. используйте опцию ядра usbcore.autosuspend=-1 и:

for i in /sys/bus/usb/devices/usb*/power/control; do echo "on" > $i; done

Надеюсь, это поможет. ИМХО, ваше решение достаточно стабильно. Я привык к таким странным «решениям», работающим в системах автоматизации.

person Gustavo da Silva Serra    schedule 13.07.2015
comment
Я использую mdev, а не udev, символическая ссылка: ln -sf /dev/ttyACM0 /dev/modem. В моем ядре нет опции "control"... - person Rami Rosenbaum; 13.07.2015