Ich habe ein Embedded Linux 3.19 System mit einer USB-Geräteschnittstelle. Das Gerät muss drei USB-Schnittstellen zum Host bereitstellen: eine virtuelle Netzwerkschnittstelle (RNDIS oder CDC ECM) und zwei virtuelle serielle Schnittstellen (CDC ACM). Das Gerät muss mit modernen Windows (7+) und Linux (3.16 +) Hosts zusammenarbeiten.Composite USB CDC Gadget funktioniert nicht mit Windows-Hosts
als Windows-Seeing nicht nativ CDC ECM unterstützen, haben wir beschlossen, zwei USB-Konfigurationen zu implementieren (dies ist ein beliebter Ansatz):
- Konfiguration 1, mit folgenden Schnittstellen:
- RNDIS
- CDC ACM 0
- CDC ACM 1
- Konfiguration 2, mit folgenden Schnittstellen:
- CDC ECM
- CDC ACM 0
- CDC ACM 1
Die Absicht ist Windows die erste Konfiguration mit RNDIS verwenden zu lassen, welches nativ unterstützt wird (Windows wählt immer die erste USB-Konfiguration); und lassen Sie Nicht-Windows-Hosts die zweite Konfiguration mit CDC ECM verwenden.
Ich habe ein Skript zusammengestellt (basierend auf einem ähnlichen Skript von David Lechner): http://pastebin.com/VtAusEmf. Relevante Teil des Skripts unten zur Verfügung gestellt (bitte folgen Sie dem Link die vollständige Skript, um zu sehen, es ist ziemlich groß):
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
Die resultierende Gadget-Konfiguration funktioniert mit Linux-Hosts (zweite Konfiguration ausgewählt wird, werden alle drei Schnittstellen sind verfügbar und funktionieren), aber Windows-Hosts (getestet mit 8 und 10) erkennen nur die RNDIS-Schnittstelle und ignorieren die ACM-Schnittstellen. Das RNDIS funktioniert jedoch gut.
Wenn ich die RNDIS-Schnittstelle deaktiviere, erkennen Windows-Hosts nur die erste ACM-Schnittstelle und ignorieren die zweite.
Ich vermute, dass Windows nicht in der Lage ist, Composite-USB-Geräte ordnungsgemäß zu behandeln. Ist es so, oder mache ich etwas falsch? Wenn es so ist, muss ich meine eigene .inf
Datei schreiben, die angibt, welche Klassentreiber geladen werden müssen?
Hallo, ich bin wirklich daran interessiert, über CDC_ECM auch auf WIN7. Wären Sie in der Lage, Sie in die Datei einzufügen?bitte – Tom
Hallo Tom, wir haben am Ende nur mit Windows 10 und neuer gearbeitet (obwohl es keine neueren Versionen gibt). Windows ab 10 hat die automatische Treiberladefunktion für alle bekannten USB-Klassen (endlich!), Wodurch die Notwendigkeit der Verteilung von .inf-Dateien beseitigt wurde, solange Sie sich an bekannte Schnittstellen wie RNDIS oder CDC-ACM halten. Ich weiß, dass diese Antwort Ihnen mit Win 7 nicht wirklich helfen wird. Sie sollten entweder erwägen, auf Win 10 zu aktualisieren, oder einfach nur ein paar Beispiele dafür, wie Sie Ihre eigene inf-Datei schreiben, das ist nicht allzu schwierig. Hoffe das hilft! –
thx Kumpel wird versuchen :) – Tom