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