3

USB デバイス インターフェイスを備えた組み込み Linux 3.19 システムを使用しています。デバイスは、仮想ネットワーク インターフェイス (RNDIS または CDC ECM) と 2 つの仮想シリアル ポート (CDC ACM) の 3 つの USB インターフェイスをホストに公開する必要があります。デバイスは、最新の Windows (7 以降) および Linux (3.16 以降) ホストと連携する必要があります。

Windows は CDC ECM をネイティブにサポートしていないため、2 つの USB 構成を実装することにしました (これは一般的なアプローチです)。

  • 構成 1、次のインターフェイスを使用:
    • RNDIS
    • CDC ACM 0
    • CDC ACM 1
  • 構成 2、次のインターフェイスを使用:
    • CDC ECM
    • CDC ACM 0
    • CDC ACM 1

これは、Windows がネイティブでサポートされている RNDIS で最初の構成を使用できるようにすることを目的としています (Windows は常に最初の USB 構成を選択します)。Windows 以外のホストが CDC ECM で 2 番目の構成を使用できるようにします。

スクリプトをまとめました (David Lechner による同様のスクリプトに基づく): http://pastebin.com/VtAusEmf。スクリプトの関連部分を以下に示します (スクリプト全体を表示するにはリンクをたどってください。かなり大きいです)。

mkdir -p ${g}
echo "${usb_ver}" > ${g}/bcdUSB
echo "${dev_class}" > ${g}/bDeviceClass
echo "${vid}" > ${g}/idVendor
echo "${pid}" > ${g}/idProduct
mkdir ${g}/strings/0x409
echo "${mfg}" > ${g}/strings/0x409/manufacturer
echo "${prod}" > ${g}/strings/0x409/product
echo "${serial}" > ${g}/strings/0x409/serialnumber

mkdir ${g}/configs/c.1
echo "${attr}" > ${g}/configs/c.1/bmAttributes
echo "${pwr}" > ${g}/configs/c.1/MaxPower
mkdir ${g}/configs/c.1/strings/0x409
echo "${cfg1}" > ${g}/configs/c.1/strings/0x409/configuration

echo "1" > ${g}/os_desc/use
echo "${ms_vendor_code}" > ${g}/os_desc/b_vendor_code
echo "${ms_qw_sign}" > ${g}/os_desc/qw_sign

mkdir ${g}/functions/rndis.usb0
echo "${dev_mac}" > ${g}/functions/rndis.usb0/dev_addr
echo "${host_mac}" > ${g}/functions/rndis.usb0/host_addr
echo "${ms_compat_id}" > ${g}/functions/rndis.usb0/os_desc/interface.rndis/compatible_id
echo "${ms_subcompat_id}" > ${g}/functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id

mkdir ${g}/configs/c.2
echo "${attr}" > ${g}/configs/c.2/bmAttributes
echo "${pwr}" > ${g}/configs/c.2/MaxPower
mkdir ${g}/configs/c.2/strings/0x409
echo "${cfg2}" > ${g}/configs/c.2/strings/0x409/configuration

mkdir ${g}/functions/ecm.usb0
echo "${dev_mac}" > ${g}/functions/ecm.usb0/dev_addr
echo "${host_mac}" > ${g}/functions/ecm.usb0/host_addr

mkdir ${g}/functions/acm.GS0
mkdir ${g}/functions/acm.GS1

ln -s ${g}/configs/c.1          ${g}/os_desc
ln -s ${g}/functions/rndis.usb0 ${g}/configs/c.1
ln -s ${g}/functions/acm.GS0    ${g}/configs/c.1
ln -s ${g}/functions/acm.GS1    ${g}/configs/c.1
ln -s ${g}/functions/ecm.usb0   ${g}/configs/c.2
ln -s ${g}/functions/acm.GS0    ${g}/configs/c.2
ln -s ${g}/functions/acm.GS1    ${g}/configs/c.2

echo "${device}" > ${g}/UDC

結果として得られるガジェット構成は、Linux ホストでは問題なく動作します (2 番目の構成が選択され、3 つのインターフェイスすべてが使用可能で機能しています)。ただし、Windows ホスト (8 および 10 でテスト済み) は RNDIS インターフェイスのみを検出し、ACM インターフェイスを無視します。ただし、RNDISはうまく機能します。

RNDIS インターフェイスを無効にすると、Windows ホストは最初の ACM インターフェイスのみを検出し、2 番目のインターフェイスは無視します。

Windows が複合 USB デバイスを適切に処理できないのではないかと思います。そうですか、それとも私は何か間違ったことをしていますか? .infその場合、どのクラス ドライバをロードする必要があるかを指定して、独自のファイルを作成する必要がありますか?

4

1 に答える 1