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    }
177