3

我正在通过 USB 将 Gemalto (Cinterion) 调制解调器连接到运行 BusyBox 和 mdev 的嵌入式 Linux (2.6.31)。

调制解调器创建 ttyACM [0-6],其中“0”用于 pppd。我时不时地(1小时,1天......)得到dis和re-connections。整个系统更加复杂——另一个嵌入式设备通过 RS232 接口连接到调制解调器,bla-bla-bla。

我的问题:

当发生断开连接和重新连接时,pppd 不够快而无法终止并释放 ttyACM0,因此会创建 ttyACM [1-7]。下次可能是 [0, 2-7] 或 [3-8],没有具体的算法。

我尝试更新一个 simlink(到 /dev/ttyMyModem),但同样的“没有具体算法”问题......所有接口都是相同的 - CDC-ACM(不是吗???)。

我目前的做法:

一个包装 pppd 的 bash 脚本,带有无限循环,等待 pppd 的退出(它停留在前台,在我的选项文件中为“nodetach”)。当 pppd 死机时,我删除驱动程序 (modprobe -r cdc_acm),删除所有节点 (rm /dev/ttyACM*),重新安装驱动程序 (modprobe cdc_acm) 并运行 pppd。我在需要的内容之间延迟了 1-2 秒。

该解决方案需要 2-4 次迭代才能重新连接(不知道为什么它在第一次不起作用),但看起来很稳定。

我的问题:

  • 我在发明轮子吗?
  • 这个解决方案稳定吗?适合生产吗?
  • 我是否在 Google 搜索中漏掉了一个“流行词”?

请不要对我苛刻...

4

1 回答 1

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

希望有帮助。恕我直言,您的解决方案足够稳定。我已经习惯了在自动化系统中工作的这种奇怪的“解决方案”。

于 2015-07-13T13:07:28.153 回答