LINUX.ORG.RU

Нет клика/тапа в событиях от тачскрина

 , , ,


0

1

Привет. Есть sbc, Digi ConnectCore 6UL SBC Pro, к нему прицеплен по LVDS какой-то экран. К экрану прицеплен тачскрин с контроллером tsc2007, заведенный в sbc через i2c. На sbc установлен DIGI Embedded Yocto 2.6. В ядре добавлена поддержка тачскринов и поддержка tsc2007 (собран как часть ядра, не модуль). Тачскрин видится в системе и двигает курсор мыши при нажатии, но никогда не присылает события «нажатие/тап по экрану», только ABS_X, ABX_Y и ABS_PRESSURE, соответственно нажать ни на что нельзя, курсор просто ползает по экрану за пальцем. Тачскрин двигает курсор только при работе через evdev, через libinput не удалось заставить. xinput_calibrator так же не получает события о нажатии, поэтому калибровку пройти не могу. Положение пальца на эране в DE (matchbox) соответствует положению курсора, т.е. калибровка в принципе не нужна. ts_calibrator (или как там его) так же не видит нажатий, да еще и сильное различие между пальцем и откликом на экране (похоже, что в tslib, которую я никак не настраивал, границы тача указаны как 65535, а в evdev берутся с железа как 4095 или что-то в этом роде).

В device tree прописан примерно так:

