Am Mittwoch, 21. Mai 2003 19:15 schrieben Sie:
Jan Hendrik Berlin schrieb:
hi! also ISO C++ kennt keine Sau! HAb Lehrer und MItschüler gefragt, aber alle sagen das gleich:"noch nie gehört!" find ich komisch!! aber egal!
Mein Problem ist derzeit:
_Welches Device muss ich öffnen, und wie finde ich das heraus!_
Ja, wenn mir einer die Frage beantworten könnte, wäre das schön!!!
Hallo Jan,
wie ich sehe bist Du nicht viel weiter gekommen mit meiner Info. Ich habe Dir mal eine Routine aus der libgphoto2 beigelegt. In der sieht man ganz genau wie man ein USB Gerät sucht. Ich gehe davon aus, daß Du SuSE 8.2 oder ähnlich benutzt. Öffne eine console. Am Eingabepromt wechsel in das /proc Verzeichnis also : cd /proc dann mit cd bus/usb in das usb Verzeichnis wechsel. dann sind da zwei Dateien, eine heißt devices und die andere drivers. dann entweder more oder besser cat device eingeben. (einige Geräte können nur in einem Stream ausgelesen werden) Da siehst Du erstmal alle gefundenen Geräte. Da müßte Dein Grät auch auftauchen. Mit allen Informationen die usb so hergibt, da Dein HID ja ein generic Device ist und nicht ein spezial Treiber benötigt). Nun mußt Du nur noch an die Information im Programm kommen. Wie gesagt, es ist nicht so einfach. Du mußt pracktisch in Deinem Programm eine Datenstruktur für ein USB Gerät anlegen und diese mit den usb..* Routinen füttern. Wenn ich Zeit hätte, würde ich schon bald selber einen Treiber zusammenbauen. Schau Dir mal in Ruhe den Quellcode von libgphoto2-2.1.1.tar.gz an. Dann müßtet Du Dein Treiber erstellen können.(Quelle: www.gphoto.org)
Der Quellauschnitt ist frei von mir aus den original Quellen entnommen und dient als Demostrationzwecken. Alle Rechte bleiben beim jeweiligen Eigentümer.
Der Quellausschnit ist im Paket libgphoto2 entnommen worden. Entpackt im root Verzeichniss mit neu angelegtem gphoto Verzeichniss ergibt:
Pfad ist: /gphoto/libgphoto2-2.1.1/libgphoto_port Datei ist libusb.c Zeile 375
Diese Routine sucht am usb nach idvendor und idprodukt. Und hier mußt Du eben nach Deinem IC suchen. Vorher hat man ja die Datenstrukturen angelegt und hat dann bei erfolgreicher Suche den Zugriff mit usb-Routinen (siehe /usr/include/usb.h) auf das USB Gerät.
Ich würde dieses Projekt auch in einfachem C programmieren.Wenn das erstmal läuft kannst Du Deine Hauptanwendung ja mit C++ gestallten. Denn da kann man auch auf C Routinen zurückgreifen.
mfg Michael
static int gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct) { struct usb_bus *bus; struct usb_device *dev;
if (!port) return (GP_ERROR_BAD_PARAMETERS);
/* * NULL idvendor is not valid. * NULL idproduct is ok. * Should the USB layer report that ? I don't know. * Better to check here. */ if (!idvendor) { gp_port_set_error (port, _("The supplied vendor or product " "id (0x%x,0x%x) is not valid."), idvendor,idproduct); return GP_ERROR_BAD_PARAMETERS; }
for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { if ((dev->descriptor.idVendor == idvendor) && (dev->descriptor.idProduct == idproduct)) { int config, interface, altsetting;
port->pl->d = dev;
gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb", "Looking for USB device " "(vendor 0x%x, product 0x%x)...found.", idvendor, idproduct);
/* Use the first config, interface and altsetting we find */
gp_port_usb_find_first_altsetting(dev,&config, &interface, &altsetting);
/* Set the defaults */ if (dev->config) { port->settings.usb.config = dev->config[config].bConfigurationValue; port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceN umber; port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateS etting;
port->settings.usb.inep = gp_port_usb_find_ep(dev, config, interface, altsetting, USB_ENDPOINT_IN,USB_ENDPOINT_TYPE_BULK); port->settings.usb.outep = gp_port_usb_find_ep(dev, config, interface, altsetting, USB_ENDPOINT_OUT,USB_ENDPOINT_TYPE_BULK); port->settings.usb.intep = gp_port_usb_find_ep(dev, config, interface, altsetting, USB_ENDPOINT_IN,USB_ENDPOINT_TYPE_INTERRUPT); gp_log (GP_LOG_VERBOSE,"gphoto2-port-usb", "Detected defaults: config %d," "interface %d, altsetting %d," "inep %02x, outep %02x,intep %02x", port->settings.usb.config,
port->settings.usb.interface,
port->settings.usb.altsetting, port->settings.usb.inep, port->settings.usb.outep, port->settings.usb.intep ); }
return GP_OK; } } }
gp_port_set_error (port, _("Could not find USB device " "(vendor 0x%x, product 0x%x). Make sure this device " "is connected to the computer."), idvendor, idproduct); return GP_ERROR_IO_USB_FIND; }
Tux007
Sorry, aber der Code ist zu hoch für mich!!! Tux007
Hallo!
Sorry, aber der Code ist zu hoch für mich!!!
Vorschlag: Schau Dir doch einmal die Dokumentation von "libusb" an. Das ist eine API zur Ansteuerung von USB Geräte im "Userspace",d. h. es ist nicht notwendig einen Kernel-Treiber zu programmieren. http://libusb.sourceforge.net/documentation.html Es wäre auch nützlich sich etwas mehr mit USB an sich zu beschäftigen. Vielleicht taugt das Buch: Messen, Steuern, Regeln mit USB Hard- und Softwareentwicklung für die Praxis Franzis-Verlag 2000 etwas. Aber gelesen habe ich es nicht. Den Vorgänger von USB 2.0. Universal Serial Bus. von Hans-Joachim Kelm (Herausgeber) Franzis-Verlag fand ich ganz gut. Der angegebene Code ist eigentlich nicht sehr kompliziert. Aber Du solltest die Architektur von USB verstehen, erst dann macht er richtig Sinn. Letztendlich wird am USB-Port abgefragt ob ein Gerät mit einer bestimmten ID anhängt. Danach werden die Endpoints ermittelt. Gruß -- Dirk Dörr
Hallo! Eine Einleitung zur Ansteuerung von HID-Devices unter Linux gibt's unter: http://www.frogmouth.net/hid-doco/linux-hid.html -- Dirk Dörr
hi! ALso wen ich das richtig verstanden hab, hat das Gerät ein bestimmte ID, die ich abfrage! Somit haben dann wohl z.B. alle IO-Warrior Chips die gleiche ID!?? Von den Endpoints hab ich auch schon was gehört! Mein Chip hat mehrere, für unterschiedliche Funtionen! Kernel Treiber!!!??? Ich weis gar nicht so genau was ich brauche! Fakt ist: -Für meinen Chip gibt es noch keine Software! -Es ist ein HID, und laut Hersteller soll man irgendwelche Standarttreiber schon benutzen können! Was die genau damit meinen, weis ich nicht! In der Dokumentation die unter /usr/src/linux/Documentation/usb/ gefunden hab, Stand auch schon was von Userspace! Was ist ein Userspace Programm? Kann es sein, es da schon eine "Schittstelle" gibt, die ich relativ einfach ansprechen kann? hmm, ich bin da mal wieder bisschen durcheinander! Gruß Tux007
Hi! Also man schrieb mir: "Wahrscheinlich wird auch auf Linux kein Treiber notwendig sein, da sich der System HID Treiber darum kümmert." Also muss ich den System HID Treiber ansprechen oder?? Erkannt wird der Chip schon! Im "Infozentrum" wird er angezeigt!! *nachdenk* *hilfeee* Tux007
Hallo! Sorry für die Verwirrung! Ich habe leider nie mit diesem Baustein gearbeitet. Daher kann ich nur allgemein antworten. Also jetzt etwas ausführlicher: Generell kann man Linux Anwendungen in 2 Kategorien einteilen: - Kernel-Programme - User-Programme Ein "Hallo Welt" wäre ein typisches User-Programm. Im Gegensatz dazu gibt es die Kernel-Programme. Diese bilden das eigentliche Linux-Betriebssystem. User-Programme können normalerweise nicht direkt auf Hardware zugreifen. Dies ist nämlich die Aufgabe der Treiber. Für jede Hardware gibt es spezielle Programme (die Treiber), die mit höheren Rechten laufen als die User-Programme. Um zum Beispiel auf die serielle Schnittstelle zugreifen zu können greifst Du nicht direkt auf den RS232 Baustein (bzw. auf die Adresse) zu sondern über "/dev/ttyS0" (das Äquivalent zu COM1 unter Windows). Um also auf USB-Hardware zugreifen zu können, müßtest Du eigentlich einen Treiber schreiben. Dies ist allerdings alles andere als trivial, da der kleinste Fehler leicht zum Absturz des ganzen Systems führen kann. Aber für USB gibt es einen einheitlichen Treiber (libusb) der den Zugriff abstrahiert und über eine API User-Programmen zur Verfügung stellst. USB ist außerdem etwas anderes als zum Beispiel die serielle Schnittstelle. USB ist ein Bus-System. Das heißt mehrere Geräte hängen praktisch an "einem Strang". Um ein Gerät in diesem Bus eindeutig identifizieren zu können gibt es verschiedene Möglichkeiten: - Identifikation über Produkt-ID und Vendor-ID. Hersteller von USB-Hardware registrieren sich bei dem USB-Konsortium und erhalten dafür eine Vendor-ID. Alle Geräte die von diesem Hersteller kommen besitzen diese ID. Die Unterscheidung der Produkte erfolgt dann über eine Product-ID, die der Hersteller selbst wählt. - Geräteklassen wie zum Beispiel HID-Device. Dies sind Geräte wie Mäuse, Joysticks und ähnliches. Damit nicht jeder Hersteller einer Maus einen eigenen Treiber schreiben muß, schreibt er die Firmware (also der Code der in der Maus auf einem µController ausgeführt wird) so daß er auf Standard Anfragen reagiert. Such einfach mal nach dem Programm usbview für Linux. Dann steckt das Entwicklungskit des IO-Warrior's ein und schau Dir die Informationen an die dieses Programm ausgibt. Dort solltest Du auch die Vendor und Product-ID des IO-Warriors finden. Über diese kannst Du dann dein Gerät mit usblib identifizieren. (Das Beispiel, das Du erhalten hast arbeitet im Prinzip auch mit der usblib). Auch kannst Du Dir mal die Kernel-Meldungen ansehen (z. b. mit dmesg) wenn Du das USB Gerät einsteckst. Du solltest Dir vielleicht einige gute Bücher über Linux-Programmierung ansehen, bevor Du mit dem USB-Projekt weitermachst. Das O'Reilly Buch über Device Treiber programmierung ist ein guter Anfang. Ich persöhnlich finde auch Linux Programmierung Neil Matthew, Richard Stones MITP-Verlag 2000 ISBN 3-8266-0569-1 sehr gut. Gruß -- Dirk Dörr
ok! ich schreibe dann wohl eher ein User Programm, und nutze die libusb! Nur wo finde ich was über libusb heraus?? KernelDokumentation hat keine Auskunft gegeben! Über usbview hab ich mir das schonmal angeschaut! Da stehen alle Daten von dem Chip... Ich bruache nun ein header Datei, in der ich dann Befehle aufrufen kann, um das ding anzusprechen oder wie??? danke für eure Hilfe! Tux007
Am Freitag, 23. Mai 2003 19:38 schrieb Jan Hendrik Berlin:
ok! ich schreibe dann wohl eher ein User Programm, und nutze die libusb! Nur wo finde ich was über libusb heraus?? KernelDokumentation hat keine Auskunft gegeben!
Hier gibt es z.B. eine englische Doku: http://libusb.sourceforge.net/doc/ tschö, Thomas
Am Freitag, 23. Mai 2003 19:46 schrieb Thomas Giese:
Am Freitag, 23. Mai 2003 19:38 schrieb Jan Hendrik Berlin:
ok! ich schreibe dann wohl eher ein User Programm, und nutze die libusb! Nur wo finde ich was über libusb heraus?? KernelDokumentation hat keine Auskunft gegeben!
Hier gibt es z.B. eine englische Doku: http://libusb.sourceforge.net/doc/
tschö, Thomas
welche header Datein muss ich nehmen? libusb.h oder sowas? Sorry is schon bisschen spät! Tux007
Am Sam, 2003-05-24 um 01.01 schrieb Jan Hendrik Berlin:
Am Freitag, 23. Mai 2003 19:46 schrieb Thomas Giese:
Am Freitag, 23. Mai 2003 19:38 schrieb Jan Hendrik Berlin:
ok! ich schreibe dann wohl eher ein User Programm, und nutze die libusb! Nur wo finde ich was über libusb heraus?? KernelDokumentation hat keine Auskunft gegeben!
Hier gibt es z.B. eine englische Doku: http://libusb.sourceforge.net/doc/ Weitere usb-Doku gibt's bei http://www.linux-usb.org.
tschö, Thomas
welche header Datein muss ich nehmen? libusb.h oder sowas? Ja, aber lies bitte auch die Doku. Zumindest RH's libusb kommt mit Doku. Würde mich sehr verwundern, wenn das unter SuSE anders wäre.
Sorry is schon bisschen spät! ;)
Ralf.
participants (4)
-
Dirk Dörr
-
Jan Hendrik Berlin
-
Ralf Corsepius
-
Thomas Giese