2015-12-03 3 views
3

Я успешно создал небольшую программу для создания устройства , которое я планирую использовать для автоматизации тестирования приложения, принимающего события ввода клавиатуры.Как получить имя (путь) созданного устройства uinput

Я следил за bothtutorials как найдено в этом очень красиво answer.

Когда моя программа создает uinput-устройство, вызывая ioctl(fd, UI_DEV_CREATE), новое устройство появляется в файловой системе, поэтому мое тестовое приложение может присоединяться к нему и ждать событий. Моя целевая система уже имеет устройство /dev/input/event0, поэтому новый получает путь /dev/input/event1. Если я компилирую и запускаю программу для своей настольной системы, где есть существующие устройства /dev/input/event[0-15], при запуске программы новое устройство получает /dev/input/event16.

Я хочу, чтобы моя программа сообщила о новом имени устройства после его создания. Есть ли способ получить это?

+0

Возможно, вы можете использовать libudev http://www.signal11.us/oss/udev/ –

ответ

6

Да, вы можете использовать UI_GET_SYSNAME (определенный в /usr/include/linux/uinput.h), если он доступен на вашей платформе (например, Android не определяет его по какой-либо причине). Он даст вам имя для устройства, созданного в /sys/devices/virtual/input. Как только вы узнаете устройство в sysfs, вы можете найти устройство (-и), созданное в /dev/input, путем чтения this SO question.

Используйте его после вызова UI_DEV_CREATE как так (опуская проверки ошибок/здравомыслие):

ioctl(fd, UI_DEV_CREATE); 

char sysfs_device_name[16]; 
ioctl(fd, UI_GET_SYSNAME(sizeof(sysfs_device_name)), sysfs_device_name); 
printf("/sys/devices/virtual/input/%s\n", sysfs_device_name); 

Если он не доступен, вы можете попробовать искать устройство sysfs в /proc/bus/input/devices, который должен содержать следующую запись:

I: Bus=0006 Vendor=0001 Product=0001 Version=0001 
N: Name="your-uinput-device-name" 
P: Phys= 
S: Sysfs=/devices/virtual/input/input12 
U: Uniq= 
H: Handlers=sysrq kbd mouse0 event11 
B: PROP=0 
B: EV=7 
B: KEY=70000 0 0 0 0 0 7ffff ffffffff fffffffe 
B: REL=143 

..что немного беспорядочно. Но, как вы можете видеть, это также даст вам ярлык для устройства, созданного в /dev/input.

+0

Есть ли способ получить файл/dev/input/event [n] после создания без чтения из файловой системы? Пропуск нового устройства ввода для qemu ожидает его как это -device virtio-input-host-pci, evdev =/dev/input/eventn –