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 側のストレージにアクセスできます。
コメント