README.md: добавлена ссылка на официальное руководство разработчика HID-драйверов
Этот коммит содержится в:
родитель
8e8092eeb5
Коммит
6055427efd
91
README.md
91
README.md
@ -73,94 +73,5 @@ mount -T io-hid <путь к библиотеке> [параметры]
|
|||||||
|
|
||||||
## Разработка драйвера
|
## Разработка драйвера
|
||||||
|
|
||||||
**Дескриптор драйвера:**
|
В официальной документации доступно [руководство по разработке HID-драйверов](https://help.kpda.ru/neutrino/2021/help/topic/ru.kpda.doc.os/html/programmers_guide/ddk/HID.html).
|
||||||
|
|
||||||
```
|
|
||||||
struct io_hid_dll_entry {
|
|
||||||
char *name;
|
|
||||||
int nfuncs;
|
|
||||||
int (*init)( void *dll_hdl, dispatch_t *dpp, io_hid_self_t *ioh, char *options );
|
|
||||||
int (*shutdown)( void *dll_hdl );
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Дескриптор [io-hid](https://help.kpda.ru/neutrino/2020/help/topic/ru.kpda.doc.os_ru/html/services/io-hid.html):**
|
|
||||||
|
|
||||||
```
|
|
||||||
struct io_hid_self_t {
|
|
||||||
_Uint32t nfuncs;
|
|
||||||
int (*reg)( void *dll_hdl, io_hid_registrant_t *registrant, int *reg_hdlp );
|
|
||||||
int (*dereg)( void *dll_hdl );
|
|
||||||
int (*get_buffer)( int reg_hdlp, void **buffer );
|
|
||||||
int (*send_report)( int registrant_hdl, void *data, _Uint32t dlen );
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**Инициализация драйвера:**
|
|
||||||
|
|
||||||
- Заполнить дескриптор устройства (`io_hid_registrant`)
|
|
||||||
- Установить обработчики прерываний и инициализировать ресурсы драйвера
|
|
||||||
- Зарегистрировать драйвер, вызвав функцию `reg()` менеджера [io-hid](https://help.kpda.ru/neutrino/2020/help/topic/ru.kpda.doc.os_ru/html/services/io-hid.html) (содержится в структуре `io_hid_self_t`)
|
|
||||||
|
|
||||||
|
|
||||||
**При получении данных от устройства:**
|
|
||||||
|
|
||||||
- Заполнить HID-report
|
|
||||||
- Передать HID-report менеджеру [io-hid](https://help.kpda.ru/neutrino/2020/help/topic/ru.kpda.doc.os_ru/html/services/io-hid.html), вызвав функцию `send_report()`
|
|
||||||
|
|
||||||
|
|
||||||
**Дескриптор HID-устройства:**
|
|
||||||
|
|
||||||
```
|
|
||||||
struct io_hid_registrant_t {
|
|
||||||
_Uint32t flags;
|
|
||||||
hidd_device_ident_t *device_ident; /* vid, pid */
|
|
||||||
void *desc; /* binary descriptor */
|
|
||||||
_Uint16t dlen; /* binary descriptor length */
|
|
||||||
_Uint8t reserved[2];
|
|
||||||
void *user_hdl;
|
|
||||||
io_hid_registrant_funcs_t *funcs; /* callbacks */
|
|
||||||
_Uint8t reserved2[4];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**Дескриптор функций драйвера:**
|
|
||||||
|
|
||||||
Дескриптор функций драйвера определяет структура `io_hid_registrant_funcs`:
|
|
||||||
|
|
||||||
- Подключение/отключение клиента (`client_attach()` / `client_detach()`)
|
|
||||||
- Управление памятью (`rbuffer_alloc()` / `rbuffer_free()`)
|
|
||||||
- Чтение/Запись HID пакетов (`report_read()` / `report_write()`)
|
|
||||||
- Управление частотой обмена (`get_idle()` / `set_idle()`)
|
|
||||||
- Управление режимом работы (`get_protocol()` / `set_protocol()`)
|
|
||||||
- Получение дополнительных данных от устройства (`string`, `indexed_string`)
|
|
||||||
- Перезагрузка устройства (`reset()`)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Общий принцип работы HID-драйвера
|
|
||||||
|
|
||||||
```
|
|
||||||
┌────────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐
|
|
||||||
│ Hardware │ │ devh-* │ │ io-hid │ │ devi-hid │ │ Клиент │
|
|
||||||
└─────┬──────┘ └─────┬────┘ └─────┬────┘ └──────┬─────┘ └─────┬────┘
|
|
||||||
│ │ │ │ │
|
|
||||||
│ │ Регистрация │ │ │
|
|
||||||
│ ├────────────────────────────▸│ │ │
|
|
||||||
│ │ │ │ │
|
|
||||||
│ ├──┐ │ │ │
|
|
||||||
│ │ │ Регистрация │ │ │
|
|
||||||
│ │ │ обработчиков прерываний │ │ │
|
|
||||||
│ │◂─┘ │ │ │
|
|
||||||
│ Прерывание │ │ │ │
|
|
||||||
├──────────────▸│ Отправка HID-report │ │ │
|
|
||||||
│ │ с помощью send_report() │ Передача │ │
|
|
||||||
│ ├────────────────────────────▸│ HID-report │ │
|
|
||||||
│ │ ├─────────────▸│ enqueue_packet() │
|
|
||||||
│ │ │ ├───────────────────▸│
|
|
||||||
│ │ │ │ │
|
|
||||||
```
|
|
||||||
|
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user