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