使用 configfs 创建的 USB 小工具的数量是否有限制?

使用 configfs 创建的 USB 小工具的数量是否有限制?

操作系统:Ubuntu 18.04.3
内核:5.3.8


大家好 :)
我正在尝试使用 configfs 创建一堆 HID 小工具。
在设置第四个小工具之前它是成功的,
但是内核在创建第五个小工具期间发出错误消息。
错误消息如下。

# 4 successive gadget creation
g_mouse1 : /dev/hidg0
g_mouse2 : /dev/hidg1
g_mouse3 : /dev/hidg2
g_kbd1 : /dev/hidg3
# error occured
mkdir: cannot create directory ‘/config/usb_gadget/g_kbd2/functions/hid.usb0’: No such device

看来HID功能不能再创建了。
所以我的问题是
“小工具的数量有限制吗?”和
“如果用户可以调整限制,那会怎样?”


根据进一步的研究,
我发现mass_storage函数最多可以创建5个,
midi函数可以创建10个以上。
所以每个USB类都存在特定的限制。
但是,我的项目要求超出 HID 类的限制。
有谁知道如何操纵这些限制?


感谢@mosvy

问题就这样解决了。

  1. HIDG_MINORS更改中的值/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
  2. 重新编译内核模块/usr/src/linux-$(uname -r)/drivers/usb/gadget
    需要更新的内核模块如下。
    • udc_核心
    • 复合库
    • usb_f_hid

现在您最多可以创建 HID 小工具HIDG_MINORS

答案1

是的,您只能创建 4 个 HID 小工具,这是一个硬编码限制:绕过它的唯一方法是修改代码并重新编译模块usb_f_hid.ko

此限制与 Linux 如何为设备分配动态主/次编号有关/dev/hidg#

drivers/usb/gadget/function/f_hid.c

#define HIDG_MINORS     4

static inline int hidg_get_minor(void)
{
    ...
        if (ret >= HIDG_MINORS) {
                ida_simple_remove(&hidg_ida, ret);
                ret = -ENODEV;

static struct usb_function_instance *hidg_alloc_inst(void)
{
    ...
                status = ghid_setup(NULL, HIDG_MINORS);

int ghid_setup(struct usb_gadget *g, int count)
{
    ...
        status = alloc_chrdev_region(&dev, 0, count, "hidg");

/dev/g_printer#对于创建设备节点的其他小工具( = 打印机、/dev/ttyGS#= gser + obex + acm 等)也 存在类似的限制。

相关内容