18c2ecf20Sopenharmony_ci.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_cifile: uapi/v4l/keytable.c
48c2ecf20Sopenharmony_ci=========================
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci.. code-block:: c
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci    /* keytable.c - This program allows checking/replacing keys at IR
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci       Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@kernel.org>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci       This program is free software; you can redistribute it and/or modify
138c2ecf20Sopenharmony_ci       it under the terms of the GNU General Public License as published by
148c2ecf20Sopenharmony_ci       the Free Software Foundation, version 2 of the License.
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci       This program is distributed in the hope that it will be useful,
178c2ecf20Sopenharmony_ci       but WITHOUT ANY WARRANTY; without even the implied warranty of
188c2ecf20Sopenharmony_ci       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
198c2ecf20Sopenharmony_ci       GNU General Public License for more details.
208c2ecf20Sopenharmony_ci     */
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci    #include <ctype.h>
238c2ecf20Sopenharmony_ci    #include <errno.h>
248c2ecf20Sopenharmony_ci    #include <fcntl.h>
258c2ecf20Sopenharmony_ci    #include <stdio.h>
268c2ecf20Sopenharmony_ci    #include <stdlib.h>
278c2ecf20Sopenharmony_ci    #include <string.h>
288c2ecf20Sopenharmony_ci    #include <linux/input.h>
298c2ecf20Sopenharmony_ci    #include <sys/ioctl.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci    #include "parse.h"
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci    void prtcode (int *codes)
348c2ecf20Sopenharmony_ci    {
358c2ecf20Sopenharmony_ci	    struct parse_key *p;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	    for (p=keynames;p->name!=NULL;p++) {
388c2ecf20Sopenharmony_ci		    if (p->value == (unsigned)codes[1]) {
398c2ecf20Sopenharmony_ci			    printf("scancode 0x%04x = %s (0x%02x)\\n", codes[0], p->name, codes[1]);
408c2ecf20Sopenharmony_ci			    return;
418c2ecf20Sopenharmony_ci		    }
428c2ecf20Sopenharmony_ci	    }
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	    if (isprint (codes[1]))
458c2ecf20Sopenharmony_ci		    printf("scancode %d = '%c' (0x%02x)\\n", codes[0], codes[1], codes[1]);
468c2ecf20Sopenharmony_ci	    else
478c2ecf20Sopenharmony_ci		    printf("scancode %d = 0x%02x\\n", codes[0], codes[1]);
488c2ecf20Sopenharmony_ci    }
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci    int parse_code(char *string)
518c2ecf20Sopenharmony_ci    {
528c2ecf20Sopenharmony_ci	    struct parse_key *p;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	    for (p=keynames;p->name!=NULL;p++) {
558c2ecf20Sopenharmony_ci		    if (!strcasecmp(p->name, string)) {
568c2ecf20Sopenharmony_ci			    return p->value;
578c2ecf20Sopenharmony_ci		    }
588c2ecf20Sopenharmony_ci	    }
598c2ecf20Sopenharmony_ci	    return -1;
608c2ecf20Sopenharmony_ci    }
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci    int main (int argc, char *argv[])
638c2ecf20Sopenharmony_ci    {
648c2ecf20Sopenharmony_ci	    int fd;
658c2ecf20Sopenharmony_ci	    unsigned int i, j;
668c2ecf20Sopenharmony_ci	    int codes[2];
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	    if (argc<2 || argc>4) {
698c2ecf20Sopenharmony_ci		    printf ("usage: %s <device> to get table; or\\n"
708c2ecf20Sopenharmony_ci			    "       %s <device> <scancode> <keycode>\\n"
718c2ecf20Sopenharmony_ci			    "       %s <device> <keycode_file>n",*argv,*argv,*argv);
728c2ecf20Sopenharmony_ci		    return -1;
738c2ecf20Sopenharmony_ci	    }
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	    if ((fd = open(argv[1], O_RDONLY)) < 0) {
768c2ecf20Sopenharmony_ci		    perror("Couldn't open input device");
778c2ecf20Sopenharmony_ci		    return(-1);
788c2ecf20Sopenharmony_ci	    }
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	    if (argc==4) {
818c2ecf20Sopenharmony_ci		    int value;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci		    value=parse_code(argv[3]);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci		    if (value==-1) {
868c2ecf20Sopenharmony_ci			    value = strtol(argv[3], NULL, 0);
878c2ecf20Sopenharmony_ci			    if (errno)
888c2ecf20Sopenharmony_ci				    perror("value");
898c2ecf20Sopenharmony_ci		    }
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci		    codes [0] = (unsigned) strtol(argv[2], NULL, 0);
928c2ecf20Sopenharmony_ci		    codes [1] = (unsigned) value;
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci		    if(ioctl(fd, EVIOCSKEYCODE, codes))
958c2ecf20Sopenharmony_ci			    perror ("EVIOCSKEYCODE");
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci		    if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
988c2ecf20Sopenharmony_ci			    prtcode(codes);
998c2ecf20Sopenharmony_ci		    return 0;
1008c2ecf20Sopenharmony_ci	    }
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	    if (argc==3) {
1038c2ecf20Sopenharmony_ci		    FILE *fin;
1048c2ecf20Sopenharmony_ci		    int value;
1058c2ecf20Sopenharmony_ci		    char *scancode, *keycode, s[2048];
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci		    fin=fopen(argv[2],"r");
1088c2ecf20Sopenharmony_ci		    if (fin==NULL) {
1098c2ecf20Sopenharmony_ci			    perror ("opening keycode file");
1108c2ecf20Sopenharmony_ci			    return -1;
1118c2ecf20Sopenharmony_ci		    }
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci		    /* Clears old table */
1148c2ecf20Sopenharmony_ci		    for (j = 0; j < 256; j++) {
1158c2ecf20Sopenharmony_ci			    for (i = 0; i < 256; i++) {
1168c2ecf20Sopenharmony_ci				    codes[0] = (j << 8) | i;
1178c2ecf20Sopenharmony_ci				    codes[1] = KEY_RESERVED;
1188c2ecf20Sopenharmony_ci				    ioctl(fd, EVIOCSKEYCODE, codes);
1198c2ecf20Sopenharmony_ci			    }
1208c2ecf20Sopenharmony_ci		    }
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci		    while (fgets(s,sizeof(s),fin)) {
1238c2ecf20Sopenharmony_ci			    scancode=strtok(s,"\\n\\t =:");
1248c2ecf20Sopenharmony_ci			    if (!scancode) {
1258c2ecf20Sopenharmony_ci				    perror ("parsing input file scancode");
1268c2ecf20Sopenharmony_ci				    return -1;
1278c2ecf20Sopenharmony_ci			    }
1288c2ecf20Sopenharmony_ci			    if (!strcasecmp(scancode, "scancode")) {
1298c2ecf20Sopenharmony_ci				    scancode = strtok(NULL,"\\n\\t =:");
1308c2ecf20Sopenharmony_ci				    if (!scancode) {
1318c2ecf20Sopenharmony_ci					    perror ("parsing input file scancode");
1328c2ecf20Sopenharmony_ci					    return -1;
1338c2ecf20Sopenharmony_ci				    }
1348c2ecf20Sopenharmony_ci			    }
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci			    keycode=strtok(NULL,"\\n\\t =:(");
1378c2ecf20Sopenharmony_ci			    if (!keycode) {
1388c2ecf20Sopenharmony_ci				    perror ("parsing input file keycode");
1398c2ecf20Sopenharmony_ci				    return -1;
1408c2ecf20Sopenharmony_ci			    }
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci			    // printf ("parsing %s=%s:", scancode, keycode);
1438c2ecf20Sopenharmony_ci			    value=parse_code(keycode);
1448c2ecf20Sopenharmony_ci			    // printf ("\\tvalue=%d\\n",value);
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci			    if (value==-1) {
1478c2ecf20Sopenharmony_ci				    value = strtol(keycode, NULL, 0);
1488c2ecf20Sopenharmony_ci				    if (errno)
1498c2ecf20Sopenharmony_ci					    perror("value");
1508c2ecf20Sopenharmony_ci			    }
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci			    codes [0] = (unsigned) strtol(scancode, NULL, 0);
1538c2ecf20Sopenharmony_ci			    codes [1] = (unsigned) value;
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci			    // printf("\\t%04x=%04x\\n",codes[0], codes[1]);
1568c2ecf20Sopenharmony_ci			    if(ioctl(fd, EVIOCSKEYCODE, codes)) {
1578c2ecf20Sopenharmony_ci				    fprintf(stderr, "Setting scancode 0x%04x with 0x%04x via ",codes[0], codes[1]);
1588c2ecf20Sopenharmony_ci				    perror ("EVIOCSKEYCODE");
1598c2ecf20Sopenharmony_ci			    }
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci			    if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
1628c2ecf20Sopenharmony_ci				    prtcode(codes);
1638c2ecf20Sopenharmony_ci		    }
1648c2ecf20Sopenharmony_ci		    return 0;
1658c2ecf20Sopenharmony_ci	    }
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	    /* Get scancode table */
1688c2ecf20Sopenharmony_ci	    for (j = 0; j < 256; j++) {
1698c2ecf20Sopenharmony_ci		    for (i = 0; i < 256; i++) {
1708c2ecf20Sopenharmony_ci			    codes[0] = (j << 8) | i;
1718c2ecf20Sopenharmony_ci			    if (!ioctl(fd, EVIOCGKEYCODE, codes) && codes[1] != KEY_RESERVED)
1728c2ecf20Sopenharmony_ci				    prtcode(codes);
1738c2ecf20Sopenharmony_ci		    }
1748c2ecf20Sopenharmony_ci	    }
1758c2ecf20Sopenharmony_ci	    return 0;
1768c2ecf20Sopenharmony_ci    }
177