
OS: Ubuntu 18.04.3
カーネル: 5.3.8
こんにちは、皆さん :)
configfs を使用して HID ガジェットを多数作成しようとしています。4
番目のガジェットの設定までは成功しました
が、5 番目のガジェットの作成中にカーネルがエラー メッセージを出力します。
エラー メッセージは次のとおりでした。
# 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
- libコンポジット
- 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 など)。