
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 클래스의 제한 이상이 필요합니다. 이러한 한계를 조작하는 방법을 아는 사람이 있습니까?
에 감사하다@모스비!
이 방법으로 문제가 해결되었습니다.
HIDG_MINORS
의 값을 변경합니다/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
.- 커널 모듈을 다시 컴파일하십시오
/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 등)를 생성하는 다른 가젯에도 비슷한 제한이 있습니다 .