운영 체제: 우분투 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
- 복합 라이브러리
- 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#
장치 노드(=프린터, =gser+obex+acm 등)를 생성하는 다른 가젯에도 /dev/ttyGS#
비슷한 제한이 있습니다 .