1.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later 2 3file: 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 } 177