Merge tag 'Smack-for-5.11-io_uring-fix' of git://github.com/cschaufler/smack-next
[linux-2.6-microblaze.git] / Documentation / userspace-api / media / rc / keytable.c.rst
1 .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
2
3 file: 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     }