HIDのconfigfs、空/sys/class/udc

HIDのconfigfs、空/sys/class/udc

現在、マウスデバイス用のUSB HIDを実装しています。他のコンピュータでマウスの動きをシミュレートするために、ラズベリーパイで予想通り正確に動作します。次のようなものを実装します。これこの詳細な実装:

#!/usr/bin/env bash

# Configures USB gadgets per: https://www.kernel.org/doc/Documentation/usb/gadget_configfs.txt

# Exit on first error.
set -e

# Echo commands to stdout.
set -x

# Treat undefined environment variables as errors.
set -u

modprobe libcomposite

# Adapted from https://github.com/girst/hardpass-sendHID/blob/master/README.md

cd /sys/kernel/config/usb_gadget/
mkdir -p g1
cd g1

echo 0x1d6b > idVendor  # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB    # USB2

STRINGS_DIR="strings/0x409"
mkdir -p "$STRINGS_DIR"
echo "6b65796d696d6570690" > "${STRINGS_DIR}/serialnumber"
echo "tinypilot" > "${STRINGS_DIR}/manufacturer"
echo "Multifunction USB Device" > "${STRINGS_DIR}/product"

# Keyboard
KEYBOARD_FUNCTIONS_DIR="functions/hid.keyboard"
mkdir -p "$KEYBOARD_FUNCTIONS_DIR"
echo 1 > "${KEYBOARD_FUNCTIONS_DIR}/protocol" # Keyboard
echo 1 > "${KEYBOARD_FUNCTIONS_DIR}/subclass" # Boot interface subclass
echo 8 > "${KEYBOARD_FUNCTIONS_DIR}/report_length"
# Write the report descriptor
# Source: https://www.kernel.org/doc/html/latest/usb/gadget_hid.html
D=$(mktemp)
echo -ne \\x05\\x01 >> "$D" # USAGE_PAGE (Generic Desktop)
echo -ne \\x09\\x06 >> "$D" # USAGE (Keyboard)
echo -ne \\xa1\\x01 >> "$D" # COLLECTION (Application)
echo -ne \\x05\\x07 >> "$D" #   USAGE_PAGE (Keyboard)
echo -ne \\x19\\xe0 >> "$D" #   USAGE_MINIMUM (Keyboard LeftControl)
echo -ne \\x29\\xe7 >> "$D" #   USAGE_MAXIMUM (Keyboard Right GUI)
echo -ne \\x15\\x00 >> "$D" #   LOGICAL_MINIMUM (0)
echo -ne \\x25\\x01 >> "$D" #   LOGICAL_MAXIMUM (1)
echo -ne \\x75\\x01 >> "$D" #   REPORT_SIZE (1)
echo -ne \\x95\\x08 >> "$D" #   REPORT_COUNT (8)
echo -ne \\x81\\x02 >> "$D" #   INPUT (Data,Var,Abs)
echo -ne \\x95\\x01 >> "$D" #   REPORT_COUNT (1)
echo -ne \\x75\\x08 >> "$D" #   REPORT_SIZE (8)
echo -ne \\x81\\x03 >> "$D" #   INPUT (Cnst,Var,Abs)
echo -ne \\x95\\x05 >> "$D" #   REPORT_COUNT (5)
echo -ne \\x75\\x01 >> "$D" #   REPORT_SIZE (1)
echo -ne \\x05\\x08 >> "$D" #   USAGE_PAGE (LEDs)
echo -ne \\x19\\x01 >> "$D" #   USAGE_MINIMUM (Num Lock)
echo -ne \\x29\\x05 >> "$D" #   USAGE_MAXIMUM (Kana)
echo -ne \\x91\\x02 >> "$D" #   OUTPUT (Data,Var,Abs)
echo -ne \\x95\\x01 >> "$D" #   REPORT_COUNT (1)
echo -ne \\x75\\x03 >> "$D" #   REPORT_SIZE (3)
echo -ne \\x91\\x03 >> "$D" #   OUTPUT (Cnst,Var,Abs)
echo -ne \\x95\\x06 >> "$D" #   REPORT_COUNT (6)
echo -ne \\x75\\x08 >> "$D" #   REPORT_SIZE (8)
echo -ne \\x15\\x00 >> "$D" #   LOGICAL_MINIMUM (0)
echo -ne \\x25\\x65 >> "$D" #   LOGICAL_MAXIMUM (101)
echo -ne \\x05\\x07 >> "$D" #   USAGE_PAGE (Keyboard)
echo -ne \\x19\\x00 >> "$D" #   USAGE_MINIMUM (Reserved)
echo -ne \\x29\\x65 >> "$D" #   USAGE_MAXIMUM (Keyboard Application)
echo -ne \\x81\\x00 >> "$D" #   INPUT (Data,Ary,Abs)
echo -ne \\xc0 >> "$D"      # END_COLLECTION
cp "$D" "${KEYBOARD_FUNCTIONS_DIR}/report_desc"

