2015-07-13 9 views
3

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

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

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

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

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

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

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

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

Мой вопрос:

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

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

ответ

0

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

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

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

+0

Я использую mdev, а не udev, symlink: ln -sf/dev/ttyACM0/dev/modem. У меня нет опции «control» в моем ядре ... –