The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

[FreeBSD] Получение scan-кодов доп. кнопок на клавиатуре (keyboard scancode freebsd)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру