Kommunikation mit USB-Device, error 0xe000404f?

  • Kommunikation mit USB-Device, error 0xe000404f?

    Hi!

    Ich hab ein eigens kleines USB-Gerät gebastelt das einen Endpoint 1 besitzt (konfiguriert als BULK OUT). Mit dem USBSimple Example von Apple kann ich auch schön auf das Gerät zugreifen, ich finde das zugehörige Interface sowie die entsprechende BULK OUT Pipe. Wenn ich nun aber mit WritePipe() etwas in die Pipe reinschreiben will krieg ich den Fehler 0xe000404f zurück — was auch immer der genau heisst. Woran liegt das?

    Die Device wird schön im USB Prober aufgeführt, Konfiguration und Endpoint alles paletti. Wenn ich (die leicht modifiezierte, um Logs erweiterte Variante von) USBSimple Example laufenlasse komme ich folgendes zurück:

    Quellcode

    1. [Session started at 2007-09-09 23:20:17 +0200.]
    2. Found device 0x1103
    3. dealWithDevice: found 1 configurations
    4. bLength 9
    5. bDescriptorType 2
    6. wTotalLength 6400
    7. bNumInterfaces 1
    8. bConfigurationValue 1
    9. iConfiguration 0
    10. bmAttributes 64
    11. MaxPower 50
    12. found interface: 0x1403
    13. dealWithInterface: found 1 pipes
    14. dealWithPipes: grabbing BULK OUT pipe index 1, number 2
    15. sdafasdf
    16. unable to send, err = e000404f
    17. USBSimpleExample has exited with status 0.
    Alles anzeigen


    sdafasdf ist der String den ich eingebe, der gesendet werden soll. WritePipe gibt jedoch besagten Fehler zurück.

    Hab in meinem Gerät auch schon mal kurz die Firmware umgeschrieben und einen BULK IN anstatt BULK OUT Endpoint konfiguriert und versucht da was zu lesen. Kommt auch derselbe Fehler. Weiss gar net wo nachschauen was der Fehler genau heisst...

    Grüsse,
    Fabian

    PS.: Hat irgendwer mal ne Cocoa-Klasse für das Handling von USB-Geräten geschrieben? Net oder...? :D
  • RE: Kommunikation mit USB-Device, error 0xe000404f?

    Aus USB.h

    Quellcode

    1. #define kIOUSBPipeStalled iokit_usb_err(79) // 0xe000404f Pipe has stalled, error needs to be cleared

    Dagegen hilft meistens

    Quellcode

    1. IOReturn (*ClearPipeStallBothEnds)(void *self, UInt8 pipeRef);


    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • wenn ich

    Quellcode

    1. ClearPipeStallBothEnds


    aufrufe, kriege ich den Compiler-Fehler

    Quellcode

    1. USBSimple Example/main.c:149: error: 'struct IOUSBInterfaceStruct' has no member named 'ClearPipeStallBothEnds'


    zurück. Wieso ist so eine Pipe überhaubt stalled???
    So sieht der USB Prober-Auszug zu meinem Gerät aus:

    Brainfuck-Quellcode

    1. Full Speed device @ 8 (0x4B310000): ............................................. Composite device: "Axamblis Local Area Bus Server"
    2. Device Descriptor
    3. Descriptor Version Number: 0x0001
    4. Device Class: 0 (Composite)
    5. Device Subclass: 0
    6. Device Protocol: 0
    7. Device MaxPacketSize: 8
    8. Device VendorID/ProductID: 0x0400/0xC35B (National Semiconductor)
    9. Device Version Number: 0x0100
    10. Number of Configurations: 1
    11. Manufacturer String: 1 "Axamblis Inc."
    12. Product String: 2 "Axamblis Local Area Bus Server"
    13. Serial Number String: 0 (none)
    14. Configuration Descriptor
    15. Length (and contents): 25
    16. Number of Interfaces: 1
    17. Configuration Value: 1
    18. Attributes: 0x40 (self-powered)
    19. MaxPower: 100 ma
    20. Interface #0 - Vendor-specific
    21. Alternate Setting 0
    22. Number of Endpoints 1
    23. Interface Class: 255 (Vendor-specific)
    24. Interface Subclass; 255 (Vendor-specific)
    25. Interface Protocol: 255
    26. Endpoint 0x02 - Bulk Output
    27. Address: 0x02 (OUT)
    28. Attributes: 0x02 (Bulk no synchronization data endpoint)
    29. Max Packet Size: 64
    30. Polling Interval: 0 ms
    Alles anzeigen


    Bin Ratlos. :D
    Kenne mich mit den Feinheiten von USB leider überhaupt net aus. Bin schon stolz, dass ich die Verbindung zum Mac seitens des Geräts zustande gebracht habe. :D

    Gruss,
    Fabian
  • Pipe Stalled bedeutet üblicherweise,,, dass da noch Daten sind,,, die gerne abgeholt werden wollen...

    In IOUSBInterface ist nur """ClearPipeStall""",,, """ClearPipeStallBothEnds""" gibt es erst ab IOUSBInterface190... Im Prinzip kannst Du dass einfach casten,,, aber damit es richtig sauber ist sollte man zur Laufzeit prüfen,,, ob man auch die richtige Version hat...

    Alex

    P...S...::: Zu meiner Zeit,,, als ich noch ein bischen Schriftsetzerei gelernt habe,,, war die Verwendung von mehreren Satzzeichen hinternander eine Totsünde... Aber ich will dem Trend ja nicht hinterherlaufen...
    The only thing that really worried me was the ether.
  • Hmmm oke, also mit ClearPipeStallBothEnds kriegt meine Device jetzt einen CLR_FEATURE Request. Dieser beinhaltet offensichtlich ENDPOINT_HALT. Jetzt weiss ich nur nicht genau wie ich darauf reagieren soll. Ich verwende ne USB-Bridge von National Semiconductor (USBN9603). Aber dieses ganze USB ist ja sowas von sch***** dokumentiert... und was meine Bridge genau mit meinen Befehlen macht ist meist auch nur ne Raterei :-D.
    Ne auf jedenfall lösche ich jetzt das STALL-Bit im Endpoint0 Control Register der USB bridge und sende eines dieser toggle PID Dinger zurück. Naja, wenn ich das toggle Teil sende sagt mir USBSimpleExample immernoch, dass die Pipe stalled sei, wenn ich kein toggle sende dann krieg ich ein timeout zurück (logisch).
    Was will denn der USB-Controller in meinem Mac genau haben? Soll ich ihm über den Endpoint irgendwie hallo sagen, oder wie ist das genau gedacht?

    Grüsse,
    Fabian
  • Ich hab n Gerät zusammengebastelt, dass als Server für eine Art CAN-Bus fungiert, ist aber net weiter wichtig. Wichtig ist, dass ich diesen Server über USB mit meinem Mac verbinden will (für Konfiguration etc.). Damit ich die USB-Leitungen (D+, D-) nicht direkt an meinem Microcontroller (ATmega64) verarbeiten muss, hab ich mich für eine USB-Bridge von National Semiconductor (USBN9603) entschieden. Der Chip übernimmt die Dekodierung der USB-Signalleitungen sowie eine erste Aufteilung der Daten nach Endpoints.

    Das Datenblatt für den Chip gibts hier:
    national.com/ds.cgi/US/USBN9603.pdf

    Weiss net wie hilfreich das Datenblatt ist.
    Jedenfalls findet der IOUSBLib dass der Endpoint stalled ist, was natürlich fertiger Quatsch ist :-D. Wenn ich in meinem USB-Chip die Endpoint Control Register für den EP1 auslese, steht da schön dass der Endpoint aktiviert ist, dass ihm die Adresse 0x02 zugeordnet wurde UND dass er NICHT stalled ist. Was hält man bitte davon???

    Weiss net genau wieso sich USB so durchgesetzt hat :P :P ... Nein Scheeeeerz, die Vorteile liegen wohl auf der Hand, jedoch leiter nicht in der Entwicklung...
  • Das glaube ich nicht.
    Eher schon dass nicht mit maxPacketSize des Endpoints gelesen wird oder einem Vielfachen davon.
    Erkläft aber nicht den STALL bei write.

    @OP
    Soweit ich mich erinnern kann ist der Endpoint bei Stall im HALT Zustand. Beim CLEAR_FEATURE Request setzt man den Data Toggle auf Data0 und antwortet mi ACK.
    Ist aber schon einige Jahre her seit ich mich da mal durchgeKEILt habe.
    Schon die USB Doku zu Rate gezogen?

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Hi,

    Vielen Dank für die Antworten. Also bei CLEAR_FEATURE den Data Toggle auf Data0 setzten und ein ACK senden. Das ist ein guter Anhaltspunkt, werde ich mal probieren (bin grade in den Ferien und hab mein Server-Board etc. nicht hier). Das ganze USB-Gebastle ist recht mühsam für den Hobby-Menschen :) . Ich hab im Netz so ne Library gefunden die die Kommunikation mit der USB-Bridge übernehmen sollte. Die hat aber bei mir nicht funktioniert, ist relativ schlecht programmiert. Daher hab ich einige Teile der Lib übernommen und abgeändert, und hab so mal zustande gebracht, dass die ganzen Configurations vom Mac ausgelesen werden und mein Gerät im System Profiler aufgeführt wird.
    Bin froh wenn das ganze funktioniert, dann werde ich mir nämlich eine Lib für den Mikrocontroller schreiben und evtl. noch irgendeine USB-Wrapperklasse in Cocoa schreiben, damit ich in Zukunft nicht mer solche Probleme habe, ist echt mühsam. Dabei ist USB an sich so schön nützlich und vielseitig – schade dass es da so lange geht, bis man den Einstieg gefunden hat.

    Ach ja, noch ne Frage:
    Ich weiss ja nicht wieviele von euch jemals was mit Mikrocontrollern gebastelt haben. Ich bastle bis jetzt immer mit den Atmel Mikrochips rum, die meiner Meinung nach ziemlich gut sind, wenig Strom verbrauchen und schön schnell sind (meist 1 oder 1/2 Instruktion pro Clock Cycle). Nun hab ich mir aber schon oft überlegt, dass ich mir vielleicht mal etwas basteln will, dass einen schnelleren Prozessor als 16 MHz benötigt, aber irgendwie finde ich keine Mikrocontroller, die das können. Von Atmel gibts da relativ schnelle Chips, mit 100MHz und mehr, aber an die komm ich net ran (verkauft hier in der Schweiz leider niemand). Und ich denke dass eine Intel CPU (Celeron oder so) übertrieben gross ist, oder? Die wird warscheinlich net so einfach zu verbauen sein...
    Kennt vielleicht jemand von euch einen Hersteller der schnelle Mikrocontroller herstellt? irgendwie um die 100 MHz oder mehr? Toll wäre natürlich, wenn sowas in der Schweiz kaufbar wäre (z.B. durch Conrad oder Schuricht/Distrelec).


    Vielen Dank und schönen Sonntag,
    Fabian
  • Original von below
    Zu meiner Zeit,,, als ich noch ein bischen Schriftsetzerei gelernt habe,,, war die Verwendung von mehreren Satzzeichen hinternander eine Totsünde... Aber ich will dem Trend ja nicht hinterherlaufen...

    Ist zwar etwas OT und klugscheißerisch, aber was soll's: "…" ist ein eigenständiges Satzzeichen namens Ellipse und somit – semantisch angemessene Verwendung vorausgesetzt – vollkommen in Ordnung (typographisch korrekt als eigenes Zeichen, normalerweise auf "alt-.", aber Onlineforen bewegen sich ja ohnehin auf typographischem Niveau von Schreibmaschinensatz).
    Multigrad - 360°-Produktfotografie für den Mac
  • Original von Fabian
    Kennt vielleicht jemand von euch einen Hersteller der schnelle Mikrocontroller herstellt? irgendwie um die 100 MHz oder mehr? Toll wäre natürlich, wenn sowas in der Schweiz kaufbar wäre (z.B. durch Conrad oder Schuricht/Distrelec).

    Da gibt's eine Menge - ARM, ColdFire und Konsorten. bei den Taktraten würde ich allerdings den Baufbau nicht mehr selbst machen, sondern was Vorgefertigtes nehmen. Wir haben gute Erfahrungen mit Borads von SSV Embedded Systems (dilnetpc.com) gemacht - interessant ist z.B. der DNP/9200 (ColdFire, 180MHz, USB und Ethernet on Board etc). Die müssten auch in die Schweiz liefern. Ethernet ist praktisch zum Entwickeln - Embedded-Linux drauf und dann per telnet einloggen.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hmmmm, vielen Dank für den Tipp. Werde mir das mal anschauen. Bin bei Conrad zufällig auf eine Prozessor-Reihe von NXP (Philips – oder schon autonom?) gestossen, die Taktraten von bis zu 70 MHz aufweisen, weiss aber nicht genau wieviele Instruktionen da effektiv ausgeführt werden. 70 MHz nützen net viel wenn ein CPU Cycle 10 Uhr-Takte benötigt :) .
    Momentan brauche ich eh noch keine so hohe Taktraten, hab mir nur gedacht, "falls" ich mal was basteln will :) . Achja, mal ne Frage: Wo lohnt sich eigentlich der Einsatz eines "grossen" Prozessors (Intel Celeron und co.) ? Apple verwendet das ganze ja im AppleTV und – soweit ich informiert bin – auch im iPhone (also keine Celerons, aber doch grössere CPUs). Lohnt sich der Einsatz eines solchen Prozessors überhaupt? Und braucht der noch diverse Periferiebausteine, oder kann man sich den auch als abgeschlossenes, lauffähiges System wie die gängigen Mikrocontroller vorstellen?
    Ich denke mal dass sich der Einsatz solch eines Prozessors für mich nie lohnt – zu komplex, zu empfindlich, zu teuer und aufwändig :) .
    Ich bleib vorerst mal bei den Atmel Chips, die haben sich bis jetzt sehr gut bewährt, und versuch mal das ganze USB-Zeugs in den Griff zu kriegen.

    Gruss,
    Fabian
  • Ach Mensch, bin mit meinem Latein am Ende... Diese Bridge macht das ganze USB-Zeugs wahrscheinlich nur noch komplizierter als es ohnehin schon ist. Ich glaube ich probier mal eine der vielen USB-in-Software Varianten aus, in denen ich die USB-Leitungen direkt an den Controller hänge, den mit 12MHz Takte und die ganze Kommunikation direkt im Programmcode implementiere. Hoffentlich geht das... Es kann doch nicht sein dass sich USB zum Standard etabliert und ich es nicht schaffe, es zu verwenden... Achja, mal sehen was rauskommt. Hoffentlich mal ein bisschen Erfolg, bin bei USB bis jetzt nur immer auf neue Wände und Komplikationen gestossen – demotivierend :D .

    Schönen Abend,
    Fabian
  • Die Software-Implementationen sind meines Wissens alle Lo-Speed, oder? Und sie schränken die Benutzung des restlichen Prozessors aufgrund der Timing-Anforderungen von USB schon ziemlich ein…

    Blöde Frage - und wahrscheinlich etwas spät im Designprozess: Warum nimmst Du nicht gleich 'nen AVR mit USB drauf, z.B. den AT90USB687? Die sind schick - fast wie ein normaler ATMega, nur dass Du USB mit relativ wenig Ärger hast. Bootloader ist standardmäßig drauf, Samplecode en masse usw. Und teurer als der ATMega und USB-Bridge einzeln ist das vermutlich auch nicht.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hmmm ja, hab mir auch schon überlegt AVRs mit USB integriert zu verbauen, aber an die komm' ich fast nicht ran, also es ist schwierig jemanden in der Schweiz zu finden, der die vertreibt (zu einem tragbaren Preis).

    Die Idee wäre eigentlich, dass ich auf nem ATtiny2313 oder kleiner USB in der Software implementiere, und dann für die eigentliche Applikation einen separaten AVR nehme (ATmega64 wahrscheinlich) – also quasi selber eine USB Bridge bauen. Hab heute die (wenigen) einzelteile für eine USB Schaltung mit dem ATtiny2313 bekommen (+ LCD um was vom Mac aus draufzuschreiben). Da lade ich heute mal die USBtiny Firmware drauf (-> Google, hab die Adresse nicht im Kopf) und versuch, vom Mac aus was auf den Display zu schreiben.

    Grüsse,
    Fabian

    PS: Die Implementation ist Full Speed... Meines Wissens nach. Hmmm quatsch, geht doch gar net, Full Speed sind doch 12 MBit, oder?