&i2c1 {
        touchscreen: tsc2007@48 {
                     compatible = "ti,tsc2007";
                     reg = <0x48>;
                     interrupt-parent = <&gpio3>;
                     interrupts = <21 0>;
                     gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;
                     ti,x-plate-ohms = <500>;
                     status = "okay";
                     linux,wakeup;
                     wakeup-source;
        };
Прерывания пробовал менять, толку мало. x-plate-ohms пробовал и 400, и 660, тоже разницы не увидел.

Конфиги:

root@ccimx6ulsbc:~# cat /usr/share/X11/xorg.conf.d/10-evdev.conf

Section "InputClass"
        Identifier "evdev pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection
root@ccimx6ulsbc:~# cat /etc/X11/xorg.conf
Section "Device"
    Identifier  "Kernel Framebuffer Device"
    Driver      "fbdev"
    Option      "fbdev" "/dev/fb0"
EndSection

Section "ServerFlags"
    Option "BlankTime"  "0"
    Option "StandbyTime"  "0"
    Option "SuspendTime"  "0"
    Option "OffTime"  "0"
EndSection

Тесты:

root@ccimx6ulsbc:~# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:      mca-cc6ul-pwrkey
/dev/input/event1:      TSC2007 Touchscreen
Select the device event number [0-1]: 1
Input driver version is 1.0.1
Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0
Input device name: "TSC2007 Touchscreen"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 330 (BTN_TOUCH)
  Event type 3 (EV_ABS)
    Event code 0 (ABS_X)
      Value      0
      Min        0
      Max     4095
    Event code 1 (ABS_Y)
      Value   4095
      Min        0
      Max     4095
    Event code 24 (ABS_PRESSURE)
      Value   4095
      Min        0
      Max     4095
Properties:
Testing ... (interrupt to exit)
Event: time 1565863240.820826, type 3 (EV_ABS), code 0 (ABS_X), value 866
Event: time 1565863240.820826, type 3 (EV_ABS), code 1 (ABS_Y), value 2031
Event: time 1565863240.820826, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 3523
Event: time 1565863240.820826, -------------- SYN_REPORT ------------
Event: time 1565863240.840968, type 3 (EV_ABS), code 0 (ABS_X), value 867
Event: time 1565863240.840968, type 3 (EV_ABS), code 1 (ABS_Y), value 2033
Event: time 1565863240.840968, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 3471
Event: time 1565863240.840968, -------------- SYN_REPORT ------------
...
...
root@ccimx6ulsbc:~# xinput test "TSC2007 Touchscreen"
motion a[0]=579 a[1]=2631 a[2]=3457
motion a[0]=590 a[1]=2640 a[2]=3444
motion a[0]=589 a[1]=2641 a[2]=3410
motion a[0]=579 a[1]=2637 a[2]=3277
motion a[0]=0 a[1]=4095 a[2]=4095
motion a[0]=542 a[1]=2512 a[2]=2420
motion a[0]=464 a[1]=2512 a[2]=3200
motion a[0]=463 a[1]=2512 a[2]=3290
motion a[1]=2513 a[2]=3328
motion a[1]=2511 a[2]=3348
...
...

Лог xorg:

root@ccimx6ulsbc:~# cat /var/log/Xorg.0.log
[   192.956]
X.Org X Server 1.20.1
X Protocol Version 11, Revision 0
...
[   193.305] (II) Using input driver 'evdev' for 'TSC2007 Touchscreen'
[   193.305] (**) TSC2007 Touchscreen: always reports core events
[   193.306] (**) evdev: TSC2007 Touchscreen: Device: "/dev/input/event1"
[   193.307] (--) evdev: TSC2007 Touchscreen: Vendor 0 Product 0
[   193.307] (--) evdev: TSC2007 Touchscreen: Found absolute axes
[   193.307] (--) evdev: TSC2007 Touchscreen: Found x and y absolute axes
[   193.307] (--) evdev: TSC2007 Touchscreen: Found absolute touchscreen
[   193.308] (II) evdev: TSC2007 Touchscreen: Configuring as touchscreen
[   193.308] (**) evdev: TSC2007 Touchscreen: YAxisMapping: buttons 4 and 5
[   193.308] (**) evdev: TSC2007 Touchscreen: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
[   193.308] (**) Option "config_info" "udev:/sys/devices/soc0/soc/2100000.aips-bus/21a0000.i2c/i2c-0/0-0048/input/input1/event1"
[   193.308] (II) XINPUT: Adding extended input device "TSC2007 Touchscreen" (type: TOUCHSCREEN, id 6)
[   193.309] (II) evdev: TSC2007 Touchscreen: initialized for absolute axes.
[   193.312] (**) TSC2007 Touchscreen: (accel) keeping acceleration scheme 1
[   193.312] (**) TSC2007 Touchscreen: (accel) acceleration profile 0
[   193.312] (**) TSC2007 Touchscreen: (accel) acceleration factor: 2.000
[   193.312] (**) TSC2007 Touchscreen: (accel) acceleration threshold: 4
[   193.316] (II) config/udev: Adding input device mca-cc6ul-pwrkey (/dev/input/event0)
[   193.317] (**) mca-cc6ul-pwrkey: Applying InputClass "evdev keyboard catchall"
[   193.317] (II) Using input driver 'evdev' for 'mca-cc6ul-pwrkey'
[   193.317] (**) mca-cc6ul-pwrkey: always reports core events
[   193.317] (**) evdev: mca-cc6ul-pwrkey: Device: "/dev/input/event0"
[   193.317] (--) evdev: mca-cc6ul-pwrkey: Vendor 0 Product 0
[   193.317] (--) evdev: mca-cc6ul-pwrkey: Found keys
[   193.318] (II) evdev: mca-cc6ul-pwrkey: Configuring as keyboard
[   193.318] (**) Option "config_info" "udev:/sys/devices/soc0/soc/2100000.aips-bus/21a0000.i2c/i2c-0/0-007e/mca-cc6ul-pwrkey/input/input0/event0"
[   193.318] (II) XINPUT: Adding extended input device "mca-cc6ul-pwrkey" (type: KEYBOARD, id 7)
[   193.318] (**) Option "xkb_rules" "evdev"

gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;

этот пин переключен на GPIO контроллер ? Ошибка наверняка связана с этим пином - либо он не переключен на GPIO, либо вообще не тот пин прописан. Драйвер tsc2007 анализирует касание через это пин. Если это тотчно тот пин который подключен к тачскрину - попробуй дописать

1) на какой контроллер должен быть переключен мультиплексор этого пина

&iomuxc {
....................

        pinctrl_tsc2007: tsc2007grp {
                fsl,pins = <
                        MX6UL_PAD_LCD_DATA16__GPIO3_IO21          0x1b0b0
                >;
        };
....................

2) допиши какие пины должны быть переключены для контроллера тачскрина

