USB mode switch 浅探

近几天的闲余时间,几乎都在和两个东西搏斗,一个叫做 OpenWrt,一个叫做 ME909s-821。

其实前者本身倒是没什么,只是后者就大大地令人伤脑筋。这是华为的一块全网通 4G 上网卡,网上的价钱,比 EC20 大概能便宜几十块,一百左右可以拿下。把它插到 OpenWrt 设备上,装上理应完备的那些相关的内核包,情况是,串口设备创建成功,但是 USB 网卡总是创建失败。这个令人皱眉的现实导致的后果是,无法有效利用这个设备的高速网络连接。

几经折腾,目前定位的阶段性结论是,毛病似乎出在 USB 的模式切换上。执行 USB 模式切换职责的组件叫做 usb_modeswitch,这个组件的来由在于,在前几年(也许现在依然)有好多的 3G 或者 4G 上网卡的厂商,会把设备设定为同时可以扮作存储了驱动程序的 CD 的驱动器。当操作系统把驱动程序(当然,通常主要是针对 Windows 平台)安装完毕之后,会向设备发送指令,进行模式切换,露出通讯设备的本来面目。

Linux 系统享受不了 CD 里带驱动的好处,却承担着设备状态不能直接就处于通讯模式的坏处,于是有人就鼓捣了个 usb_modeswitch 出来。这个工具在通常状态下都应该是自动工作的,但也支持手动执行。它的基本原理是(现学现卖,前几天老夫也只是傻瓜式使用):它时刻在监视着 USB 总线上的变化,当出现认识的 VID:PID 设备时,就执行 usb_modeswitch 来切换设备的模式。这一句话里有三个地方是关键(干货真不少),一是监视,二是匹配,三是切换。如果想知其所以然,就得知道这几件事分别是由谁来完成的。

以本人的一知半解来看(主要信息来源是 http://www.draisberghof.de/usb_modeswitch/),似乎监视的承担者是系统里被称为 udev 的一套组件或者说机制,它在发现新的设备后会根据 USB mode switch 提供的一个规则文件(即 /lib/udev/rules.d/40-usb_modeswitch.rules)对 VID:PID 进行匹配,有结果的话则执行一个指定的行为,此行为就是 usb_modeswitch 这个命令行工具。usb_modeswitch 运行起来以后,又会根据 VID:PID 在自己的数据库里查询相应的处理指令,这个处理有很多种情况,具体可以参考其开源的源代码和数据文件。

有个比较糟心的事情在于,如果要使其工作于并非串口的高速网络连接模式的话,系统提供若干种不同的选择,如 QMI、MBIM、NCM、RNDIS。对于 ME909s-821,不知道应该对应到哪个上面。根据网上有限的资料,有人在树莓派上通过 RNDIS 模式拨号成功,其上网所使用的设备为 usb0,这是典型的 RNDIS 行为,前三个模式,如果驱动正确的话,好像创建出来的设备应该是 /dev/cdc-wdm0 这样的。这也是为什么上面叙述的努力过程,目标一直是按照要出现 usb0 设备来设定的。

注:此事呗优先级更高的事情被迫中止,容后再叙。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注