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