&i2c1 {
        touchscreen: tsc2007@48 {
                     compatible = "ti,tsc2007";
                     reg = <0x48>;

---->                pinctrl-names = "default";
---->                pinctrl-0 = <&pinctrl_tsc2007>;

                     interrupt-parent = <&gpio3>;
                     interrupts = <21 0>;
                     gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;
                     ti,x-plate-ohms = <500>;
                     status = "okay";
                     linux,wakeup;
                     wakeup-source;
        };

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

Спасибо за ответ, анон.

этот пин переключен на GPIO контроллер ?

А как это узнать? Я пробовал gpio3 и gpio5, разницы не увидел. Пины пробовал подключать, но, опять же, наугад и именно этот не пробовал. Сейчас пересоберу, проверю.

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

Нет, пин явно неправильный, при загрузке пишет

imx6ul-pinctrl 20e0000.iomuxc: pin MX6UL_PAD_LCD_DATA16 already requested by 21c8000.lcdif; cannot claim for 0-0048
imx6ul-pinctrl 20e0000.iomuxc: pin-86 (0-0048) status -22
imx6ul-pinctrl 20e0000.iomuxc: could not request pin 86 (MX6UL_PAD_LCD_DATA16) from group tsc2007grp  on device 20e0000.iomuxc
tsc2007 0-0048: Error applying setting, reverse things back
tsc2007: probe of 0-0048 failed with error -22

Ну и устройства, соответственно, нет. Как выбрать правильный пин? Это какой механикой вообще определяется? Мне разработчик железа должен сказать номер пина? Документация на tsc2007? Или монетку кинуть?

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

Как выбрать правильный пин?

он куда-то подключен - смотреть схему соединений tsc2007 c DIGI, на стороне тачскрина это линия irq, на стороне DIGI - какой-то пин, найти его и переключить на GPIO.

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

Анон, я правильно понимаю, что tsc2007 должен быть подключен не только к i1c, но и к какому-то пину GPIO физически? Я посмотрел даташит, нога PENIRQ описана как «Data available interrupt output. A delayed (process delay) pen touch detect. Pin polarity with active low.». Я не железячник, объясни пожалуйста: если эта нога не заведена в sbc, то сообщений о касании экрана же не должно приходить (никто не говорит data available). А если они приходят, сообщения, значит она заведена, так? Но тогда почему не приходит BTN_TOUCH? Я смотрел исходники tsc2007_core.c по диагонали, там все 4 типа данных выдаются всегда пачкой. А наверх приходит только 3. Точно дело в железе, не в софте?

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

Я не железячник ... Точно дело в железе, не в софте?

а я не телепат. Линия PENIRQ должна быть подключена на какой-то пин - смотри схему, его и прописывай в DTS. То что у тебя прописано - однозначно не будет работать, даже если к этому пину подключено - у тебя конфликт с lcdif, так как у тебя LVDS с твоих слов то можешь попробовать отключить этот пин от lcdif - найди его описание iomux в секции lcdif и закоментируй. Но лучше схему бл.ть посмотри.

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

Спасибо тебе, анон. Ты хоть и начал агриться на ровном месте, но все равно здорово помог. Понятно, что надо читать доки, схемы итд, но без соответствующего бэкграунда в это тяжело вникнуть. Я за последние 4 дня столько перечитал всего, а помогло едва ли, как видишь.

Правильный ответ:

  • 1. Заставить железячника завести PENIRQ с tsc2007 в i2c колодку. Почему он не сделал этого раньше я не знаю.
  • 2. Посмотреть в даташит на imx6ul и увидеть там, что EXP_I2C_IRQ_N заводится в GPIO5_05 (а перед этим догадаться, почему именно EXP_I2C_IRQ_N).
  • 3. В device tree прописать
touchscreen: tsc2007@48 {
		compatible = "ti,tsc2007";
		reg = <0x48>;
		interrupt-parent = <&gpio5>;
		interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
		gpios = <&gpio5 5 GPIO_ACTIVE_LOW>;
		ti,x-plate-ohms = <660>;
		linux,wakeup;
	};

И вроде работает.

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

2. Можно завести на любой _свободный_ пин который может работать как GPIO (часть пинов имеют специальное назначение - например дифференциальные входы-выходы USB, LVDS, HDMI, DSI, CSI) и прписать его. На таких SoC GPIO могут служить источником запроса на прерывание от внешних устройств.

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

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

Продолжаю нубские вопросы.

  • 2. Т.е. PENIRQ можно было физически завести не в колодку i2c, а в колодку GPIO и указать через pinctrl_tsc2007 пин в колодке GPIO? Или речь идет исключительно про возню с device tree?
  • 3. Долго прикидывал, так и не понял. Не можешь меня носом ткнуть, какой именно надо пин прописать?
leet27 ()