只为特定的 usb 接口加载 cdc_acm 模块

Load cdc_acm module only for specific usb interface

我正在尝试 USB 设备,它代表自己有多个(七个)USB 子接口,每个子接口都加载了 cdc_acm 内核模块。 cdc_acm 模块报告 "no more free acm devices",当我尝试连接更多 USB 设备时。

我试过 udev 规则但没有成功。

ACTION=="add", SUBSYSTEMS=="usb", DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}!="00", RUN+="/bin/sh -c 'echo -n $id > /sys/bus/usb/drivers/cdc_acm/unbind'"

此规则取消绑定 cdc_acm 驱动程序,但它发生在驱动程序检测到所有子接口并且 运行 进入免费 space 问题后。

我正在寻找只为一个 SUB 子接口加载 cdc_acm 驱动程序的方法。

在cdc_acm的源代码中可以看到"no more free acm devices"消息的来源:

http://lxr.free-electrons.com/source/drivers/usb/class/cdc-acm.c#L1320

稍微查看该代码后,看起来 cdc_acm 驱动程序有一个只能容纳 32 个条目的 table,当 table 填满时您将收到该错误消息。 table的大小由cdc-acm.h.

中的ACM_TTY_MINORS宏决定

您可以通过重新编译具有更高 ACM_TTY_MINORS 值的 cdc-acm 模块,然后将其加载到您的内核中来解决您的问题。

重新编译内核模块是一个非常复杂的过程。我以前做过,但我不知道所有的细节。许多其他人已经在其他情况下做过,所以您应该能够搜索东西 "recompiling a Linux kernel module" 以找到关于它的好的教程。