# Mouse
MOUSE_FUNCTIONS_DIR="functions/hid.mouse"
mkdir -p "$MOUSE_FUNCTIONS_DIR"
echo 0 > "${MOUSE_FUNCTIONS_DIR}/protocol"
echo 0 > "${MOUSE_FUNCTIONS_DIR}/subclass"
echo 5 > "${MOUSE_FUNCTIONS_DIR}/report_length"
# Write the report descriptor
D=$(mktemp)
echo -ne \\x05\\x01 >> "$D"      # USAGE_PAGE (Generic Desktop)
echo -ne \\x09\\x02 >> "$D"      # USAGE (Mouse)
echo -ne \\xA1\\x01 >> "$D"      # COLLECTION (Application)
                                 #   8-buttons
echo -ne \\x05\\x09 >> "$D"      #   USAGE_PAGE (Button)
echo -ne \\x19\\x01 >> "$D"      #   USAGE_MINIMUM (Button 1)
echo -ne \\x29\\x08 >> "$D"      #   USAGE_MAXIMUM (Button 8)
echo -ne \\x15\\x00 >> "$D"      #   LOGICAL_MINIMUM (0)
echo -ne \\x25\\x01 >> "$D"      #   LOGICAL_MAXIMUM (1)
echo -ne \\x95\\x08 >> "$D"      #   REPORT_COUNT (8)
echo -ne \\x75\\x01 >> "$D"      #   REPORT_SIZE (1)
echo -ne \\x81\\x02 >> "$D"      #   INPUT (Data,Var,Abs)
                                 #   x,y absolute coordinates
echo -ne \\x05\\x01 >> "$D"      #   USAGE_PAGE (Generic Desktop)
echo -ne \\x09\\x30 >> "$D"      #   USAGE (X)
echo -ne \\x09\\x31 >> "$D"      #   USAGE (Y)
echo -ne \\x16\\x00\\x00 >> "$D" #   LOGICAL_MINIMUM (0)
echo -ne \\x26\\xFF\\x7F >> "$D" #   LOGICAL_MAXIMUM (32767)
echo -ne \\x75\\x10 >> "$D"      #   REPORT_SIZE (16)
echo -ne \\x95\\x02 >> "$D"      #   REPORT_COUNT (2)
echo -ne \\x81\\x02 >> "$D"      #   INPUT (Data,Var,Abs)
                                 #   vertical wheel
echo -ne \\x09\\x38 >> "$D"      #   USAGE (wheel)
echo -ne \\x15\\x81 >> "$D"      #   LOGICAL_MINIMUM (-127)
echo -ne \\x25\\x7F >> "$D"      #   LOGICAL_MAXIMUM (127)
echo -ne \\x75\\x08 >> "$D"      #   REPORT_SIZE (8)
echo -ne \\x95\\x01 >> "$D"      #   REPORT_COUNT (1)
echo -ne \\x81\\x06 >> "$D"      #   INPUT (Data,Var,Rel)
                                 #   horizontal wheel
