Forum: PC-Programmierung USB-AVR hid-data unter Linux


von Jacob R. (jaykopf)


Lesenswert?

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

von Jacob R. (jaykopf)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

Wie funkioniert das überhaupt bei 16 MHz? 12 oder 16,5 sind doch nur 
möglich wegen usb.

von Andreas W. (theslow)


Lesenswert?

>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.

von Michael (Gast)


Lesenswert?

Hört sich für mich nach einen Zugriffsproblem an. Hast Du dem User die 
Rechte eingeräumt für den Zugriff auf das USB-Device?

von Jacob R. (jaykopf)


Lesenswert?

@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??

von Michael (Gast)


Lesenswert?

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".

von Jacob R. (jaykopf)


Lesenswert?

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

von Michael W. (wiebel42)


Lesenswert?

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

von Roland (Gast)


Lesenswert?

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

von Jacob R. (jaykopf)


Lesenswert?

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:
1
int usbhidGetReport(usbDevice_t *device, int reportNumber, char *buffer, 
2
int *len)
3
{
4
int bytesReceived, maxLen = *len;
5
6
    if(!usesReportIDs){
7
        buffer++;   /* make room for dummy report ID */
8
        maxLen--;
9
    }
10
    bytesReceived = usb_control_msg((void *)device, 
11
                    USB_TYPE_CLASS
12
                    | USB_RECIP_INTERFACE 
13
                    | USB_ENDPOINT_IN, USBRQ_HID_GET_REPORT,
14
                    USB_HID_REPORT_TYPE_FEATURE << 8 | reportNumber, 0,
15
                    buffer, maxLen, 5000);
16
    if(bytesReceived < 0){
17
        fprintf(stderr, "Error sending message: %s\n", usb_strerror());
18
        return USBOPEN_ERR_IO;
19
    }
20
    *len = bytesReceived;
21
    if(!usesReportIDs){
22
        buffer[-1] = reportNumber;  /* add dummy report ID */
23
        (*len)++;
24
    }
25
    return 0;
26
}

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.

von Jacob R. (jaykopf)


Lesenswert?

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

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.