Jump to content

    
Sign in to follow this  
enclis_

Прерывания в драйвере ADS7846 на OpenWrt

Recommended Posts

Пытаюсь добавить сенсорный экран ( compatible = "ti,ads7846"; ) к железке на базе MT7621 через SPI, но похоже, что OpenWrt (ядро 5.4.52) не хочет перенаправлять прерывание к драйверу ads7846 (https://github.com/torvalds/linux/blob/master/drivers/input/touchscreen/ads7846.c). Кусок из моего дерева устройств:

....
#include "mt7621.dtsi"
....

    xpt2046reg: xpt2046_reg {
        compatible = "regulator-fixed";
        regulator-name = "xpt2046_vcc";
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        regulator-always-on;
.....
&spi0 {
    status = "okay";

....

    spidev3@3 {
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "ralink,mt7621-spi";
        reg = <3>;
        spi-max-frequency = <250000>;
        status = "disabled";
    };
    
    xpt2046@4 {
        compatible = "ti,ads7846";
        reg = <3>;
        vcc-supply = <&xpt2046reg>;
        spi-max-frequency = <250000>;

        interrupt-parent = <&gpio>;
        interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
        pendown-gpio = <&gpio 18 GPIO_ACTIVE_LOW>;
        ti,x-min = /bits/ 16 <0x0>;
        ti,x-max = /bits/ 16 <0x0fff>;
        ti,y-min = /bits/ 16 <0x0>;
        ti,y-max = /bits/ 16 <0x0fff>;
        ti,x-plate-ohms = /bits/ 16 <180>;
        ti,pressure-max = /bits/ 16 <255>;
        ti,debounce-max = /bits/ 16 <10>;
        ti,debounce-tol = /bits/ 16 <5>;
        ti,debounce-rep = /bits/ 16 <1>;
        ti,keep-vref-on = <1>;
        ti,settle-delay-usec = /bits/ 16 <150>;

        wakeup-source;
        status = "okay";
    };
};

Прерывание успешно регистрируется в системе:

ads7846 spi0.3: touchscreen, irq 27

Драйвер тоже успешно грузится:

input: ADS7846 Touchscreen as /devices/platform/1e000000.palmbus/1e000b00.spi/spi_master/spi0/spi0.3/input/input0

MISO, MOSI, SCK и CS работают на spi0.3, а драйвер сенсорного экрана даже что-то отвечает вразумительное во время инициализации линуксового драйвера во время загрузки системы. В /proc/interrupts появляется соответствующая строка:

27:          0          0          0          0  1e000600.gpio  18  ads7846

Event находится в /dev/input/event0.

GPIO18 подтянут снаружи к питанию через 10 кОм. Но когда чип драйвера сенсорного экрана опускает вниз соответствующую ножку (pendown), в /proc/interrupts ничего не происходит. Функции ads7846_hard_irq () и ads7846_irq () из драйвера даже не используются.

Если я удалю всякое упоминание о GPIO18 в дереве устройств, то GPIO18 можно будет свободно использовать в качестве источника прерывания через gpiolib записав echo falling > /sys/class/gpio/gpio490/edge, что будет потом видно в /proc/interrupts.

# cat /proc/bus/input/devices 
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="ADS7846 Touchscreen"
P: Phys=spi0.3/input0
S: Sysfs=/devices/platform/1e000000.palmbus/1e000b00.spi/spi_master/spi0/spi0.3/input/input0
U: Uniq=
H: Handlers=event0 
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

Как еще можно это отлаживать?

Я видел, что у некоторых event тачскрина регистрировался как два устройства - например как /dev/input/event0 и /dev/input/event1,  а прерывания шли только на /dev/input/event1. Соответственно в /proc/bus/input/devices  было Phys=spi0.х/input0, а Sysfs=/devices/platform/...../spi_master/spi0/spi0.х/input/input1. У меня не так, но мне кажется, что это не так важно. Или важно?

Share this post


Link to post
Share on other sites
9 hours ago, enclis_ said:

Пытаюсь добавить сенсорный экран ( compatible = "ti,ads7846"; ) к железке на базе MT7621

Странное решение - у этого процессора нет видеоконтроллера для LCD

Quote

Dual-core Network Processor

а в логе у вас 4 ядра

Quote

27:          0          0          0          0  1e000600.gpio  18  ads7846

с драйвером ads7846 имел дело много раз и никаких проблем не возникало

Share this post


Link to post
Share on other sites
Quote

Странное решение - у этого процессора нет видеоконтроллера для LCD

Зачем обязательно иметь видеоконтроллер для LCD? Может быть мне надо просто одну статическую картинку вывести раз в час (фоторамка-роутер, лол ). Может быть мне вообще не надо LCD. Хочу просто тачскрин как input устройство. 

Quote

а в логе у вас 4 ядра

У MT7621A 2 ядра, 4 потока.

Share this post


Link to post
Share on other sites

Меня вот больше интересует вопрос почему функции ads7846_hard_irq () и ads7846_irq () из драйвера не используются. Как это отлаживать? 

Share this post


Link to post
Share on other sites
10 hours ago, enclis_ said:

почему функции ads7846_hard_irq () и ads7846_irq () из драйвера не используются. Как это отлаживать? 

не вызываются потому что запрос на прерывание не приходит - cкорей всего прерывание неправильно описано в dts. У этого процессора 3 банка GPIO (gpio0, gpio1, gpio2) 

 

https://github.com/openwrt-mirror/openwrt/blob/9b4650b3b92e6246b986ac9e3d7c2a80d66b805b/target/linux/ramips/dts/mt7621.dtsi#L70

 

я не знаю какой у вас пин и из  какого банка, предположим из банка 0

        interrupt-parent = <&gpio0>;
        interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
        pendown-gpio = <&gpio0 18 GPIO_ACTIVE_LOW>;

 

Edited by sasamy

Share this post


Link to post
Share on other sites

Огромное спасибо вам за то, что вы хотя бы поверхностно взглянули на проблему. 

Quote

interrupt-parent = <&gpio0>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
pendown-gpio = <&gpio0 18 GPIO_ACTIVE_LOW>;

Ну ведь это было бы совсем просто, правда же? :)  В новых версиях openwrt оно немного по-другому. Достаточно посмотреть dts конкретной железки (https://github.com/openwrt/openwrt/blob/master/target/linux/ramips/dts/mt7621_xiaomi_mir3g-v2.dts) и увидеть, что обращение к первому банку идёт просто через gpio. Ну а так оно даже не собирается:

ERROR (phandle_references): /palmbus@1E000000/spi@b00/xpt2046@4: Reference to non-existent node or label "gpio0"
Quote

прерывание неправильно описано в dts. У этого процессора 3 банка GPIO (gpio0, gpio1, gpio2)

В этом зацепке наверное что-то есть, но как к ней подойти правильно я не знаю. Раньше было явно 3 банка, теперь как бы один.  При этом:

# ls /sys/class/gpio/
export       gpiochip416  gpiochip448  gpiochip480  unexport
# cat /sys/class/gpio/gpiochip4*/label 
1e000600.gpio-bank2
1e000600.gpio-bank1
1e000600.gpio-bank0

По 32 GPIO на каждый gpiochip при том что согласно даташиту доступно только 49 (ну не развели наверное просто на ножки). А вообще в конце таблицы с описанием пинов - "Total 265 balls", а всего шариков 347, опять же, если верить "Ball Map" из того же даташита. Я уж не стал сверять таблицу с описанием пинов и  "Ball Map". Или всё-таки надо? "GPIO pin share scheme" соответствует правде.

Share this post


Link to post
Share on other sites
10 minutes ago, enclis_ said:

В новых версиях openwrt оно немного по-другому.

Проблема в том что openwrt это какой-то трэш - куча своих патчей и разобраться что в исходниках вашей сборки мне не представляется возможным. До какой-то версии контроллер gpio у них не генерировал прерывания

https://patchwork.ozlabs.org/project/openwrt/patch/20180530063639.31017-8-rosenp@gmail.com/

и если смотреть DTS разных роутеров на этом процессоре кнопки на GPIO у них без прерываний на поллинге - програмном периодическом опросе.

Share this post


Link to post
Share on other sites

Ну так в "обычном линуксе" тоже самое: https://github.com/torvalds/linux/blob/master/drivers/staging/mt7621-dts/mt7621.dtsi, оно конечно staging,  но не суть.

Quote

openwrt это какой-то трэш

А что не треш? openwrt кстати весьма неплохо выглядит на фоне остальных. Лет 5-10 назад может быть было не очень, а сейчас всё не так плохо как может показаться. 

Quote

 

До какой-то версии контроллер gpio у них не генерировал прерывания

https://patchwork.ozlabs.org/project/openwrt/patch/20180530063639.31017-8-rosenp@gmail.com/

 

Этого коммита я кстати не нашёл в официальной репе openwrt)) В обычном линуксе было дело, да) - https://github.com/torvalds/linux/commit/c7092ed7946217a9ffad8aa1bcacece727843674

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this