LINUX.ORG.RU

/dev/uinput на Debian

 ,


0

2

Имеется одноплатный компьютер olinuxino A10, на который накачен armbian. К нему подключен 7' дисплей c тачскрином, дисплей - по hdmi, тачскрин и питание - usb.

Опуская предшествующие ритуалы с бубном - тачскрин определился как 0eff:0005. Эта китайская радость (http://www.waveshare.com/wiki/7inch_HDMI_LCD_(B)) увы, заточена на rasbberry.

У меня есть скачаный скрипт на питоне, судя по всему тачскрин шлет по usb сообщения по 25 байт (первых 7 достаточно для определения 1 касания - кроме мусора там инфа нажато/отжато и координаты). И судя по всему - от тачскрина в системе должен был появиться /dev/hidraw, а выдранные координаты писаться в /dev/uinput. У меня нет ни того, ни другого.

На хабре прочитал - это тачскрин eGalaxTouch, а китайцы перебили pid/vid. Когда пытаюсь собрать его драйвер - опять же ругается:

(E) Can't load uinput module

Что это за чертов uinput (насколько я понял, им можно имитировать устройства ввода), и как его получить? Вот uname:

Linux lime-a10 4.1.6-sunxi #22 SMP Tue Aug 25 17:54:51 CEST 2015 armv7l GNU/Linux

★★

Ответ на: комментарий от anonymous

Есть вот-это

by-id/
by-path/
event0
event1
event2
event3

wolph ★★
() автор топика
Ответ на: комментарий от ktk

Сложность в том, что lsusb видит устройство, но никакого /dev/hidraw не появляется. Пытался просто подключиться к девайсу через libusb - ошибка на этапе usb_set_config.

Плевать уже на глобальную эмуляцию мыши - встроил бы в прогу, только никак не могу до него достучаться.

А дрова для eGalax не собираются - хотят модуль uinput.

wolph ★★
() автор топика
Ответ на: комментарий от ktk

Когда я перетыкаю мышь/клавиатуру - содержимое /dev/input меняется. А на тачскрин /dev/input/* никак не реагирует.

wolph ★★
() автор топика
Ответ на: комментарий от wolph

а при чем тут /dev/hidraw?

Вот как на их сайте предполагается работа с этим тачскрином. Этот скрипт запускается как демон:

#!/usr/bin/env python3

import struct
import time
import math
import glob
import uinput
import pyudev
import os

# Wait and find devices
def read_and_emulate_mouse(deviceFound):
    with open(deviceFound, 'rb') as f:
        print("Read buffer")

        device = uinput.Device([
            uinput.BTN_LEFT,
            uinput.BTN_RIGHT,
            uinput.ABS_X,
            uinput.ABS_Y,
        ])

        clicked = False
        rightClicked = False
        (lastX, lastY) = (0, 0)
        startTime = time.time()

        while True:
            b = f.read(25)
            (tag, btnLeft, x, y) = struct.unpack_from('>c?HH', b)
            print(btnLeft, x, y)
            time.sleep(0.01) 

            if btnLeft:
                device.emit(uinput.ABS_X, x, True)
                device.emit(uinput.ABS_Y, y, True)

                if not clicked:
                    print("Left click")
                    device.emit(uinput.BTN_LEFT, 1)
                    clicked = True
                    startTime = time.time()
                    (lastX, lastY) = (x, y)

                duration = time.time() - startTime
                movement = math.sqrt(pow(x - lastX, 2) + pow(y - lastY, 2))

                if clicked and (not rightClicked) and (duration > 1) and (movement < 20):
                    print("Right click")
                    device.emit(uinput.BTN_RIGHT, 1)
                    device.emit(uinput.BTN_RIGHT, 0)
                    rightClicked = True
            else:
                print("Release")
                clicked = False
                rightClicked = False
                device.emit(uinput.BTN_LEFT, 0)


if __name__ == "__main__":
    os.system("modprobe uinput")
    os.system("chmod 666 /dev/hidraw*")
    os.system("chmod 666 /dev/uinput*")

    while True:
        # try:
        print("Waiting device")
        hidrawDevices = glob.glob("/dev/hidraw*")

        context = pyudev.Context()

        deviceFound = None
        for hid in hidrawDevices:
            device = pyudev.Device.from_device_file(context, hid)
            if "0EEF:0005" in device.device_path:
                deviceFound = hid

        if deviceFound:
            print("Device found", deviceFound)
            read_and_emulate_mouse(deviceFound)
            # except:
            #     print("Error:", sys.exc_info())
            #     pass
            # finally:
            #     time.sleep(1)

wolph ★★
() автор топика
Ответ на: комментарий от wolph

вообще мне кажется что корень всех бед растет из измененного usbID. возможно поможет добавить эти идишники в драйвер evdev.

ktk ★★★★
()
Ответ на: комментарий от anonymous

event1 реагирует на мышь, event2 реагирует на клавиатуру. На тачскрин ни один евент не реагирует.

wolph ★★
() автор топика
Ответ на: комментарий от wolph

что-то я посмотрел на вашу железку, какая-то содомия и пздц. но способ для rPi должен работать, ибо usb устройсто.

ktk ★★★★
()
Ответ на: комментарий от ktk

но способ для rPi должен работать

Для rPi там и ядро уже собраное с модулями выложено. Но у меня нету rPi - в наличии только олимексы а10 и а13.

А где можно добыть и собрать этот чертов uinput? В гугле о нем инфы - с гулькин нос, и везде подразумевается, что он уже собран и есть, и modprobe uinput достаточно.

wolph ★★
() автор топика
Ответ на: комментарий от wolph
root@api:~# modprobe uinput
root@api:~# lsmod | grep uinput
uinput                 17372  0

а просто посмотреть в исходники ядра ты не догадался? стандартный модуль, если есть железка на a10,a13 просто пересобери ядро или используй обычный дебиан из обычного стандартного установщика(а не *bian-ы)

ktk ★★★★
()

Фух, заработало.

Пришлось собирать свой образ armbian'а - теперь там убунта 14.04. Ткнул для ведра недостающие галочки - и теперь появились /dev/hidraw0-3 (тачскрин определяется как /dev/hidraw0), и появился /dev/uinput. Питоноскрипт от rPi работает.

Еще есть вопрос - lightdm автоматом не стартует, только вручную через service lightdm start. Как его автостартовать то? Пока создал сессию для xfce, а в будущем должно стартовать своя аппликуха в киоск-режиме.

wolph ★★
() автор топика
29 июля 2016 г.

olinuxino

qulinxao? оволосино?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.