File Index
Files and directories
Sign in
FILE

keytable.c.rst

File preview with syntax highlighting.

linux-6.19.14/Documentation/userspace-api/media/rc/keytable.c.rst RESTRUCTUREDTEXT
  1.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
  2
  3file: uapi/v4l/keytable.c
  4=========================
  5
  6.. code-block:: c
  7
  8    /* keytable.c - This program allows checking/replacing keys at IR
  9
 10       Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@kernel.org>
 11
 12       This program is free software; you can redistribute it and/or modify
 13       it under the terms of the GNU General Public License as published by
 14       the Free Software Foundation, version 2 of the License.
 15
 16       This program is distributed in the hope that it will be useful,
 17       but WITHOUT ANY WARRANTY; without even the implied warranty of
 18       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 19       GNU General Public License for more details.
 20     */
 21
 22    #include <ctype.h>
 23    #include <errno.h>
 24    #include <fcntl.h>
 25    #include <stdio.h>
 26    #include <stdlib.h>
 27    #include <string.h>
 28    #include <linux/input.h>
 29    #include <sys/ioctl.h>
 30
 31    #include "parse.h"
 32
 33    void prtcode (int *codes)
 34    {
 35	    struct parse_key *p;
 36
 37	    for (p=keynames;p->name!=NULL;p++) {
 38		    if (p->value == (unsigned)codes[1]) {
 39			    printf("scancode 0x%04x = %s (0x%02x)\\n", codes[0], p->name, codes[1]);
 40			    return;
 41		    }
 42	    }
 43
 44	    if (isprint (codes[1]))
 45		    printf("scancode %d = '%c' (0x%02x)\\n", codes[0], codes[1], codes[1]);
 46	    else
 47		    printf("scancode %d = 0x%02x\\n", codes[0], codes[1]);
 48    }
 49
 50    int parse_code(char *string)
 51    {
 52	    struct parse_key *p;
 53
 54	    for (p=keynames;p->name!=NULL;p++) {
 55		    if (!strcasecmp(p->name, string)) {
 56			    return p->value;
 57		    }
 58	    }
 59	    return -1;
 60    }
 61
 62    int main (int argc, char *argv[])
 63    {
 64	    int fd;
 65	    unsigned int i, j;
 66	    int codes[2];
 67
 68	    if (argc<2 || argc>4) {
 69		    printf ("usage: %s <device> to get table; or\\n"
 70			    "       %s <device> <scancode> <keycode>\\n"
 71			    "       %s <device> <keycode_file>n",*argv,*argv,*argv);
 72		    return -1;
 73	    }
 74
 75	    if ((fd = open(argv[1], O_RDONLY)) < 0) {
 76		    perror("Couldn't open input device");
 77		    return(-1);
 78	    }
 79
 80	    if (argc==4) {
 81		    int value;
 82
 83		    value=parse_code(argv[3]);
 84
 85		    if (value==-1) {
 86			    value = strtol(argv[3], NULL, 0);
 87			    if (errno)
 88				    perror("value");
 89		    }
 90
 91		    codes [0] = (unsigned) strtol(argv[2], NULL, 0);
 92		    codes [1] = (unsigned) value;
 93
 94		    if(ioctl(fd, EVIOCSKEYCODE, codes))
 95			    perror ("EVIOCSKEYCODE");
 96
 97		    if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
 98			    prtcode(codes);
 99		    return 0;
100	    }
101
102	    if (argc==3) {
103		    FILE *fin;
104		    int value;
105		    char *scancode, *keycode, s[2048];
106
107		    fin=fopen(argv[2],"r");
108		    if (fin==NULL) {
109			    perror ("opening keycode file");
110			    return -1;
111		    }
112
113		    /* Clears old table */
114		    for (j = 0; j < 256; j++) {
115			    for (i = 0; i < 256; i++) {
116				    codes[0] = (j << 8) | i;
117				    codes[1] = KEY_RESERVED;
118				    ioctl(fd, EVIOCSKEYCODE, codes);
119			    }
120		    }
121
122		    while (fgets(s,sizeof(s),fin)) {
123			    scancode=strtok(s,"\\n\\t =:");
124			    if (!scancode) {
125				    perror ("parsing input file scancode");
126				    return -1;
127			    }
128			    if (!strcasecmp(scancode, "scancode")) {
129				    scancode = strtok(NULL,"\\n\\t =:");
130				    if (!scancode) {
131					    perror ("parsing input file scancode");
132					    return -1;
133				    }
134			    }
135
136			    keycode=strtok(NULL,"\\n\\t =:(");
137			    if (!keycode) {
138				    perror ("parsing input file keycode");
139				    return -1;
140			    }
141
142			    // printf ("parsing %s=%s:", scancode, keycode);
143			    value=parse_code(keycode);
144			    // printf ("\\tvalue=%d\\n",value);
145
146			    if (value==-1) {
147				    value = strtol(keycode, NULL, 0);
148				    if (errno)
149					    perror("value");
150			    }
151
152			    codes [0] = (unsigned) strtol(scancode, NULL, 0);
153			    codes [1] = (unsigned) value;
154
155			    // printf("\\t%04x=%04x\\n",codes[0], codes[1]);
156			    if(ioctl(fd, EVIOCSKEYCODE, codes)) {
157				    fprintf(stderr, "Setting scancode 0x%04x with 0x%04x via ",codes[0], codes[1]);
158				    perror ("EVIOCSKEYCODE");
159			    }
160
161			    if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
162				    prtcode(codes);
163		    }
164		    return 0;
165	    }
166
167	    /* Get scancode table */
168	    for (j = 0; j < 256; j++) {
169		    for (i = 0; i < 256; i++) {
170			    codes[0] = (j << 8) | i;
171			    if (!ioctl(fd, EVIOCGKEYCODE, codes) && codes[1] != KEY_RESERVED)
172				    prtcode(codes);
173		    }
174	    }
175	    return 0;
176    }
~/ Read-only file preview.