Forum: Mikrocontroller und Digitale Elektronik V-USB Keyboard LED


von Fridolin O. (muebau)


Lesenswert?

Hi,

mein Vorhaben:
Schalten eines Relais über USB.

Idee:
Tastaturen haben LEDs. Diese lassen sich unter C ohne Weiteres 
ansprechen:
1
#include <linux/input.h>
2
.
3
.
4
.
5
int main (int argc, char *argv[])
6
{
7
  device = argv[1];
8
  
9
  //Open Device
10
  if ((fd = open (device, O_RDWR)) == -1)
11
    printf ("%s is not a vaild device.\n", device);
12
 
13
  //Print Device Name
14
  ioctl (fd, EVIOCGNAME (sizeof (name)), name);
15
  printf ("Reading From : %s (%s)\n", device, name);
16
 
17
  struct input_event ev; /* the event */
18
19
  ev.type = EV_LED;
20
  ev.code = LED_CAPSL;
21
22
  /* turn off */
23
  ev.value = 0;
24
  int retval = write(fd, &ev, sizeof(struct input_event));
25
26
  /* turn on */
27
  ev.value = 1;
28
  int retval = write(fd, &ev, sizeof(struct input_event));

Umsetzung:
Es gibt schon:
http://www.obdev.at/products/vusb/hidkeys.html

Leider scheint man hier bewusst auf die Teile des Diskriptors verzichtet 
zu haben welche u.A. die LEDs betreffen (main.c):
1
/* ------------------------------------------------------------------------- */
2
/* ----------------------------- USB interface ----------------------------- */
3
/* ------------------------------------------------------------------------- */
4
5
static uchar    reportBuffer[2];    /* buffer for HID reports */
6
static uchar    idleRate;           /* in 4 ms units */
7
8
PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
9
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
10
    0x09, 0x06,                    // USAGE (Keyboard)
11
    0xa1, 0x01,                    // COLLECTION (Application)
12
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
13
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
14
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
15
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
16
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
17
    0x75, 0x01,                    //   REPORT_SIZE (1)
18
    0x95, 0x08,                    //   REPORT_COUNT (8)
19
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
20
    0x95, 0x01,                    //   REPORT_COUNT (1)
21
    0x75, 0x08,                    //   REPORT_SIZE (8)
22
    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
23
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
24
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
25
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
26
    0xc0                           // END_COLLECTION
27
};
28
/* We use a simplifed keyboard report descriptor which does not support the
29
 * boot protocol. We don't allow setting status LEDs and we only allow one
30
 * simultaneous key press (except modifiers). We can therefore use short
31
 * 2 byte input reports.
32
 * The report descriptor has been created with usb.org's "HID Descriptor Tool"
33
 * which can be downloaded from http://www.usb.org/developers/hidpage/.
34
 * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted
35
 * for the second INPUT item.
36
 */

Frage:
Was muss man im Descriptor tun um eben diesen Support wieder einzubauen?
Was kann man aus dem Descriptor entfernen um Platz und Overhead zu 
sparen?

Vielen Danke im Voraus
muebau

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der ebenfalls auf V-USB aufbauende Code dieser Tastatur scheint LEDs 
ansteuern zu können:
http://mg8.org/rump/

von Fridolin O. (muebau)


Lesenswert?

Hi,
ja das scheint genau das zu sein was ich vorhabe. Ich würde nur all den 
key press Kram raus schmeißen und eben nur den LED-Teil behalten.

Habe ich etwas übersehen oder werden die LEDs nicht verwendet?
Alles was etwas tun könnte ist doch auskommentiert, oder nicht?
Sehe ich das richtig das "return 0x01;" soviel wie "Alles OK" 
zurückgibt?
1
uchar usbFunctionWrite(uchar *data, uchar len) {
2
  if ((expectReport) && (len == 1)) {
3
    /* Get the state of all 5 LEDs */
4
    LEDstate = data[0];
5
    /* Check state of CAPS lock LED */
6
/*
7
    if (LEDstate & LED_NUM) {
8
      PORTD |= 0x40;
9
    } else {
10
      PORTD &= ~0x40;
11
    }
12
 */
13
  }
14
  expectReport = 0;
15
  return 0x01;
16
}

Tschüss muebau

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Möchtest Du wirklich, daß Dein Relais anzieht, wenn jemand auf die 
CapsLock-Taste, die NumLock-Taste oder die Rollen-Taste drückt?

von Fridolin O. (muebau)


Lesenswert?

Hi,
nun da ich exklusiv mit der "Tastatur" umgehe stellt sich diese Frage 
hier nicht. Die Schaltung wird später an einem Embedded system (z.B. 
Relais an WRT / Fritzbox oder so.) hängen und eben exklusiv in Beschlag 
genommen.
Ist es denn wirklich so das wenn 2 Tastaturen an einem Rechner hängen 
sich der Status der einen auf den der Anderen überträgt?

Tschüss muebau

von Oliver J. (skriptkiddy)


Lesenswert?

Fridolin Onteca schrieb:
> Ist es denn wirklich so das wenn 2 Tastaturen an einem Rechner hängen
> sich der Status der einen auf den der Anderen überträgt?
Ja.

von Guido Körber (Gast)


Lesenswert?

Fridolin Onteca schrieb:
> Ist es denn wirklich so das wenn 2 Tastaturen an einem Rechner hängen
> sich der Status der einen auf den der Anderen überträgt?

Bei MacOS nicht, bei Windows und Linux schon.

Ich finde den Ansatz etwas mehr als bedenklich, da gibt es viele 
Fehlermodi. Wenn das BIOS des Systems verstellt ist, kann ja auch eine 
der Lock-Tasten beim Starten des Systems gesetzt werden.

Sinnvoller wäre es dedizierte I/O-Controller einzusetzen, z.B.:
http://www.codemercs.com/index.php?id=127&L=0

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.