Драйверы devi-[egalax/hid] из состава ЗОСРВ "Нейтрино" редакции 2020
Этот коммит содержится в:
Коммит
4346965cdc
3
Makefile
Обычный файл
3
Makefile
Обычный файл
@ -0,0 +1,3 @@
|
||||
LIST=hardware
|
||||
EARLY_DIRS=devu
|
||||
include recurse.mk
|
318
README.md
Обычный файл
318
README.md
Обычный файл
@ -0,0 +1,318 @@
|
||||
## Предостережение
|
||||
|
||||
Предоставленный исходный код драйвера [devi-hid](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/utils/system/devi-hid.html) рекомендуется использовать **только для отладочных целей** при разработке HID-драйверов. Для всех остальных задач следует использовать штатный системный драйвер [devi-hid](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/utils/system/devi-hid.html). В общем случае **не существует задач**, которые требуется решать в этом драйвере при поддержке нового оборудования (для этого должен быть написан/модифицирован отдельный драйвер ввода или HID-драйвер).
|
||||
|
||||
|
||||
|
||||
## Общая структура подсистемы ввода
|
||||
|
||||
```
|
||||
┌───────────────────────────┐
|
||||
│ │
|
||||
│ Устройство ввода ◂───────────────────────┐
|
||||
│ │ │
|
||||
└─────────────▴─────────────┘ │
|
||||
│ │
|
||||
┌─────────────┴─────────────┐ │ Не HID-совместимое
|
||||
│ │ │ устройство
|
||||
│ HID-драйвер (devh-*) │ │
|
||||
│ │ │
|
||||
└─────────────▴─────────────┘ │
|
||||
│ │
|
||||
┌─────────────┴─────────────┐ ┌─────────────┴─────────────┐
|
||||
│ │ │ │
|
||||
│ HID-менеджер (io-hid) ◂─── * ───┤ Драйвер ввода (devi-*) ◂───▸ /dev/??? (standalone-режим)
|
||||
│ │ │ │
|
||||
└───────────────────────────┘ ▲ └─────────────▴─────────────┘
|
||||
│ │
|
||||
│ ┌─────────────▾─────────────┐
|
||||
Интерфейс libhiddi ─────┘ │ │
|
||||
│ Оконная оболочка Photon │
|
||||
│ │
|
||||
└───────────────────────────┘
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Дерево исходных кодов
|
||||
|
||||
```
|
||||
|- devi/
|
||||
| |- egalax/ - Исходный код драйвера поддержки тачскринов egalax, подключаемых по PS/2
|
||||
| |- hid/ - Исходный код драйвера HID-совместимых устройств (только для отладочных целей)
|
||||
| |- include/ - Заголовочные файлы библиотек
|
||||
| |- keymap/ - Библиотека трансляции символов (libkeymap)
|
||||
| |- lib/ - Библиотека менеджера ресурсов драйвера (libinput)
|
||||
| |- public/ - Публичные интерфейсы драйвера
|
||||
| |- Makefile - Правила сборки дерева исходников
|
||||
| `- common.mk - Параметры сборки драйверов и библиотек
|
||||
|
|
||||
`- Makefile - Правила сборки дерева исходников
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Сборка драйвера
|
||||
|
||||
- Установить и настроить [комплект разработчика](https://help.kpda.ru/help/topic/ru.kpda.doc.dev_tools_ru/html/devkit/devkit.html) для [ЗОСРВ "Нейтрино" редакции 2020](https://help.kpda.ru/help/index.jsp).
|
||||
- Выполнить команду:
|
||||
|
||||
```
|
||||
make
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Запуск драйвера
|
||||
|
||||
Общая схема запуска драйвера:
|
||||
|
||||
```
|
||||
devi-* <опции_драйвера> <протокол> <опции протокола> [<устройство> <опции_устройства>] [<фильтр> <опции_фильтра>]
|
||||
```
|
||||
|
||||
Примеры:
|
||||
|
||||
```
|
||||
devi-hirun -b kbd fd -d /dev/kbd ps2 mousedev
|
||||
└───┬────┘ └───┬───┘ └───┬────┘ └────┬─────┘ └───────┬────────┘ └───┬────┘ └────┬─────┘
|
||||
│ │ │ │ │ │ │
|
||||
│ │ │ │ Опции устройства │ │
|
||||
│ │ │ Устройство │ Устройство
|
||||
│ │ Протокол Протокол
|
||||
│ Опции
|
||||
Драйвер
|
||||
|
||||
|
||||
|
||||
devi-hid -b touch mouse kbd
|
||||
└───┬───┘ └───┬───┘ └───────┬───────┘
|
||||
│ │ │
|
||||
│ │ Протоколы
|
||||
│ Опции
|
||||
Драйвер
|
||||
```
|
||||
|
||||
|
||||
|
||||
## События ввода (events)
|
||||
|
||||
**Маршрутизация событий:**
|
||||
|
||||
```
|
||||
Hardware → Device → Protocol → Filter → Photon или /dev/???
|
||||
```
|
||||
|
||||
**Виды событий ввода:**
|
||||
|
||||
- Относительные - содержат информирмацию об изменении координат на некоторую величину (мышь, touchpad)
|
||||
- Абсолютные - содержащие координаты в контекста собственного разрешения устройства ввода (touchscreen)
|
||||
- Клавиатурные - содержат сведения об изменении состояния клавиатуры (состояние клавиш, сканкоды и статусные флаги)
|
||||
|
||||
(!) Устройства с абсолютным позиционированием необходимо [калибровать](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/utils/photon/calib.html) перед использованием. Это позволяет установить соответствие между пространством координат устройства ввода и координатами дисплея.
|
||||
|
||||
|
||||
|
||||
## Интерфейсы и взаимодействие
|
||||
|
||||
Пример чтения ctrl-структуры в клиентском приложении:
|
||||
|
||||
```
|
||||
#include <sys/dcmd_input.h>
|
||||
|
||||
...
|
||||
|
||||
int main()
|
||||
{
|
||||
struct _keyboard_ctrl kbctrl;
|
||||
int fd = open( "/dev/keyboard0", O_RDWR );
|
||||
...
|
||||
|
||||
/* Инициализация */
|
||||
...
|
||||
|
||||
if ( devctl( fd, _KEYBOARDGETCTRL, &kbctrl, sizeof( kbctrl ), NULL ) != EOK )
|
||||
{
|
||||
/* Обработка ошибок */
|
||||
} else {
|
||||
/* Структура контроля клавиатуры считана в переменную kbctrl. Можно приступать к ее анализу. */
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Разработка драйвера
|
||||
|
||||
**Дескриптор модуля:**
|
||||
|
||||
```
|
||||
struct _input_module
|
||||
{
|
||||
/* Module parameters */
|
||||
input_module_t *up; /* Up module in the bus line */
|
||||
input_module_t *down; /* Down module in the bus line */
|
||||
struct Line *line; /* Bus line */
|
||||
int flags; /* flags */
|
||||
int type; /* type of module */
|
||||
char name[12]; /* Module name */
|
||||
char date[12]; /* Date of compilation */
|
||||
const char *args; /* Module arguments */
|
||||
void *data; /* Private module data */
|
||||
|
||||
/* Callbacks */
|
||||
int (*init)( input_module_t *module );
|
||||
int (*reset)( input_module_t *module );
|
||||
int (*input)( input_module_t *module, int num, void *data );
|
||||
int (*output)( input_module_t *module, void *data, int num );
|
||||
int (*pulse)( message_context_t *ctx, int code, unsigned flags, void *data );
|
||||
int (*parm)( input_module_t *module, int code, char *optarg );
|
||||
int (*devctrl)( input_module_t *module, int event, void *data );
|
||||
int (*shutdown)( input_module_t *module, int delay );
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
**Инициализация драйвера:**
|
||||
|
||||
- Заполнить структуру дескриптора модуля
|
||||
- Заполнить структуру `_common_callbacks` (см. ниже):
|
||||
- Выполнить инициализацию библиотеки `libinput`, вызвав функцию: `devi_init( (struct _common_callbacks *)&ptr );`
|
||||
- Выполнить всю необходимую инициализацию прочих библиотек и ресурсов
|
||||
- Передать управление библиотеке `libinput`, вызвав функцию: `begin( (int)argc, (char**)argv );`
|
||||
|
||||
Структура `_common_callbacks`:
|
||||
|
||||
```
|
||||
struct _common_callbacks {
|
||||
int nCallbacks;
|
||||
int (*pre_init)();
|
||||
int (*post_init)();
|
||||
int (*pre_shutdown)();
|
||||
int (*post_shutdown)();
|
||||
}
|
||||
```
|
||||
|
||||
Диаграмма последовательности инициализации:
|
||||
|
||||
```
|
||||
┌──────────────────────────┐ ┌──────────────────────┐ ┌──────────────────────────┐
|
||||
│ Драйвер ввода (devi-*) │ │ Библиотека libinput │ │ Модуль │
|
||||
└────────────┬─────────────┘ └──────────┬───────────┘ └────────────┬─────────────┘
|
||||
│ │ │
|
||||
│ devi_init() │ │
|
||||
├──────────────────────────▸│ │
|
||||
│ │ │
|
||||
│ begin() │ │
|
||||
├──────────────────────────▸│ │
|
||||
│ │ │
|
||||
│ pre_init_callbacks() │ │
|
||||
│◂──────────────────────────┤ │
|
||||
│ ├──┐ │
|
||||
│ │ │ Разбор опций, иницализация │
|
||||
│ │ │ структур модуля │
|
||||
│ │◂─┘ │
|
||||
│ │ │
|
||||
│ │ init callback │
|
||||
│ ├───────────────────────────────▸│
|
||||
│ │ │
|
||||
│ │ param callback │
|
||||
│ ├───────────────────────────────▸│
|
||||
│ │ │
|
||||
│ │ reset callback │
|
||||
│ ├───────────────────────────────▸│
|
||||
│ │ │
|
||||
│ post_init_callbacks() │ │
|
||||
│◂──────────────────────────┤ │
|
||||
│ ├──┐ │
|
||||
│ │ │ Иницализация интерфейсов │
|
||||
│ │◂─┘ │
|
||||
│ ├──┐ │
|
||||
│ │ │ Иницализация пула потоков │
|
||||
│ │◂─┘ │
|
||||
│ ├──┐ │
|
||||
│ │ │ Запуск менеджера ресурсов │
|
||||
│ │◂─┘ │
|
||||
│ │ │
|
||||
```
|
||||
|
||||
|
||||
**Обработка событий (pulse):**
|
||||
|
||||
- Вызывается в ответ на возникновение события
|
||||
- Обычно реализуется в модулях устройств
|
||||
- Выполняет сбор данных из устройства
|
||||
- Возможные способы регистрации обработчика: `devi_register_interrupt()`, `devi_register_pulse()` или `devi_register_timer()`
|
||||
- Для передачи данных далее по Busline используется функция `module->up->input()`
|
||||
|
||||
|
||||
**Ввод данных (input) – передача данных клиенту:**
|
||||
|
||||
- Вызывается в моменты, когда модуль более низкого уровня готов к передаче данных
|
||||
- Модуль устройства:
|
||||
- Выполнить сбор данных
|
||||
- Упаковать их в согласованный с модулем протокола формат
|
||||
- Передать их на уровень модуля-протокола, используя функцию `module->up->input()`
|
||||
- Модуль протокола:
|
||||
- Преобразовать данные в стандартную структуру пакета, соответствующего обслуживаемому устройству (`packet_kbd`, `packet_abs`, `packet_rel`)
|
||||
- Передать их на уровень модуля-протокола, используя функцию `module->up->input()`
|
||||
- Модуль фильтра:
|
||||
- Выполнить необходимую коррекцию принятых данных
|
||||
- Передать данные на реализуемые интерфейсы, используя функцию `devi_enqueue_packet()`
|
||||
|
||||
Диаграмма последовательности ввода данных:
|
||||
|
||||
```
|
||||
┌────────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌──────────┐
|
||||
│ Hardware │ │ libinput │ │ Device │ │ Protocol │ │ Filter │ │ Клиент │
|
||||
└─────┬──────┘ └──────┬─────┘ └─────┬────┘ └──────┬─────┘ └─────┬────┘ └─────┬────┘
|
||||
│ │ │ │ │ │
|
||||
│ │ devi_interrupt_attach() │ │ │ │
|
||||
│ │◂──────────────────────────┤ │ │ │
|
||||
│ Прерывание │ │ │ │ │
|
||||
├───────────────▸│ pulse_callback() │ │ │ │
|
||||
│ ├──────────────────────────▸│ │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ read() │ │ │ │
|
||||
│◂───────────────────────────────────────────┤ │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ Данные │ │ input │ │ │
|
||||
├───────────────────────────────────────────▸│ callback │ input │ │
|
||||
│ │ ├─────────────▸│ callback │ │
|
||||
│ │ │ ├─────────────▸│ devi_enqueue_packet() │
|
||||
│ │ │ │ ├────────────────────────▸│
|
||||
│ │ │ │ │ │
|
||||
```
|
||||
|
||||
|
||||
**Управление устройством (devctl):**
|
||||
|
||||
- Реализует управление модулем и реакцию на внешние [devctl()](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/libraries/libc/d/devctl.html) команды
|
||||
- Собственные [devctl()](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/libraries/libc/d/devctl.html) команды можно зарегистрировать, используя константы из заголовочного файла `include/const.h`
|
||||
- Модуль устройства:
|
||||
- Если тип события известен – выполнить обработку
|
||||
- Если тип события не известен – вернуть значение `-1` и установить переменную [errno](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/libraries/libc/e/errno.html) в значение `EINVAL`;
|
||||
- Модуль протокола:
|
||||
- Если тип события известен – выполнить обработку
|
||||
- Если тип события не известен и имеется связанный модуль нижнего уровня – передать событие далее
|
||||
|
||||
|
||||
|
||||
## Обзор API библиотеки libinput
|
||||
|
||||
- Работа с циклическими буферами (см. функции семейства `buff_*()`)
|
||||
- Системные функции:
|
||||
- `clk_get()`
|
||||
- `devi_request_iorange()`
|
||||
- Передача данных на/от реализуемых интерфейсов:
|
||||
- `devi_enqueue_packet()`
|
||||
- Регистрация обработчиков событий (см. `devi_register_*()`)
|
||||
- Доступ к данным менеджера ресурсов:
|
||||
- `devi_get_coid()`
|
||||
- `devi_get_dispatch_handle()` / `devi_set_dispatch_handle()`
|
||||
- Работа с менеджером [io-hid](https://help.kpda.ru/help/topic/ru.kpda.doc.os_ru/html/services/io-hid.html):
|
||||
- `devi_hid_init()`
|
||||
- `devi_hid_register_client()` / `devi_hid_unregister_client()`
|
||||
- `devi_hid_server_connect()` / `devi_hid_server_disconnect()`
|
||||
- `devi_scan_to_usb()` / `devi_usb_to_scan()`
|
||||
|
3
devi/Makefile
Обычный файл
3
devi/Makefile
Обычный файл
@ -0,0 +1,3 @@
|
||||
EARLY_DIRS=keymap lib
|
||||
LIST=DEVI
|
||||
include recurse.mk
|
61
devi/common.mk
Обычный файл
61
devi/common.mk
Обычный файл
@ -0,0 +1,61 @@
|
||||
#
|
||||
# (c) 2010-2018, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
ifndef QCONFIG
|
||||
QCONFIG=qconfig.mk
|
||||
endif
|
||||
include $(QCONFIG)
|
||||
INSTALLDIR=usr/photon/bin
|
||||
|
||||
define PINFO
|
||||
PINFO DESCRIPTION=
|
||||
endef
|
||||
|
||||
USEFILE=$(PROJECT_ROOT)/$(SECTION)/devi-$(SECTION).use
|
||||
|
||||
EXTRA_SILENT_VARIANTS = $(subst -, ,$(SECTION))
|
||||
NAME=$(PROJECT)-$(SECTION)
|
||||
|
||||
LIBPREF_ph = -Bstatic
|
||||
LIBPOST_ph = -Bdynamic
|
||||
LIBS += input keymap ph gf cache
|
||||
|
||||
CCFLAGS += -w0 -D__DATE__=\"$(PINFO_DATE)\" -D__TIME__=\"\"
|
||||
|
||||
#PUBLIC_INCVPATH+=$(PROJECT_ROOT)/private $(PROJECT_ROOT)/public
|
||||
PUBLIC_INCVPATH+=$(PROJECT_ROOT)/public
|
||||
|
||||
SERVICES_ROOT=$(PRODUCT_ROOT)/../services
|
||||
LIB_VARIANT=$(subst dll,o,$(COMPOUND_VARIANT))
|
||||
|
||||
# Local modifications of make environment
|
||||
-include ../../../private.mk
|
||||
|
||||
include $(MKFILES_ROOT)/qmacros.mk
|
||||
include $(PROJECT_ROOT)/$(SECTION)/pinfo.mk
|
||||
|
||||
-include $(PROJECT_ROOT)/roots.mk
|
||||
ifndef DEVILIB_ROOT
|
||||
DEVILIB_ROOT=$(PROJECT_ROOT)/lib
|
||||
endif
|
||||
ifndef KEYMAP_ROOT
|
||||
KEYMAP_ROOT=$(PROJECT_ROOT)/keymap
|
||||
endif
|
||||
|
||||
EXTRA_INCVPATH+=$(PROJECT_ROOT)/private/sys $(PROJECT_ROOT)/private
|
||||
EXTRA_INCVPATH+=$(PROJECT_ROOT)/public/sys
|
||||
|
||||
EXTRA_LIBVPATH+=$(SERVICES_ROOT)/usb/usbdi/$(subst x86/so.,x86/so,$(CPU)/so.$(filter le be,$(subst ., ,$(VARIANTS))))
|
||||
EXTRA_LIBVPATH+=$(SERVICES_ROOT)/hid/hiddi/$(subst x86/so.,x86/so,$(CPU)/so.$(filter le be,$(subst ., ,$(VARIANTS))))
|
||||
EXTRA_INCVPATH+=$(PROJECT_ROOT)/include $(PROJECT_ROOT)/../../lib/ph
|
||||
|
||||
EXTRA_LIBVPATH+=$(DEVILIB_ROOT)/$(OS)/$(CPU)/a.$(COMPOUND_VARIANT) $(KEYMAP_ROOT)/$(OS)/$(CPU)/a.$(COMPOUND_VARIANT)
|
||||
EXTRA_LIBVPATH+=$(DEVILIB_ROOT)/$(OS)/$(CPU)/a.$(COMPOUND_VARIANT).shared $(KEYMAP_ROOT)/$(OS)/$(CPU)/a.$(COMPOUND_VARIANT).shared
|
||||
|
||||
|
||||
include $(MKFILES_ROOT)/qtargets.mk
|
||||
|
||||
|
||||
infoinfo:
|
||||
echo $(VARIANT1) $(COMPOUND_VARIANT)
|
2
devi/egalax/Makefile
Обычный файл
2
devi/egalax/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=OS
|
||||
include recurse.mk
|
46
devi/egalax/devi-egalax.use
Обычный файл
46
devi/egalax/devi-egalax.use
Обычный файл
@ -0,0 +1,46 @@
|
||||
%C [general_opts] protocol* [protocol_opts]*
|
||||
|
||||
%C : EETI eGalaxTouch (PS/2) Input Manager for Photon
|
||||
|
||||
ATTENTION! Manager is incompatible with any ps2 hid modules
|
||||
|
||||
General opts:
|
||||
-P disable photon interface (default start Photon interface)
|
||||
-r start resource manager interface (only use if not using Photon)
|
||||
-b prevent CASB exit (default allow CASB)
|
||||
-G presence of grafx driver is not required when
|
||||
starting up a touchscreen driver; useful in debug mode
|
||||
-g input group (default 1)
|
||||
-v increment verbosity (default 0)
|
||||
-l list List the internal modules. Modules are listed in
|
||||
the following format:
|
||||
|
||||
module name | date last compiled | revision | class
|
||||
where: class is comprised of (D)evice and/or
|
||||
(P)rotocol and/or (F)ilter
|
||||
|
||||
Protocol and protocol_opts:
|
||||
|
||||
egalaxtouch [egalaxtouch_opts] [uart uart_opts]
|
||||
|
||||
protocol modules and their options:
|
||||
|
||||
egalax Elographics smartset protocol
|
||||
-R Don't reset device (default reset device)
|
||||
|
||||
filter modules and their options:
|
||||
|
||||
abs Transform and compresses absolute coordinate "touch" events
|
||||
-b Touching the screen is a right mouse button (default left)
|
||||
-c Calibrate mode - don't transform coordinates
|
||||
-f filename Calibration file name
|
||||
-o x,y Origin of display region (default, origin of graphics region)
|
||||
-s x,y Coordinates of lower right corner of display region
|
||||
(default, width and height of graphics region)
|
||||
-x Reverse X
|
||||
-y Reverse Y
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
%C egalax
|
495
devi/egalax/egalax.c
Обычный файл
495
devi/egalax/egalax.c
Обычный файл
@ -0,0 +1,495 @@
|
||||
/*
|
||||
* (c) 2016, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* smarttest.c
|
||||
*
|
||||
* Elographics touch screen protocol.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "devi.h"
|
||||
#include <time.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE !TRUE
|
||||
#define DEBOUNCE 80000L
|
||||
|
||||
#define TRY_LIMIT (100000)
|
||||
#define TIME_DELAY (10000)
|
||||
#define IN_BUFF_FULL (0x2)
|
||||
#define OUT_BUFF_FULL (0x1)
|
||||
|
||||
#define AUX_IRQ 12 /* default aux irq */
|
||||
#define PS2_DATA_PORT 0x60
|
||||
#define PS2_STATUS_REGISTER 0x64
|
||||
#define PS2_COMMAND_REGISTER 0x64
|
||||
|
||||
#define PS2_TEST_CONTROLLER 0xAA
|
||||
#define PS2_SELFTEST_SUCCESS 0x55
|
||||
#define PS2_READ_CONFBYTE 0x20
|
||||
#define PS2_WRITE_CONFBYTE 0x60
|
||||
#define PS2_AUX_TEST 0xA9
|
||||
#define PS2_AUX_WRITE 0xD4
|
||||
#define AUX_DISABLE 0xA7 /* disable the aux device */
|
||||
#define AUX_ENABLE 0xA8 /* enable the aux device */
|
||||
|
||||
#define AUX_ENABLE_XFER 0xf4 /* enable stream mode transfer */
|
||||
#define AUX_DISABLE_XFER 0xf5 /* disable stream mode transfer */
|
||||
#define AUX_RESET 0xFF /* RESET mouse */
|
||||
#define AUX_COMPLETE 0xaa /* Mouse complete */
|
||||
#define AUX_GET_STATUS 0xe9 /* get mouse state */
|
||||
#define AUX_DEV_ID 0xf2 /* get device ID */
|
||||
#define AUX_STREAM_MODE 0xea /* Set stream mode */
|
||||
|
||||
// Mouse replies
|
||||
#define RESEND (0xfe) /* resend */
|
||||
#define ACK (0xfa)
|
||||
#define NUM_OF_RETRIES (5)
|
||||
|
||||
#define TRY_LIMIT (100000)
|
||||
#define TIME_DELAY (10000)
|
||||
#define IN_BUFF_FULL (0x2)
|
||||
#define OUT_BUFF_FULL (0x1)
|
||||
|
||||
#define DATA_PACKAGE_SIZE (5)
|
||||
#define FLAG_INIT 0x1000
|
||||
#define FLAG_RESET 0x2000
|
||||
|
||||
struct data {
|
||||
|
||||
int flags;
|
||||
struct sigevent event;
|
||||
struct packet_abs tp;
|
||||
int state; /* current state (see smart_input for details) */
|
||||
};
|
||||
|
||||
extern struct sigevent event;
|
||||
|
||||
static int egalax_init(input_module_t *module);
|
||||
static int egalax_devctrl(input_module_t *module,int event,void *ptr);
|
||||
static int egalax_reset(input_module_t *module);
|
||||
static int egalax_input(input_module_t *module, int num, void *ptr);
|
||||
static int egalax_parm(input_module_t *module,int opt,char *optarg);
|
||||
static int egalax_shutdown(input_module_t *module, int delay);
|
||||
static int egalax_pulse(message_context_t *ctp, int code, unsigned flags, void *data);
|
||||
|
||||
void* inter_wait_cycle( input_module_t *module );
|
||||
int ps2_init( void );
|
||||
int aux_reset( void );
|
||||
|
||||
input_module_t egalax = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_ABS | DEVI_MODULE_TYPE_DEVICE | DEVI_MODULE_TYPE_PROTO,
|
||||
"egalax",
|
||||
__DATE__,
|
||||
"R",
|
||||
NULL, // data
|
||||
egalax_init,
|
||||
egalax_reset,
|
||||
egalax_input,
|
||||
NULL,
|
||||
NULL, //egalax_pulse,
|
||||
egalax_parm,
|
||||
egalax_devctrl,
|
||||
egalax_shutdown,
|
||||
};
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module */
|
||||
/* initializes input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int egalax_init(input_module_t *module)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
|
||||
ThreadCtl( _NTO_TCTL_IO, 0 );
|
||||
|
||||
if( !module->data ) {
|
||||
if( !(dp = module->data = calloc(sizeof *dp, 1)) ) {
|
||||
return (-1);
|
||||
}
|
||||
|
||||
SIGEV_INTR_INIT( &(dp->event) );
|
||||
dp->flags = ABSOLUTE | ABS_UNCALIBRATED | FLAG_RESET;
|
||||
dp->state = 0;
|
||||
}
|
||||
|
||||
ps2_init();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void* inter_wait_cycle( input_module_t *module )
|
||||
{
|
||||
int id;
|
||||
struct data *dp = module->data;
|
||||
|
||||
id = InterruptAttachEvent( AUX_IRQ, &dp->event, _NTO_INTR_FLAGS_END );
|
||||
if ( id == -1 ) {
|
||||
fprintf(stderr, "Mouse interrupt attach failed\n" );
|
||||
exit ( -1 );
|
||||
}
|
||||
|
||||
uint8_t data[DATA_PACKAGE_SIZE];
|
||||
int count = 0;
|
||||
for (;;)
|
||||
{
|
||||
InterruptWait( 0, NULL );
|
||||
data[count++] = in8( PS2_DATA_PORT );
|
||||
|
||||
InterruptUnmask( AUX_IRQ, id );
|
||||
|
||||
if ( count == DATA_PACKAGE_SIZE ) {
|
||||
(module->input)( module, DATA_PACKAGE_SIZE, data );
|
||||
count = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
int egalax_devctrl(input_module_t *module, int event, void *ptr)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
input_module_t *down = module->down;
|
||||
|
||||
switch(event) {
|
||||
|
||||
case DEVCTL_GETDEVFLAGS:
|
||||
*(unsigned short *)ptr = (dp->flags & FLAGS_GLOBAL);
|
||||
break;
|
||||
case DEVCTL_GETPTRBTNS:
|
||||
*(unsigned long *)ptr = 1L;
|
||||
break;
|
||||
case DEVCTL_GETPTRCOORD:
|
||||
*(unsigned char *)ptr = '\02';
|
||||
break;
|
||||
case DEVCTL_GETPTRPRESS:
|
||||
*(unsigned char *)ptr = (dp->flags & ABS_PRESS_DATA)?1:0;
|
||||
break;
|
||||
case DEVCTL_GETCOORDRNG: {
|
||||
struct devctl_coord_range *range = ptr;
|
||||
|
||||
// TODO: look for coord range
|
||||
range->min = 0;
|
||||
range->max = 4095;
|
||||
|
||||
break;
|
||||
}
|
||||
case DEVCTL_GETPRESSRNG: {
|
||||
// for all smartset devices at present the range is 0-255
|
||||
struct devctl_coord_range *range = ptr;
|
||||
|
||||
range->min = 0;
|
||||
range->max = 255;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus;it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int egalax_reset(input_module_t * module)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
input_module_t *down = module->down;
|
||||
|
||||
if((dp->flags & FLAG_INIT) == 0) { // if not initialized
|
||||
pthread_attr_t attr;
|
||||
|
||||
aux_reset();
|
||||
|
||||
pthread_attr_init( &attr );
|
||||
if ( pthread_create( NULL, &attr, &inter_wait_cycle, module ) != EOK ) {
|
||||
fprintf(stderr, "Unable to create interrupt handler thread\n" );
|
||||
exit ( -1 );
|
||||
}
|
||||
|
||||
dp->flags |= FLAG_INIT;
|
||||
}
|
||||
|
||||
// if (dp->flags & FLAG_RESET)
|
||||
// aux_reset();
|
||||
|
||||
dp->state = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is to interpret */
|
||||
/* the data according to the Elographics touch screen protocol, create */
|
||||
/* a data structure, fill it in and hand it off to the filter layer */
|
||||
/* module above it. The protocol is processed using simple state */
|
||||
/* machine. State info is kept in module's private data */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int egalax_input( input_module_t *module, int num, void *ptr )
|
||||
{
|
||||
int i, enqueue = 0;
|
||||
uint8_t *p = (uint8_t *)ptr;
|
||||
struct data *dp = module->data;
|
||||
input_module_t *up = module->up;
|
||||
|
||||
if(verbosity >= 5)
|
||||
{
|
||||
fprintf( stderr, "Received : ");
|
||||
for(i = 0; i < num; ++i)
|
||||
fprintf( stderr, "%#x ", (int)*((_uint8 *)ptr + i));
|
||||
fprintf( stderr, "\n");
|
||||
}
|
||||
|
||||
if( p[0] & 0x01 ) dp->tp.buttons = 4L;
|
||||
if( (p[0] & 0x01) == 0 ) dp->tp.buttons = 0;
|
||||
|
||||
dp->tp.y = ( (p[1] & 0x7f) << 7) | (p[2] & 0x7f);
|
||||
dp->tp.x = ( (p[3] & 0x7f) << 7) | (p[4] & 0x7f);
|
||||
|
||||
dp->state = 0;
|
||||
dp->tp.flags = dp->flags;
|
||||
clk_get(&dp->tp.timestamp);
|
||||
|
||||
int ret = (up->input)(up, 1, &dp->tp); // send data upwards
|
||||
|
||||
if(verbosity >= 5)
|
||||
fprintf( stderr, "Translated: x = %d, y = %d; ret = %d (%s)\n", dp->tp.x, dp->tp.y, ret, up->name );
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in smartset.args)*/
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int egalax_parm(input_module_t *module, int opt, char *optarg)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
|
||||
if(verbosity >= 5)
|
||||
fprintf(stderr, "(%s): params\n", module->name);
|
||||
|
||||
switch (opt) {
|
||||
case 'R':
|
||||
dp->flags &= ~FLAG_RESET;
|
||||
break;
|
||||
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int delay - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : Does nothing for the protocol level */
|
||||
int egalax_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
int drain_input_buffer()
|
||||
{
|
||||
int nTries;
|
||||
|
||||
for (nTries = TRY_LIMIT; nTries && ( in8( PS2_STATUS_REGISTER ) & IN_BUFF_FULL); nTries--) {
|
||||
nanospin_ns( TIME_DELAY );
|
||||
}
|
||||
|
||||
return (nTries == 0);
|
||||
}
|
||||
int drain_output_buffer()
|
||||
{
|
||||
int nTries;
|
||||
|
||||
for (nTries = TRY_LIMIT; nTries && ( in8( PS2_STATUS_REGISTER ) & OUT_BUFF_FULL ); nTries--) {
|
||||
nanospin_ns( TIME_DELAY );
|
||||
in8( PS2_DATA_PORT );
|
||||
}
|
||||
|
||||
return (nTries == 0);
|
||||
}
|
||||
|
||||
int ps2_wait_reply()
|
||||
{
|
||||
int nTries;
|
||||
uint8_t status;
|
||||
int ret = -1;
|
||||
|
||||
// Poll bit 0 (0x01 mask) of the Status Register ("Input buffer empty/full")
|
||||
// until it becomes full, or until your time-out expires
|
||||
for ( nTries = TRY_LIMIT; nTries; nTries-- )
|
||||
{
|
||||
status = in8 ( PS2_STATUS_REGISTER );
|
||||
if ( (status & OUT_BUFF_FULL) ) {
|
||||
ret = in8( PS2_DATA_PORT );
|
||||
|
||||
break;
|
||||
}
|
||||
nanospin_ns( TIME_DELAY );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ps2_send_command( uint8_t cmd, int n, uint8_t *reply )
|
||||
{
|
||||
int i;
|
||||
|
||||
drain_output_buffer();
|
||||
drain_input_buffer();
|
||||
|
||||
out8( PS2_COMMAND_REGISTER, cmd );
|
||||
|
||||
for ( i = 0; i < n; ++i )
|
||||
reply[i] = ps2_wait_reply();
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
int ps2_send_data( uint8_t data, int n, uint8_t *reply )
|
||||
{
|
||||
int nTries, i;
|
||||
uint8_t status;
|
||||
int ret = -1;
|
||||
|
||||
for ( nTries = TRY_LIMIT; nTries; --nTries )
|
||||
{
|
||||
status = in8 ( PS2_STATUS_REGISTER );
|
||||
if ( ( status & IN_BUFF_FULL ) == 0 ) { // Input buffer status (0 = empty, 1 = full)
|
||||
out8( PS2_DATA_PORT, data );
|
||||
|
||||
break;
|
||||
}
|
||||
nanospin_ns( TIME_DELAY );
|
||||
}
|
||||
|
||||
if ( nTries == 0 )
|
||||
return -1;
|
||||
|
||||
for ( i = 0; i < n; ++i )
|
||||
reply[i] = ps2_wait_reply();
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
int ps2_init( void )
|
||||
{
|
||||
uint8_t reply[1];
|
||||
int ret = 0;
|
||||
|
||||
//aux_send_command( AUX_DISABLE_1PORT, 0, NULL );
|
||||
ps2_send_command( AUX_DISABLE, 0, NULL );
|
||||
|
||||
ps2_send_command( PS2_TEST_CONTROLLER, 1, reply );
|
||||
if ( reply[0] != PS2_SELFTEST_SUCCESS ) {
|
||||
fprintf( stderr, "PS2 controller selftest failed (0x%x)\n", reply[0] );
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
ps2_send_command( PS2_AUX_TEST, 1, reply );
|
||||
if ( reply[0] != 0 ) {
|
||||
fprintf( stderr, "PS2 second port test failed (0x%x)\n", reply[0] );
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
ps2_send_command( PS2_READ_CONFBYTE, 1, reply );
|
||||
reply[0] |= 0x3; // Enable interrupts (two first bits)
|
||||
ps2_send_command( PS2_WRITE_CONFBYTE, 0, NULL );
|
||||
ps2_send_data( reply[0], 0, NULL );
|
||||
|
||||
// Enable device - we are interested only in mouse
|
||||
ps2_send_command( AUX_ENABLE, 0, NULL );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int aux_reset( void )
|
||||
{
|
||||
uint8_t egalax_diag[] = { 0x0A, 1, 'A' };
|
||||
uint8_t reply[4];
|
||||
int ret = 0, i;
|
||||
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
if ( ps2_send_data( AUX_RESET, 1, reply ) == -1 || reply[0] != ACK ) {
|
||||
fprintf( stderr, "Error while reseting aux device\n" );
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( AUX_STREAM_MODE, 1, reply );
|
||||
if ( reply[0] != ACK )
|
||||
fprintf( stderr, "Error transmitting data to aux device\n" );
|
||||
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( egalax_diag[0], 1, reply );
|
||||
if ( reply[0] != ACK )
|
||||
fprintf( stderr, "Error transmitting data to aux device\n" );
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( egalax_diag[1], 1, reply );
|
||||
if ( reply[0] != ACK )
|
||||
fprintf( stderr, "Error transmitting data to aux device\n" );
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( egalax_diag[2], 4, reply );
|
||||
if ( reply[0] != ACK )
|
||||
fprintf( stderr, "Error transmitting data to aux device\n" );
|
||||
|
||||
for ( i = 1; i <= 3; ++i )
|
||||
if ( reply[i] != egalax_diag[i-1] )
|
||||
break;
|
||||
if ( i != 4 ) {
|
||||
fprintf( stderr, "Error transmitting egalax diag\n" );
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
reply[0] = 0;
|
||||
ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( AUX_ENABLE_XFER, 1, reply );
|
||||
if ( reply[0] != ACK )
|
||||
fprintf( stderr, "Error transmitting data to aux device\n" );
|
||||
|
||||
/* ps2_send_command( PS2_AUX_WRITE, 0, NULL );
|
||||
ps2_send_data( 0xE9, 4, reply );
|
||||
if ( reply[0] == ACK )
|
||||
fprintf( stderr, "status = %#x,%#x,%#x\n", reply[1], reply[2], reply[3] );*/
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
17
devi/egalax/main.c
Обычный файл
17
devi/egalax/main.c
Обычный файл
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* (c) 2016, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
#include "devi.h"
|
||||
|
||||
extern input_module_t egalax;
|
||||
|
||||
input_module_t *modules[] = {
|
||||
&egalax,
|
||||
NULL
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return begin(argc, argv);
|
||||
}
|
2
devi/egalax/nto/Makefile
Обычный файл
2
devi/egalax/nto/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=CPU
|
||||
include recurse.mk
|
2
devi/egalax/nto/x86/Makefile
Обычный файл
2
devi/egalax/nto/x86/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/egalax/nto/x86/o/Makefile
Обычный файл
1
devi/egalax/nto/x86/o/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
7
devi/egalax/pinfo.mk
Обычный файл
7
devi/egalax/pinfo.mk
Обычный файл
@ -0,0 +1,7 @@
|
||||
#
|
||||
# (c) 2016, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
define PINFO
|
||||
PINFO DESCRIPTION=Elographics input manager for Photon
|
||||
endef
|
9
devi/egalax/private.mk
Обычный файл
9
devi/egalax/private.mk
Обычный файл
@ -0,0 +1,9 @@
|
||||
#
|
||||
# (c) 2016, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
EXTRA_LIBVPATH+=$(PROJECT_ROOT)/lib/$(OS)/$(CPU)/a.$(LIB_VARIANT).shared $(PROJECT_ROOT)/keymap/$(OS)/$(CPU)/a.$(LIB_VARIANT).shared
|
||||
LIBS=inputS keymapS ph gf
|
||||
CCFLAGS += $(CCFLAGS_$(TYPE))
|
||||
|
||||
EXTRA_DEPS=$(PROJECT_ROOT)/lib/$(OS)/$(CPU)/a.$(LIB_VARIANT).shared/libinputS.a $(PROJECT_ROOT)/keymap/$(OS)/$(CPU)/a.$(LIB_VARIANT).shared/libkeymapS.a
|
2
devi/hid/Makefile
Обычный файл
2
devi/hid/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=OS
|
||||
include recurse.mk
|
253
devi/hid/control.c
Обычный файл
253
devi/hid/control.c
Обычный файл
@ -0,0 +1,253 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* control.c
|
||||
*
|
||||
* The HID USB control combined device/protocol module.
|
||||
*
|
||||
*/
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#define FLAG_INIT 0x0100
|
||||
#define FLAG_RESET 0x0200
|
||||
#define FLAG_KIOSK_MODE 0x0400
|
||||
#define controlED 1
|
||||
#define RELEASED 0
|
||||
|
||||
/* Protocol module private data */
|
||||
struct private_data {
|
||||
int flags; /* see valid values before */
|
||||
int nDev; /* USB device number */
|
||||
int state;
|
||||
void * hid_module_handle; /* HID module_handle */
|
||||
};
|
||||
|
||||
|
||||
/* forward declarations */
|
||||
static int control_init(input_module_t *module);
|
||||
static int control_devctrl(input_module_t *module, int event, void *ptr);
|
||||
static int control_reset(input_module_t *module);
|
||||
static int control_input(input_module_t *module, int num, void *arg);
|
||||
static int control_parm(input_module_t *module, int opt, char *optarg);
|
||||
static int control_shutdown(input_module_t *module, int delay);
|
||||
|
||||
|
||||
|
||||
/* Our protocol module is represented by the following input_module_t data structure */
|
||||
|
||||
input_module_t control = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_CONTROL | DEVI_MODULE_TYPE_PROTO | DEVI_MODULE_TYPE_DEVICE,
|
||||
"control",
|
||||
__DATE__,
|
||||
"Ku:",
|
||||
NULL,
|
||||
control_init,
|
||||
control_reset,
|
||||
control_input,
|
||||
NULL,
|
||||
NULL,
|
||||
control_parm,
|
||||
control_devctrl,
|
||||
control_shutdown
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module is */
|
||||
/* initialising the input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int control_init(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!module->data)
|
||||
{
|
||||
if(!(dp = module->data = _scalloc(sizeof *dp)))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
dp -> nDev = HIDD_CONNECT_WILDCARD;
|
||||
dp->state = RELEASED;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function for DEVCTRL command processing */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int event - DEVCTRL command code */
|
||||
/* void * ptr - pointer to data exchange block */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int control_devctrl(input_module_t *module, int event, void *ptr)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
int rc = 0;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case DEVCTL_GETDEVFLAGS:
|
||||
*(unsigned short *)ptr = (dp->flags & FLAGS_GLOBAL);
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRBTNS:
|
||||
*(unsigned long *)ptr = 5L;
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRCOORD:
|
||||
*(unsigned char *)ptr='\02';
|
||||
break;
|
||||
|
||||
default:
|
||||
rc = devi_hid_devctrl(dp -> hid_module_handle, event, ptr, HIDD_CONNECT_WILDCARD );
|
||||
break;
|
||||
}
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus;it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int control_reset(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!(dp->flags & FLAG_INIT))
|
||||
{
|
||||
if(NULL == (dp -> hid_module_handle = devi_hid_register_client(module, dp -> nDev)))
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dp->flags |= FLAG_INIT;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is to interpret */
|
||||
/* the data according to the MS wheel control protocol, create a */
|
||||
/* data structure, fill it in and hand it off to the filter layer */
|
||||
/* module above it. The protocol is processed using simple state */
|
||||
/* machine. State info is kept in module's private data */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : driver uses one of two input modules depending on device data */
|
||||
/* protocol */
|
||||
int control_input(input_module_t *module, int num, void *arg)
|
||||
{
|
||||
pControl_raw_data_t control_raw_data = (pControl_raw_data_t)arg;
|
||||
struct packet_control mp;
|
||||
|
||||
struct private_data *dp = module->data;
|
||||
input_module_t *up = module->up;
|
||||
|
||||
assert(num == sizeof(control_raw_data_t)); // Desynchronized exchange format
|
||||
|
||||
if(dp->flags & FLAG_INIT)
|
||||
{
|
||||
mp.Rx = control_raw_data->Rx;
|
||||
mp.Ry = control_raw_data->Ry;
|
||||
mp.Rz = control_raw_data->Rz;
|
||||
mp.button_state = control_raw_data->button_state;
|
||||
}
|
||||
|
||||
if (verbosity > 1)
|
||||
fprintf (stderr, "Device Module Level: Rx:%d, Ry:%d, Rz:%d, Buttons %x\n", mp.Rx, mp.Ry, mp.Rz, mp.button_state);
|
||||
|
||||
(up->input)(up, 1, &mp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in control.args) */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : we don't accept any parameter for this module at the protocol level */
|
||||
int control_parm(input_module_t *module, int opt, char *optarg)
|
||||
{
|
||||
/* Now empty */
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
switch (opt)
|
||||
{
|
||||
case 'u':
|
||||
{
|
||||
if(NULL != optarg)
|
||||
dp->nDev = atoi(optarg);
|
||||
break;
|
||||
}
|
||||
case 'K':
|
||||
{
|
||||
dp->flags |= FLAG_KIOSK_MODE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int ms - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : Does nothing for the protocol level */
|
||||
int control_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if( (NULL != dp) && (NULL != dp -> hid_module_handle))
|
||||
devi_unregister_hid_client(dp -> hid_module_handle);
|
||||
|
||||
return (0);
|
||||
}
|
104
devi/hid/devi-hid.use
Обычный файл
104
devi/hid/devi-hid.use
Обычный файл
@ -0,0 +1,104 @@
|
||||
%C [general_opts] protocol* [protocol_opts]* filter* [filter_opts]*
|
||||
|
||||
%C : HID input manager
|
||||
|
||||
This driver doesn't care about physical interfaces of real devices.
|
||||
It just relies on io-hid resource manager and supplementary input
|
||||
modules service.
|
||||
|
||||
(!!!) Do not use this source code to modify default devi-hid driver.
|
||||
|
||||
General opts:
|
||||
-b prevent CASB exit (default allow CASB)
|
||||
-d photon device (default /dev/photon | PHOTON env var)
|
||||
-g input group (default 1)
|
||||
-l list List the internal modules. Modules are listed in
|
||||
the following format:
|
||||
|
||||
module name | date last compiled | revision | class
|
||||
where: class is comprised of (P)rotocol and/or (F)ilter
|
||||
|
||||
-P disable photon interface (default start Photon interface)
|
||||
-r start resource manager interface (only use if not using Photon)
|
||||
-v increment verbosity (default 0)
|
||||
|
||||
protocol modules and their options:
|
||||
|
||||
kbd HID compliant keyboard
|
||||
-k rate[,delay] Keyboard rate(Hz)/delay(ms) (default 150Hz, 500ms)
|
||||
-u device optional: USB device number
|
||||
|
||||
mouse HID compliant mouse
|
||||
|
||||
touch HID compliant touch screen
|
||||
-K Kiosk Mode (cursor does not drag).
|
||||
-m size Touchscreen Matrix size (default 1023). This is used for
|
||||
calculated transformation points.
|
||||
-u device optional: USB device number
|
||||
|
||||
|
||||
filter modules and their options:
|
||||
|
||||
keyboard Translate scan codes to UNICODE
|
||||
-k kbd_file File to use for keyboard mapping
|
||||
-L [N][C][S]
|
||||
Set the initial state of the keyboard and its LEDs (default all off):
|
||||
- C turn CapsLock on.
|
||||
- N turn NumLock on.
|
||||
- S turn ScrollLock on.
|
||||
|
||||
rel Filters and compresses relative coordinate "mouse" events
|
||||
-a wheel acceleration parameter (default 10); the more this
|
||||
value, the more mouse wheel acceleration effect
|
||||
-G gain Motion multiplier (default 1)
|
||||
-l Swap right and left buttons around
|
||||
-T threshold Speed doubling threshold in mickeys (100)
|
||||
-x Reverse X
|
||||
-y Reverse Y
|
||||
|
||||
abs Transform and compresses absolute coordinate "touch" events
|
||||
-a {3/4} Transformation algorithm, available algorithms 3 point and
|
||||
4 point (default 3 point).
|
||||
-b Touching the screen is a right mouse button (default left)
|
||||
-c Calibrate mode - don't transform coordinates
|
||||
-f filename Calibration file name
|
||||
(default /etc/system/config/calib.{hostname}).
|
||||
Note: If You want use vmware mouse, your calibration file need
|
||||
has size 0
|
||||
-o x,y Origin of display region (default, origin of graphics region)
|
||||
-s x,y Coordinates of lower right corner of display region
|
||||
(default, width and height of graphics region)
|
||||
-x Reverse X
|
||||
-y Reverse Y
|
||||
-D pixels Differential filter that will filter out packets that are
|
||||
within a number of pixels of the last touch. This prevents
|
||||
sending repeat coordinates.
|
||||
-N pixels Noise filter that will filter out packets that are outside
|
||||
the max number of pixels. This filters out jittery events
|
||||
from some touchscreens.
|
||||
-S ms Soft Button release, emulates a release event after X ms of
|
||||
inactivity from the touch controller. This is helpful for
|
||||
screens that are not very sensitive, so every event received
|
||||
before X number of ms expire is treated as a pen down event.
|
||||
-O origin Touch screen origin (0,0). This is used for the calibration
|
||||
free transformation. If no calibration file is specified
|
||||
the driver will attempt to calculate the X,Y position based
|
||||
on screen resolution and touch screen matrix size (if known).
|
||||
Possible values are:
|
||||
Upper Left = 0
|
||||
Lower Left = 1
|
||||
Lower Right = 2
|
||||
Upper Right = 3
|
||||
|
||||
Example:
|
||||
-------
|
||||
|
||||
%C kbd mouse
|
||||
|
||||
Start the HID driver with a keyboard and mouse
|
||||
|
||||
|
||||
%C kbd touch abs -a4
|
||||
|
||||
Start the HID driver keyboard and touchscreen and tell the touchscreen to use the
|
||||
older, four point calibration algorithm.
|
257
devi/hid/joystick.c
Обычный файл
257
devi/hid/joystick.c
Обычный файл
@ -0,0 +1,257 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* joystick.c
|
||||
*
|
||||
* The HID USB joystick combined device/protocol module.
|
||||
*
|
||||
*/
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#define FLAG_INIT 0x0100
|
||||
#define FLAG_RESET 0x0200
|
||||
#define FLAG_KIOSK_MODE 0x0400
|
||||
#define joystickED 1
|
||||
#define RELEASED 0
|
||||
|
||||
/* Protocol module private data */
|
||||
struct private_data {
|
||||
int flags; /* see valid values before */
|
||||
int nDev; /* USB device number */
|
||||
int state;
|
||||
void * hid_module_handle; /* HID module_handle */
|
||||
};
|
||||
|
||||
|
||||
/* forward declarations */
|
||||
static int joystick_init(input_module_t *module);
|
||||
static int joystick_devctrl(input_module_t *module, int event, void *ptr);
|
||||
static int joystick_reset(input_module_t *module);
|
||||
static int joystick_input(input_module_t *module, int num, void *arg);
|
||||
static int joystick_parm(input_module_t *module, int opt, char *optarg);
|
||||
static int joystick_shutdown(input_module_t *module, int delay);
|
||||
|
||||
|
||||
|
||||
/* Our protocol module is represented by the following input_module_t data structure */
|
||||
|
||||
input_module_t joystick = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_JOYSTICK | DEVI_MODULE_TYPE_PROTO | DEVI_MODULE_TYPE_DEVICE,
|
||||
"joystick",
|
||||
__DATE__,
|
||||
"u:",
|
||||
NULL,
|
||||
joystick_init,
|
||||
joystick_reset,
|
||||
joystick_input,
|
||||
NULL,
|
||||
NULL,
|
||||
joystick_parm,
|
||||
joystick_devctrl,
|
||||
joystick_shutdown
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module is */
|
||||
/* initialising the input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int joystick_init(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!module->data)
|
||||
{
|
||||
if(!(dp = module->data = _scalloc(sizeof *dp)))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
dp -> nDev = HIDD_CONNECT_WILDCARD;
|
||||
dp->state = RELEASED;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function for DEVCTRL command processing */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int event - DEVCTRL command code */
|
||||
/* void * ptr - pointer to data exchange block */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int joystick_devctrl(input_module_t *module, int event, void *ptr)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
int rc = 0;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case DEVCTL_GETDEVFLAGS:
|
||||
*(unsigned short *)ptr = (dp->flags & FLAGS_GLOBAL);
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRBTNS:
|
||||
*(unsigned long *)ptr = 5L;
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRCOORD:
|
||||
*(unsigned char *)ptr='\02';
|
||||
break;
|
||||
|
||||
default:
|
||||
rc = devi_hid_devctrl(dp -> hid_module_handle, event, ptr, HIDD_CONNECT_WILDCARD );
|
||||
break;
|
||||
}
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus;it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int joystick_reset(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!(dp->flags & FLAG_INIT))
|
||||
{
|
||||
if(NULL == (dp -> hid_module_handle = devi_hid_register_client(module, dp -> nDev)))
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dp->flags |= FLAG_INIT;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is to interpret */
|
||||
/* the data according to the MS wheel joystick protocol, create a */
|
||||
/* data structure, fill it in and hand it off to the filter layer */
|
||||
/* module above it. The protocol is processed using simple state */
|
||||
/* machine. State info is kept in module's private data */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : driver uses one of two input modules depending on device data */
|
||||
/* protocol */
|
||||
int joystick_input(input_module_t *module, int num, void *arg)
|
||||
{
|
||||
pJoystick_raw_data_t pjoystickRawData = (pJoystick_raw_data_t)arg;
|
||||
struct packet_joystick jp;
|
||||
|
||||
struct private_data *dp = module->data;
|
||||
input_module_t *up = module->up;
|
||||
|
||||
assert(num == sizeof(joystick_raw_data_t)); // Desynchronized exchange format
|
||||
|
||||
if(dp->flags & FLAG_INIT)
|
||||
{
|
||||
jp.x = pjoystickRawData->x;
|
||||
jp.y = pjoystickRawData->y;
|
||||
jp.z = pjoystickRawData->z;
|
||||
|
||||
jp.Rx = pjoystickRawData->Rx;
|
||||
jp.Ry = pjoystickRawData->Ry;
|
||||
jp.Rz = pjoystickRawData->Rz;
|
||||
|
||||
jp.slider = pjoystickRawData->slider;
|
||||
jp.hat_switch = pjoystickRawData->hat_switch;
|
||||
|
||||
jp.button_state = pjoystickRawData->button_state;
|
||||
}
|
||||
|
||||
if (verbosity > 1)
|
||||
fprintf (stderr, "Device Level: x:%d, y:%d, z:%d, Buttons:%x, Rx:%d, Ry:%d, Rz:%d, Slider:%d, Hat Switch:%d\n",
|
||||
jp.x, jp.y, jp.z, jp.button_state, jp.Rx, jp.Ry, jp.Rz, jp.slider, jp.hat_switch);
|
||||
|
||||
(up->input)(up, 1, &jp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in joystick.args) */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : we don't accept any parameter for this module at the protocol level */
|
||||
int joystick_parm(input_module_t *module, int opt, char *optarg)
|
||||
{
|
||||
/* Now empty */
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
switch (opt)
|
||||
{
|
||||
case 'u':
|
||||
{
|
||||
if(NULL != optarg)
|
||||
dp->nDev = atoi(optarg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int ms - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : Does nothing for the protocol level */
|
||||
int joystick_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if( (NULL != dp) && (NULL != dp -> hid_module_handle))
|
||||
devi_unregister_hid_client(dp -> hid_module_handle);
|
||||
|
||||
return (0);
|
||||
}
|
332
devi/hid/kbd.c
Обычный файл
332
devi/hid/kbd.c
Обычный файл
@ -0,0 +1,332 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* kbd.c
|
||||
*
|
||||
* The HID USB keyboard combined protocol/device module.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
#include "pthread.h"
|
||||
|
||||
|
||||
/* forward declarations */
|
||||
static int kbd_init(input_module_t *module);
|
||||
static int kbd_devctrl(input_module_t *module, int event, void *ptr);
|
||||
static int kbd_reset(input_module_t *module);
|
||||
static int kbd_input(input_module_t *module, int num, void *arg);
|
||||
static int kbd_parm(input_module_t *module, int opt, char *optarg);
|
||||
static int kbd_shutdown(input_module_t *module, int delay);
|
||||
|
||||
/* Our protocol module is represented by the following input_module_t data structure */
|
||||
|
||||
input_module_t kbd = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_KBD | DEVI_MODULE_TYPE_PROTO | DEVI_MODULE_TYPE_DEVICE,
|
||||
"Kbd",
|
||||
__DATE__,
|
||||
"k:f:p:u:",
|
||||
NULL, /* initialized by us (in init) */
|
||||
kbd_init,
|
||||
kbd_reset,
|
||||
kbd_input,
|
||||
NULL,
|
||||
NULL,
|
||||
kbd_parm,
|
||||
kbd_devctrl,
|
||||
kbd_shutdown
|
||||
};
|
||||
|
||||
#define FLAG_INIT 0x1000
|
||||
#define FLAG_SYM 0x8000 /* DEvice level supplies valid symbols */
|
||||
|
||||
/* Protocol module private data */
|
||||
struct data {
|
||||
int flags;
|
||||
int rate; /* kbd delay */
|
||||
int delay; /* kbd rate */
|
||||
void * hid_module_handle; /* HID module_handle */
|
||||
int nDev; /* USB device number */
|
||||
int fId; /* For debug mode (-f parameter) - write input to file */
|
||||
int fifo; /* For debug mode (-p parameter) - write input to FIFO file */
|
||||
char fifo_name[100];
|
||||
};
|
||||
|
||||
void * open_pipe(void * parm)
|
||||
{
|
||||
struct data * dp = (struct data *)parm;
|
||||
int pipe_no;
|
||||
|
||||
dp -> fifo = 0;
|
||||
// Block until O_RDONLY pipe will be opened
|
||||
pipe_no = open(dp -> fifo_name, O_WRONLY );
|
||||
close(pipe_no);
|
||||
// Wait a peer process re-opens pipe
|
||||
sleep(1);
|
||||
// Open non-blocked pipe
|
||||
dp -> fifo = open(dp -> fifo_name, O_WRONLY | O_NONBLOCK );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module is */
|
||||
/* initialising the input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int kbd_init(input_module_t *module)
|
||||
{
|
||||
struct data *dp=module->data;
|
||||
|
||||
if(!module->data) {
|
||||
if(!(dp = module->data = calloc(sizeof *dp, 1))) {
|
||||
return -1;
|
||||
}
|
||||
dp->flags = 0;
|
||||
dp->fId = 0;
|
||||
dp -> fifo = 0;
|
||||
dp -> rate = 33; /* In times per second * 10 */
|
||||
dp -> delay= 500; /* In milliseconds */
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
}
|
||||
|
||||
dp -> nDev = HIDD_CONNECT_WILDCARD;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Description: this is a callback function for DEVCTRL command processing */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int event - DEVCTRL command code */
|
||||
/* void * ptr - pointer to data exchange block */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int kbd_devctrl(input_module_t *module,int event,void *ptr)
|
||||
{
|
||||
struct data *dp=module->data;
|
||||
int rc = EOK;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case DEVCTL_RESET_KBD:
|
||||
rc = ENOTSUP;
|
||||
break;
|
||||
case DEVCTL_GETKBD:
|
||||
if(NULL != ptr)
|
||||
{ // Get keyboard parameters - delay & rate
|
||||
struct devctl_getkbd * pDevctl = (struct devctl_getkbd *)ptr;
|
||||
pDevctl -> rate = dp -> rate;
|
||||
pDevctl -> delay = dp -> delay;
|
||||
}
|
||||
break;
|
||||
|
||||
case DEVCTL_SETKBD:
|
||||
if(NULL != ptr)
|
||||
{
|
||||
struct devctl_setkbd * pDevctl = (struct devctl_setkbd *)ptr;
|
||||
dp -> delay = pDevctl -> delay;
|
||||
dp -> rate = pDevctl -> rate;
|
||||
}
|
||||
default:
|
||||
if(dp -> hid_module_handle)
|
||||
rc = devi_hid_devctrl(dp -> hid_module_handle, event, ptr, HIDD_CONNECT_WILDCARD);
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus; it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int kbd_reset(input_module_t *module)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
struct devctl_setkbd devctl;
|
||||
int rc = EOK;
|
||||
|
||||
if((dp->flags & FLAG_INIT) == 0)
|
||||
{
|
||||
if(NULL == (dp -> hid_module_handle = devi_hid_register_client(module, dp -> nDev)))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
dp->flags |= FLAG_INIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(module -> up)
|
||||
rc = module -> up -> reset(module -> up);
|
||||
if(EOK != rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
devctl.delay = dp -> delay;
|
||||
devctl.rate = dp -> rate;
|
||||
kbd_devctrl(module, DEVCTL_SETKBD, &devctl);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is very simple: */
|
||||
/* just to hand data off to the filter layer module above it. */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int kbd_input(input_module_t *module, int num, void *ptr)
|
||||
{
|
||||
struct data *dp=module->data;
|
||||
input_module_t *up=module->up;
|
||||
struct packet_kbd kbuf;
|
||||
USBKCode *tmp=ptr;
|
||||
_uint8 buf[10]; // Buffer for scan codes
|
||||
int nLen;
|
||||
int i, j;
|
||||
|
||||
if(dp->flags & FLAG_INIT)
|
||||
{
|
||||
|
||||
kbuf.bMakeBreak = *tmp++;
|
||||
clk_get(&kbuf.timestamp);
|
||||
|
||||
for(i = 1; i < (num / sizeof(USBKCode)); i++)
|
||||
{
|
||||
memset(&kbuf.key, 0x00, sizeof kbuf.key);
|
||||
|
||||
|
||||
if(0 < dp -> fId)
|
||||
write(dp -> fId, tmp, sizeof(USBKCode));
|
||||
|
||||
if(0 < dp -> fifo)
|
||||
{
|
||||
if(0 > write(dp -> fifo, tmp, sizeof(USBKCode)))
|
||||
{
|
||||
dp -> fifo = 0;
|
||||
pthread_create(NULL, NULL, open_pipe, dp);
|
||||
}
|
||||
}
|
||||
/* The device level supplies USB usages */
|
||||
/* get scan codes for them */
|
||||
kbuf.nUSBCode = 0;
|
||||
nLen = sizeof(buf);
|
||||
if(EOK == devi_usb_to_scan(*tmp, kbuf.bMakeBreak, buf, &nLen))
|
||||
for(j = 0; j < nLen; ++j)
|
||||
{
|
||||
kbuf.key.key_scan = buf[j];
|
||||
kbuf.key.flags = KEY_SCAN_VALID;
|
||||
if(j == (nLen - 1)) // Last package carries USB code as well
|
||||
kbuf.nUSBCode = *tmp;
|
||||
(up->input)(up, 1, &kbuf);
|
||||
}
|
||||
else {
|
||||
kbuf.nUSBCode = *tmp;
|
||||
(up->input)(up, 1, &kbuf);
|
||||
}
|
||||
++tmp;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in kbd.args) */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int kbd_parm(input_module_t *module,int opt,char *optarg)
|
||||
{
|
||||
struct data *dp=module->data;
|
||||
|
||||
switch(opt) {
|
||||
case 'k': /* specify key repeat rate and delay */
|
||||
dp->rate = strtol(optarg, (char **)&optarg, 10) * 10;
|
||||
if(*optarg == '.' && *++optarg >= '0' && *optarg <= '9') {
|
||||
dp->rate += *optarg++ - '0';
|
||||
}
|
||||
if ( dp->rate )
|
||||
dp->rate = 10000/dp->rate; /* convert to ms delay between succesive reports */
|
||||
if(*optarg == ',') {
|
||||
dp->delay = strtol(++optarg, 0, 10);
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
dp -> fId = open(optarg, O_CREAT | O_WRONLY | O_TRUNC,
|
||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
||||
break;
|
||||
case 'p':
|
||||
if(access(optarg, F_OK))
|
||||
{
|
||||
if(mkfifo(optarg, S_IRUSR | S_IWUSR))
|
||||
{
|
||||
printf("Cannot open FIFO (%s), error = %i\n", optarg, errno);
|
||||
break;
|
||||
}
|
||||
printf ("Pipe %s has been created\n", optarg);
|
||||
}
|
||||
strcpy(dp -> fifo_name, optarg);
|
||||
pthread_create(NULL, NULL, open_pipe, dp);
|
||||
break;
|
||||
case 'u':
|
||||
if(NULL != optarg)
|
||||
dp -> nDev = atoi(optarg);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int ms - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int kbd_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
struct data *dp = module->data;
|
||||
if(NULL != dp)
|
||||
{
|
||||
if(0 < dp -> fId) /* if debug output file was created - close it */
|
||||
close(dp -> fId);
|
||||
if(0 < dp -> fifo) /* if debug output file was created - close it */
|
||||
close(dp -> fifo);
|
||||
if( NULL != dp -> hid_module_handle)
|
||||
devi_unregister_hid_client(dp -> hid_module_handle);
|
||||
}
|
||||
return(0);
|
||||
}
|
85
devi/hid/main.c
Обычный файл
85
devi/hid/main.c
Обычный файл
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* main.c
|
||||
*
|
||||
* Main resourse manager module.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
|
||||
extern input_module_t mouse;
|
||||
extern input_module_t kbd;
|
||||
extern input_module_t touch;
|
||||
extern input_module_t joystick;
|
||||
extern input_module_t control;
|
||||
|
||||
static int post_init();
|
||||
static int post_shutdown();
|
||||
|
||||
|
||||
input_module_t *modules[] = {
|
||||
&kbd,
|
||||
&mouse,
|
||||
&touch,
|
||||
&joystick,
|
||||
&control,
|
||||
NULL
|
||||
};
|
||||
|
||||
common_callbacks_t callbacks = {
|
||||
4,
|
||||
NULL, // Pre-init
|
||||
post_init, // Post-init
|
||||
NULL, // Pre-shutdown
|
||||
post_shutdown // Post-shutdown
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
devi_init(&callbacks); // Set driver callback function
|
||||
|
||||
devi_hid_init(); // Initialize USB interface
|
||||
|
||||
pServ_name = NULL; // Optional HID server name ( may be reassign in command line)
|
||||
|
||||
return begin(argc, argv);
|
||||
}
|
||||
|
||||
|
||||
int post_init()
|
||||
{
|
||||
// We cannot connect to USB stack until initialization is finished
|
||||
// because as soon as connection established, input data may come to
|
||||
// input channel, and processing bus must be ready to this event.
|
||||
devi_hid_server_connect(pServ_name); // Connect to USB server
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int post_shutdown()
|
||||
{
|
||||
devi_hid_server_disconnect();
|
||||
return 0;
|
||||
}
|
261
devi/hid/mouse.c
Обычный файл
261
devi/hid/mouse.c
Обычный файл
@ -0,0 +1,261 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* mouse.c
|
||||
*
|
||||
* The HID USB mouse combined device/protocol module.
|
||||
*
|
||||
*/
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#define FLAG_INIT 0x0100
|
||||
#define FLAG_RESET 0x0200
|
||||
|
||||
/* Protocol module private data */
|
||||
struct private_data {
|
||||
int flags; /* see valid values before */
|
||||
int nDev; /* USB device number */
|
||||
void * hid_module_handle; /* HID module_handle */
|
||||
};
|
||||
|
||||
|
||||
/* forward declarations */
|
||||
static int mouse_init(input_module_t *module);
|
||||
static int mouse_devctrl(input_module_t *module, int event, void *ptr);
|
||||
static int mouse_reset(input_module_t *module);
|
||||
static int mouse_input(input_module_t *module, int num, void *arg);
|
||||
static int mouse_parm(input_module_t *module, int opt, char *optarg);
|
||||
static int mouse_shutdown(input_module_t *module, int delay);
|
||||
|
||||
|
||||
|
||||
/* Our protocol module is represented by the following input_module_t data structure */
|
||||
|
||||
input_module_t mouse = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_REL | DEVI_MODULE_TYPE_PROTO | DEVI_MODULE_TYPE_DEVICE,
|
||||
"mouse",
|
||||
__DATE__,
|
||||
"u:",
|
||||
NULL,
|
||||
mouse_init,
|
||||
mouse_reset,
|
||||
mouse_input,
|
||||
NULL,
|
||||
NULL,
|
||||
mouse_parm,
|
||||
mouse_devctrl,
|
||||
mouse_shutdown
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module is */
|
||||
/* initialising the input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int mouse_init(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!module->data)
|
||||
{
|
||||
if(!(dp = module->data = _scalloc(sizeof *dp)))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
dp -> nDev = HIDD_CONNECT_WILDCARD;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function for DEVCTRL command processing */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int event - DEVCTRL command code */
|
||||
/* void * ptr - pointer to data exchange block */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int mouse_devctrl(input_module_t *module, int event, void *ptr)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
unsigned wheel;
|
||||
int rc = 0;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
|
||||
case DEVCTL_GETDEVFLAGS:
|
||||
*(unsigned short *)ptr = (dp->flags & FLAGS_GLOBAL);
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRBTNS:
|
||||
*(unsigned long *)ptr = 5L;
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRCOORD:
|
||||
*(unsigned char *)ptr='\02';
|
||||
break;
|
||||
|
||||
case DEVCTL_GETWHEEL:
|
||||
if(NULL != ptr)
|
||||
{
|
||||
struct devctl_mouse_types devctl;
|
||||
if(EOK == (rc = devi_hid_devctrl(dp -> hid_module_handle, DEVCTL_GETMOUSETYPE, &devctl, HIDD_CONNECT_WILDCARD)))
|
||||
{
|
||||
if(devctl.curtype == NO_WHEEL_MOUSE)
|
||||
wheel = 2;
|
||||
else
|
||||
wheel = 3;
|
||||
*(unsigned *)ptr= wheel;
|
||||
}
|
||||
}
|
||||
else
|
||||
rc = EINVAL;
|
||||
break;
|
||||
case DEVCTL_SETWHEEL:
|
||||
if(NULL != ptr) {
|
||||
struct devctl_mouse_types devctl;
|
||||
devctl.type = devctl.curtype = *(unsigned *)ptr;
|
||||
if(EOK == (rc = devi_hid_devctrl(dp -> hid_module_handle, DEVCTL_SETMOUSETYPE, &devctl, HIDD_CONNECT_WILDCARD)))
|
||||
{
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DEVCTL_SETMOUSETYPE: // Could be NO_WHEEL_MOUSE, WHEEL_3B_MOUSE or WHEEL_5B_MOUSE
|
||||
case DEVCTL_GETMOUSETYPE:
|
||||
default:
|
||||
rc = devi_hid_devctrl(dp -> hid_module_handle, event, ptr, HIDD_CONNECT_WILDCARD );
|
||||
break;
|
||||
}
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus;it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int mouse_reset(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!(dp->flags & FLAG_INIT))
|
||||
{
|
||||
if(NULL == (dp -> hid_module_handle = devi_hid_register_client(module, dp -> nDev)))
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dp->flags |= FLAG_INIT;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is to interpret */
|
||||
/* the data according to the MS wheel mouse protocol, create a */
|
||||
/* data structure, fill it in and hand it off to the filter layer */
|
||||
/* module above it. The protocol is processed using simple state */
|
||||
/* machine. State info is kept in module's private data */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : driver uses one of two input modules depending on device data */
|
||||
/* protocol */
|
||||
int mouse_input(input_module_t *module, int num, void *arg)
|
||||
{
|
||||
pMouse_raw_data_t pMouseRawData = (pMouse_raw_data_t)arg;
|
||||
struct packet_rel mp; /* data buffer */
|
||||
|
||||
|
||||
struct private_data *dp = module->data;
|
||||
input_module_t *up = module->up;
|
||||
|
||||
assert(num == sizeof(mouse_raw_data_t)); // Desynchronized exchange format
|
||||
|
||||
if(dp->flags & FLAG_INIT)
|
||||
{
|
||||
mp.flags = PTR_Z_DATA; // Set it inall cases. If there are no wheel, z always == 0
|
||||
mp.dx = pMouseRawData -> x;
|
||||
mp.dy = -(pMouseRawData -> y); // '-' because HID specifies down as '+' and up as '-'
|
||||
mp.dz = -(pMouseRawData -> z); // '-' because HID specifies down as '+' and up as '-'
|
||||
mp.buttons = pMouseRawData -> btnStates;
|
||||
( up->input)(up, 1, &mp);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in mouse.args) */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : we don't accept any parameter for this module at the protocol level */
|
||||
int mouse_parm(input_module_t *module, int opt, char *optarg)
|
||||
{
|
||||
/* Now empty */
|
||||
struct private_data *dp = module->data;
|
||||
switch (opt)
|
||||
{
|
||||
case 'u':
|
||||
if(NULL != optarg)
|
||||
dp -> nDev = atoi(optarg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int ms - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : Does nothing for the protocol level */
|
||||
int mouse_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
if( (NULL != dp) && (NULL != dp -> hid_module_handle))
|
||||
devi_unregister_hid_client(dp -> hid_module_handle);
|
||||
return (0);
|
||||
}
|
2
devi/hid/nto/Makefile
Обычный файл
2
devi/hid/nto/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=CPU
|
||||
include recurse.mk
|
2
devi/hid/nto/arm/Makefile
Обычный файл
2
devi/hid/nto/arm/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/hid/nto/arm/o.le.v7/Makefile
Обычный файл
1
devi/hid/nto/arm/o.le.v7/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
1
devi/hid/nto/arm/o.le/Makefile
Обычный файл
1
devi/hid/nto/arm/o.le/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
2
devi/hid/nto/e2k/Makefile
Обычный файл
2
devi/hid/nto/e2k/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/hid/nto/e2k/o.le/Makefile
Обычный файл
1
devi/hid/nto/e2k/o.le/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
2
devi/hid/nto/mips/Makefile
Обычный файл
2
devi/hid/nto/mips/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/hid/nto/mips/o.be/Makefile
Обычный файл
1
devi/hid/nto/mips/o.be/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
2
devi/hid/nto/ppc/Makefile
Обычный файл
2
devi/hid/nto/ppc/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/hid/nto/ppc/o.be.spe/Makefile
Обычный файл
1
devi/hid/nto/ppc/o.be.spe/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
1
devi/hid/nto/ppc/o.be/Makefile
Обычный файл
1
devi/hid/nto/ppc/o.be/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
2
devi/hid/nto/x86/Makefile
Обычный файл
2
devi/hid/nto/x86/Makefile
Обычный файл
@ -0,0 +1,2 @@
|
||||
LIST=VARIANT
|
||||
include recurse.mk
|
1
devi/hid/nto/x86/o/Makefile
Обычный файл
1
devi/hid/nto/x86/o/Makefile
Обычный файл
@ -0,0 +1 @@
|
||||
include ../../../../common.mk
|
7
devi/hid/pinfo.mk
Обычный файл
7
devi/hid/pinfo.mk
Обычный файл
@ -0,0 +1,7 @@
|
||||
#
|
||||
# (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
define PINFO
|
||||
PINFO DESCRIPTION=Generic Photon input driver\; This driver supports all devices that have intervace to HID/USB service
|
||||
endef
|
5
devi/hid/private.mk
Обычный файл
5
devi/hid/private.mk
Обычный файл
@ -0,0 +1,5 @@
|
||||
#
|
||||
# (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
LIBS+=hiddi
|
295
devi/hid/touch.c
Обычный файл
295
devi/hid/touch.c
Обычный файл
@ -0,0 +1,295 @@
|
||||
/*
|
||||
* (c) 2010-2018, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* Предостережение:
|
||||
*
|
||||
* Предоставленный исходный код драйвера devi-hid рекомендуется использовать
|
||||
* только для отладочных целей при разработке HID-драйверов. Для всех остальных
|
||||
* задач следует использовать штатный системный драйвер devi-hid.
|
||||
*
|
||||
* В общем случае не существует задач, которые требуется решать в этом драйвере
|
||||
* при поддержке нового оборудования (для этого должен быть написан/модифицирован
|
||||
* отдельный драйвер ввода или HID-драйвер).
|
||||
*/
|
||||
|
||||
/*
|
||||
* touch.c
|
||||
*
|
||||
* The HID USB touch combined device/protocol module.
|
||||
*
|
||||
*/
|
||||
#include <sys/devi.h>
|
||||
#include "hid.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#define FLAG_INIT 0x0100
|
||||
#define FLAG_RESET 0x0200
|
||||
#define FLAG_KIOSK_MODE 0x0400
|
||||
#define TOUCHED 1
|
||||
#define RELEASED 0
|
||||
|
||||
/* Protocol module private data */
|
||||
struct private_data {
|
||||
int flags; /* see valid values before */
|
||||
int nDev; /* USB device number */
|
||||
int state;
|
||||
int max_matrix_val; /* Max value touchscreen can send */
|
||||
void * hid_module_handle; /* HID module_handle */
|
||||
};
|
||||
|
||||
|
||||
/* forward declarations */
|
||||
static int touch_init(input_module_t *module);
|
||||
static int touch_devctrl(input_module_t *module, int event, void *ptr);
|
||||
static int touch_reset(input_module_t *module);
|
||||
static int touch_input(input_module_t *module, int num, void *arg);
|
||||
static int touch_parm(input_module_t *module, int opt, char *optarg);
|
||||
static int touch_shutdown(input_module_t *module, int delay);
|
||||
|
||||
|
||||
|
||||
/* Our protocol module is represented by the following input_module_t data structure */
|
||||
|
||||
input_module_t touch = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
DEVI_CLASS_ABS | DEVI_MODULE_TYPE_PROTO | DEVI_MODULE_TYPE_DEVICE,
|
||||
"touch",
|
||||
__DATE__,
|
||||
"Km:u:",
|
||||
NULL,
|
||||
touch_init,
|
||||
touch_reset,
|
||||
touch_input,
|
||||
NULL,
|
||||
NULL,
|
||||
touch_parm,
|
||||
touch_devctrl,
|
||||
touch_shutdown
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: callback initialisation function; it is called when input module is */
|
||||
/* initialising the input system */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise - (-1) */
|
||||
int touch_init(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!module->data)
|
||||
{
|
||||
if(!(dp = module->data = _scalloc(sizeof *dp)))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
dp -> nDev = HIDD_CONNECT_WILDCARD;
|
||||
dp->state = RELEASED;
|
||||
dp->max_matrix_val = 1023;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function for DEVCTRL command processing */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int event - DEVCTRL command code */
|
||||
/* void * ptr - pointer to data exchange block */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int touch_devctrl(input_module_t *module, int event, void *ptr)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
int rc = 0;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case DEVCTL_GETDEVFLAGS:
|
||||
*(unsigned short *)ptr = (dp->flags & FLAGS_GLOBAL);
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRBTNS:
|
||||
*(unsigned long *)ptr = 5L;
|
||||
break;
|
||||
|
||||
case DEVCTL_GETPTRCOORD:
|
||||
*(unsigned char *)ptr='\02';
|
||||
break;
|
||||
|
||||
case DEVCTL_GETCOORDRNG: {
|
||||
struct devctl_coord_range *range = ptr;
|
||||
|
||||
range->min = 0;
|
||||
range->max = dp->max_matrix_val;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
rc = devi_hid_devctrl(dp -> hid_module_handle, event, ptr, HIDD_CONNECT_WILDCARD );
|
||||
break;
|
||||
}
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: this callback funtion is called when the module is linked into the */
|
||||
/* event bus;it is used to set initial module state on the protocol */
|
||||
/* level */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
int touch_reset(input_module_t *module)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if(!(dp->flags & FLAG_INIT))
|
||||
{
|
||||
if(NULL == (dp -> hid_module_handle = devi_hid_register_client(module, dp -> nDev)))
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dp->flags |= FLAG_INIT;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Description: main protocol processing function. It will be called by the */
|
||||
/* device layer to pass it data to process. Its job is to interpret */
|
||||
/* the data according to the MS wheel touch protocol, create a */
|
||||
/* data structure, fill it in and hand it off to the filter layer */
|
||||
/* module above it. The protocol is processed using simple state */
|
||||
/* machine. State info is kept in module's private data */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int num - number of bytes to process */
|
||||
/* void * arg - raw data to process */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : driver uses one of two input modules depending on device data */
|
||||
/* protocol */
|
||||
int touch_input(input_module_t *module, int num, void *arg)
|
||||
{
|
||||
pTouch_raw_data_t pTouchRawData = (pTouch_raw_data_t)arg;
|
||||
struct packet_abs mp;
|
||||
|
||||
struct private_data *dp = module->data;
|
||||
input_module_t *up = module->up;
|
||||
|
||||
assert(num == sizeof(touch_raw_data_t)); // Desynchronized exchange format
|
||||
|
||||
if(dp->flags & FLAG_INIT)
|
||||
{
|
||||
mp.flags = ABS_PRESS_DATA;
|
||||
mp.x = pTouchRawData -> x;
|
||||
mp.y = pTouchRawData -> y;
|
||||
mp.z = (_int8)pTouchRawData -> z;
|
||||
mp.buttons = pTouchRawData -> touched;
|
||||
}
|
||||
|
||||
if (verbosity)
|
||||
fprintf (stderr, "Device Level: X:%u, Y:%u, Z:%u, Buttons %d\n", mp.x, mp.y, mp.z, mp.buttons);
|
||||
|
||||
if (dp->flags & FLAG_KIOSK_MODE)
|
||||
{
|
||||
if ((mp.buttons == _POINTER_BUTTON_LEFT) && (dp->state != TOUCHED))
|
||||
{
|
||||
/* Emit a Touch Event */
|
||||
(up->input)(up, 1, &mp);
|
||||
|
||||
mp.buttons = RELEASED;
|
||||
dp->state = TOUCHED;
|
||||
|
||||
/* Right After Emit a Release Event */
|
||||
(up->input)(up, 1, &mp);
|
||||
}
|
||||
else if (mp.buttons == RELEASED)
|
||||
{
|
||||
dp->state = RELEASED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
(up->input)(up, 1, &mp);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Description: this is a callback function for command line parameter processing */
|
||||
/* (all valid parameters for device module are listed in touch.args) */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int opt - parameter code */
|
||||
/* char * optarg - optional parameter value */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : we don't accept any parameter for this module at the protocol level */
|
||||
int touch_parm(input_module_t *module, int opt, char *optarg)
|
||||
{
|
||||
/* Now empty */
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
switch (opt)
|
||||
{
|
||||
case 'u':
|
||||
{
|
||||
if(NULL != optarg)
|
||||
dp->nDev = atoi(optarg);
|
||||
break;
|
||||
}
|
||||
case 'K':
|
||||
{
|
||||
dp->flags |= FLAG_KIOSK_MODE;
|
||||
break;
|
||||
}
|
||||
case 'm':
|
||||
{
|
||||
int tmp = dp->max_matrix_val;
|
||||
|
||||
dp->max_matrix_val = atoi (optarg);
|
||||
|
||||
if (dp->max_matrix_val < 0)
|
||||
dp->max_matrix_val = tmp;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* Description: this is a callback function which is called when resourse manager */
|
||||
/* is shutting down */
|
||||
/* Input : input_module_t * module - pointer to module descriptor */
|
||||
/* int ms - program doesn't use this parameter */
|
||||
/* Output : None */
|
||||
/* Return : 0 if OK, otherwise -1 */
|
||||
/* Comment : Does nothing for the protocol level */
|
||||
int touch_shutdown(input_module_t *module, int delay)
|
||||
{
|
||||
struct private_data *dp = module->data;
|
||||
|
||||
if( (NULL != dp) && (NULL != dp -> hid_module_handle))
|
||||
devi_unregister_hid_client(dp -> hid_module_handle);
|
||||
|
||||
return (0);
|
||||
}
|
144
devi/include/const.h
Обычный файл
144
devi/include/const.h
Обычный файл
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CONST_H_INCLUDED
|
||||
#define CONST_H_INCLUDED
|
||||
|
||||
/* photon options */
|
||||
#define INP_REG_DISABLE_CASB 0x00000001
|
||||
#define INP_REG_NO_GRAFX 0x00000002
|
||||
|
||||
/* general options */
|
||||
#define OPT_NO_PHOTON 0x0001
|
||||
#define OPT_RESMGR 0x0002
|
||||
|
||||
/* flags for devi lib calls */
|
||||
#define DEVI_SHARE_RSRC (1 << 0)
|
||||
#define DEVI_PULSE_ALLOC -1
|
||||
|
||||
#define MSEC(_t) ((unsigned long)(((_t).tv_sec * 1000) + ((_t).tv_nsec / 1000000)))
|
||||
|
||||
/* Mouse types */
|
||||
#define NO_WHEEL_MOUSE 0x00
|
||||
#define WHEEL_3B_MOUSE 0x03
|
||||
#define WHEEL_5B_MOUSE 0x04
|
||||
|
||||
/* serial port config flags */
|
||||
|
||||
#define DEVCTL_CFLAG_MASK (CSIZE | CSTOPB | PARENB | PARODD)
|
||||
#define PODD (PARENB | PARODD)
|
||||
#define PNONE 0
|
||||
#define PEVEN PARENB
|
||||
#define STOP1 0
|
||||
#define STOP2 CSTOPB
|
||||
|
||||
/* global flags mask */
|
||||
#define FLAGS_GLOBAL 0x00FF
|
||||
|
||||
/* absolute (touchscreen) flags */
|
||||
|
||||
#define ABS_MAX 16383 /* Calibrated max */
|
||||
#define ABSOLUTE 0x0008 /* Direct coordinates */
|
||||
#define ABS_SCREEN 0x0009 /* Touch screen */
|
||||
#define ABS_WORLD 0x000A /* Digitizing tablet */
|
||||
#define ABS_TYPE_MASK 0x000F /* Type mask */
|
||||
#define ABS_UNCALIBRATED 0x0010 /* Raw coordinates */
|
||||
#define ABS_PRESS_DATA 0x0020 /* touch screen pressure */
|
||||
#define ABS_RAW_MODE 0x0040 /* operate in raw mode */
|
||||
#define ABS_XLATE_MODE 0x0080 /* operate in translation mode */
|
||||
|
||||
#define PTR_BUT_SWAP 0x0001 /* swap status of buttons */
|
||||
#define PTR_X_SWAP 0x0002
|
||||
#define PTR_Y_SWAP 0x0004
|
||||
#define PTR_Z_SWAP 0x0008
|
||||
|
||||
/* devctls -- */
|
||||
|
||||
#define DEVCTL_SETBAUD 0x0010 /* change the baud rate */
|
||||
#define DEVCTL_RESET 0x0020 /* reset */
|
||||
#define DEVCTL_LED 0x0030 /* set keyboard leds */
|
||||
#define DEVCTL_GETKBD 0x0040 /* get keyboard rate and delay */
|
||||
#define DEVCTL_SETKBD 0x0050 /* set keyboard rate and delay */
|
||||
#define DEVCTL_RESET_KBD 0x0060 /* reset keyboard device */
|
||||
#define DEVCTL_RESET_PS2MOUSE 0x0070 /* reset ps2 controller */
|
||||
#define DEVCTL_ISKBD 0x0080 /* device emitting real scancodes? */
|
||||
#define DEVCTL_RESCHG 0x0090 /* establish new display resolution */
|
||||
#define DEVCTL_GETDEVFLAGS 0x00a0 /* get the device flags */
|
||||
#define DEVCTL_GETKEYF 0x00b0 /* get keymap file name */
|
||||
#define DEVCTL_SETKEYF 0x00c0 /* set keymap file name */
|
||||
#define DEVCTL_GETPTRBTNS 0x00d0 /* get available buttons mask */
|
||||
#define DEVCTL_GETPTRCOORD 0x00e0 /* get number of device coordinates */
|
||||
#define DEVCTL_GETPTRPRESS 0x00f0 /* get number of device pressures */
|
||||
#define DEVCTL_GETCOORDRNG 0x0100 /* get the range of a coordinate */
|
||||
#define DEVCTL_GETPRESSRNG 0x0110 /* get the range of a pressure */
|
||||
#define DEVCTL_GETDEVTYPE 0x0120 /* get the range of a pressure */
|
||||
#define DEVCTL_COORDCHG 0x0130 /* change the device coordinates */
|
||||
#define DEVCTL_BELL 0x0140 /* sound the bell */
|
||||
#define DEVCTL_GETBELLPARM 0x0150 /* get bell parameters */
|
||||
#define DEVCTL_SETBELLPARM 0x0160 /* set bell parameters */
|
||||
#define DEVCTL_GETLED 0x0170 /* get LED status */
|
||||
#define DEVCTL_SETLED 0x0180 /* set LED status */
|
||||
#define DEVCTL_GETLEDMASK 0x0190 /* get the LED's present on device */
|
||||
#define DEVCTL_SETTRIG 0x01c0 /* set trigger level */
|
||||
#define DEVCTL_GETLOADKBDS 0x01d0 /* get list of loaded keyboards */
|
||||
#define DEVCTL_SEL_KBD 0x01d1 /* select keyboard */
|
||||
#define DEVCTL_GET_SEL_KBD 0x01d2 /* get selected keyboard */
|
||||
#define DEVCTL_ADD_KBD 0x01d3 /* add new keyboard */
|
||||
#define DEVCTL_REMOVE_KBD 0x01d4 /* remove kbd */
|
||||
#define DEVCTL_RELOAD_KBDS 0x01d5 /* reload keyboards from scratch */
|
||||
#define DEVCTL_SET_CALIB_MATRIX 0x01d6 /* Set the 3 Point Calibration Matrix */
|
||||
#define DEVCTL_SET_STATE 0x01d7 /* Set the Device State */
|
||||
#define DEVCTL_SET_KBD_STATE 0x01d8 /* Set the KBD device State */
|
||||
#define DEVCTL_SET_REL_STATE 0x01d9 /* Set the REL device State */
|
||||
#define DEVCTL_SET_ABS_STATE 0x01da /* Set the ABS device State */
|
||||
|
||||
|
||||
|
||||
/* signalled on lower layers once reset complete */
|
||||
#define DEVCTL_CHECKPOINT 0x01d0
|
||||
|
||||
#define DEVCTL_SETACCEL 0x01f00 /* change relative filter parms */
|
||||
#define DEVCTL_GETACCEL 0x02000
|
||||
|
||||
#define DEVCTL_GETSWAP 0x02100
|
||||
#define DEVCTL_SETSWAP 0x02200
|
||||
|
||||
#define DEVCTL_ABS_MODE 0x02400
|
||||
|
||||
#define DEVCTL_GETWHEEL 0x02600
|
||||
#define DEVCTL_SETWHEEL 0x02700
|
||||
|
||||
#define DEVCTL_GETWHEEL_ACCEL 0x02800
|
||||
#define DEVCTL_SETWHEEL_ACCEL 0x02900
|
||||
|
||||
#define DEVCTL_GETZMODE 0x02a00 /* I mouse has a wheel, how to deal with it ? */
|
||||
#define DEVCTL_SETZMODE 0x02b00 /* See constants below */
|
||||
|
||||
#define DEVCTL_GETSAMPLE_RATE 0x02c00 /* Number of samples per second */
|
||||
#define DEVCTL_SETSAMPLE_RATE 0x02d00
|
||||
|
||||
#define DEVCTL_GET_RESOLUTION 0x02e00
|
||||
#define DEVCTL_SET_RESOLUTION 0x02f00 /* Value sets power of two counts per mm */
|
||||
|
||||
|
||||
#define DEVCTL_GETMOUSETYPE 0x04000 /* get mouse type: returns in buffer struct devctl_mouse_types; types - see before */
|
||||
#define DEVCTL_SETMOUSETYPE 0x04100 /* send in buffer int value (new mouse type); types - see before */
|
||||
|
||||
|
||||
#define DEVCTL_RESET_COMPOSESTATE 0x01e0
|
||||
|
||||
|
||||
/* Z-modes (see DEVCTL_SET(GET)ZMODE */
|
||||
#define ZMODE_KEY_UPDOWN 1 /* Transform z-move to key UP and DOWN; this is a default value */
|
||||
#define ZMODE_PAGE_UP_DOWN 2 /* Transform z-move to key PgUP and PgDOWN */
|
||||
#define ZMODE_SEND_CLIENT_ONLY 3 /* Send z-move information to client only */
|
||||
|
||||
|
||||
|
||||
#define scalloc(a) calloc((a),1)
|
||||
#define smalloc(a) malloc(a)
|
||||
#define srealloc(a,b,c) realloc(a,c)
|
||||
|
||||
#endif
|
65
devi/include/errdbg.h
Обычный файл
65
devi/include/errdbg.h
Обычный файл
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ERRDBG_H_INCLUDED
|
||||
#define _ERRDBG_H_INCLUDED
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
* examples of the DEBUG macro in action
|
||||
*
|
||||
* DBG(printf("This val should be: %d\n", val););
|
||||
*
|
||||
* DBG(assert(x == someval););
|
||||
*
|
||||
* DBG(if (x == someval)
|
||||
print("Oops");
|
||||
else
|
||||
x = newval;
|
||||
);
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(code_fragment) do { code_fragment } while (0)
|
||||
#else
|
||||
#define DBG(code_fragment) // debug: do nothing
|
||||
#endif
|
||||
|
||||
#define VBOSE(a) if(verbose) printf("%s\n",(a))
|
||||
|
||||
#define err_abort(code, text) do { \
|
||||
fprintf (stderr, "%s at \"%s\":%d %s\n", \
|
||||
text, __FILE__, __LINE__, strerror(code)); \
|
||||
abort(); \
|
||||
} while (0)
|
||||
|
||||
#define errno_abort(text) do { \
|
||||
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
|
||||
text, __FILE__, __LINE__, strerror(errno)); \
|
||||
abort(); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define errno_exit(text) do { \
|
||||
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
|
||||
text, __FILE__, __LINE__, strerror(errno)); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define errno_print(text) do { \
|
||||
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
|
||||
text, __FILE__, __LINE__, strerror(errno)); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
36
devi/include/externs.h
Обычный файл
36
devi/include/externs.h
Обычный файл
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef EXTERN_H_INCLUDED
|
||||
#ifndef EXT
|
||||
#define EXT extern
|
||||
#endif
|
||||
|
||||
#define EXTERN_H_INCLUDED
|
||||
|
||||
#include <sys/devi.h>
|
||||
|
||||
extern int optind, opterr, optopt;
|
||||
extern char *optarg;
|
||||
|
||||
EXT int verbosity;
|
||||
|
||||
EXT event_bus_line_t *Bus; /* pointer to list of event bus lines
|
||||
managed by devi */
|
||||
|
||||
EXT int IpGroup; /* input group (used by photon i/f) */
|
||||
EXT char *IpTargetDev; /* name of photon device to open */
|
||||
EXT unsigned int OptFlags; /* global options */
|
||||
EXT int IpCurrentFd; /* fd used to send messages via photon */
|
||||
EXT input_module_t *ModuleTable[MODULE_TABLE_SIZE]; /* table of currently
|
||||
supported modules */
|
||||
EXT common_callbacks_t commonCallbacks; /* Global callback functions */
|
||||
EXT char *pServ_name;
|
||||
EXT char *pFull_process_name; // Full process name
|
||||
EXT int loopPlayback;
|
||||
EXT FILE *playFile;
|
||||
EXT FILE *logFile;
|
||||
EXT int delayMsec;
|
||||
#endif
|
125
devi/include/hid.h
Обычный файл
125
devi/include/hid.h
Обычный файл
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* (c) 2010-2019, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __HID_H_INCLUDED__
|
||||
#define __HID_H_INCLUDED__
|
||||
|
||||
#include <sys/hidut.h>
|
||||
#include <sys/hiddi.h>
|
||||
#include <sys/devi.h>
|
||||
|
||||
#define MAX_SLIDER 16
|
||||
#define MAX_HAT 16
|
||||
|
||||
#define HID_MOUSE_HAS_WHEEL (0x01)
|
||||
#define HID_MOUSE_WHEEL_ON (0x02)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Keyboard Data Structures
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
typedef struct _hid_keyboard_data {
|
||||
_uint16 nLeds; /* Number of leds */
|
||||
_uint16 nKeys; /* Size of keyboard array */
|
||||
_uint16 nRate; /* Time interval to repeat (in msecs) */
|
||||
_uint16 nDelay; /* Delay time interval (in msecs) */
|
||||
} hid_keyboard_data_t, *pHid_keyboard_data_t;
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Mouse Data Structures
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
typedef struct _mouse_data {
|
||||
_uint16 nButtons; /* Number of buttons */
|
||||
_uint8 flags; /* Flags */
|
||||
} mouse_data_t, *pMouse_data_t;
|
||||
|
||||
typedef struct _mouse_raw_data {
|
||||
_uint8 btnStates; /* Buttons states (each bit == 1 corresponds to pressed button */
|
||||
|
||||
_int16 x; /* pointer x-movement */
|
||||
_int16 y; /* pointer y-movement */
|
||||
_int16 z; /* wheel movement (if wheel exists) */
|
||||
} mouse_raw_data_t, *pMouse_raw_data_t;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Joystick Data Structures
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
typedef struct _joystick_attrib {
|
||||
_uint16 nButtons; /* Number of buttons */
|
||||
_uint16 nButtons2; /* Number of buttons */
|
||||
_uint8 flags; /* Flags */
|
||||
} joystick_attrib_t, *pJoystick_attrib_t;
|
||||
|
||||
typedef struct _joystick_data {
|
||||
// _uint16 nButtons_1; /* Number of buttons */
|
||||
_uint8 btnStates_1; /* Buttons states (each bit == 1 corresponds to pressed button */
|
||||
_uint64 button_state;
|
||||
// _uint16 nButtons_2; /* Number of buttons */
|
||||
_uint8 btnStates_2; /* Buttons states (each bit == 1 corresponds to pressed button */
|
||||
/* Pointer */
|
||||
_uint32 x;
|
||||
_uint32 y;
|
||||
_uint32 z;
|
||||
/* Hat switch */
|
||||
_uint32 hat_switch;
|
||||
/* Slider */
|
||||
_uint32 slider;
|
||||
/* Rotational */
|
||||
_uint32 Rx;
|
||||
_uint32 Ry;
|
||||
_uint32 Rz;
|
||||
} joystick_raw_data_t, * pJoystick_raw_data_t;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Touchscreen Data Structures
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
typedef struct _touch_attrib {
|
||||
_uint16 nButtons; /* Number of buttons */
|
||||
_uint8 flags; /* Flags */
|
||||
} touch_attrib_t, *pTouch_attrib_t;
|
||||
|
||||
typedef struct _touch_raw_data {
|
||||
_uint8 touched; /* 1 if screen yes, otherwise 0 */
|
||||
_int16 x; /* Absolute x-position */
|
||||
_int16 y; /* Absolute y-position */
|
||||
_int16 z; /* wheel movement (if wheel exists) */
|
||||
} touch_raw_data_t, *pTouch_raw_data_t;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Consumer Control Data Structures
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
typedef struct _control_attrib {
|
||||
_uint16 nButtons; /* Number of buttons */
|
||||
_uint8 flags; /* Flags */
|
||||
} control_attrib_t, *pControl_attrib_t;
|
||||
|
||||
typedef struct _control_raw_data {
|
||||
_uint32 button_state;
|
||||
|
||||
_int16 Rx;
|
||||
_int16 Ry;
|
||||
_int16 Rz;
|
||||
} control_raw_data_t, *pControl_raw_data_t;
|
||||
|
||||
#endif
|
83
devi/include/photon.h
Обычный файл
83
devi/include/photon.h
Обычный файл
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __PHOTON_H_INCLUDED__
|
||||
#define __PHOTON_H_INCLUDED__
|
||||
|
||||
#include <Ph.h>
|
||||
#include <photon/PhT.h>
|
||||
#include <photon/PhSystem.h>
|
||||
#include <photon/PhService.h>
|
||||
|
||||
extern struct _Ph_ctrl *_Ph_;
|
||||
|
||||
#define MAX_QUERY_RIDS 100
|
||||
|
||||
/* injection constants */
|
||||
|
||||
#define INJECTED 1
|
||||
#define NOT_INJECTED ~INJECTED
|
||||
#define MAX_COORD 50
|
||||
|
||||
#define SIG_INPUT_EVENT SIGRTMIN
|
||||
#define SIG_PH_EVENT SIGRTMIN+1
|
||||
|
||||
|
||||
typedef struct _input_data {
|
||||
|
||||
struct {
|
||||
unsigned char type;
|
||||
unsigned char flags;
|
||||
long reply_pid;
|
||||
} hdr;
|
||||
|
||||
union {
|
||||
struct packet_kbd kbd;
|
||||
struct packet_rel rel;
|
||||
struct packet_abs abs;
|
||||
char data[1];
|
||||
} u;
|
||||
} input_data_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
||||
int flags;
|
||||
PhRid_t rid;
|
||||
PhRect_t rect;
|
||||
PhRegion_t region;
|
||||
int throttle;
|
||||
} input_region_data_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
unsigned millisec;
|
||||
unsigned abs_max;
|
||||
|
||||
union {
|
||||
PhRawPtrEvent_t ptr;
|
||||
char padding[offsetof(PhRawPtrEvent_t, coord) +
|
||||
MAX_COORD * sizeof(PhRawPtrCoord_t)];
|
||||
} u;
|
||||
|
||||
} inject_event_t;
|
||||
|
||||
|
||||
/* Protos */
|
||||
|
||||
int photon_connect(char *, input_region_data_t *);
|
||||
void inject(buffer_t *, input_data_t *, input_region_data_t *);
|
||||
void trig_ptr(PhRawPtrEvent_t *, unsigned, PhRid_t);
|
||||
void trig_kbd(PhRawKeyEvent_t *, unsigned, PhRid_t);
|
||||
void * ph_thread(void *);
|
||||
void injector_specific_destroy(void *);
|
||||
int photon_input_pulse(input_region_data_t *);
|
||||
int query_grafx_region(int, PhRect_t *);
|
||||
void slay_photon(unsigned);
|
||||
pid_t photon_pid(void);
|
||||
int gfi_emit_ptr(PhRawPtrEvent_t const *ptr_ev);
|
||||
int gfi_emit_kbd(PhRawKeyEvent_t const *key_ev);
|
||||
|
||||
#endif
|
143
devi/include/proto.h
Обычный файл
143
devi/include/proto.h
Обычный файл
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PROTO_H_INCLUDED
|
||||
#define PROTO_H_INCLUDED
|
||||
|
||||
#include <sys/devi.h>
|
||||
#include "usb.h"
|
||||
|
||||
void devi_init(pCommon_callbacks_t pCallbacks);
|
||||
int begin(int, char**);
|
||||
|
||||
/* buffer */
|
||||
|
||||
buffer_t * buff_create(unsigned, unsigned);
|
||||
int buff_append(buffer_t *, char *, int );
|
||||
int buff_delete(buffer_t *, char *, int );
|
||||
int buff_flush(buffer_t *);
|
||||
int buff_putc(buffer_t *, char );
|
||||
int buff_getc(buffer_t *, char *);
|
||||
int buff_waiting(buffer_t *);
|
||||
|
||||
|
||||
/* Event Bus */
|
||||
|
||||
event_bus_line_t *bus_create(void);
|
||||
int bus_add(event_bus_line_t *, input_module_t *);
|
||||
int bus_complete(event_bus_line_t *line);
|
||||
void bus_dump(void);
|
||||
int bus_interrogate(int, input_module_t **);
|
||||
int bus_reset(void);
|
||||
|
||||
|
||||
/* base */
|
||||
|
||||
int options(int argc, char *argv[], uint32_t *, unsigned int *);
|
||||
|
||||
|
||||
/* util */
|
||||
|
||||
int devi_get_coid();
|
||||
void init_sclk(void);
|
||||
void clk_get(struct timespec *);
|
||||
|
||||
|
||||
/* module */
|
||||
|
||||
input_module_t *module_lookup(char *name);
|
||||
input_module_t *module_filter_lookup(int);
|
||||
|
||||
int start_photon_interface(uint32_t);
|
||||
|
||||
int resmgr_create_device(event_bus_line_t *line);
|
||||
|
||||
void resmgr_init(int);
|
||||
void resmgr_enqueue_packet(event_bus_line_t *, char *data, int size);
|
||||
|
||||
int photon_raw_enqueue(unsigned type, char *dptr, int size);
|
||||
|
||||
int gfi_register(int input_group);
|
||||
|
||||
/* Dispatch services */
|
||||
dispatch_t * devi_get_dispatch_handle();
|
||||
void devi_set_dispatch_handle(dispatch_t * pdp);
|
||||
|
||||
/* Initializes USB driver */
|
||||
void devi_usb_init();
|
||||
|
||||
/* Initializes USB client */
|
||||
int devi_usb_server_connect(char * serv_path_name);
|
||||
|
||||
/* Disconnect USB server */
|
||||
void devi_usb_server_disconnect();
|
||||
|
||||
/* This function attach client to USB sub-system. Register your client from
|
||||
* reset function of device module. If nDev >= 0, it specifies device number.
|
||||
* Function returns local module handler
|
||||
*/
|
||||
void * devi_usb_register_client(input_module_t * pInput_module, int nDev,
|
||||
_uint32 nVendor, _uint32 nClass, _uint32 nSubClass);
|
||||
|
||||
/* Detach input module from USB driver */
|
||||
void devi_unregister_usb_client(void * h);
|
||||
|
||||
/* Get device status (see usb.h) */
|
||||
int devi_usb_device_status(void * pHandle, _uint8 * pnStatus);
|
||||
|
||||
|
||||
/* Initializes HID driver */
|
||||
void devi_hid_init();
|
||||
|
||||
/* Connects to USB HID server */
|
||||
int devi_hid_server_connect(char * serv_path_name);
|
||||
|
||||
/* Disconnects client from USB HID server */
|
||||
void devi_hid_server_disconnect();
|
||||
|
||||
/* This function attach client to HID USB sub-system. Register your client from
|
||||
* reset function of each device module. If nDev >= 0, it specifies device number.
|
||||
* Function returns local module handler
|
||||
*/
|
||||
void * devi_hid_register_client(input_module_t *module, int nDev);
|
||||
|
||||
/* Detach input module from HID driver */
|
||||
void devi_unregister_hid_client(void * h);
|
||||
|
||||
/* HID devctrl processor */
|
||||
int devi_hid_devctrl(void * pHandle, int event, void *ptr,
|
||||
int nDev /*HIDD_CONNECT_WILDCARD if all devices connected to this module*/);
|
||||
|
||||
/* Register pulse */
|
||||
int devi_register_pulse(input_module_t *module, int code,
|
||||
int (*func)(message_context_t *, int, unsigned, void *));
|
||||
|
||||
/* Register interrupt */
|
||||
int devi_register_interrupt(int intr, int prio, int *code, input_module_t *module, struct sigevent *evp, unsigned);
|
||||
|
||||
/* Register timer */
|
||||
timer_t devi_register_timer(input_module_t *module, int prio, int *code, struct sigevent *evp);
|
||||
|
||||
/* Request input/output space mapping */
|
||||
uintptr_t devi_request_iorange(unsigned start, unsigned len, unsigned flags);
|
||||
|
||||
/* Engue data package */
|
||||
int devi_enqueue_packet(input_module_t *, char *, unsigned);
|
||||
|
||||
/* Convert scan code(s) to USB keyboard usage code */
|
||||
int devi_scan_to_usb(unsigned char * buf, int * pnBytes, USBKCode * usbCodes,
|
||||
unsigned char * makeBreakes, int * pnLen);
|
||||
|
||||
/* Convert USB keyboard usage code to scan code(s) */
|
||||
int devi_usb_to_scan(USBKCode usbCode, int nMakeBreak, _uint8 * buf, int * pnLen);
|
||||
|
||||
|
||||
// This function sends control data to the device control endpoint
|
||||
int devi_output_control(void * pHandle, pControlRequest pRequest, void * data, int nLen);
|
||||
|
||||
/* from main */
|
||||
void input_shutdown(void);
|
||||
|
||||
#endif
|
80
devi/include/ps2api.h
Обычный файл
80
devi/include/ps2api.h
Обычный файл
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
/* PS2 controller API specification */
|
||||
|
||||
#ifndef _PS2API_H
|
||||
#define _PS2API_H
|
||||
|
||||
/* Controller modes */
|
||||
#define SET_LEGACY_MODE (1)
|
||||
#define SET_MULTIPLEX_MODE (2)
|
||||
|
||||
|
||||
/* Initialization flags */
|
||||
#define INIT_MULTIPLEX_MODE (0x01)
|
||||
#define INIT_SELF_TEST (0x02)
|
||||
/* Next two constant - for IRQ parameters in init_contr */
|
||||
#define SET_DEFAULT (0)
|
||||
#define SET_NONE (-1)
|
||||
/* Initialize PS/2 keyboard controller */
|
||||
int init_contr(int flags, int nIrq_base, int nIrq_aux, int nDataPort, int nStatusPort);
|
||||
|
||||
|
||||
/* default arguments */
|
||||
#define DEFAULT_DISPHANDLE (NULL)
|
||||
#define DEFAULT_COID (-1)
|
||||
/* Register logical device at the PS/2 controller */
|
||||
int register_device(dispatch_t * dp, int (*pulse)(message_context_t *, int, unsigned, void *),
|
||||
int coid, int nPortNum, void * data);
|
||||
|
||||
/* Reset PS/2 device */
|
||||
int reset_device(int nPortNum);
|
||||
/* Disconnect logical device from PS/2 controller */
|
||||
int unregister_device(int nPortNum);
|
||||
|
||||
/* Change scheduling priority for this port processing */
|
||||
int set_priority(int nPortNum,int nNewPrty);
|
||||
|
||||
/* sends command to target device but not
|
||||
expects ACK (useful for RESET and RESET_WRAP_MODE */
|
||||
int send_device_command(int nPortNum, unsigned char cmd,
|
||||
unsigned char * pReply, int nReplyLen);
|
||||
|
||||
/* Send device/controller specific command */
|
||||
int send_command(int nPortNum, unsigned char cmd,
|
||||
unsigned char * pReply, int nReplyLen);
|
||||
/* Send sequence of commands to device */
|
||||
int send_command_set(int nPortNum,
|
||||
unsigned char * pCmds, int nCmdSetLen,
|
||||
unsigned char * pReply, int nReplyLen);
|
||||
|
||||
/* Extract data comming from interrupt processing program */
|
||||
unsigned char get_in_data(int blk);
|
||||
|
||||
/* Shutdown PS/2 controller */
|
||||
void shutdown_contr();
|
||||
/* Switch controller to/from multiplexing mode (now just does nothing) */
|
||||
int switch_controller_mode(int nNewMode);
|
||||
|
||||
/* Prototipes of Controller specific functions */
|
||||
typedef int (check_data)(int nPortNum, unsigned char nStatus);
|
||||
typedef int (get_switch_cmd)(int nPortNum);
|
||||
|
||||
#define NOT_DEF_IRQ_TYPE (0)
|
||||
#define KBD_IRQ_TYPE (1)
|
||||
#define AUX_IRQ_TYPE (2)
|
||||
|
||||
#define RET_DATA_ERROR (-1)
|
||||
#define RET_NO_DATA (-2)
|
||||
typedef int (validate_data)(int nStatus, int nIrqId);
|
||||
typedef int (enable_port_cmd)(int nPortNum, unsigned char cmd);
|
||||
typedef int (switch_mode)(int nNewMode);
|
||||
|
||||
/* Replace controller specific callbacks */
|
||||
void set_callbacks(check_data * f_chdat, get_switch_cmd * f_getsw, validate_data * f_valid,
|
||||
enable_port_cmd * f_encmd, switch_mode * f_swmode);
|
||||
|
||||
#endif // _PS2API_H
|
287
devi/include/storage.h
Обычный файл
287
devi/include/storage.h
Обычный файл
@ -0,0 +1,287 @@
|
||||
/*
|
||||
* (c) 2010-2017, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* storage.h
|
||||
*
|
||||
* This file includes structures that are used by keyboard mapping programs
|
||||
*/
|
||||
|
||||
#ifndef _STORAGE_H
|
||||
#define _STORAGE_H
|
||||
|
||||
#include <_pack1.h>
|
||||
|
||||
#include <sys/usbcodes.h>
|
||||
|
||||
#define KEYBIN_SIGNATURE "KDEF-RTP"
|
||||
|
||||
#define MAX_DEAD_KEYS (20)
|
||||
|
||||
|
||||
/* structure defines virtual modifier declared in keyboard layout description file */
|
||||
/* Note: first eight modifiers are used for standard modifiers (USB): */
|
||||
/* - LEFT_CTRL */
|
||||
/* - LEFT_SHIFT */
|
||||
/* - LEFT_ALT */
|
||||
/* - LEFT_GUI */
|
||||
/* - RIGHT_CTRL */
|
||||
/* - RIGHT_SHIFT */
|
||||
/* - RIGHT_ALT */
|
||||
/* - RIGHT_GUI */
|
||||
/* All other modifiers are either a key that was assigned to be a modifier */
|
||||
/* (NUM_LOCK for example) or completely virtual modifiers (SHIFT for example). */
|
||||
/* All non-default modifiers get initial values and can be changed by actions */
|
||||
/* As more as 56 virtual modifiers can be declared */
|
||||
typedef struct _modifier
|
||||
{
|
||||
char *pModName; /* global modifier identifier */
|
||||
USBKCode modKey; /* 0 if no key associated with this modifier */
|
||||
/* otherwise key USB code (see usbcodes.h) */
|
||||
} modifier, *pmodifier;
|
||||
|
||||
typedef struct _modArray
|
||||
{
|
||||
short nOfModifiers;
|
||||
_uint64 modState; /* up to 64 modifiers; each bit corresponds to one modifier */
|
||||
modifier aModifiers[1];
|
||||
} mod_array_t, * pmod_array_t;
|
||||
|
||||
typedef struct _action
|
||||
{
|
||||
/* state of modifiers before action */
|
||||
_uint64 modBefore; /* vector of modifiers we test state */
|
||||
/* before; 1 - test, 0 - ignore */
|
||||
_uint64 modStateBefore; /* vector of modifiers state before */
|
||||
_uint64 modAction; /* vector of modifiers that involved in */
|
||||
/* action; 1 - involved, 0 - ignore */
|
||||
_uint64 modStateAction; /* how these modifies can be changed */
|
||||
_uint8 modToDo; /* modifier number we should change */
|
||||
struct {
|
||||
#if defined(__BIGENDIAN__)
|
||||
BYTE reserve : 5; /* reserve */
|
||||
BYTE newState : 2; /* 0 - press , 1 - release */
|
||||
/* 2 - up, 3 - down */
|
||||
/* which modifier and how should be changed */
|
||||
/* Up & Down changes global state, Press & Release - just temp variabes that */
|
||||
/* decoder uses as array of curent actions */
|
||||
#define _ACT_UP_ (0)
|
||||
#define _ACT_DOWN_ (1)
|
||||
#define _ACT_PRESS_ (2)
|
||||
#define _ACT_RELEASE_ (3)
|
||||
unsigned int bOperation : 1; /* 0 - "OR", 1 - "AND" */
|
||||
/* Logical operation for before state */
|
||||
#else
|
||||
BYTE bOperation : 1; /* 0 - "OR", 1 - "AND" */
|
||||
/* Logical operation for before state */
|
||||
/* which modifier and how should be changed */
|
||||
/* Up & Down changes global state, Press & Release - just temp variabes that */
|
||||
/* decoder uses as array of curent actions */
|
||||
#define _ACT_UP_ (0)
|
||||
#define _ACT_DOWN_ (1)
|
||||
#define _ACT_PRESS_ (2)
|
||||
#define _ACT_RELEASE_ (3)
|
||||
BYTE newState : 2; /* 0 - press , 1 - release */
|
||||
/* 2 - up, 3 - down */
|
||||
BYTE reserve : 5; /* reserve */
|
||||
#endif
|
||||
} flags;
|
||||
} action_t, * paction_t;
|
||||
|
||||
|
||||
typedef struct _actArray /* array of actions */
|
||||
{
|
||||
short nOfActions;
|
||||
action_t aActions[1];
|
||||
} act_array_t, * pact_array_t;
|
||||
|
||||
|
||||
/* Composition sections */
|
||||
#define COMP_START_DEADKEY (0)
|
||||
#define COMP_START_CTRL (1)
|
||||
#define COMP_START_SHIFT (2)
|
||||
#define COMP_START_ALT (3)
|
||||
#define COMP_START_GUI (4)
|
||||
|
||||
/* We search the table of compositions sequentialy; we selected this implementation*/
|
||||
/* because of the composed chains are quite short and so the cost of support any */
|
||||
/* general structure could be much more in comparing with this simple approach */
|
||||
typedef struct _composeItem
|
||||
{
|
||||
#if defined(__BIGENDIAN__)
|
||||
BYTE lengthOut : 4; /* length of result UNICODE string */
|
||||
BYTE lengthIn : 4; /* length of composed string */
|
||||
#else
|
||||
BYTE lengthIn : 4; /* length of composed string */
|
||||
BYTE lengthOut : 4; /* length of result UNICODE string */
|
||||
#endif
|
||||
wchar_t data[1]; /* first UNICODE comp string, then out string */
|
||||
} compose_item_t, * pcompose_item_t;
|
||||
|
||||
typedef struct _compArea /* area where composition descriptors are stored */
|
||||
{
|
||||
wchar_t aDeadKeys[MAX_DEAD_KEYS]; /* Dead keys that were specified for this */
|
||||
/* keyboard mapping file */
|
||||
/* four different modifiers can be applied (see comment to composeItem structure */
|
||||
/* composition descriptors grouped in four different sections for each possible */
|
||||
/* modifier to expedite search; each section can be empty (nComps == 0) */
|
||||
/* the last fifth section is created for combinations that can be ignited by */
|
||||
/* dead keys (see sample.kdef file) */
|
||||
struct { /* there are five sections */
|
||||
_uint16 nComps; /* number of compositions in section */
|
||||
_uint16 nOffset;/* offset of section beginning from the start of pComps */
|
||||
} sect[5];
|
||||
BYTE nModState; /* we use this field to monitor compose ignition(sequential */
|
||||
/* pressing and releasing of any default modifier (from */
|
||||
/* KS_Control_L to KS_Right_GUI) */
|
||||
/* If it is a composition state, following variables describe it */
|
||||
short nCurSect; /* number of active section; -1 if none */
|
||||
short nCurItemNum; /* Number of compose string we stand on */
|
||||
short nCurOffset; /* offset of current compose sequence from the start of sect */
|
||||
short nCurLen; /* current length of compose sequence */
|
||||
/* End of composition state descriptor */
|
||||
void * pComps;
|
||||
} comp_area_t, * pcomp_area_t;
|
||||
|
||||
/* In general, map table provides 1-to-n mapping: 1 USB code can be mapped to n */
|
||||
/* UNICODE characters (about combination see comment later) */
|
||||
/* array of modification flags is a key to the map table */
|
||||
/* mapping table is a set of items two main types */
|
||||
/* - continuous array of map items */
|
||||
/* - single map item */
|
||||
/* array is defined using the first item code and its length; each array item */
|
||||
/* then mapping items follow; */
|
||||
/* single item is defined just with USB key code */
|
||||
/* both array item and single item have three main types of mapping */
|
||||
/* - start of combination of codes (see compose characters in sample map file */
|
||||
/* - set of UNICODE symbols (if output consists of more than one cha */
|
||||
/* - single UNICODE code (this modified key should be mapped to just single code */
|
||||
|
||||
|
||||
typedef struct _keyMapItem
|
||||
{
|
||||
USBKCode nCode; /* USB code to be remapped (if type == 1 - this */
|
||||
/* code just corresponds to the first item in array */
|
||||
union {
|
||||
struct {
|
||||
#if defined(__BIGENDIAN__)
|
||||
BYTE length: 7; /* length of array */
|
||||
BYTE type : 1; /* 0 - array of codes */
|
||||
/* This is a mapping array (may be just from 1 item) */
|
||||
/* In this case nCode corresponds to the first */
|
||||
/* item in this table. CAP == code */
|
||||
/* (CAP makes sense only for non-modified USB codes) */
|
||||
} strArray;
|
||||
struct {
|
||||
BYTE length: 4; /* Length of string */
|
||||
BYTE reserve:1;
|
||||
BYTE deadKey:1; /* 1 if this is a dead key */
|
||||
BYTE bHasCAP:1; /* does it has CAP ? */
|
||||
/* If CAP code exists it is always the last in the */
|
||||
/* string (if length == 1, CAP == code) */
|
||||
BYTE type : 1; /* 1 - single code or string of UNICODs */
|
||||
} strSingle;
|
||||
#else
|
||||
BYTE type : 1; /* 0 - array of codes */
|
||||
/* This is a mapping array (may be just from 1 item) */
|
||||
/* In this case nCode corresponds to the first */
|
||||
/* item in this table. CAP == code */
|
||||
/* (CAP makes sense only for non-modified USB codes) */
|
||||
BYTE length: 7; /* length of array */
|
||||
} strArray;
|
||||
struct {
|
||||
BYTE type : 1; /* 1 - single code or string of UNICODs */
|
||||
BYTE bHasCAP:1; /* does it has CAP ? */
|
||||
/* If CAP code exists it is always the last in the */
|
||||
/* string (if length == 1, CAP == code) */
|
||||
BYTE deadKey:1; /* 1 if this is a dead key */
|
||||
BYTE reserve:1;
|
||||
BYTE length: 4; /* Length of string */
|
||||
} strSingle;
|
||||
#endif
|
||||
} descriptor;
|
||||
wchar_t nUNICode[1]; /* string of UNICODEs */
|
||||
} key_map_item_t, * pkey_map_item_t;
|
||||
|
||||
typedef struct _dirItem
|
||||
{
|
||||
_uint64 modState; /* the state of modifiers for this map table */
|
||||
_uint64 modToTest; /* Each '1' s a modifier we have to test */
|
||||
_uint16 nBlocks; /* number of descriptive blocks in this table */
|
||||
_uint32 offset; /* offset of map table from the end of directory */
|
||||
} dir_item_t, * pdir_item_t;
|
||||
|
||||
|
||||
typedef struct _keyMapDir
|
||||
{
|
||||
short nOfMapTables;
|
||||
dir_item_t dirTable[1];
|
||||
} key_map_dir_t, * pkey_map_dir_t;
|
||||
|
||||
/* structure defines keyboard layout description file header */
|
||||
typedef struct _stHeader
|
||||
{
|
||||
_uint8 leds[8]; /* table to get LEDs */
|
||||
_uint8 stdModArray[32]; /* table to re-map to standard modifiers */
|
||||
pmod_array_t pMod; /* virtual modifiers */
|
||||
pact_array_t pAct; /* actions that change modifier state */
|
||||
pkey_map_dir_t pKMapDir; /* key map directory */
|
||||
pcomp_area_t pComp; /* area where combinations of codes are located */
|
||||
/* this area is used for mapping of composed */
|
||||
/* characters sequences */
|
||||
} st_header_t, * pst_header_t;
|
||||
|
||||
|
||||
#include <_packpop.h>
|
||||
|
||||
#if defined(__MIPS__) && defined(__BIGENDIAN__)
|
||||
#undef ENDIAN_SWAP16
|
||||
#undef ENDIAN_SWAP32
|
||||
#undef ENDIAN_SWAP64
|
||||
#define ENDIAN_SWAP16(pVal) \
|
||||
{ \
|
||||
uint8_t *pswap16 = (uint8_t *)pVal; \
|
||||
uint8_t aswap16[2]; \
|
||||
aswap16[0] = pswap16[1]; \
|
||||
aswap16[1] = pswap16[0]; \
|
||||
pswap16[0] = aswap16[0]; \
|
||||
pswap16[1] = aswap16[1]; \
|
||||
}
|
||||
#define ENDIAN_SWAP32(pVal) \
|
||||
{ \
|
||||
uint8_t *pswap32 = (uint8_t *)pVal; \
|
||||
uint8_t aswap32[4]; \
|
||||
aswap32[0] = pswap32[3]; \
|
||||
aswap32[1] = pswap32[2]; \
|
||||
aswap32[2] = pswap32[1]; \
|
||||
aswap32[3] = pswap32[0]; \
|
||||
pswap32[0] = aswap32[0]; \
|
||||
pswap32[1] = aswap32[1]; \
|
||||
pswap32[2] = aswap32[2]; \
|
||||
pswap32[3] = aswap32[3]; \
|
||||
}
|
||||
#define ENDIAN_SWAP64(pVal) \
|
||||
{ \
|
||||
uint8_t *pswap64 = (uint8_t *)pVal; \
|
||||
uint8_t aswap64[8]; \
|
||||
aswap64[0] = pswap64[7]; \
|
||||
aswap64[1] = pswap64[6]; \
|
||||
aswap64[2] = pswap64[5]; \
|
||||
aswap64[3] = pswap64[4]; \
|
||||
aswap64[4] = pswap64[3]; \
|
||||
aswap64[5] = pswap64[2]; \
|
||||
aswap64[6] = pswap64[1]; \
|
||||
aswap64[7] = pswap64[0]; \
|
||||
pswap64[0] = aswap64[0]; \
|
||||
pswap64[1] = aswap64[1]; \
|
||||
pswap64[2] = aswap64[2]; \
|
||||
pswap64[3] = aswap64[3]; \
|
||||
pswap64[4] = aswap64[4]; \
|
||||
pswap64[5] = aswap64[5]; \
|
||||
pswap64[6] = aswap64[6]; \
|
||||
pswap64[7] = aswap64[7]; \
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*_STORAGE_H*/
|
27
devi/include/usb.h
Обычный файл
27
devi/include/usb.h
Обычный файл
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* (c) 2010, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __USB_H_INCLUDED__
|
||||
#define __USB_H_INCLUDED__
|
||||
|
||||
|
||||
#include <sys/usbdi.h>
|
||||
|
||||
typedef struct _controlRequest
|
||||
{
|
||||
_uint8 dir ; /* Direction (URB_DIR_IN or URB_DIR_OUT) */
|
||||
_uint8 type; /* Type (USB_TYPE_STANDARD, USB_TYPE_CLASS or USB_TYPE_VENDOR) */
|
||||
_uint8 rec ; /* Recipient (USB_RECIPENT_DEVICE, _INTERFACE, _ENDPOINT, _OTHER) */
|
||||
_uint8 req ; /* Request - vendor specific or one of standard */
|
||||
_uint16 value; /* Command parameter */
|
||||
_uint16 index; /* Command index( request specific */
|
||||
} controlRequest, * pControlRequest;
|
||||
|
||||
/* Device status flags */
|
||||
#define USB_DEVICE_STATUS_FLAGS (0xff)
|
||||
#define USB_DEVICE_ON (0x01)
|
||||
#define USB_DEVICE_PRESENT (0x02)
|
||||
|
||||
#endif
|
Двоичные данные
devi/keymap/nto/arm/a.o.le.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/arm/a.o.le.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/arm/a.o.le.v7.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/arm/a.o.le.v7.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/arm/a.o.le.v7/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/arm/a.o.le.v7/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/arm/a.o.le/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/arm/a.o.le/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/e2k/a.o.le/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/e2k/a.o.le/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/mips/a.o.be.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/mips/a.o.be.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/mips/a.o.be/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/mips/a.o.be/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/mips/a.o.le.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/mips/a.o.le.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/mips/a.o.le/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/mips/a.o.le/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/ppc/a.o.be.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/ppc/a.o.be.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/ppc/a.o.be.spe.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/ppc/a.o.be.spe.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/ppc/a.o.be.spe/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/ppc/a.o.be.spe/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/ppc/a.o.be/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/ppc/a.o.be/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/x86/a.o.shared/libkeymapS.a
Обычный файл
Двоичные данные
devi/keymap/nto/x86/a.o.shared/libkeymapS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/keymap/nto/x86/a.o/libkeymap.a
Обычный файл
Двоичные данные
devi/keymap/nto/x86/a.o/libkeymap.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/arm/a.o.le.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/arm/a.o.le.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/arm/a.o.le.v7.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/arm/a.o.le.v7.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/arm/a.o.le.v7/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/arm/a.o.le.v7/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/arm/a.o.le/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/arm/a.o.le/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/e2k/a.o.le/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/e2k/a.o.le/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/mips/a.o.be.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/mips/a.o.be.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/mips/a.o.be/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/mips/a.o.be/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/mips/a.o.le.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/mips/a.o.le.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/mips/a.o.le/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/mips/a.o.le/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/ppc/a.o.be.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/ppc/a.o.be.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/ppc/a.o.be.spe.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/ppc/a.o.be.spe.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/ppc/a.o.be.spe/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/ppc/a.o.be.spe/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/ppc/a.o.be/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/ppc/a.o.be/libinput.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/x86/a.o.shared/libinputS.a
Обычный файл
Двоичные данные
devi/lib/nto/x86/a.o.shared/libinputS.a
Обычный файл
Двоичный файл не отображается.
Двоичные данные
devi/lib/nto/x86/a.o/libinput.a
Обычный файл
Двоичные данные
devi/lib/nto/x86/a.o/libinput.a
Обычный файл
Двоичный файл не отображается.
301
devi/public/sys/dcmd_input.h
Обычный файл
301
devi/public/sys/dcmd_input.h
Обычный файл
@ -0,0 +1,301 @@
|
||||
/*
|
||||
* (c) 2020, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* dcmd_input.h
|
||||
*/
|
||||
|
||||
#ifndef __DCMD_INPUT_H_INCLUDED
|
||||
#define __DCMD_INPUT_H_INCLUDED
|
||||
|
||||
#ifndef _DEVCTL_H_INCLUDED
|
||||
#include <devctl.h>
|
||||
#endif
|
||||
|
||||
#ifndef __DCMD_MISC_H_INCLUDED
|
||||
#include <sys/dcmd_misc.h>
|
||||
#endif
|
||||
|
||||
#ifndef _TIME_H_INCLUDED
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#ifndef __PLATFORM_H_INCLUDED
|
||||
#include <sys/platform.h>
|
||||
#endif
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
#include <_pack64.h>
|
||||
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
#define KB_OFFSET 0x10 /* offset of kb devctls in the input space */
|
||||
|
||||
struct _keyboard_data {
|
||||
unsigned int modifiers;
|
||||
unsigned int flags;
|
||||
unsigned int key_cap;
|
||||
unsigned int key_sym;
|
||||
unsigned int key_scan;
|
||||
};
|
||||
|
||||
struct _keyboard_packet { /* start of struct returned from read() */
|
||||
struct timespec time;
|
||||
struct _keyboard_data data;
|
||||
};
|
||||
|
||||
#define _KEYBOARD_MODE_SCAN 0x0000 /* single byte scancodes are returned */
|
||||
#define _KEYBOARD_MODE_PACKET 0x0001 /* _keyboard_packets are returned */
|
||||
#define _KEYBOARD_MODE_UNICODE 0x0002 /* unicode (16 bit quantities) are returned */
|
||||
#define _KEYBOARD_MODE_MASK 0x0003
|
||||
|
||||
struct _keyboard_ctrl {
|
||||
struct _interact_device type; /* Device type */
|
||||
unsigned int flags; /* Device type flags */
|
||||
unsigned int mode; /* Mode of currently read packets */
|
||||
unsigned short rate;
|
||||
unsigned short delay;
|
||||
char mapfile[_POSIX_PATH_MAX];
|
||||
unsigned int zero[9];
|
||||
};
|
||||
|
||||
#define _KEYBOARDGETCTRL __DIOF(_DCMD_INPUT, KB_OFFSET+0, struct _keyboard_ctrl)
|
||||
#define _KEYBOARDSETCTRL __DIOT(_DCMD_INPUT, KB_OFFSET+1, struct _keyboard_ctrl)
|
||||
#define _KEYBOARDGETKEYMAPPATH __DIOF(_DCMD_INPUT, KB_OFFSET+2, char[_POSIX_PATH_MAX])
|
||||
#define _KEYBOARDSETKEYMAPPATH __DIOT(_DCMD_INPUT, KB_OFFSET+3, char[_POSIX_PATH_MAX])
|
||||
#define _KEYBOARDRELOADCONFIG __DIOT(_DCMD_INPUT, KB_OFFSET+4, struct _interact_device)
|
||||
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#define PTR_OFFSET 0x20
|
||||
|
||||
#define _POINTER_FLAG_PROPERTIES 0x000088ff /* Properties mask */
|
||||
#define _POINTER_FLAG_ABSOLUTE 0x00000001 /* Absolute co-ordinates (proximity) */
|
||||
#define _POINTER_FLAG_BUTTON 0x00000002 /* buttons is non-zero */
|
||||
#define _POINTER_FLAG_COORD 0x00000800 /* num_coord is non-zero */
|
||||
#define _POINTER_FLAG_PRESSURE 0x00008000 /* num_pressure is non-zero */
|
||||
#define _POINTER_FLAG_VALUE (_POINTER_FLAG_COORD|_POINTER_FLAG_PRESSURE)
|
||||
|
||||
#define _POINTER_FLAG_CSCALE 0x00000700 /* Unit scale mask (for coords) */
|
||||
#define _POINTER_FLAG_CUNITY 0x00000000 /* Units are not world related */
|
||||
#define _POINTER_FLAG_CMETRIC 0x00000100 /* each unit is a number of micrometers (meter / 1000000) */
|
||||
#define _POINTER_FLAG_CIMPERIAL 0x00000200 /* each unit is a number of microns (inch / 1000000) */
|
||||
#define _POINTER_FLAG_CSCREEN 0x00000300 /* each unit is relitave to screen */
|
||||
|
||||
#define _POINTER_FLAG_PSCALE 0x00007000 /* Unit scale mask (for pressure) */
|
||||
#define _POINTER_FLAG_PUNITY 0x00000000 /* Units are not world related */
|
||||
|
||||
#define _POINTER_FLAG_TOUCH (_POINTER_FLAG_ABSOLUTE|_POINTER_FLAG_COORD|_POINTER_FLAG_CSCREEN)
|
||||
#define _POINTER_FLAG_MOUSE (_POINTER_FLAG_COORD)
|
||||
|
||||
#define _POINTER_FLAG_BSWAP 0x00010000
|
||||
#define _POINTER_FLAG_XSWAP 0x00020000
|
||||
#define _POINTER_FLAG_YSWAP 0x00040000
|
||||
#define _POINTER_FLAG_ZSWAP 0x00080000
|
||||
#define _POINTER_FLAG_SWAP_MASK 0x000f0000
|
||||
#define _POINTER_FLAG_SWAP_POS 16
|
||||
|
||||
#define _POINTER_MODE_COMPRESSED 0x0001 /* Data is compressed */
|
||||
|
||||
#define _POINTER_BUTTON_1 0x00000001
|
||||
#define _POINTER_BUTTON_2 0x00000002
|
||||
#define _POINTER_BUTTON_3 0x00000004
|
||||
#define _POINTER_BUTTON_4 0x00000008
|
||||
#define _POINTER_BUTTON_5 0x00000010
|
||||
#define _POINTER_BUTTON_6 0x00000020
|
||||
#define _POINTER_BUTTON_7 0x00000040
|
||||
#define _POINTER_BUTTON_8 0x00000080
|
||||
#define _POINTER_BUTTON_RIGHT _POINTER_BUTTON_1
|
||||
#define _POINTER_BUTTON_MIDDLE _POINTER_BUTTON_2
|
||||
#define _POINTER_BUTTON_LEFT _POINTER_BUTTON_3
|
||||
|
||||
#define _POINTER_IOCTL_MAX_POINTS 6 /* Maximum number of data points available with ioctl(), otherwise use qnx_ioctl() */
|
||||
|
||||
struct _pointer_packet_hdr { /* start of struct returned from read() */
|
||||
struct timespec time;
|
||||
unsigned int buttons; /* Currently depressed buttons */
|
||||
};
|
||||
|
||||
struct _pointer_packet { /* returned from read() (variable number of data items) */
|
||||
struct _pointer_packet_hdr hdr;
|
||||
int data[1]; /* variable amount of data (first coord, then pressure) */
|
||||
};
|
||||
|
||||
struct _mouse_packet { /* common form for "mouse" pointing devices */
|
||||
struct _pointer_packet_hdr hdr;
|
||||
int dx; /* num_coord == 2, num_pressure = 0 */
|
||||
int dy;
|
||||
int dz;
|
||||
};
|
||||
|
||||
struct _touch1_packet { /* common form for "touch" pointing devices (no pressure) */
|
||||
struct _pointer_packet_hdr hdr;
|
||||
int x; /* num_coord = 2, num_pressure = 0 */
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
|
||||
struct _joystick_packet_hdr { /* start of struct returned from read() */
|
||||
struct timespec time;
|
||||
#ifndef __64__
|
||||
unsigned long long button_state; /* Currently depressed buttons */
|
||||
#else
|
||||
unsigned long button_state; /* Currently depressed buttons */
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _joystick_packet {
|
||||
struct _joystick_packet_hdr hdr;
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
|
||||
short Rx;
|
||||
short Ry;
|
||||
short Rz;
|
||||
|
||||
unsigned short function_count; /* Stores the number of sliders in the low bits, and Hats in the high bits */
|
||||
//unsigned *slider[MAX_SLIDER];
|
||||
unsigned slider;
|
||||
//unsigned *hat[MAX_HAT];
|
||||
unsigned hat_switch;
|
||||
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
struct _control_packet_hdr { /* start of struct returned from read() */
|
||||
struct timespec time;
|
||||
#ifndef __64__
|
||||
unsigned long long button_state; /* Currently depressed buttons */
|
||||
#else
|
||||
unsigned long button_state; /* Currently depressed buttons */
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _control_packet {
|
||||
struct _control_packet_hdr hdr;
|
||||
|
||||
short Rx;
|
||||
short Ry;
|
||||
short Rz;
|
||||
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
struct _pointer_info {
|
||||
struct _interact_device type; /* Device type */
|
||||
unsigned int flags; /* Device type flags (read only) */
|
||||
unsigned char num_coord; /* Number of coordinats (first range values) */
|
||||
unsigned char num_pressure; /* Number of pressures (after coord values) */
|
||||
unsigned short mode; /* Mode of currently read packets */
|
||||
unsigned int buttons; /* Buttons available bitmap */
|
||||
struct _pointer_range {
|
||||
int min;
|
||||
int max;
|
||||
unsigned int units; /* Microns or micrometer per unit (if used) */
|
||||
} range[_POINTER_IOCTL_MAX_POINTS];
|
||||
};
|
||||
|
||||
struct _pointer_ctrl {
|
||||
struct _interact_device type; /* Device type */
|
||||
unsigned flags;
|
||||
short gain;
|
||||
short threshold;
|
||||
int state;
|
||||
};
|
||||
|
||||
typedef union {
|
||||
int number; /* number to perform operations on */
|
||||
struct {
|
||||
short integer; /* integer component of number */
|
||||
unsigned short frac; /* fractional component of number */
|
||||
} component;
|
||||
} hex_frac_t;
|
||||
|
||||
struct _pointer_matrix {
|
||||
hex_frac_t xscale, xy;
|
||||
hex_frac_t yx, yscale;
|
||||
hex_frac_t xoffset, yoffset;
|
||||
};
|
||||
|
||||
struct _three_point_calib_matrix {
|
||||
long long An, Bn, Cn, Dn, En, Fn, Divider;
|
||||
};
|
||||
|
||||
struct _pointer_transform {
|
||||
struct _interact_device type;
|
||||
struct _pointer_matrix xy_coord; /* Only the first two coordinats are transformed */
|
||||
struct _pointer_scale {
|
||||
int min;
|
||||
int max;
|
||||
} pressure[_POINTER_IOCTL_MAX_POINTS];
|
||||
};
|
||||
|
||||
#define _POINTERGETINFO __DIOF(_DCMD_INPUT, PTR_OFFSET+0, struct _pointer_info)
|
||||
#define _POINTERSETCTRL __DIOT(_DCMD_INPUT, PTR_OFFSET+1, struct _pointer_ctrl)
|
||||
#define _POINTERGETMATRIX __DIOF(_DCMD_INPUT, PTR_OFFSET+2, struct _pointer_matrix)
|
||||
#define _POINTERSETMATRIX __DIOT(_DCMD_INPUT, PTR_OFFSET+3, struct _pointer_matrix)
|
||||
#define _POINTERGETCTRL __DIOF(_DCMD_INPUT, PTR_OFFSET+4, struct _pointer_ctrl)
|
||||
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
#define FB_OFFSET 0x30
|
||||
|
||||
#define _FEEDBACK_LED_1 0x00000001
|
||||
#define _FEEDBACK_LED_2 0x00000002
|
||||
#define _FEEDBACK_LED_3 0x00000004
|
||||
#define _FEEDBACK_LED_4 0x00000008
|
||||
#define _FEEDBACK_LED_SCROLL _FEEDBACK_LED_1
|
||||
#define _FEEDBACK_LED_NUM _FEEDBACK_LED_2
|
||||
#define _FEEDBACK_LED_CAPS _FEEDBACK_LED_3
|
||||
|
||||
struct _feedback_led {
|
||||
struct _interact_device type;
|
||||
int value;
|
||||
int mask;
|
||||
};
|
||||
|
||||
struct _feedback_bell {
|
||||
struct _interact_device type;
|
||||
unsigned short flags; /* Flags */
|
||||
unsigned short frequency; /* In Hz, zero is rest */
|
||||
unsigned short duration; /* duration in ms */
|
||||
unsigned short volume; /* USHRT_MAX is full volume */
|
||||
};
|
||||
|
||||
#define _FEEDBACK_BELL_FLAG_FREQ 0x0004
|
||||
#define _FEEDBACK_BELL_FLAG_DURATION 0x0002
|
||||
#define _FEEDBACK_BELL_FLAG_VOLUME 0x0001
|
||||
|
||||
#define _FEEDBACK_BELL_FLAG_FLUSH 0x0001 /* Flush pending bells */
|
||||
#define _FEEDBACK_BELL_VOLUME_DFLT (USHRT_MAX/2)
|
||||
|
||||
#define _FEEDBACK_STRING_MAX 255
|
||||
|
||||
#define _FEEDBACKSETLED __DIOT(_DCMD_INPUT, FB_OFFSET+1, struct _feedback_led)
|
||||
#define _FEEDBACKGETLED __DIOF(_DCMD_INPUT, FB_OFFSET+2, struct _feedback_led)
|
||||
#define _FEEDBACKGETLEDMASK __DIOF(_DCMD_INPUT, FB_OFFSET+3, struct _feedback_led)
|
||||
#define _FEEDBACKBELL __DIOT(_DCMD_INPUT, FB_OFFSET+5, struct _feedback_bell)
|
||||
#define _FEEDBACKINTEGER __DIOF(_DCMD_INPUT, FB_OFFSET+0xA, int)
|
||||
#define _FEEDBACKSTRING __DIOT(_DCMD_INPUT, FB_OFFSET+0xF, char[_FEEDBACK_STRING_MAX])
|
||||
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
#define DEVICE_OFFSET 0x40 /* offset of device devctls in the input space */
|
||||
|
||||
struct _device_state {
|
||||
struct _interact_device type;
|
||||
int state;
|
||||
};
|
||||
|
||||
#define _SETDEVICESTATE __DIOT(_DCMD_INPUT, DEVICE_OFFSET+0, struct _device_state)
|
||||
|
||||
#include <_packpop.h>
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
350
devi/public/sys/devi.h
Обычный файл
350
devi/public/sys/devi.h
Обычный файл
@ -0,0 +1,350 @@
|
||||
/*
|
||||
* (c) 2020, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __DEVI_H_INCLUDED__
|
||||
#define __DEVI_H_INCLUDED__
|
||||
|
||||
#include "errdbg.h"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <devctl.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <hw/inout.h>
|
||||
#include <malloc.h>
|
||||
#include <process.h>
|
||||
#include <pthread.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/dcmd_chr.h>
|
||||
#include <sys/dcmd_input.h>
|
||||
#include <sys/dcmd_misc.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/netmgr.h>
|
||||
#include <sys/neutrino.h>
|
||||
#include <sys/procfs.h>
|
||||
#include <sys/procmgr.h>
|
||||
#include <sys/rsrcdbmgr.h>
|
||||
#include <sys/rsrcdbmsg.h>
|
||||
#include <sys/slog.h>
|
||||
#include <sys/slogcodes.h>
|
||||
#include <sys/socket.h>
|
||||
#include <termios.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/keycodes.h>
|
||||
#include <sys/keytable.h>
|
||||
|
||||
#include <sys/usbcodes.h>
|
||||
|
||||
#include <photon/PhT.h>
|
||||
|
||||
#define MODULE_TABLE_SIZE 32
|
||||
#define RESMGR_Q_SIZE 100
|
||||
|
||||
#define MAX_SLIDER 16
|
||||
#define MAX_HAT 16
|
||||
|
||||
typedef struct _input_module input_module_t;
|
||||
typedef struct _devi_attr devi_attr_t;
|
||||
typedef struct _devi_ocb devi_ocb_t;
|
||||
|
||||
typedef _uint8 BYTE;
|
||||
|
||||
typedef struct Line {
|
||||
|
||||
int flags;
|
||||
#define DEVI_LINE_HAVE_DEVICE (1 << 0)
|
||||
#define DEVI_LINE_HAVE_PROTO (1 << 1)
|
||||
#define DEVI_LINE_HAVE_FILTER (1 << 2)
|
||||
|
||||
int type;
|
||||
/* DEVI_CLASS_* */
|
||||
|
||||
struct Line *next;
|
||||
input_module_t *bottom; /* device layer */
|
||||
input_module_t *top; /* filter layer (typically) */
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cond;
|
||||
union {
|
||||
struct _keyboard_packet *kq;
|
||||
struct _mouse_packet *mq;
|
||||
struct _touch1_packet *tq;
|
||||
struct _joystick_packet *jq;
|
||||
struct _control_packet *cq;
|
||||
} u;
|
||||
int elem_size;
|
||||
|
||||
int head;
|
||||
devi_attr_t *attr;
|
||||
|
||||
} event_bus_line_t;
|
||||
|
||||
#ifndef IOFUNC_ATTR_T
|
||||
#define IOFUNC_ATTR_T devi_attr_t
|
||||
#endif
|
||||
#ifndef IOFUNC_OCB_T
|
||||
#define IOFUNC_OCB_T devi_ocb_t
|
||||
#endif
|
||||
#ifndef THREAD_POOL_PARAM_T
|
||||
#define THREAD_POOL_PARAM_T dispatch_context_t
|
||||
#endif
|
||||
|
||||
#include <sys/iofunc.h>
|
||||
|
||||
struct _devi_ocb {
|
||||
|
||||
iofunc_ocb_t ocb;
|
||||
uint32_t flags;
|
||||
#define OCB_UNBLOCK_WANTED (1 << 0)
|
||||
int read_ptr;
|
||||
};
|
||||
|
||||
|
||||
struct _ocb_list {
|
||||
|
||||
devi_ocb_t *ocb;
|
||||
struct _ocb_list *prev;
|
||||
struct _ocb_list *next;
|
||||
};
|
||||
|
||||
|
||||
struct _devi_attr {
|
||||
|
||||
iofunc_attr_t attr;
|
||||
int ocb_size;
|
||||
uint32_t flags;
|
||||
#define DEVI_NOTIFICATION_ARMED (1 << 0)
|
||||
event_bus_line_t *line;
|
||||
struct _ocb_list *ocb_list;
|
||||
struct _wait_q *wait_queue;
|
||||
iofunc_notify_t notify[3];
|
||||
};
|
||||
|
||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
|
||||
|
||||
|
||||
#include <sys/resmgr.h>
|
||||
#include <sys/dispatch.h>
|
||||
|
||||
|
||||
struct _input_module {
|
||||
|
||||
input_module_t *up;
|
||||
input_module_t *down;
|
||||
struct Line *line;
|
||||
int flags;
|
||||
#define MODULE_FLAG_INUSE (1 << 0)
|
||||
|
||||
int type;
|
||||
|
||||
#define DEVI_CLASS_MASK 0x000000ff
|
||||
#define DEVI_CLASS_NONE 0x00000001
|
||||
#define DEVI_CLASS_KBD 0x00000002
|
||||
#define DEVI_CLASS_REL 0x00000004
|
||||
#define DEVI_CLASS_ABS 0x00000008
|
||||
#define DEVI_CLASS_JOYSTICK 0x00000010
|
||||
#define DEVI_CLASS_GAMEPAD 0x00000020
|
||||
#define DEVI_CLASS_CONTROL 0x00000040
|
||||
|
||||
#define DEVI_MODULE_TYPE_MASK 0x0000ff00
|
||||
#define DEVI_MODULE_TYPE_FILTER 0x00000100
|
||||
#define DEVI_MODULE_TYPE_PROTO 0x00000200
|
||||
#define DEVI_MODULE_TYPE_DEVICE 0x00000400
|
||||
|
||||
char name[12], date[12];
|
||||
const char *args;
|
||||
void *data;
|
||||
int (*init)(input_module_t *);
|
||||
int (*reset)(input_module_t *);
|
||||
int (*input)(input_module_t *, int, void *);
|
||||
int (*output)(input_module_t *, void *, int);
|
||||
int (*pulse)(message_context_t *, int, unsigned, void *);
|
||||
int (*parm)(input_module_t *, int, char *);
|
||||
int (*devctrl)(input_module_t *, int, void *);
|
||||
int (*shutdown)(input_module_t *, int);
|
||||
};
|
||||
|
||||
|
||||
/* Common callbacks */
|
||||
typedef struct _common_callbacks {
|
||||
int nCallbacks;
|
||||
int (*pre_init)();
|
||||
int (*post_init)();
|
||||
int (*pre_shutdown)();
|
||||
int (*post_shutdown)();
|
||||
} common_callbacks_t, * pCommon_callbacks_t;
|
||||
|
||||
struct _wait_q {
|
||||
|
||||
devi_ocb_t *ocb;
|
||||
int rcvid;
|
||||
int nbytes;
|
||||
struct _wait_q *prev;
|
||||
struct _wait_q *next;
|
||||
};
|
||||
|
||||
|
||||
typedef struct _buffer {
|
||||
char *head;
|
||||
char *tail;
|
||||
char *buff;
|
||||
int cnt;
|
||||
int bufsize;
|
||||
int recsize;
|
||||
pthread_mutex_t mutex;
|
||||
} buffer_t;
|
||||
|
||||
|
||||
struct packet_rel {
|
||||
unsigned flags;
|
||||
#define PTR_TYPE_MASK 0x0f00 /* general flags (all pointing devs) */
|
||||
#define PTR_Z_DATA 0x0100 /* Z coordinate data available */
|
||||
int dx;
|
||||
int dy;
|
||||
int dz;
|
||||
unsigned buttons;
|
||||
/* typically _POINTER_BUTTON_RIGHT, _POINTER_BUTTON_MIDDLE or
|
||||
* _POINTER_BUTTON_LEFT
|
||||
*/
|
||||
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
|
||||
struct packet_abs {
|
||||
unsigned flags;
|
||||
/* see const.h, set it to ABSOLUTE|ABS_UNCALIBRATED in the proto module */
|
||||
unsigned x;
|
||||
unsigned y;
|
||||
unsigned z;
|
||||
unsigned buttons; /* _POINTER_BUTTON_LEFT */
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
struct packet_kbd {
|
||||
struct timespec timestamp;
|
||||
USBKCode nUSBCode;
|
||||
unsigned char bMakeBreak;
|
||||
/* See /usr/include/sys/dcmd_input.h for the format of this field. */
|
||||
struct _keyboard_data key;
|
||||
};
|
||||
|
||||
struct packet_joystick {
|
||||
_uint32 x;
|
||||
_uint32 y;
|
||||
_uint32 z;
|
||||
|
||||
int Rx;
|
||||
int Ry;
|
||||
int Rz;
|
||||
|
||||
uint16_t function_count; /* Stores the number of sliders in the low bits, and Hats in the high bits */
|
||||
//unsigned *slider[MAX_SLIDER];
|
||||
unsigned slider;
|
||||
//unsigned *hat[MAX_HAT];
|
||||
unsigned hat_switch;
|
||||
_uint64 button_state;
|
||||
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
struct packet_control {
|
||||
_uint64 button_state;
|
||||
|
||||
int16_t Rx;
|
||||
int16_t Ry;
|
||||
int16_t Rz;
|
||||
|
||||
struct timespec timestamp;
|
||||
};
|
||||
|
||||
struct devctl_setbaud {
|
||||
unsigned baud;
|
||||
tcflag_t cflag; /* from termios.h */
|
||||
};
|
||||
|
||||
struct devctl_settrig {
|
||||
int trigger_level;
|
||||
};
|
||||
|
||||
struct devctl_getkbd {
|
||||
short rate; /* 0 to 31 where 0 is 30Hz */
|
||||
short delay; /* 0 to 3 where 0 is 250ms, and 3 is 1s */
|
||||
};
|
||||
|
||||
struct devctl_setkbd {
|
||||
short rate; /* 0 to 31 where 0 is 30Hz */
|
||||
short delay; /* 0 to 3 where 0 is 250ms, and 3 is 1s */
|
||||
};
|
||||
|
||||
struct devctl_disparea_res {
|
||||
long xl,xh;
|
||||
long yl,yh;
|
||||
};
|
||||
|
||||
struct devctl_devcoord {
|
||||
int swap;
|
||||
long xl,xh;
|
||||
long yl,yh;
|
||||
};
|
||||
|
||||
struct devctl_coord_range {
|
||||
int which;
|
||||
long min;
|
||||
long max;
|
||||
};
|
||||
|
||||
struct devctl_led {
|
||||
int value;
|
||||
int mask;
|
||||
};
|
||||
|
||||
struct devctl_bell {
|
||||
unsigned short flags; /* Flags */
|
||||
unsigned short frequency; /* In Hz, zero is rest */
|
||||
unsigned short duration; /* duration in ms */
|
||||
unsigned short volume; /* USHRT_MAX is full volume */
|
||||
};
|
||||
|
||||
struct devctl_rel_accel {
|
||||
int gain;
|
||||
int threshold;
|
||||
};
|
||||
|
||||
struct devctl_wheel_accel {
|
||||
int step;
|
||||
int accel;
|
||||
};
|
||||
|
||||
struct devctl_abs_mode {
|
||||
int mode;
|
||||
};
|
||||
|
||||
struct devctl_mouse_types
|
||||
{
|
||||
unsigned char type ; /* max level */
|
||||
unsigned char curtype; /* current level */
|
||||
};
|
||||
|
||||
#define LIST_FIRST_ITEM(head) ((head) -> lh_first)
|
||||
#define LIST_NEXT_ITEM(elm, field) ((elm == NULL) ? NULL : (elm) -> field.le_next)
|
||||
#define LIST_PREV_ITEM(elm, field) ((elm == NULL) ? NULL : (elm) -> field.le_prev)
|
||||
|
||||
/* Device States */
|
||||
#define STATE_START 1
|
||||
#define STATE_STOP 2
|
||||
#define STATE_RESTART 3
|
||||
#define STATE_ENABLE 4
|
||||
#define STATE_DISABLE 5
|
||||
#define STATE_STANDBY 6
|
||||
|
||||
#include "const.h"
|
||||
#include "externs.h"
|
||||
#include "proto.h"
|
||||
|
||||
#endif
|
95
devi/public/sys/gfi_iomsg.h
Обычный файл
95
devi/public/sys/gfi_iomsg.h
Обычный файл
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* (c) 2020, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GFI_IOMSG_H_INCLUDED
|
||||
#define __GFI_IOMSG_H_INCLUDED
|
||||
|
||||
#ifndef __IOMSG_H_INCLUDED
|
||||
#include <sys/iomsg.h>
|
||||
#endif
|
||||
|
||||
#ifndef _GF_GFI_H_INCLUDED
|
||||
#include <gf/gfi.h>
|
||||
#endif
|
||||
|
||||
#ifndef _IOMGR_INPUT
|
||||
#define _IOMGR_INPUT 0x16
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This version number is used to detect version mismatches between the
|
||||
* GF lib and devi drivers. At every incompatible release, the number should
|
||||
* be incremented.
|
||||
*/
|
||||
#define GFI_VERSION 0x00000001
|
||||
|
||||
#define GFI_IOMSG_SIZEOF(u_type) (sizeof (io_msg_t) + sizeof (u_type))
|
||||
#define GFI_IOMSG_REP_SIZEOF(u_type) (sizeof (int) + sizeof (u_type))
|
||||
#define GFI_GET_EVENT_MAX 32
|
||||
|
||||
typedef struct {
|
||||
io_msg_t iomsg;
|
||||
union {
|
||||
#define GFI_REGISTER_LAYER 0x0001
|
||||
struct {
|
||||
_Uint32t gfi_version;
|
||||
_Int32t z_pos;
|
||||
} reg;
|
||||
#define GFI_UNREGISTER_LAYER 0x0002
|
||||
struct {
|
||||
_Int32t z_pos;
|
||||
} unreg;
|
||||
#define GFI_SET_ATTRS 0x0003
|
||||
struct {
|
||||
_Int32t z_pos;
|
||||
_Int32t x1, y1, x2, y2;
|
||||
_Uint32t flags; /* See gfi_attr */
|
||||
} set_attrs;
|
||||
#define GFI_GET_EVENT 0x0004
|
||||
struct {
|
||||
_Int32t nlayers;
|
||||
_Int32t layer_z_pos[GFI_GET_EVENT_MAX];
|
||||
_Int32t block;
|
||||
} get_event;
|
||||
#define GFI_SET_FOCUS 0x0005
|
||||
struct {
|
||||
_Int32t z_pos;
|
||||
} set_focus;
|
||||
#define GFI_EMIT_EVENT 0x0006
|
||||
struct {
|
||||
_Int32t z_pos;
|
||||
gfi_event_t ev;
|
||||
} emit_event;
|
||||
#define GFI_SET_PTR_CTRL 0x0007
|
||||
struct {
|
||||
_Int32t flags;
|
||||
} set_ptr_ctrl;
|
||||
#define GFI_SET_PTR_MATRIX4 0x0008
|
||||
struct {
|
||||
_Int32t swap;
|
||||
_Int32t scr_xoffset, scr_yoffset, scr_xscale, scr_yscale;
|
||||
_Int32t coord_xoffset, coord_yoffset, coord_xscale, coord_yscale;
|
||||
} set_ptr_matrix4;
|
||||
#define GFI_SET_PTR_MATRIX3 0x0009
|
||||
struct {
|
||||
int64_t An, Bn, Cn, Dn, En, Fn, Divider;
|
||||
} set_ptr_matrix3;
|
||||
} u;
|
||||
} gfi_iomsg_t;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct {
|
||||
} reg;
|
||||
struct {
|
||||
gfi_event_t ev;
|
||||
int got_event;
|
||||
} get_event;
|
||||
struct {
|
||||
} dummy;
|
||||
} u;
|
||||
} gfi_iomsg_reply_t;
|
||||
|
||||
#endif /* __GFI_IOMSG_H_INCLUDED */
|
128
devi/public/sys/keymap.h
Обычный файл
128
devi/public/sys/keymap.h
Обычный файл
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* (c) 2020, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __KEYMAP_H_INCLUDED__
|
||||
#define __KEYMAP_H_INCLUDED__
|
||||
|
||||
#ifndef _STDDEF_H_INCLUDED
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
/* #include "storage.h" */
|
||||
|
||||
#include <sys/usbcodes.h>
|
||||
|
||||
#define KEY_PRESS (1)
|
||||
#define KEY_RELEASE (0)
|
||||
|
||||
#define IGNORE_COMP 0x01
|
||||
#define IGNORE_ACTIONS 0x02
|
||||
|
||||
#define DONT_NEED_CAP 0
|
||||
#define NEED_CAP 1
|
||||
|
||||
/* Keyboard switchers */
|
||||
#define KBDMAP_SWITCH_LEFT_ALT_SHIFT (1)
|
||||
#define KBDMAP_SWITCH_ANY_CTRL_SHIFT (2)
|
||||
#define KBDMAP_SWITCH_NONE (0)
|
||||
#define KBDMAP_SWITCH_DEFAULT (KBDMAP_SWITCH_LEFT_ALT_SHIFT)
|
||||
|
||||
#ifndef _STORAGE_H
|
||||
|
||||
/* struct _modArray; */
|
||||
typedef struct _modArray * pmod_array_t;
|
||||
/* struct _actArray; */
|
||||
typedef struct _actArray * pact_array_t;
|
||||
/* struct _compArea; */
|
||||
typedef struct _compArea * pcomp_area_t;
|
||||
/* struct _keyMapDir; */
|
||||
typedef struct _keyMapDir * pkey_map_dir_t;
|
||||
|
||||
/* structure defines keyboard layout description file header */
|
||||
typedef struct _stHeader
|
||||
{
|
||||
_Uint8t leds[8]; /* table to get LEDs */
|
||||
_Uint8t stdModArray[32]; /* table to re-map to standard modifiers */
|
||||
pmod_array_t pMod; /* virtual modifiers */
|
||||
pact_array_t pAct; /* actions that change modifier state */
|
||||
pkey_map_dir_t pKMapDir; /* key map directory */
|
||||
pcomp_area_t pComp; /* area where combinations of codes are located */
|
||||
/* this area is used for mapping of composed */
|
||||
/* characters sequences */
|
||||
} st_header_t, * pst_header_t;
|
||||
#endif
|
||||
|
||||
typedef struct _kmap_data {
|
||||
struct _stHeader header;
|
||||
USBKCode lastKey;
|
||||
char *name;
|
||||
} kmap_data, * p_kmap_data;
|
||||
|
||||
|
||||
/* Using USB code and current modifiers state, function resolves UNICODE string */
|
||||
void kmap_get_unicode(pst_header_t pHeader,USBKCode code, int bNeedCAP, wchar_t * pCodes, int * pnLen, int * pIsDeadKey);
|
||||
|
||||
/* function processes keyboard activity */
|
||||
void kmap_process_key_event(pst_header_t pHeader, USBKCode code, int nMakeBreak,
|
||||
wchar_t * pBuf, int * pnBufLen, int * pFlags);
|
||||
/* These are processing flags. pFlags is an input/output parameter
|
||||
* For now we have only one output flag */
|
||||
#define PFLAG_O_DEAD_KEY 0x01
|
||||
|
||||
/* function checks if this is a deadkey code */
|
||||
int kmap_is_dead_key(pst_header_t pHeader, wchar_t cDeadKeyCode);
|
||||
|
||||
/* function returns bit array of standard modifiers */
|
||||
_Uint32t kmap_get_std_modifiers(pst_header_t pHeader);
|
||||
|
||||
/* function returns bit array of LEDs */
|
||||
_Uint8t kmap_get_leds(pst_header_t pHeader);
|
||||
|
||||
/* function sets modifiers' state using new LED state */
|
||||
void kmap_set_leds(pst_header_t pHeader, _Uint8t leds);
|
||||
|
||||
/* function copies keyboard state */
|
||||
void kmap_copy_keyboard_state(pst_header_t pFrom, pst_header_t pTo);
|
||||
|
||||
/* function reset keyboard state */
|
||||
void kmap_reset_keyboard_state(pst_header_t pHeader);
|
||||
|
||||
/* function loads new keyboard definition file */
|
||||
int kmap_load_kbd_file(const char * fname, pst_header_t pHeader);
|
||||
|
||||
/* free allocated memory we don't need more */
|
||||
int kmap_free_memory(pst_header_t pHeader);
|
||||
|
||||
/* load keyboard mapping files */
|
||||
int kmap_load_keyboards(p_kmap_data * ppData, char * proc_path);
|
||||
|
||||
/* Load new mapping file */
|
||||
int kmap_add_new_keyboard( char * name, p_kmap_data * ppData);
|
||||
|
||||
/* Remove keyboard mapping file from memory */
|
||||
int kmap_remove_keyboard(char * name);
|
||||
|
||||
/* Remove keyboard mapping file from memory */
|
||||
int kmap_remove_all_keyboards();
|
||||
|
||||
/* Make another mapping file active */
|
||||
int kmap_switch_to_keyboard(char * name, p_kmap_data * ppData);
|
||||
|
||||
/* Switch to next keyboard */
|
||||
void kmap_switch_to_next(p_kmap_data * ppData);
|
||||
|
||||
/* Number of loaded keyboards */
|
||||
int kmap_get_num_of_loaded_keyboards();
|
||||
|
||||
/* Get keymap descriptor */
|
||||
int kmap_get_kmap_data_by_name(char * name, p_kmap_data * ppData);
|
||||
|
||||
/* Get keymap descriptor */
|
||||
int kmap_get_kmap_data_by_number(int nKbd, p_kmap_data * ppData);
|
||||
|
||||
/* Get current switcher (see constants in the beginning of this file */
|
||||
int kmap_get_active_switcher();
|
||||
|
||||
#endif /* __KEYMAP_H_INCLUDED */
|
245
devi/public/sys/usbcodes.h
Обычный файл
245
devi/public/sys/usbcodes.h
Обычный файл
@ -0,0 +1,245 @@
|
||||
/*
|
||||
* (c) 2020, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
* usbcodes.h
|
||||
*
|
||||
* This file includes USB usages (Usb page 0x07 - keyboard/keypad)
|
||||
*/
|
||||
|
||||
#ifndef _USBCODES_H
|
||||
#define _USBCODES_H
|
||||
|
||||
#ifndef __PLATFORM_H_INCLUDED
|
||||
#include <sys/platform.h>
|
||||
#endif
|
||||
|
||||
typedef _Uint16t USBKCode; /* USB key code */
|
||||
#define KS_None 0x00
|
||||
|
||||
#define KS_a 0x04
|
||||
#define KS_b 0x05
|
||||
#define KS_c 0x06
|
||||
#define KS_d 0x07
|
||||
#define KS_e 0x08
|
||||
#define KS_f 0x09
|
||||
#define KS_g 0x0a
|
||||
#define KS_h 0x0b
|
||||
#define KS_i 0x0c
|
||||
#define KS_j 0x0d
|
||||
#define KS_k 0x0e
|
||||
#define KS_l 0x0f
|
||||
#define KS_m 0x10
|
||||
#define KS_n 0x11
|
||||
#define KS_o 0x12
|
||||
#define KS_p 0x13
|
||||
#define KS_q 0x14
|
||||
#define KS_r 0x15
|
||||
#define KS_s 0x16
|
||||
#define KS_t 0x17
|
||||
#define KS_u 0x18
|
||||
#define KS_v 0x19
|
||||
#define KS_w 0x1a
|
||||
#define KS_x 0x1b
|
||||
#define KS_y 0x1c
|
||||
#define KS_z 0x1d
|
||||
#define KS_1 0x1e
|
||||
#define KS_exclam (KS_1) /* upper case */
|
||||
#define KS_2 0x1f
|
||||
#define KS_at (KS_2) /* upper case */
|
||||
#define KS_3 0x20
|
||||
#define KS_numbersign (KS_3) /* upper case */
|
||||
#define KS_4 0x21
|
||||
#define KS_dollar (KS_4) /* upper case */
|
||||
#define KS_5 0x22
|
||||
#define KS_percent (KS_5) /* upper case */
|
||||
#define KS_6 0x23
|
||||
#define KS_asciicircum (KS_6) /* upper case */
|
||||
#define KS_7 0x24
|
||||
#define KS_ampersand (KS_6) /* upper case */
|
||||
#define KS_8 0x25
|
||||
#define KS_asterisk (KS_8) /* upper case */
|
||||
#define KS_9 0x26
|
||||
#define KS_parenleft (KS_9) /* upper case */
|
||||
#define KS_0 0x27
|
||||
#define KS_parenright (KS_0) /* upper case */
|
||||
#define KS_Enter 0x28
|
||||
#define KS_Cmd_Debugger (KS_6) /* upper case */
|
||||
#define KS_Escape 0x29
|
||||
#define KS_BackSpace 0x2a
|
||||
#define KS_Tab 0x2b
|
||||
#define KS_space 0x2c
|
||||
#define KS_minus 0x2d
|
||||
#define KS_underscore (KS_minus) /* upper case */
|
||||
#define KS_equal 0x2e
|
||||
#define KS_plus (KS_equal) /* upper case */
|
||||
#define KS_bracketleft 0x2f
|
||||
#define KS_braceleft (KS_bracketleft) /* upper case */
|
||||
#define KS_bracketright 0x30
|
||||
#define KS_braceright (KS_bracketright) /* upper case */
|
||||
#define KS_backslash 0x31
|
||||
#define KS_bar (KS_backslash) /* upper case */
|
||||
#define KS_NonUSNumsign 0x32
|
||||
#define KS_asciitilde (KS_NonUSNumsign) /* upper case */
|
||||
#define KS_semicolon 0x33
|
||||
#define KS_colon (KS_semicolumn) /* upper case */
|
||||
#define KS_apostrophe 0x34
|
||||
#define KS_quotedbl (KS_apostrophe) /* upper case */
|
||||
#define KS_grave 0x35
|
||||
#define KS_tilde (KS_grave) /* upper case */
|
||||
#define KS_comma 0x36
|
||||
#define KS_less (KS_comma) /* upper case */
|
||||
#define KS_period 0x37
|
||||
#define KS_greater (KS_period) /* upper case */
|
||||
#define KS_slash 0x38
|
||||
#define KS_question (KS_slash) /* upper case */
|
||||
#define KS_Caps_Lock 0x39
|
||||
#define KS_Cmd_Screen0 (KS_Caps_Lock) /* upper case */
|
||||
#define KS_f1 0x3a
|
||||
#define KS_Cmd_Screen1 (KS_f1) /* upper case */
|
||||
#define KS_f2 0x3b
|
||||
#define KS_Cmd_Screen2 (KS_f2) /* upper case */
|
||||
#define KS_f3 0x3c
|
||||
#define KS_Cmd_Screen3 (KS_f3) /* upper case */
|
||||
#define KS_f4 0x3d
|
||||
#define KS_Cmd_Screen4 (KS_f4) /* upper case */
|
||||
#define KS_f5 0x3e
|
||||
#define KS_Cmd_Screen5 (KS_f5) /* upper case */
|
||||
#define KS_f6 0x3f
|
||||
#define KS_Cmd_Screen6 (KS_f6) /* upper case */
|
||||
#define KS_f7 0x40
|
||||
#define KS_Cmd_Screen7 (KS_f7) /* upper case */
|
||||
#define KS_f8 0x41
|
||||
#define KS_Cmd_Screen8 (KS_f8) /* upper case */
|
||||
#define KS_f9 0x42
|
||||
#define KS_Cmd_Screen9 (KS_f9) /* upper case */
|
||||
#define KS_f10 0x43
|
||||
#define KS_f11 0x44
|
||||
#define KS_f12 0x45
|
||||
#define KS_Print_Screen 0x46
|
||||
#define KS_Hold_Screen 0x47
|
||||
#define KS_Pause 0x48
|
||||
#define KS_Insert 0x49
|
||||
#define KS_Home 0x4a
|
||||
#define KS_PgUp 0x4b
|
||||
#define KS_Delete 0x4c
|
||||
#define KS_End 0x4d
|
||||
#define KS_PgDn 0x4e
|
||||
#define KS_Right 0x4f
|
||||
#define KS_Left 0x50
|
||||
#define KS_Down 0x51
|
||||
#define KS_Up 0x52
|
||||
#define KS_Num_Lock 0x53
|
||||
#define KS_KP_Divide 0x54
|
||||
#define KS_KP_Multiply 0x55
|
||||
#define KS_KP_Subtract 0x56
|
||||
#define KS_KP_Add 0x57
|
||||
#define KS_KP_Enter 0x58
|
||||
#define KS_KP_End 0x59
|
||||
#define KS_KP_1 (KS_KP_End) /* Num Lock ON */
|
||||
#define KS_KP_Down 0x5a
|
||||
#define KS_KP_2 (KS_KP_Down) /* Num Lock ON */
|
||||
#define KS_KP_Next 0x5b
|
||||
#define KS_KP_3 (KS_KP_Next) /* Num Lock ON */
|
||||
#define KS_KP_Left 0x5c
|
||||
#define KS_KP_4 (KS_KP_Left) /* Num Lock ON */
|
||||
#define KS_KP_Begin 0x5d
|
||||
#define KS_KP_5 (KS_KP_Begin) /* Num Lock ON */
|
||||
#define KS_KP_Right 0x5e
|
||||
#define KS_KP_6 (KS_KP_right) /* Num Lock ON */
|
||||
#define KS_KP_Home 0x5f
|
||||
#define KS_KP_7 (KS_KP_Home) /* Num Lock ON */
|
||||
#define KS_KP_Up 0x60
|
||||
#define KS_KP_8 (KS_KP_Up) /* Num Lock ON */
|
||||
#define KS_KP_Prior 0x61
|
||||
#define KS_KP_9 (KS_KP_Prior) /* Num Lock ON */
|
||||
#define KS_KP_Insert 0x62
|
||||
#define KS_KP_0 (KS_KP_Insert) /* Num Lock ON */
|
||||
#define KS_KP_Delete 0x63
|
||||
#define KS_KP_Decimal (KS_KP_Delete) /* Num Lock ON */
|
||||
#define KS_NonUSSlash 0x64
|
||||
#define KS_NonUSBar (KS_NonUSSlash) /* upper case */
|
||||
#define KS_Application 0x65
|
||||
#define KS_Power 0x66
|
||||
#define KS_Keypad_Eq 0x67
|
||||
#define KS_f13 0x68
|
||||
#define KS_f14 0x69
|
||||
#define KS_f15 0x6a
|
||||
#define KS_f16 0x6b
|
||||
#define KS_f17 0x6c
|
||||
#define KS_f18 0x6d
|
||||
#define KS_f19 0x6e
|
||||
#define KS_f20 0x6f
|
||||
#define KS_f21 0x70
|
||||
#define KS_f22 0x71
|
||||
#define KS_f23 0x72
|
||||
#define KS_f24 0x73
|
||||
#define KS_Execute 0x74
|
||||
#define KS_Help 0x75
|
||||
#define KS_Menu 0x76
|
||||
#define KS_Select 0x77
|
||||
#define KS_Stop 0x78
|
||||
#define KS_Again 0x79
|
||||
#define KS_Undo 0x7a
|
||||
#define KS_Cut 0x7b
|
||||
#define KS_Copy 0x7c
|
||||
#define KS_Paste 0x7d
|
||||
#define KS_Find 0x7e
|
||||
#define KS_Mute 0x7f
|
||||
#define KS_Volume_Up 0x80
|
||||
#define KS_Volume_Down 0x81
|
||||
#define KS_LockCpsLock 0x82
|
||||
#define KS_LockNumLock 0x83
|
||||
#define KS_LockScrLock 0x84
|
||||
#define KS_KP_Comma 0x85
|
||||
#define KS_KP_Equal 0x86
|
||||
#define KS_Internat1 0x87
|
||||
#define KS_Internat2 0x88
|
||||
#define KS_Internat3 0x89
|
||||
#define KS_Internat4 0x8a
|
||||
#define KS_Internat5 0x8b
|
||||
#define KS_Internat6 0x8c
|
||||
#define KS_Internat7 0x8d
|
||||
#define KS_Internat8 0x8e
|
||||
#define KS_Internat9 0x8f
|
||||
#define KS_Lang1 0x90
|
||||
#define KS_Lang2 0x91
|
||||
#define KS_Lang3 0x92
|
||||
#define KS_Lang4 0x93
|
||||
#define KS_Lang5 0x94
|
||||
#define KS_Lang6 0x95
|
||||
#define KS_Lang7 0x96
|
||||
#define KS_Lang8 0x97
|
||||
#define KS_Lang9 0x98
|
||||
#define KS_AltErase 0x99
|
||||
#define KS_SysReq 0x9a
|
||||
#define KS_Cancel 0x9b
|
||||
#define KS_Clear 0x9c
|
||||
#define KS_Prior 0x9d
|
||||
#define KS_Return 0x9e /* Don't confuse with Enter ! */
|
||||
#define KS_Separator 0x9f
|
||||
#define KS_Out 0xa0
|
||||
#define KS_Oper 0xa1
|
||||
#define KS_ClearAgain 0xa2
|
||||
#define KS_CrSel_Props 0xa3
|
||||
#define KS_ExSel 0xa4
|
||||
/* 0xa5 - 0xdf : reserved */
|
||||
/* ... many unmapped keys ... */
|
||||
#define KS_Control_L 0xe0
|
||||
#define KS_Cmd1 (KS_Control_L)
|
||||
#define KS_Shift_L 0xe1
|
||||
#define KS_Alt_L 0xe2
|
||||
#define KS_Cmd2 (KS_Alt_L)
|
||||
#define KS_LeftGUI 0xe3
|
||||
#define KS_Meta_L (KS_LeftGUI)
|
||||
#define KS_Control_R 0xe4
|
||||
#define KS_Shift_R 0xe5
|
||||
#define KS_Alt_R 0xe6
|
||||
#define KS_Multi_key (KS_Alt_R)
|
||||
#define KS_RightGUI 0xe7
|
||||
#define KS_Meta_R (KS_RightGUI)
|
||||
/* 0xe8-0xffff : reserved */
|
||||
|
||||
|
||||
#endif /* _USBCODES_H */
|
Загрузка…
Ссылка в новой задаче
Block a user