Habe mir hier ein Testboard für den STM32H743 aufgebaut. Im Moment bin ich bei der Inbetriebnahme des FS USB. Ich habe sowohl ein "CDC-Standalone" Beispiel von ST als auch ein "Custom HID" Beispiel am laufen. Das Gerät ist am PC (Linux) per 'lsusb' auf der Konsole einwandfrei zu finden.
Eine Testsoftware, die libusb verwendet und in einem früheren Projekt bereits funktioniert hat, liefert nach dem anstecken des H743 Boards immer LIBUSB_ERROR_BUSY als Konfig Fehler:
Moin Richie,
so, wie ich Deiner Antwort entnehme, gehst Du davon aus, daß der Kernel derzeit versucht, USB-Geräte bekannter Klassen sofort in Beschlag zu nehmen (claimen). Ich werde das nachher gleich testen.
Wahrscheinlich könnte ich auch eine "vendor specific class" nehmen, dann kann der Kernel nix claimen.
Bin selbst nicht so der Überflieger in Sachen USB, aber ich versuche mich gerade durchzubeißen.
Edit:
Das war es noch nicht, libusb_detach_kernel_driver() gibt zurück -5, also war das Gerät wohl nicht vom Kernel belegt.
Hast Du noch eine Idee?
[ 3024.396432] usb 5-3.2.1: selecting invalid altsetting 1
Das ist ein SetInterface (1) request. Geht bei CDC natürlich nicht.
CDC ist ein Compound Device und hat 2 Interfaces die beide in den libusb Strukturen initialisiert werden müssen.
Also entweder das Devíce mit den Lowlevel Requests ansteuern oder halt die Deskriptoren auswerten und die Strukturen befüllen.
Wahrscheinlich wäre es sinnvoll, das device auf vendor class zu stellen. Daher kommt die SW im ersten Beitrag. Im Endeffekt brauche ich zwei bulk endpoints für Ein- und Ausgabe aufs device. Nix zeitkritisches.
@usbman: bist Du auch der Meinung, das ein umstellen auf vendor-class sinnvoll wäre?
Im Endeffekt brauche ich zwei bulk
endpoints für Ein- und Ausgabe aufs device. Nix zeitkritisches.
Warum baust du ein CDC wenn du nur 2 Bulk EPs brauchst? Zumal dein CDC noch nicht mal spec konform ist.
Wie gesagt CDC ist ein Compount Device und braucht eigentlich zwingend IAD. Mir ist auch klar dass es ohne IAD geht, aber halt nicht spec konform. Das hast du wohl bei STM abgeschrieben.
Wenn du auf Vendor umstellst wird kein CDC mehr erkannt. Die Pipes auf deinem Interface 1 musst du trotzdem initialisieren. Ich bin kein Freund von Libusb, aber wenn ich mich richtig erinnere muss vor dem Configure die Pipe Struktur gefüllt werden.
Zur Not kannst du auch Vendor CTL Requests ganz ohne EPs benutzen. Der usbASP macht das so.
Es ist noch viel schlimmer; ich habe ein Beispiel von ST einfach hergenommen und kompiliert. Da ich das Board selbst aufgebaut habe, ging es natürlich erst mal darum, die Hardware prinzipiell in Funktion zu kriegen. Schnittstellen, auf denen man beide Seiten programmieren muß, sind halt von vornherein Henne-Ei-Problem.
Das CDC lief praktisch auf Anhieb, d.h. hat Daten vom PC direkt auf Ausgangs-UART vom H743 geschrieben.
Auf PC-Seite hole ich mir mit folgender Initialisierung mein Device:
Vielleicht kannst Du es kurz ansehen, ob arg Käse drin steht. Wie gesagt, es hat mal funktioniert, aber das heißt ja nix. Ich schaue mir Dein Beispiel lt. Link an.
Danke schon mal!!
Ja klar, das sieht anders aus. So, wie ich das Beispiel verstehe, muß man erst mal 'irgendwem' das Interface aus den Klauen reißen. Deswegen werde ich meinen Code auf dem Device auf vendor class umstellen. Oder auf HID class. Das paßt vermutlich auch besser auf meine eigentliche Anforderung. Wie bereits gesagt, war das CDC nur der Versuch, das USB auf dem device überhaupt zum laufen zu kriegen.
So, wie ich das Beispiel verstehe, muß
man erst mal 'irgendwem' das Interface aus den Klauen reißen. Deswegen
werde ich meinen Code auf dem Device auf vendor class umstellen.
wieso denn? Beim HID hättest du das gleiche Problem...
Lass usb_error= libusb_set_configuration(handle_usb, 1); weg
dann libusb_detach_kernel_driver(handle_usb, 1); //Interface 1
und libusb_claim_interface(handle_usb, 1);//Interface 1
und libusb_set_interface_alt_setting(handle_usb, 1, 0); //alt 0.
alt setings kannst du auch weglassen. Wenn du das aufrufst dann halt mit alt 0 alternate settings gibt es nur bei ISO Transfers um die Bandbreite zuzuteilen.
Wichtig ist dass du immer Interface 1 angibst, das ist dein Transfer Interface mit den Bulk Eps. Dann sollte das auch auf deinem CDC marschieren.
Detach Kernel und Claim IF gibt jedes Mal 0 zurück. Danach schicke ich jede halbe sec. ein paar Zeichen runter und die kommen an. Jetzt kommt als nächstes die Empfangsrichtung...