
ОС: Ubuntu 18.04.3
Ядро: 5.3.8
Привет, ребята :)
Я пытаюсь создать кучу гаджетов HID с помощью configfs.
Все было успешно до настройки четвертого гаджета,
но ядро выдает сообщение об ошибке во время создания пятого гаджета.
Сообщение об ошибке было следующим.
# 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!
Проблема решена таким образом.
- Измените значение
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
Да, вы можете создать только 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#
= printer, /dev/ttyGS#
= gser + obex + acm и т. д.).