www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik V-USB Keyboard LED


Autor: Fridolin Onteca (muebau)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mein Vorhaben:
Schalten eines Relais über USB.

Idee:
Tastaturen haben LEDs. Diese lassen sich unter C ohne Weiteres 
ansprechen:
#include <linux/input.h>
.
.
.
int main (int argc, char *argv[])
{
  device = argv[1];
  
  //Open Device
  if ((fd = open (device, O_RDWR)) == -1)
    printf ("%s is not a vaild device.\n", device);
 
  //Print Device Name
  ioctl (fd, EVIOCGNAME (sizeof (name)), name);
  printf ("Reading From : %s (%s)\n", device, name);
 
  struct input_event ev; /* the event */

  ev.type = EV_LED;
  ev.code = LED_CAPSL;

  /* turn off */
  ev.value = 0;
  int retval = write(fd, &ev, sizeof(struct input_event));

  /* turn on */
  ev.value = 1;
  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):
/* ------------------------------------------------------------------------- */
/* ----------------------------- USB interface ----------------------------- */
/* ------------------------------------------------------------------------- */

static uchar    reportBuffer[2];    /* buffer for HID reports */
static uchar    idleRate;           /* in 4 ms units */

PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0                           // END_COLLECTION
};
/* We use a simplifed keyboard report descriptor which does not support the
 * boot protocol. We don't allow setting status LEDs and we only allow one
 * simultaneous key press (except modifiers). We can therefore use short
 * 2 byte input reports.
 * The report descriptor has been created with usb.org's "HID Descriptor Tool"
 * which can be downloaded from http://www.usb.org/developers/hidpage/.
 * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted
 * for the second INPUT item.
 */

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Fridolin Onteca (muebau)
Datum:

Bewertung
0 lesenswert
nicht 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?
uchar usbFunctionWrite(uchar *data, uchar len) {
  if ((expectReport) && (len == 1)) {
    /* Get the state of all 5 LEDs */
    LEDstate = data[0];
    /* Check state of CAPS lock LED */
/*
    if (LEDstate & LED_NUM) {
      PORTD |= 0x40;
    } else {
      PORTD &= ~0x40;
    }
 */
  }
  expectReport = 0;
  return 0x01;
}

Tschüss muebau

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Fridolin Onteca (muebau)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guido Körber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.