brintos

brintos / linux-shallow public Read only

0
0
Text · 4.4 KiB · 243e02d Raw
177 lines · plain
1.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later2 3file: uapi/v4l/keytable.c4=========================5 6.. code-block:: c7 8    /* keytable.c - This program allows checking/replacing keys at IR9 10       Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@kernel.org>11 12       This program is free software; you can redistribute it and/or modify13       it under the terms of the GNU General Public License as published by14       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 of18       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the19       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	    else47		    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