Forum: Mikrocontroller und Digitale Elektronik USB Verbundgerät


von Sebastian____ (Gast)


Lesenswert?

Hallo,
ich versuche mit einem Controller (Coldfire V1) 2 USB Geräte anzumelden, 
diese sollten dann auch soweit halbweges getrennt im Controller 
behandelt werden. Zb. eine HID Maus + Tastatur + CDC Device.
Alles jeweils allein ist ja kein Problem. Ich habe insgesamt 16Endpoints 
im Controller, daran sollte es also nicht scheitern.
Wie stellt man es an das zb 2 verschiedene Geräte mit einem Controller 
gleichzeitig angemeldet werden.

Normalerweise müsste man doch wie jedes einzelne Gerät jeweils den 
Report Descriptor haben und die entprechenden Diskriptoren dann im 
Konfig discriptor bündeln.
So richtig finde ich auch keine Dokumentation wie man so ein Gerät 
entsprechend anmeldet bzw. wie das in der Firmware aussehen muß.

MfG
Sebastian

von Guido Körber (Gast)


Lesenswert?

Du brauchst mehrere Interface-Descriptoren.

von René K. (king)


Lesenswert?

Guido Körber wrote:
> Du brauchst mehrere Interface-Descriptoren.

+ IAD (wegen CDC)

von termite (Gast)


Lesenswert?

Moin,

cdc = wirtueller com Port?

da gabs irgend welche gemeinheiten in verbindung mit hid (Tastatur und 
maus)
ggf mal das implementers froum von usb.org durchstöbern. da stand irgend 
etwas über Hid und virtuel Comport drinen.

www.usb.org
Jan Axelson (nein sie ist eine Frau!) hat dazu irgend wann mal was 
geschrieben.

von René K. (king)


Lesenswert?

termite wrote:
> cdc = wirtueller com Port?
>
> da gabs irgend welche gemeinheiten in verbindung mit hid (Tastatur und
> maus)

Bei mir funktioniert CDC in Verbindung mit HID ohne Gemeinheiten. Nach 
was muss ich da suchen?

von termite (Gast)


Lesenswert?

Hi

grr usb.org löscht ältere einträge im Forum
Ich will damit nicht sagen das es nicht geht. es gibt für das Problem 
nur mehrere Lösungen die mehr oder wenig gut funktionieren.

Die gemeinhat hat irgend etwas mit dem Discriptor zu tun, und wie dieser 
aufgebaut werden sollte. einfach nen composite mit cdc hund hid ging 
irgendwie nicht. Hing glaubich damit zusammen, das cdc selber schon 
sowas wie ein composite device ist descriptortechnisch.

Sie hat in dem beitrag auch mehrer lösungen vorgestellt.

wie gesagt ich find den eintrag nicht mehr (den link schon nur der 
beitrag is wech), ist somit alles aus den untersten schubladen meines 
gedächtnisses ausgegragen. keine garantie auf richtigkeit.

von termite (Gast)


Lesenswert?

CDC und iad descriptoren vertrugen sich mal nicht
http://support.microsoft.com/kb/918365

Das währen eigentlich die links zu dem thema von Jan
https://www.usb.org/phpbb/viewtopic.php?t=13308
https://www.usb.org/phpbb/viewtopic.php?t=13610

Bei denen liefs auch nicht auf anhieb.
http://www.cygnal.org/ubb/Forum9/HTML/001227.html

von René K. (king)


Lesenswert?

termite wrote:
> CDC und iad descriptoren vertrugen sich mal nicht
> http://support.microsoft.com/kb/918365

Schnee von gestern, aktuell funktioniert es.

> Das währen eigentlich die links zu dem thema von Jan
> https://www.usb.org/phpbb/viewtopic.php?t=13308
> https://www.usb.org/phpbb/viewtopic.php?t=13610

"The topic or post you requested does not exist"

> Bei denen liefs auch nicht auf anhieb.
> http://www.cygnal.org/ubb/Forum9/HTML/001227.html

Bei mir schon, da habe ich wohl noch etwas falsch gemacht. :-)

Im Ernst: Das Einzige Problem war für mich das Finden des letzten Restes 
der Dokumentation. Es ging im Speziellen um "USB IAD Device Class Code 
and Use Model", das war unter den white papers zu finden. Da bin ich 
allein nicht drauf gekommen, musste mir auch erst von Jan Axelson helfen 
lassen. Das Implemtieren ging aber blasenfrei, ganz ohne Gemeinheiten.

