Usb

使用 configfs 可以創建的 USB 小工具的數量是否有限制?

  • November 25, 2019

作業系統: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_MINORSin的值/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
  2. 重新編譯核心模組/usr/src/linux-$(uname -r)/drivers/usb/gadget

需要更新的核心模組如下。

  • udc_core
  • libcomposite
  • usb_f_hid

現在您最多可以創建 HID 小工具HIDG_MINORS

是的,您只能創建 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 等)。

引用自:https://unix.stackexchange.com/questions/553957