2016-06-04 15 views
1

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?

Antwort

1

RTFM geholfen. Die Anforderungen an die Verbund USB-Geräte werden in diesen Artikeln beschrieben:

Lösung:

echo "0xEF" > ${g}/bDeviceClass 
echo "0x02" > ${g}/bDeviceSubClass 
echo "0x01" > ${g}/bDeviceProtocol 
+0

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

+0

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! –

+0

thx Kumpel wird versuchen :) – Tom