V-USB Keyboard LED

OP #2058270
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
OP #2058556
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
OP #2060070
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
Gast #2061167
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.