von Sebastian____ (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe immer noch ein kleines Problem.
Ich bekomme es einfach nicht hin ein device mit 2 Interfaces zum laufen 
zu bekommen.
Die Kommunikation bricht höchst warscheinlich bei SET_CONFIGURATION ab.
Siehe Screenshot von der USB Analyse.

Die Descriptoren sehen so aus:
1
//--- hier könnte ein Problem sein
2
const hcc_u8 kbd_config_descriptor[] = {
3
  USB_FILL_CFG_DESC(9+3 + 9+9+7 + 9+9+7, 2, 1, 4, CFGD_ATTR_SELF_PWR, 0),
4
  USB_FILL_OTG_DESC(1, 1),
5
  
6
  USB_FILL_IFC_DESC(0, 0, 1, 0x03, 0x01, 0x1, 5), /* HID, boot, keyboard (3/1/1) */
7
  USB_FILL_HID_DESC(9, 0x0100, 0x0, 1, 0x22, sizeof(kbd_report_descriptor)),
8
  USB_FILL_EP_DESC(0x1, 1, 0x3, 8, 0x20),
9
10
  USB_FILL_IFC_DESC(1, 0, 1, 0x3, 0x0, 0x0, 6),  /* (HID, none, none) */
11
  USB_FILL_HID_DESC(9, 0x0100, 0x0, 1, 0x22, sizeof(geh_report_descriptor)),
12
  USB_FILL_EP_DESC(0x2, 1, 0x3, 8, 0x20),
13
};

hier die zugehörigen Makros:
1
/* This macro will evaluate to an array inicializer list with values of a
2
   interface descriptor. */
3
#define USB_FILL_IFC_DESC(ifc_id, alt_set, no_ep, iclass, isubclass, iproto, strndx) \
4
  (hcc_u8)0x09u, STDD_INTERFACE, (hcc_u8)(ifc_id), (hcc_u8)(alt_set), (hcc_u8)(no_ep)\
5
  , (hcc_u8)(iclass), (hcc_u8)(isubclass), (hcc_u8)(iproto), (hcc_u8)(strndx)
6
7
/* This macro will evaluate to an array inicializer list with values of a
8
   endpoint descriptor. */
9
#define USB_FILL_EP_DESC(addr, dir, attrib, psize, interval) \
10
  (hcc_u8)0x07u, STDD_ENDPOINT, (hcc_u8)((addr)&0x7f) | (((hcc_u8)(dir))<<0x7)\
11
  , (hcc_u8)(attrib), (hcc_u8)((psize) & 0xff), (hcc_u8)(((psize) >> 8) & 0xff)\
12
  , (interval)

von Sebastian____ (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch mal ein log mit Snoopy.

von Sebastian____ (Gast)


Angehängte Dateien:

Lesenswert?

und noch einer

von René K. (king)


Lesenswert?

Wenn ich mir nun so die Screenshots ansehe, vermute ich, dass das 
irgendwie kein Verbundgerät CDC und HID ist. Auf diese Art würde ich 
jedenfalls auch nicht funktionieren.

Du brauchst mindestens 3 Interfaces, nicht 2 (1x Communication, 1x Data, 
1x HID). Desweiteren scheint mir noch der IAD zu fehlen, der das 
Communication- und das Data-Interface zusammenfasst.

Wie sieht der Device-Descriptor aus? Hast Du bekanntgegeben, dass Dein 
Gerät IAD verwendet?

Außerdem: Für CDC spricht ein Interface Class 0x02 (Communication) und 
Subclass 0x02 (ACM). Das andere Interface spricht Class 0x0A (Data) und 
Subclass 0x00 (undefined). Bei Dir sehe ich aber Class 0x00, Subclass 
0x00 und Class 0x02, Subclass 0x00. Wo bleibt da das HID?

Dazu haben beide Interfaces noch unterschiedliche Alternate Settings. 
Was bezweckst Du damit?

von Sebastian____ (Gast)


Lesenswert?

Ich wollter erst mal nur eine Tastatur + Ein Generic Hid Device 
Implementieren. Wenn das von derFirmware her richtig läuft eventuell 
noch das CDC dazu.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.