[Linux] USB-gadget の設定

Linux で USB-device を動かす場合の設定例を示します。USB-device はその名の通りデバイスとして動作するため、HostPC と USB ケーブルを介して接続します。ここで示す例は最低限動作するものなので、実際には各項目をよく確認するようにしてください。

この例では Host に対して USB-device を CDC-ACM(シリアル)と mass-storage (ストレージデバイス) に見えるようにすることを目指します。

kernel 再構築

defconfig へ以下を追加して kernel を再構築します。USB-device は configfs を介して設定を行うため、関連のconfigを定義します。

CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_ACM=y 
CONFIG_USB_CONFIGFS_MASS_STORAGE=y

gadget の登録

USB-device を使って表す"仮想デバイス"を USB gadget と呼んでいます。この gadget の configfs 設定を行いますが、基本的には kernel.org のドキュメント "Linux USB gadget configured through configfs" に沿って設定していきます。

configfs がマウントされていない場合は先にマウントしてください。

mount -t configfs none /sys/kernel/config

まず、usb_gadget 以下にディレクトリ "g1" を作成します。"g1" 以下にパラメータを設定するファイルが現れます。

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

ベンダID、プロダクトIDなどを設定します。ここでは Linux Foundation (0x1d6b) の Multifunction Composite Gadget (0x0104) を指定しています。この情報は USB.org で管理されているため、自由に設定することはできません。

echo 0x1d6b > idVendor
echo 0x0104 > idProduct

デバイスに対する情報 (シリアル番号・製造者名・製品名) を登録します。これらの情報は任意で登録でき、Host に接続した際に表示されます。言語ごとに決められたサブディレクトリを作成しますが、en-US は "0x409" となっています。

mkdir strings/0x409
echo "12345678"    > strings/0x409/serialnumber
echo "Foobar Inc." > strings/0x409/manufacturer
echo "My Storage"  > strings/0x409/product

configuration の登録

gadget "g1" の下に "configs" があり、その下に設定を作成していきます。"c.1" は任意名の1番を表す設定です。"c.1" 以下に先と同じ strings/0x409 を作成し、さらにその下の configuration に設定を追加していきます。ここでは設定項目はないため省略します。

mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo <config> configs/c.1/strings/0x409/configuration

functionの登録

gadget が持つ function を configuration に紐づけます。

CDC-ACM の場合

CDC-ACM の場合は、functions の下に ”acm.GS0” を作成し、先ほど作成した設定 "c.1" の下にリンクを張ることで紐づけられます。

mkdir functions/acm.GS0
ln -s functions/acm.GS0 configs/c.1/

mass-storage の場合

mass-storage の場合は、まずストレージを用意します。例として、予めストレージとなる 1MB の ext4 ファイルシステムイメージを作成しておきます。

dd if=/dev/zero of=/tmp/empty.img bs=1k count=1k
mkfs.ext4 /tmp/empty.img

functions の下に ”mass_storage.0” を作成し、作成したイメージファイルを指定した後、先ほど作成した設定 "c.1" の下にリンクを張ることで紐づけられます。

mkdir functions/mass_storage.0
echo /tmp/empty.img > functions/mass_storage.0/lun.0/file
ln -s functions/mass_storage.0 configs/c.1/

イメージファイルの代わりに eMMC など実デバイスを指定することもできます。その場合はパーティションの作成とファイルシステムのフォーマットをしておき、パーティションを示すデバイスファイルを指定します。

gadget の有効化

最後に gadget を有効にします。/sys/class/udc 以下にあるデバイス名を "UDC" に書き込むことで有効化することができます。

ls /sys/class/udc > UDC

Host 側で接続されることを確認してください。

CDC-ACM であれば host 側は /dev/ttyUSBn、target 側は /dev/ttyACMn として現れ、互いに serial として通信が可能です。

mass-storage であれば host 側に /dev/sdXn などのストレージデバイスとして現れ、mount することで target 側のストレージにアクセスできます。


コメント

タイトルとURLをコピーしました