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