Ключевые слова:keyboard, scancode, freebsd, (найти похожие документы)
Date: Thu, 29 Apr 2004 14:03:14 +0600
From: Alex Semenyaka <[email protected]>
Newsgroups: ftn.ru.unix.prog
Subject: [FreeBSD] Получение scan-кодов доп. кнопок на клавиатуре
TV> Кто нибудь уже писал драйвера для клавиатур, чтобы заработали
TV> мультимедийные кнопки? Если нет, то куда хотябы копать (какие библиотеки
TV> использовать и как определить биты, выдаваемые клавиатурой при нажатии
TV> на эти батоны)
Судя по Origin - у тебя FreeBSD. Тогда man 4 keyboard, man kbdcontrol, man
atkbd. Полезно посмотреть имеющиеся /usr/share/syscons/keymaps.
Если в manах какой-то клавиши не найдёшь, то ниже - программка, переводящая
клавиатуру на 10 секунд в режим генерации scan-кодов (если заменишь K_CODE на
K_RAW - будет вообще "что получили, то и отдали). Узнаёшь код, вписываешь в
keymap и радуешься.
#include <stdio.h>
#include <termios.h>
#include <signal.h>
#include <time.h>
#include <fcntl.h>
#include <err.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/kbio.h>
#define TIMEOUT 10
#define BUFSIZE 16
int main(int ac, char *av[]) {
int fd, mode, rc;
time_t t;
unsigned char buf[BUFSIZE];
int nread, i;
struct termios one, old;
/* redundant precautions */
signal(SIGINT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGINFO, SIG_IGN);
fd = fileno(stdin);
/* set new mode of the terminal and remember old one */
rc = tcgetattr(fd, &old);
if (rc < 0) err(1, "tcgetattr error");
memcpy(&one, &old, sizeof(old));
one.c_lflag &= ~(ICANON | ECHO | ISIG | TOSTOP);
one.c_lflag |= (NOKERNINFO);
one.c_cc[VMIN] = 1;
one.c_cc[VTIME] = 0;
rc = tcsetattr(fd, TCSANOW, &one);
if (rc < 0) err(1, "tcsetattr error");
/* raw keyboard mode and remember old one */
ioctl(fd, KDGKBMODE, &mode, sizeof(mode));
ioctl(fd, KDSKBMODE, K_CODE);
//ioctl(fd, KDSKBMODE, K_RAW);
printf("Was mode %d\n", mode);
/* ten seconds will print raw key codes */
for(t = time(NULL); time(NULL) - t < TIMEOUT;) {
nread = read(fd, buf, BUFSIZE);
if (nread <= 0) continue;
printf("Have read %d bytes\n", nread);
for(i=0; i<nread; i++) {
printf("%02x ", (int)buf[i]);
}
printf("\n");
}
/* restore the old kbd mode */
ioctl(fd, KDSKBMODE, mode);
/* restore the old terminal mode */
tcsetattr(fd, TCSANOW, &old);
exit(0);
}
Alex