configfs로 생성할 수 있는 USB 가젯 수에 제한이 있습니까?

configfs로 생성할 수 있는 USB 가젯 수에 제한이 있습니까?

OS: 우분투 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 클래스의 제한 이상이 필요합니다. 이러한 한계를 조작하는 방법을 아는 사람이 있습니까?




에 감사하다@모스비!

이 방법으로 문제가 해결되었습니다.

  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_core
    • libcomposite
    • usb_f_hid

이제 최대 HID 가젯을 만들 수 있습니다.HIDG_MINORS

답변1

예, HID 가젯은 4개만 생성할 수 있으며 이는 하드 코딩된 제한입니다. 이를 우회하는 유일한 방법은 코드를 수정하고 모듈을 다시 컴파일하는 것입니다 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 등)를 생성하는 다른 가젯에도 비슷한 제한이 있습니다 .

관련 정보