echo -ne \\x05\\x0C >> "$D"      #   USAGE_PAGE (Consumer Devices)
echo -ne \\x0A\\x38\\x02 >> "$D" #   USAGE (AC Pan)
echo -ne \\x15\\x81 >> "$D"      #   LOGICAL_MINIMUM (-127)
echo -ne \\x25\\x7F >> "$D"      #   LOGICAL_MAXIMUM (127)
echo -ne \\x75\\x08 >> "$D"      #   REPORT_SIZE (8)
echo -ne \\x95\\x01 >> "$D"      #   REPORT_COUNT (1)
echo -ne \\x81\\x06 >> "$D"      #   INPUT (Data,Var,Rel)
echo -ne \\xC0 >> "$D"           # END_COLLECTION
cp "$D" "${MOUSE_FUNCTIONS_DIR}/report_desc"

CONFIG_INDEX=1
CONFIGS_DIR="configs/c.${CONFIG_INDEX}"
mkdir -p "$CONFIGS_DIR"
echo 250 > "${CONFIGS_DIR}/MaxPower"

CONFIGS_STRINGS_DIR="${CONFIGS_DIR}/strings/0x409"
mkdir -p "$CONFIGS_STRINGS_DIR"
echo "Config ${CONFIG_INDEX}: ECM network" > "${CONFIGS_STRINGS_DIR}/configuration"

ln -s "$KEYBOARD_FUNCTIONS_DIR" "${CONFIGS_DIR}/"
ln -s "$MOUSE_FUNCTIONS_DIR" "${CONFIGS_DIR}/"
ls /sys/class/udc > UDC

chmod 777 /dev/hidg0
chmod 777 /dev/hidg1

ただし、Linuxを実行している産業用PCに実装すると、同じ設定は機能しません。主な問題は、/sys/class/udcが空であることです。 Raspiの場合、udc fe980000.usbがあります。産業用PCの場合、これは存在しません。さまざまな異なるフォーラムで。 Raspberry Piには、dtoverlay = dwc2構成がドライバーに関連付けられているため、この機能があります。産業用コンピュータにはそのようなドライバがないようです。

以下が調査/観察されました。

  1. configfs のカーネル構成設定が正しいことを確認してください。 CONFIG_USB_CONFIGFS_F_HID=y

  2. modprobe configfsとlibcompositeが動作しています。

  3. ls / devにhidg0またはhidg(番号)は表示されません。

  4. /sys/kernel/config/usb_gadget にインストールすると、フォルダを作成して期待どおりに動作します。

唯一の問題/症状は、/dev/hidg0が表示されないため、書き込めないことです。同時にudcが空で、bashスクリプトはls /sys/class/udc> UDCで失敗します。

産業用コンピュータの場合、ディストリビュータID:Ubuntu説明:Ubuntu 18.04.5 LTSバージョン:18.04コード名:bionic 5.4.0-81-genericで実行されます。

私はLinux/Ubuntuに初めて触れたので、事前に謝罪します。どんな助けでも大変感謝します。

ハードウェアエディタ:アーキテクチャ:x86_64 CPU動作モード:32ビット、64ビットエンディアン:Little Endian CPU:16オンラインCPUリスト:各スレッド0〜15コア:ソケットあたり2コア:8ソケット:1 NUMAノード:1ベンダーID:GenuineIntel CPUファミリ:6モデル:158モデル名:Intel(R)Core(TM)i9-9900T CPU @ 2.10GHzステップ:13 CPU MHz:899.790 CPU最大MHz:4400,0000 CPU最小MHz:800,0000 Bogo :4199.88仮想化:VT-x L1dキャッシュ:32K L1iキャッシュ:32K L2キャッシュ:256K L3キャッシュ:16384K NUMAノード0 CPU:0-15

lsusb Bus002 Device002: ID 1058:25ee Western Digital Technologies, Inc. Bus002 Device001: ID 1d6b:0003 Linux Foundation 3.0 ルートハブ Bus001 Device002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 ハブ Bus001 Device001: ID 1d6b:0002 Linux Foundation 2.0 ルートハブ

Raspiに比べてCOMポートやUSBポートが多い。

ベストアンサー1

おすすめ記事