Moin moin!
Ich bin gerade dabei einen USB-Sensor für Nagios zu entwickeln. Dieser
soll erstmal nur Temperatur messen können und zwei Reed-Kontakte
überprüfen.
Ich verwende dazu:
ATMEGA8
DS1621
16MHz Quarzoszi
Um den ATMEGA per USB an den Rechner anzuschließen habe ich die
USB-Firmware von Objective Development verwendet. Dazu eignete sich das
Example "HID-DATA" sehr gut.
In dem Example werden auch Command-Line Tools mitgeliefert inklusive
einem Makefile für Linux und einem Makefile für windows welches das
Linux-Makefile benutzt, nur einiege Compiler-Flags für Windows anpasst.
Habe die Frimware und auch die Commandline-Tools so angepasst das es
Temperatur und Status der Reed-Kontakte auslesen kann. Unter windows
klappt das auch super ("make -f MakeFile.windows" verwendet).
Unter Linux ("make -f MakeFile" verwendet) wird auch ein
Commandline-Tool kompiliert, doch wenn ich es ausführe, kommt folgende
Fehlermeldung:
1
Warning: cannot query manufacturer for device: error sending control message: Operation not permitted
2
error finding DataStore: Communication error with device
Er findet also wohl den "Vendor-name" nicht.
Wenn ich "lsusb" ausführe wird mir auch ein Device mit der
entsprechenden Device-ID angezeigt, doch es steht kein Vendor-Name
dahinter.
Auch in Windows finde ich den eingestellten Vendor-Name (obdev.at) nicht
in den Eigenschaften des HID-Device. Dort finde ich nur den Device-Name
(NagiosSensor).
Als ich eben das Device in meine VM eingebunden habe, fällt ebenfalls
auf das VMWare das Device als "Anonymous USB Device" bezeichnet.
Scheint also so als ob der Vendor-Name nicht "übernommen" wird, doch so
wie es scheint braucht man diesen um in Linux darauf zuzugreifen.
Hat jemand vielleicht einen Tipp woran das liegen kann? Falls noch
weitere Informationen benötigt werden dann sagt welche, ich werd sie
nachliefern.
MfG
Jay-Kopf
Moin nochmals,
habe nun auch nochmal das original example in mein ATMEGA8 geflash und
das original commandline-tool ausprobiert, doch da ist es genau das
gleich, in Windows funktioniert es und in Linux nicht.
>Wie funkioniert das überhaupt bei 16 MHz? 12 oder 16,5 sind doch nur>möglich wegen usb.
Das stimmt so nicht, es gibt auch ein 16MHz und ein 20MHz Modul, und die
Funktionieren auch beide obwohl sie nicht vielfache von 1,5MHz sind.
Da werden wohl Wartezyklen eingebaut oder sowas um die Synchronisation
zu behalten.
@Michael:
Habe es gerade mit vorangestelltem "sudo" ausprobiert und es klappt
trotzdem nicht.
Habe auch mal das USB-Device herausgezogen und wieder reingesteckt und
dann "dmesg" ausgeführt und da zeigt sich das der Vendor-Name auf
jedenfall erkannt wird:
1
[12775.545105] usb 1-1: new full speed USB device using uhci_hcd and address 5
2
[12775.851096] usb 1-1: configuration #1 chosen from 1 choice
3
[12776.005060] hiddev96hidraw0: USB HID v1.01 Device [obdev.at NagiosSensor] on usb-0000:00:07.2-1
jetzt bin ich aber wirklich ratlos, denn den Vendor-Name nimmt das
commandline-tool aus der usbconfig.h, also daher wo er auch in der
Firmware festgelegt ist.
by the way: Wie richtet man denn für ein USB-HID Userrechte ein??
Na ja, Du hattest oben folgende Fehlermeldung:
"error sending control message: Operation not permitted"
Das kommt immer, wenn es ein Rechteproblem gibt. Aber wenn der Code
irgendeinen Mist machen sollte, dann kann das natürlich auch passieren.
Um mal zu testen, was für Rechte es gibt, kannst Du folgendes machen:
Einmal "lsusb" machen und die beiden je dreistelligen Zahlen vorne
merken. Dann "ls -l /dev/bus/usb/xxx/yyy" (xxx und yyy sind die beiden
Zahlen) machen.
Dann kriegste die vom System angelegte Device-Datei angezeigt inkl. der
Rechte.
Wenn Du nichts siehst, dann probier beide Befehle ggf. mit "sudo".
Vielen dank schonmal.
Ich hatte nicht genau geschaut, wenn ich das Commandline-Tool mit SUDO
starte, dann bin ich ein Schritt weiter, denn dann kommt ne andere
Fehlermeldung:
1
Error getting message: error sending control message: Device or resource busy
2
error reading data: Communication error with device
nun muss ich nur noch rausfinden warum er das meldet.
Grüße,
Jay
Mit fuser <xx> bzw. lsof |grep <xx> kannst du mal checken welcher
Prozess da das Device belegt.
Ich könnte mir z.B. vorstellen das der X Server sich u.U. vorschnell
über alle HID devices hermacht.
- wiebel
Hab früher mal die libhid unter Debian Sarge verwenden für ein
selbstgebasteltes Device. Seit Debian Etch hatte ich Probleme das es nur
manchmal funktioniert hat. Anscheinend gibt es eine weiteren Treiber im
Kernel der sich mit der libhid beisst. Seit dem ich die libhid nicht
mehr
verwende sondern das Device mit ioctls über /dev/usb/hiddev0 anspreche
läufts super. z.B. http://www.frogmouth.net/hid-doco/c514.html
Vielen dank für eure Tipps.
Also es sieht jetzt so aus:
Momentan läuft das Tool nur auf nem eeePC mit Xandros (und halt
Windows).
Dort zeigt er mekrwürdigerweise die Temperatur an.
Wenn man bei allen Distributionen sich mit "dmesg" anschaut was der
Kernel dazu sagt dann findet man sowas: "Interface 0 did not claim
before use"
Habe leider noch nicht wirklich eine Lösung dafür gefunden, bin noch ein
Neuling in der Benutzung von spezieller Hardware am PC in
Programmiersprachen.
Also die Fehlermeldung würde ich so deuten das ich dieses Interface
zuerst anfordern muss, doch wie macht man sowas?
Der Code der verwendet wird ist der von obdev.at (example, hid-data). Es
liegt wohl an der folgenden Funktion, denn ich versuche Daten von USB
abzurufen:
Warum das gerade auf eeeXandros läuf (naja die claim-Meldung wird aber
auch ausgegeben) ist schon merkwürdig. Xandros scheint wohl nicht so
streng zu sein :)
@Roland:
Danke für den Link, habe morgen wieder nen bischen Zeit und werde mir
das mal anschauen und dann vielleicht auch darauf umsteigen.
So,
habe heute mal mir ioctls angeschaut. Durch die netten kleinen Beispiele
und den infos im inet sind die ersten Schritte auch recht einfach, doch
bisher bin ich noch nicht an meine Daten gekommen.
Ich denke ich muss da wohl mich in die Grundlagen von USB einarbeiten.
Grüße,
Jay