Logo Search packages:      
Sourcecode: v4l-utils version File versions  Download package

keytable.c

/* keytable.c - This program allows checking/replacing keys at IR

   Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@infradead.org>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 */

#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/input.h>
#include <sys/ioctl.h>

#include "parse.h"

static void prtcode (int *codes)
{
      struct parse_key *p;

      for (p=keynames;p->name!=NULL;p++) {
            if (p->value == (unsigned)codes[1]) {
                  printf("scancode 0x%04x = %s (0x%02x)\n", codes[0], p->name, codes[1]);
                  return;
            }
      }

      if (isprint (codes[1]))
            printf("scancode %d = '%c' (0x%02x)\n", codes[0], codes[1], codes[1]);
      else
            printf("scancode %d = 0x%02x\n", codes[0], codes[1]);
}

static int parse_code(char *string)
{
      struct parse_key *p;

      for (p=keynames;p->name!=NULL;p++) {
            if (!strcasecmp(p->name, string)) {
                  return p->value;
            }
      }
      return -1;
}

int main (int argc, char *argv[])
{
      int fd;
      unsigned int i, j;
      int codes[2];

      if (argc<2 || argc>4) {
            printf ("usage: %s <device> to get table; or\n"
                  "       %s <device> <scancode> <keycode>\n"
                  "       %s <device> <keycode_file>\n",*argv,*argv,*argv);
            return -1;
      }

      if ((fd = open(argv[1], O_RDONLY)) < 0) {
            perror("Couldn't open input device");
            return(-1);
      }

      if (argc==4) {
            int value;

            value=parse_code(argv[3]);

            if (value==-1) {
                  value = strtol(argv[3], NULL, 0);
                  if (errno)
                        perror("value");
            }

            codes [0] = (unsigned) strtol(argv[2], NULL, 0);
            codes [1] = (unsigned) value;

            if(ioctl(fd, EVIOCSKEYCODE, codes))
                  perror ("EVIOCSKEYCODE");

            if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
                  prtcode(codes);
            return 0;
      }

      if (argc==3) {
            FILE *fin;
            int value;
            char *scancode, *keycode, s[2048];

            fin=fopen(argv[2],"r");
            if (fin==NULL) {
                  perror ("opening keycode file");
                  return -1;
            }

            /* Clears old table */
            for (j = 0; j < 256; j++) {
                  for (i = 0; i < 256; i++) {
                        codes[0] = (j << 8) | i;
                        codes[1] = KEY_RESERVED;
                        ioctl(fd, EVIOCSKEYCODE, codes);
                  }
            }

            while (fgets(s,sizeof(s),fin)) {
                  scancode=strtok(s,"\n\t =:");
                  if (!scancode) {
                        perror ("parsing input file scancode");
                        return -1;
                  }
                  if (!strcasecmp(scancode, "scancode")) {
                        scancode = strtok(NULL,"\n\t =:");
                        if (!scancode) {
                              perror ("parsing input file scancode");
                              return -1;
                        }
                  }

                  keycode=strtok(NULL,"\n\t =:(");
                  if (!keycode) {
                        perror ("parsing input file keycode");
                        return -1;
                  }

                  // printf ("parsing %s=%s:", scancode, keycode);
                  value=parse_code(keycode);
                  // printf ("\tvalue=%d\n",value);

                  if (value==-1) {
                        value = strtol(keycode, NULL, 0);
                        if (errno)
                              perror("value");
                  }

                  codes [0] = (unsigned) strtol(scancode, NULL, 0);
                  codes [1] = (unsigned) value;

                  // printf("\t%04x=%04x\n",codes[0], codes[1]);
                  if(ioctl(fd, EVIOCSKEYCODE, codes)) {
                        fprintf(stderr, "Setting scancode 0x%04x with 0x%04x via ",codes[0], codes[1]);
                        perror ("EVIOCSKEYCODE");
                  }

                  if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
                        prtcode(codes);
            }
            return 0;
      }

      /* Get scancode table */
      for (j = 0; j < 256; j++) {
            for (i = 0; i < 256; i++) {
                  codes[0] = (j << 8) | i;
                  if (!ioctl(fd, EVIOCGKEYCODE, codes) && codes[1] != KEY_RESERVED)
                        prtcode(codes);
            }
      }
      return 0;
}


Generated by  Doxygen 1.6.0   Back to index